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

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

  • สร้างโปรแกรมเปลี่ยนรูปแบบ SkSL

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

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

  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

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