نگاشت رنگ‌مایه درخشندگی 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 پیاده‌سازی واحد پردازش مرکزی از سایه‌زن تعریف‌شده در libtonemap_LookupTonemapGain است. این مورد توسط آزمایش‌های واحد در چارچوب استفاده می‌شود، و شرکا می‌توانند از آن برای کمک به تولید جدول مراجعه نگاشت رنگ‌مایه در خط لوله رنگ خود استفاده کنند.

    libtonemap_LookupTonemapGain مقادیر رنگ را در فضای خطی مطلق و غیرنرمال‌شده، هم در RGB خطی و هم در XYZ، دریافت می‌کند و یک عدد اعشاری برمی‌گرداند که نشان می‌دهد رنگ‌های ورودی در فضای خطی باید در چه مقداری ضرب شوند.

  • تولید سایه‌زن SkSL

    واسط ToneMapper::generateTonemapGainShaderSkSL رشته سایه‌زن 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 نتایج قابل‌قبولی تولید می‌کند. بااین‌حال، ازآنجایی‌که الگوریتم نگاشت تن مورد استفاده در ترکیب GPU می‌تواند با الگوریتم مورد استفاده در ترکیب DPU متفاوت باشد، استفاده از پیاده‌سازی مرجع می‌تواند در برخی‌از سناریوها مانند پویانمایی چرخش باعث پرش شود. سفارشی‌سازی می‌تواند مشکلات کیفیت تصویر مختص فروشنده را حل کند.

به تولیدکنندگان اصلی سخت‌افزار قویاً توصیه می‌شود که پیاده‌سازی libtonemap را لغو کنند تا زیرکلاس ToneMapper خودشان را تعریف کنند که توسط getToneMapper برگردانده می‌شود. هنگام سفارشی‌سازی پیاده‌سازی، انتظار می‌رود شرکا یکی از موارد زیر را انجام دهند:

  • پیاده‌سازی libtonemap را مستقیماً اصلاح کنید.
  • کتابخانه ایستا خود را تعریف کنند، کتابخانه را به‌عنوان یک کتابخانه مستقل کامپایل کنند، و فایل .a کتابخانه libtonemap را با فایل تولیدشده از کتابخانه سفارشی خود جایگزین کنند.

تأمین‌کنندگان نیازی به تغییر کد هسته ندارند، اما چندین تأمین‌کننده باید جزئیات مربوط به الگوریتم‌های نگاشت تن DPU را برای پیاده‌سازی صحیح با یکدیگر مبادله کنند.

اعتبارسنجی

برای اعتبارسنجی پیاده‌سازی‌تان، این مراحل را دنبال کنید:

  1. ویدیوهای HDR را در صفحه‌نمایش با هر استاندارد HDR که سیستم نمایشگر پشتیبانی می‌کند پخش کنید، مانند HLG،‏ HDR10،‏ HDR10+‎، یا DolbyVision.

  2. ترکیب GPU را روشن/خاموش کنید تا مطمئن شوید که هیچ پرش قابل‌توجهی برای کاربر وجود ندارد.

    برای روشن/خاموش کردن ترکیب GPU، از فرمان adb زیر استفاده کنید:

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

مسائل رایج

مشکلات زیر ممکن است در این پیاده‌سازی رخ دهد:

  • نواربندی زمانی رخ می‌دهد که هدف رندر استفاده‌شده توسط ترکیب GPU از دقت کمتری نسبت‌به مقدار معمول برای محتوای HDR برخوردار باشد. برای مثال، زمانی که پیاده‌سازی HWC از قالب‌های ۱۰ بیتی مات برای HDR مانند RGBA1010102 یا P010 پشتیبانی می‌کند، اما برای پشتیبانی از آلفا، ترکیب GPU را ملزم می‌کند که در قالب ۸ بیتی مانند RGBA8888 بنویسد، ممکن است باندینگ رخ دهد.

  • اگر DPU با دقتی متفاوت از GPU کار کند، تفاوت‌های کمّی‌سازی باعث تغییر رنگ ظریفی می‌شود.

هرکدام از این مشکلات به تفاوت‌های دقت نسبی سخت‌افزار زیربنایی مربوط می‌شود. یک راه حل معمول این است که اطمینان حاصل شود که یک مرحله لرزش در مسیرهای با دقت پایین‌تر وجود دارد، که باعث می‌شود هرگونه تفاوت دقت کمتر برای انسان قابل درک باشد.