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 shaders ซึ่งสามารถเสียบเข้ากับ SurfaceFlinger สำหรับองค์ประกอบ GPU-backend และโดย HWC สำหรับสร้างตารางค้นหาการแมปโทน (LUT) จุดเข้าสู่ libtonemap คือ android::tonemap::getToneMapper() ซึ่งจะส่งคืนวัตถุที่ใช้อินเทอร์เฟซ ToneMapper

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

  • สร้าง LUT การจับคู่โทนเสียง

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

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

  • สร้าง SkSL shader

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

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

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

    • รายการชุดเครื่องแบบที่ผูกมัดโดย SkSL shader

    • ค่าที่เหมือนกัน in_libtonemap_displayMaxLuminance และ in_libtonemap_inputMaxLuminance ค่าเหล่านี้ถูกใช้โดย framework shaders เมื่อปรับขนาดอินพุตเป็น 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

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