การจับคู่โทนสี HDR ความสว่างกับช่วงที่เข้ากันได้กับ SDR

Android 13 เปิดตัวไลบรารีแบบคงที่ที่กําหนดค่าได้ซึ่งเรียกว่า libtonemap ซึ่งจะกําหนดการทํางานของการปรับโทนสีและแชร์กับกระบวนการ SurfaceFlinger และการใช้งาน Hardware Composer (HWC) ฟีเจอร์นี้ช่วยให้ OEM กำหนดและแชร์อัลกอริทึมการแมปโทนสี Display ระหว่างเฟรมเวิร์กและผู้ให้บริการได้ ซึ่งช่วยลดความไม่ตรงกันของการแมปโทนสี

ก่อน Android 13 การดำเนินการการปรับโทนสีเฉพาะจอแสดงผลไม่ได้แชร์ระหว่าง HWC, SurfaceFlinger และแอป สำหรับเนื้อหา HDR ปัญหานี้อาจส่งผลให้คุณภาพของภาพไม่ตรงกัน ทั้งนี้ขึ้นอยู่กับเส้นทางการแสดงผล โดยเนื้อหา HDR ได้รับการแมปโทนสีไปยังพื้นที่เอาต์พุตด้วยวิธีที่แตกต่างกัน กรณีนี้จะเห็นได้ในสถานการณ์ต่างๆ เช่น การหมุนหน้าจอที่กลยุทธ์การจัดองค์ประกอบมีการเปลี่ยนแปลงระหว่าง GPU และ DPU รวมถึงลักษณะการทำงานของการแสดงผลระหว่าง TextureView และ SurfaceView ที่แตกต่างกัน

หน้านี้อธิบายอินเทอร์เฟซ การปรับแต่ง และรายละเอียดการตรวจสอบของไลบรารี libtonemap

อินเทอร์เฟซไปยังไลบรารีการแมปโทนสี

ไลบรารี libtonemap มีการใช้งานที่ใช้ CPU และตัวปรับแสงเงา SkSL ซึ่งสามารถเสียบเข้ากับ SurfaceFlinger สำหรับองค์ประกอบแบ็กเอนด์ของ GPU และโดย HWC เพื่อสร้างตารางค้นหาการแมปโทน (LUT) จุดแรกเข้าของ libtonemap คือ android::tonemap::getToneMapper() ซึ่งจะแสดงผลออบเจ็กต์ที่ใช้อินเทอร์เฟซ ToneMapper

อินเทอร์เฟซของ ToneMapper รองรับความสามารถต่อไปนี้

  • สร้าง LUT การปรับโทนสี

    อินเทอร์เฟซ ToneMapper::lookupTonemapGain คือการใช้งาน CPU ของโปรแกรมเปลี่ยนสีที่กำหนดไว้ใน libtonemap_LookupTonemapGain() ข้อมูลนี้ใช้กับการทดสอบ 1 หน่วยในเฟรมเวิร์ก และพาร์ทเนอร์สามารถใช้เพื่อขอความช่วยเหลือในการสร้าง LUT การปรับโทนสีในไปป์ไลน์สี

    libtonemap_LookupTonemapGain() จะใช้ค่าสีในปริภูมิเชิงเส้นแบบสัมบูรณ์ที่ไม่เป็นมาตรฐาน ทั้งใน RGB เชิงเส้นและใน XYZ และแสดงผลจำนวนลอยตัวที่อธิบายจำนวนเงินที่จะคูณสีอินพุตในพื้นที่เชิงเส้น

  • สร้างโปรแกรมเปลี่ยนรูปแบบ SkSL

    อินเทอร์เฟซ ToneMapper::generateTonemapGainShaderSkSL() จะแสดงผลสตริงโปรแกรมเปลี่ยนรูปแบบภาพ SkSL โดยอิงตามพื้นที่ข้อมูลต้นทางและปลายทาง ปลั๊กอิน SkSL สานเข้ากับการใช้งาน Skia สำหรับ RenderEngine ซึ่งเป็นคอมโพเนนต์การประสานที่ใช้ GPU เร่งการแสดงผลสำหรับ SurfaceFlinger นอกจากนี้ Shader ยังเสียบเข้ากับ libhwui ด้วย เพื่อให้ TextureView ทำการแมปโทนสี HDR เป็น SDR ได้อย่างมีประสิทธิภาพ เนื่องจากสตริงที่สร้างขึ้นในบรรทัดที่แทรกอยู่ในเครื่องมือให้เฉดสี SkSL อื่นๆ ที่ Skia ใช้ ตัวปรับแสงเงาจึงต้องปฏิบัติตามกฎต่อไปนี้

    • สตริงเฉดสีต้องมีจุดแรกเข้าที่มีลายเซ็น float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) โดยที่ linearRGB คือค่านิตสัมบูรณ์ของพิกเซล RGB ในพื้นที่เชิงเส้นและ xyz linearRGB แปลงเป็น XYZ
    • เมธอดตัวช่วยที่ใช้โดยสตริง Shader ต้องมีสตริง libtonemap_ นำหน้าเพื่อให้คำจำกัดความ Shader ของเฟรมเวิร์กไม่ทับซ้อนกัน ในทำนองเดียวกัน อินพุตแบบเหมือนกันต้องขึ้นต้นด้วย in_libtonemap_
  • สร้างเครื่องแบบ SkSL

    อินเทอร์เฟซ ToneMapper::generateShaderSkSLUniforms() จะแสดงผลต่อไปนี้เมื่อมีข้อมูลเมตา struct ที่อธิบายข้อมูลเมตาจากมาตรฐาน HDR และสภาพการแสดงผลที่แตกต่างกัน

    • รายการยูนิฟอร์มที่เชื่อมโยงกับโปรแกรมเปลี่ยนสี SkSL

    • ค่าแบบเดียวกัน in_libtonemap_displayMaxLuminance และ in_libtonemap_inputMaxLuminance โปรแกรมเปลี่ยนสีของเฟรมเวิร์กจะใช้ค่าเหล่านี้เมื่อปรับขนาดอินพุตเป็น libtonemap และทำให้เอาต์พุตเป็นมาตรฐานตามความเหมาะสม

    ในปัจจุบันกระบวนการสร้างเครื่องแบบนั้นไม่มีผลต่อพื้นที่ข้อมูลของอินพุตและเอาต์พุต

การปรับแต่ง

การใช้งานอ้างอิงของไลบรารี libtonemap ให้ผลลัพธ์ที่ยอมรับได้ อย่างไรก็ตาม เนื่องจากอัลกอริทึมการแมปโทนสีที่ใช้โดยองค์ประกอบของ GPU อาจแตกต่างจากองค์ประกอบ DPU ที่ใช้ การใช้การอ้างอิงจึงอาจทำให้เกิดการกะพริบในบางสถานการณ์ เช่น ภาพเคลื่อนไหวการหมุน การปรับแต่งอาจแก้ปัญหาด้านคุณภาพของรูปของผู้ให้บริการที่เจาะจงดังกล่าว

เราขอแนะนําอย่างยิ่งให้ OEM ลบล้างการใช้งาน libtonemap เพื่อกําหนดคลาสย่อย ToneMapper ของตนเอง ซึ่ง getToneMapper() จะแสดงผล เมื่อปรับแต่งการใช้งาน พาร์ทเนอร์จะต้องดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • แก้ไขการใช้งาน libtonemap โดยตรง
  • กำหนดไลบรารีแบบคงที่ของตนเอง คอมไพล์ไลบรารีแบบสแตนด์อโลน และแทนที่ไฟล์ .a ของไลบรารี libtonemap ด้วยไฟล์ที่สร้างขึ้นจากไลบรารีที่กำหนดเอง

ผู้ให้บริการไม่จำเป็นต้องแก้ไขโค้ดเคอร์เนล แต่ผู้ให้บริการหลายรายต้องสื่อสารรายละเอียดเกี่ยวกับอัลกอริทึมการปรับโทนสี DPU เพื่อการใช้งานอย่างเหมาะสม

การตรวจสอบความถูกต้อง

ทําตามขั้นตอนต่อไปนี้เพื่อตรวจสอบการติดตั้งใช้งาน

  1. เล่นวิดีโอ HDR บนหน้าจอมาตรฐาน HDR ที่ระบบแสดงผลรองรับ เช่น HLG, HDR10, HDR10+ หรือ DolbyVision

  2. สลับองค์ประกอบของ GPU เพื่อให้แน่ใจว่าไม่มีการกะพริบที่ผู้ใช้รับรู้ได้

    ใช้คำสั่ง adb ต่อไปนี้เพื่อสลับองค์ประกอบ GPU

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

ปัญหาทั่วไป

ปัญหาต่อไปนี้อาจเกิดขึ้นเมื่อติดตั้งใช้งาน

  • แถบสีเกิดขึ้นเมื่อเป้าหมายการแสดงผลที่ใช้โดยองค์ประกอบ GPU มีความแม่นยําต่ำกว่าค่าปกติสําหรับเนื้อหา HDR ตัวอย่างเช่น แถบสีอาจเกิดขึ้นเมื่อใช้ HWC รองรับรูปแบบ 10 บิตแบบทึบแสงสำหรับ HDR เช่น RGBA1010102 หรือ P010 แต่กำหนดให้องค์ประกอบของ GPU เขียนเป็นรูปแบบ 8 บิต เช่น RGBA8888 เพื่อรองรับอัลฟ่า

  • การเปลี่ยนแปลงสีเล็กน้อยเกิดจากความแตกต่างของการวัดปริมาณด้วยหาก DPU ทำงานที่ความแม่นยำต่างจาก GPU

ปัญหาแต่ละข้อเกี่ยวข้องกับความแตกต่างของความแม่นยำแบบสัมพัทธ์ของฮาร์ดแวร์ที่เกี่ยวข้อง วิธีแก้ปัญหาทั่วไปคือการตรวจสอบว่ามีขั้นตอนเพิ่มขึ้นในเส้นทางที่มีความแม่นยำต่ำกว่า ซึ่งทำให้ความแตกต่างด้านความแม่นยำที่มนุษย์รับรู้ได้น้อยลง