Tone Mapping HDR Luminance กับช่วงที่รองรับ SDR

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

ก่อน 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() สิ่งนี้ถูกใช้โดยการทดสอบหน่วยในเฟรมเวิร์ก และคู่ค้าสามารถนำไปใช้เพื่อขอความช่วยเหลือในการสร้าง LUT การแมปโทนภายในไปป์ไลน์สีของพวกเขา

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

  • สร้างเชเดอร์ SkSL

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

    • สตริงเชเดอร์ต้องมีจุดเริ่มต้นที่มีลายเซ็น float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) โดยที่ linearRGB คือค่าของ nits สัมบูรณ์ของพิกเซล RGB ในพื้นที่เชิงเส้น และ xyz จะถูกแปลงเป็น linearRGB เป็น XYZ
    • วิธีการช่วยเหลือใดๆ ที่ใช้โดยสตริงเชเดอร์จะต้องนำหน้าด้วยสตริง libtonemap_ เพื่อให้คำจำกัดความของเฟรมเวิร์กเชเดอร์ไม่ขัดแย้งกัน ในทำนองเดียวกัน ชุดอินพุตจะต้องนำหน้าด้วย 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

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