การจับคู่โทนสี HDR ความสว่างกับช่วงที่เข้ากันได้กับ 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 คือ เมื่อมีการติดตั้งใช้งาน Skia สำหรับ RenderEngine คอมโพเนนต์การประสานที่ใช้ GPU เร่งการแสดงผลสำหรับ SurfaceFlinger นอกจากนี้ ตัวปรับแสงเงายัง ซึ่งเสียบเข้ากับ libhwui เพื่อให้การแมปโทนสี HDR เป็น SDR ทำได้อย่างมีประสิทธิภาพสำหรับ TextureView เนื่องจากสตริงที่สร้างขึ้นจะอยู่ใน เครื่องมือสร้างเฉดสี SkSL อื่นๆ ที่ Skia ใช้ ตัวปรับแสงเงาต้องเป็นไปตามกฎต่อไปนี้

    • สตริงตัวปรับแสงเงาต้องมีจุดแรกเข้าที่มี ลายเซ็น float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) โดยที่ linearRGB คือค่านิตสัมบูรณ์ของพิกเซล 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

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