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

تدعم واجهة ToneMapper القدرات التالية:

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

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

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

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

    تعرض الواجهة ToneMapper::generateTonemapGainShaderSkSL() سلسلة تظليل SkSL ، مع إعطاء مساحة بيانات المصدر والوجهة. تم توصيل تظليل SkSL بتطبيق Skia لـ RenderEngine ، وهو مكون التركيب المسرع بواسطة وحدة معالجة الرسومات لـ SurfaceFlinger. يتم توصيل التظليل أيضًا libhwui ، بحيث يمكن إجراء تعيين نغمة HDR-to-SDR بكفاءة من أجل TextureView . نظرًا لأن السلسلة التي تم إنشاؤها مضمنة في تظليلات SkSL الأخرى المستخدمة بواسطة Skia ، يجب أن يلتزم التظليل بالقواعد التالية:

    • يجب أن تحتوي سلسلة التظليل على نقطة إدخال مع float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) linearRGB حيث يمثل الخطي RGB قيمة القمل المطلقة لوحدات البكسل RGB في المساحة الخطية ويكون xyz linearRGB تم تحويله إلى XYZ.
    • يجب أن تكون أي طرق مساعدة مستخدمة بواسطة سلسلة shader مسبوقة بالسلسلة libtonemap_ حتى لا تتعارض تعريفات إطار العمل. وبالمثل ، يجب أن يُسبَق زي الإدخال بـ in_libtonemap_ .
  • إنشاء زي موحد SkSL

    تعرض الواجهة ToneMapper::generateShaderSkSLUniforms() ما يلي ، بالنظر إلى struct بيانات وصفية تصف البيانات الوصفية من معايير HDR وشروط عرض مختلفة:

    • قائمة بالزي الرسمي المرتبط بـ SkSL shader.

    • القيم الموحدة in_libtonemap_displayMaxLuminance و in_libtonemap_inputMaxLuminance . يتم استخدام هذه القيم بواسطة تظليل الإطار عند قياس المدخلات في libtonemap ، وتطبيع المخرجات حسب الاقتضاء.

    حاليًا ، تعتبر عملية إنشاء الزي الرسمي غير محددة لمساحة بيانات الإدخال والإخراج.

التخصيص

ينتج عن التطبيق المرجعي لمكتبة libtonemap نتائج مقبولة. ومع ذلك ، نظرًا لأن خوارزمية تعيين النغمة المستخدمة بواسطة تكوين وحدة معالجة الرسومات يمكن أن تختلف عن تلك المستخدمة بواسطة تكوين DPU ، فإن استخدام التنفيذ المرجعي يمكن أن يتسبب في حدوث وميض في بعض السيناريوهات مثل الرسوم المتحركة بالتناوب. يمكن أن يؤدي التخصيص إلى حل مشكلات جودة الصورة الخاصة بالبائع.

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

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

لا يحتاج البائعون إلى تعديل أي رمز kernel ، ولكن يجب على البائعين المتعددين إرسال تفاصيل حول خوارزميات تعيين نغمة DPU للتنفيذ المناسب.

تصديق

اتبع هذه الخطوات للتحقق من صحة التنفيذ الخاص بك:

  1. قم بتشغيل مقاطع فيديو HDR على شاشة أي معايير HDR يدعمها نظام العرض لديك ، مثل HLG أو HDR10 أو HDR10 + أو DolbyVision.

  2. قم بتبديل تكوين وحدة معالجة الرسومات لضمان عدم وجود وميض يمكن للمستخدم إدراكه.

    استخدم الأمر adb التالي لتبديل تكوين وحدة معالجة الرسومات:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

مشاكل شائعة

يمكن أن تحدث المشكلات التالية مع هذا التنفيذ:

  • يحدث التباين عندما يكون هدف التجسيد المستخدم بواسطة تكوين وحدة معالجة الرسومات أقل دقة من القيمة النموذجية لمحتوى HDR. على سبيل المثال ، يمكن أن يحدث النطاقات عندما يدعم تنفيذ HWC تنسيقات غير شفافة 10 بت لـ HDR مثل RGBA1010102 أو P010 ، ولكنه يتطلب أن يكتب تكوين GPU بتنسيق 8 بت مثل RGBA8888 لدعم ألفا.

  • يحدث التحول الدقيق في اللون بسبب اختلافات التكميم إذا كانت وحدة DPU تعمل بدقة مختلفة عن وحدة معالجة الرسومات.

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