การปรับโทนความสว่าง HDR ให้เป็นช่วงที่เข้ากันได้กับ SDR

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

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

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

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

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

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

  • สร้าง LUT ของ Tone Mapping

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

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

  • สร้าง SkSL Shader

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

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

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

    • รายการยูนิฟอร์มที่ SkSL Shader ผูกไว้

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

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

การปรับแต่ง

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

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

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

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

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