يقدّم نظام التشغيل Android 13 مكتبة ثابتة يمكن للمورّد ضبطها باسم libtonemap
، وهي تحدّد عمليات ربط الدرجات اللونية ويتم مشاركتها مع عملية SurfaceFlinger وعمليات تنفيذ Hardware Composer (HWC).
تتيح هذه الميزة لمصنّعي المعدات الأصلية تحديد ومشاركة خوارزميات تعيين درجات الألوان على الشاشة بين إطار العمل والمورّدين، ما يقلّل من عدم تطابق تعيين درجات الألوان.
قبل الإصدار 13 من نظام التشغيل Android، لم تكن عمليات ربط الألوان الخاصة بالشاشة تتم مشاركتها بين HWC وSurfaceFlinger والتطبيقات. واستنادًا إلى مسار العرض، أدّى ذلك إلى حدوث اختلافات في جودة الصورة عند عرض محتوى HDR، حيث تم تحويل درجات الألوان في محتوى HDR إلى مساحة إخراج بطرق مختلفة. كان هذا التأخير ملحوظًا في سيناريوهات مثل تدوير الشاشة، حيث تتغير استراتيجية التركيب بين وحدة معالجة الرسومات ووحدة معالجة العرض، وفي الاختلافات في سلوك العرض بين TextureView وSurfaceView.
توضّح هذه الصفحة تفاصيل الواجهة والتخصيص والتحقّق الخاصة بمكتبة
libtonemap
.
واجهة مكتبة تعيين الدرجات اللونية
تحتوي مكتبة libtonemap
على عمليات تنفيذ مستندة إلى وحدة المعالجة المركزية (CPU) وتظليلات SkSL، ويمكن أن يضيفها SurfaceFlinger لإنشاء تركيبة مستندة إلى وحدة معالجة الرسومات (GPU)، ويمكن أن تضيفها HWC لإنشاء جدول بحث (LUT) لربط الدرجات اللونية. نقطة الدخول إلى libtonemap
هي android::tonemap::getToneMapper()
، التي تعرض عنصرًا
ينفّذ الواجهة ToneMapper
.
تتيح واجهة ToneMapper
الإمكانات التالية:
إنشاء جدول بحث لضبط درجة اللون
الواجهة
ToneMapper::lookupTonemapGain
هي تنفيذ لوحدة المعالجة المركزية (CPU) لبرنامج تظليل محدّد فيlibtonemap_LookupTonemapGain()
. يتم استخدام هذا الخيار من خلال اختبارات الوحدة في إطار العمل، ويمكن أن يستخدمه الشركاء للمساعدة في إنشاء جدول بحث لضبط درجة اللون داخل مسار الألوان.تتلقّى
libtonemap_LookupTonemapGain()
قيم الألوان في مساحة خطية مطلقة وغير عادية، سواء في نموذج الأحمر والأخضر والأزرق الخطي أو في نموذج XYZ، وتعرض عددًا عشريًا يوضّح مقدار مضاعفة الألوان المُدخَلة في المساحة الخطية.إنشاء برنامج تظليل SkSL
تعرض الواجهة
ToneMapper::generateTonemapGainShaderSkSL()
سلسلة تظليل SkSL، مع توفّر مساحة بيانات المصدر والوجهة. يتم توصيل برنامج تظليل SkSL بتنفيذ Skia فيRenderEngine
، وهو مكوّن التركيب المسرَّع بواسطة وحدة معالجة الرسومات في SurfaceFlinger. يتم أيضًا توصيل برنامج التظليل بـlibhwui
، بحيث يمكن إجراء عملية مطابقة الألوان من النطاق العالي الديناميكية إلى النطاق العادي الديناميكية بكفاءة في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
مباشرةً - تحديد مكتبتهم الثابتة الخاصة، وتجميع المكتبة كوحدة مستقلة، واستبدال ملف
.a
الخاص بمكتبةlibtonemap
بالملف الذي تم إنشاؤه من مكتبتهم المخصّصة
لا يحتاج المورّدون إلى تعديل أي رمز نواة، ولكن يجب أن يتبادل المورّدون المتعدّدون تفاصيل حول خوارزميات ربط الدرجات اللونية في وحدة معالجة البيانات (DPU) من أجل التنفيذ السليم.
التحقُّق
اتّبِع الخطوات التالية للتحقّق من صحة عملية التنفيذ:
تشغيل فيديوهات HDR على شاشة تتوافق مع أي من معايير HDR التي يدعمها نظام العرض، مثل HLG أو HDR10 أو HDR10+ أو DolbyVision
فعِّل ميزة "التركيب باستخدام وحدة معالجة الرسومات" لضمان عدم حدوث أي وميض ملحوظ للمستخدم.
استخدِم الأمر
adb
التالي لتفعيل ميزة "التركيب باستخدام وحدة معالجة الرسومات" أو إيقافها:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
المشاكل الشائعة
يمكن أن تحدث المشاكل التالية عند استخدام طريقة التنفيذ هذه:
يحدث التقطيع عندما تكون دقة هدف العرض الذي تستخدمه عملية التركيب في وحدة معالجة الرسومات أقل من القيمة النموذجية لمحتوى HDR. على سبيل المثال، يمكن أن يحدث التدرّج غير المنتظم للألوان عندما يتيح تنفيذ HWC تنسيقات 10 بت غير شفافة لنطاق HDR، مثل RGBA1010102 أو P010، ولكن يتطلّب أن تكتب تركيبة وحدة معالجة الرسومات بتنسيق 8 بت، مثل RGBA8888، لتوفير قناة ألفا.
يحدث تغيير طفيف في الألوان بسبب اختلافات التكميم إذا كانت وحدة معالجة البيانات (DPU) تعمل بدقة مختلفة عن وحدة معالجة الرسومات (GPU).
ترتبط كل مشكلة من هذه المشاكل باختلافات الدقة النسبية للأجهزة الأساسية. ويتم عادةً حل هذه المشكلة من خلال التأكّد من توفّر خطوة تمويه في مسارات الدقة المنخفضة، ما يجعل أي اختلافات في الدقة أقل وضوحًا بالنسبة إلى العين البشرية.