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

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

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

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

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

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

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

  • สร้าง LUT การแมปโทน

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

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

  • สร้าง Shader SkSL

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

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

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

    • รายการค่าคงที่ที่เชื่อมโยงกับเชเดอร์ SkSL

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

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

การปรับแต่ง

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

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

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

ผู้ให้บริการไม่จำเป็นต้องแก้ไขโค้ดเคอร์เนล แต่ผู้ให้บริการหลายรายต้อง สื่อสารรายละเอียดเกี่ยวกับอัลกอริทึมการแมปโทน 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

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