نگاشت HDR Luminance به محدوده سازگار با SDR

اندروید ۱۳ یک کتابخانه استاتیک قابل تنظیم توسط فروشنده به نام libtonemap را معرفی می‌کند که عملیات نگاشت تُن را تعریف می‌کند و با فرآیند SurfaceFlinger و پیاده‌سازی‌های Hardware Composer (HWC) به اشتراک گذاشته می‌شود. این ویژگی به OEMها (سازندگان اصلی تجهیزات) امکان می‌دهد الگوریتم‌های نگاشت تُن نمایش خود را بین چارچوب و فروشندگان تعریف و به اشتراک بگذارند و عدم تطابق در نگاشت تُن را کاهش دهند.

قبل از اندروید ۱۳، عملیات نگاشت تُن مخصوص نمایشگر بین HWC، SurfaceFlinger و برنامه‌ها به اشتراک گذاشته نمی‌شد. بسته به مسیر رندر، برای محتوای HDR، این امر منجر به عدم تطابق در کیفیت تصویر می‌شد، جایی که محتوای HDR به روش‌های مختلف به فضای خروجی نگاشت تُن می‌شد. این امر در سناریوهایی مانند چرخش صفحه، جایی که استراتژی ترکیب بین GPU و DPU تغییر می‌کند، و در تفاوت‌های رفتار رندر بین TextureView و SurfaceView قابل درک بود.

این صفحه رابط کاربری، سفارشی‌سازی و جزئیات اعتبارسنجی کتابخانه libtonemap را شرح می‌دهد.

رابط کاربری کتابخانه نگاشت تُن

کتابخانه libtonemap شامل پیاده‌سازی‌های پشتیبانی‌شده توسط CPU و سایه‌زن‌های SkSL است که می‌توانند توسط SurfaceFlinger برای ترکیب GPU-backend و توسط HWC برای تولید جدول جستجوی نگاشت تُن (LUT) متصل شوند. نقطه ورود به libtonemap android::tonemap::getToneMapper() است که شیء‌ای را برمی‌گرداند که رابط ToneMapper را پیاده‌سازی می‌کند.

رابط ToneMapper از قابلیت‌های زیر پشتیبانی می‌کند:

  • یک LUT با نگاشت تُن صدا ایجاد کنید

    رابط ToneMapper::lookupTonemapGain یک پیاده‌سازی CPU از سایه‌زن تعریف شده در libtonemap_LookupTonemapGain() است. این رابط توسط تست‌های واحد در چارچوب استفاده می‌شود و می‌تواند توسط شرکا برای کمک به تولید یک LUT نگاشت تُن در داخل خط لوله رنگ آنها مورد استفاده قرار گیرد.

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

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

    رابط ToneMapper::generateTonemapGainShaderSkSL() یک رشته سایه‌زن SkSL را با توجه به فضای داده منبع و مقصد برمی‌گرداند. سایه‌زن SkSL به پیاده‌سازی Skia برای RenderEngine ، کامپوننت ترکیب شتاب‌یافته با GPU برای SurfaceFlinger، متصل است. این سایه‌زن همچنین به libhwui متصل است، به طوری که نگاشت تُن HDR به SDR می‌تواند به طور موثر برای TextureView انجام شود. از آنجا که رشته تولید شده در سایر سایه‌زن‌های SkSL مورد استفاده Skia قرار دارد، سایه‌زن باید از قوانین زیر پیروی کند:

    • رشته سایه‌زن باید یک نقطه ورودی با امضای float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) داشته باشد، که در آن linearRGB مقدار نیت‌های مطلق پیکسل‌های RGB در فضای خطی است و xyz linearRGB تبدیل شده به XYZ است.
    • هر متد کمکی که توسط رشته shader استفاده می‌شود باید با پیشوند رشته libtonemap_ شروع شود تا تعاریف shader فریم‌ورک با هم تداخل نداشته باشند. به طور مشابه، input uniforms باید با پیشوند in_libtonemap_ شروع شوند.
  • تولید یونیفرم‌های SkSL

    رابط ToneMapper::generateShaderSkSLUniforms() با دریافت یک struct فراداده که فراداده‌های استانداردهای HDR و شرایط نمایش مختلف را توصیف می‌کند، مقدار زیر را برمی‌گرداند:

    • فهرستی از یونیفرم‌هایی که توسط سایه‌زن SkSL محدود شده‌اند.

    • مقادیر یکنواخت in_libtonemap_displayMaxLuminance و in_libtonemap_inputMaxLuminance . این مقادیر توسط سایه‌زن‌های چارچوب هنگام مقیاس‌بندی ورودی به libtonemap و نرمال‌سازی خروجی در صورت لزوم استفاده می‌شوند.

    در حال حاضر فرآیند تولید یونیفرم‌ها مستقل از فضای داده ورودی و خروجی است.

سفارشی‌سازی

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

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

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

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

اعتبارسنجی

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

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

  2. ترکیب پردازنده گرافیکی را تغییر دهید تا مطمئن شوید هیچ لرزشی که کاربر متوجه شود، وجود ندارد.

    برای تغییر ترکیب پردازنده گرافیکی (GPU) از دستور adb زیر استفاده کنید:

    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 عمل کند، تغییر رنگ نامحسوس ناشی از تفاوت‌های کوانتیزاسیون است.

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