تعيين درجات سطوع HDR إلى نطاق متوافق مع SDR

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

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

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

واجهة مكتبة ربط درجات الألوان

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

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

  • إنشاء جدول بحث للتحويل اللوني

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

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

  • إنشاء برنامج تشويش SkSL

    تعرض الواجهة ToneMapper::generateTonemapGainShaderSkSL() سلسلة ملفّ shader لـ SkSL، استنادًا إلى مساحة بيانات المصدر والوجهة. يتم توصيل برنامج تشويش SkSL بتطبيق Skia لـ RenderEngine، وهو مكوّن الدمج المُسرَّع بوحدة معالجة الرسومات لـ 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 نتائج مقبولة. ومع ذلك، لأنّ خوارزمية ربط الألوان المستخدَمة في تركيبة وحدة معالجة الرسومات يمكن أن تختلف عن تلك المستخدَمة في تركيبة وحدة معالجة البيانات، يمكن أن يؤدي استخدام التنفيذ المرجعي إلى وميض في بعض السيناريوهات، مثل الصور المتحركة للّوائح. يمكن أن يؤدي التخصيص إلى حلّ هذه المشاكل المتعلّقة بجودة الصور والتي تخصّ المورّد.

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

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

لا يحتاج المورّدون إلى تعديل أي رمز نواة، ولكن على مورّدين متعدّدين إعلامهم بتفاصيل حول خوارزميات تحويل النغمات في وحدة معالجة البيانات (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 بت غير شفافة لميزة "النطاق العالي الديناميكية"، مثل RGBA1010102 أو P010، ولكنّه يتطلّب أن تكتب تركيبة وحدة معالجة الرسومات تنسيقًا 8 بت مثل RGBA8888 لتتوافق مع قناة ألفا.

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

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