تحويل سطوع النطاق العالي الديناميكية (HDR) إلى نطاق متوافق مع النطاق العادي الديناميكية (SDR)

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

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

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

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

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

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

  • إنشاء جدول بحث عن تدرّج الألوان

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

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

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

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

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