Tone Mapping HDR Luminance إلى نطاق متوافق مع SDR

يقدم Android 13 مكتبة ثابتة قابلة للتكوين بواسطة البائع تسمى libtonemap ، والتي تحدد عمليات تعيين النغمات ويتم مشاركتها مع عملية SurfaceFlinger وتطبيقات Hardware Composer (HWC). تتيح هذه الميزة لمصنعي المعدات الأصلية إمكانية تحديد ومشاركة خوارزميات تعيين نغمة العرض الخاصة بهم بين إطار العمل والموردين، مما يقلل من عدم التطابق في تعيين نغمة العرض.

قبل إصدار Android 13، لم تكن عمليات تعيين النغمات الخاصة بالشاشة مشتركة بين HWC وSurfaceFlinger والتطبيقات. اعتمادًا على مسار العرض، بالنسبة لمحتوى HDR، أدى ذلك إلى عدم تطابق في جودة الصورة، حيث تم تعيين نغمة محتوى HDR إلى مساحة الإخراج بطرق مختلفة. كان هذا ملحوظًا في سيناريوهات مثل تدوير الشاشة، حيث تتغير إستراتيجية التركيب بين وحدة معالجة الرسومات ووحدة المعالجة المركزية، وفي الاختلافات في سلوك العرض بين TextureView وSurfaceView.

تصف هذه الصفحة الواجهة والتخصيص وتفاصيل التحقق من صحة مكتبة libtonemap .

واجهة لمكتبة تعيين النغمات

تحتوي مكتبة libtonemap على تطبيقات مدعومة بوحدة المعالجة المركزية (CPU) وتظليلات SkSL، والتي يمكن توصيلها بواسطة SurfaceFlinger لتكوين الواجهة الخلفية لوحدة معالجة الرسومات (GPU) وبواسطة HWC لإنشاء جدول بحث لتعيين النغمات (LUT). نقطة الدخول إلى libtonemap هي android::tonemap::getToneMapper() ، والتي تُرجع كائنًا ينفذ واجهة ToneMapper .

تدعم واجهة ToneMapper الإمكانيات التالية:

  • إنشاء جدول البحث (LUT) لتعيين النغمات

    الواجهة ToneMapper::lookupTonemapGain هي تطبيق لوحدة المعالجة المركزية للتظليل المحدد في libtonemap_LookupTonemapGain() . يتم استخدام هذا من خلال اختبارات الوحدة في إطار العمل، ويمكن استخدامه من قبل الشركاء للمساعدة في إنشاء جداول البحث (LUT) لتعيين درجات الألوان داخل مسار الألوان الخاص بهم.

    يأخذ libtonemap_LookupTonemapGain() قيم الألوان في الفضاء الخطي المطلق وغير الطبيعي، سواء في RGB الخطي أو في XYZ، ويعيد تعويمًا يصف مقدار مضاعفة الألوان المدخلة في الفضاء الخطي.

  • إنشاء تظليل SkSL

    تقوم الواجهة ToneMapper::generateTonemapGainShaderSkSL() بإرجاع سلسلة تظليل SkSL، مع توفير مساحة بيانات المصدر والوجهة. تم توصيل تظليل SkSL بتطبيق Skia لـ RenderEngine ، وهو مكون التركيب المسرع بواسطة GPU لـ SurfaceFlinger. يتم توصيل التظليل أيضًا بـ libhwui ، بحيث يمكن إجراء تعيين نغمة HDR-to-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، فإن استخدام التنفيذ المرجعي يمكن أن يسبب وميضًا في بعض السيناريوهات مثل الرسوم المتحركة للتدوير. يمكن أن يؤدي التخصيص إلى حل مشكلات جودة الصورة الخاصة بالبائع.

يتم تشجيع مصنعي المعدات الأصلية بشدة على تجاوز تطبيق libtonemap لتحديد فئة ToneMapper الفرعية الخاصة بهم، والتي يتم إرجاعها بواسطة getToneMapper() . عند تخصيص التنفيذ، من المتوقع أن يقوم الشركاء بأحد الإجراءات التالية:

  • تعديل تنفيذ libtonemap مباشرة.
  • حدد مكتبتهم الثابتة، وقم بتجميع المكتبة كمكتبة مستقلة، واستبدل ملف .a الخاص بمكتبة libtonemap بالملف الذي تم إنشاؤه من مكتبتهم المخصصة.

لا يحتاج البائعون إلى تعديل أي رمز kernel، ولكن يجب على البائعين المتعددين توصيل تفاصيل حول خوارزميات تعيين نغمة 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 تعمل بدقة مختلفة عن وحدة معالجة الرسومات.

ترتبط كل مشكلة من هذه المشكلات باختلافات الدقة النسبية للأجهزة الأساسية. الحل النموذجي هو التأكد من وجود خطوة ثبات في المسارات ذات الدقة المنخفضة، مما يجعل أي اختلافات في الدقة أقل وضوحًا من قبل الإنسان.