تراتبدیل رسانه سازگار

تراتبدیل رسانه سازگار که در Android 12 معرفی شد، ویژگی‌ای است که به دستگاه‌ها امکان می‌دهد از قالب‌های رسانه‌ای مدرن‌تر و کارآمدتر برای ذخیره‌سازی در ضبط ویدیو، مثل HEVC، استفاده کنند و درعین‌حال با برنامه‌ها سازگار باشند. با این ویژگی، سازندگان دستگاه می‌توانند به‌طور پیش‌فرض از HEVC به‌جای AVC استفاده کنند تا کیفیت ویدیو را بهبود بخشند و درعین‌حال نیاز به فضای ذخیره‌سازی و پهنای باند را کاهش دهند. برای دستگاه‌هایی که تراتبدیل رسانه سازگار در آن‌ها فعال است، Android می‌تواند ویدیوهای ضبط‌شده در قالب‌هایی مثل HEVC یا HDR را (تا یک دقیقه) به‌طور خودکار تبدیل کند، وقتی که ویدیوها توسط برنامه‌ای باز می‌شوند که از آن قالب پشتیبانی نمی‌کند. این کار به برنامه‌ها اجازه می‌دهد حتی وقتی ویدیوها در قالب‌های جدیدتر در دستگاه ضبط می‌شوند، کار کنند.

ویژگی تراتبدیل رسانه سازگار به‌طور پیش‌فرض خاموش است. برای درخواست تراتبدیل رسانه، برنامه‌ها باید قابلیت‌های رسانه‌ای خود را اعلام کنند. برای کسب اطلاعات بیشتر درباره اعلام قابلیت‌های رسانه، تراتبدیل رسانه سازگار در سایت «توسعه‌دهندگان Android» را ببینید.

روش کار

ویژگی تراتبدیل رسانه سازگار از دو بخش اصلی تشکیل شده است:

  • خدمات تراتبدیل در چارچوب رسانه: این خدمات فایل‌ها را بااستفاده از سخت‌افزار از قالبی به قالب دیگر تبدیل می‌کنند تا تأخیر کم و تبدیل با کیفیت بالا داشته باشند. این شامل API تراتبدیل، سرویس تراتبدیل، افزایه OEM برای فیلترهای سفارشی، و سخت‌افزار می‌شود. برای جزئیات بیشتر، به نمای کلی معماری مراجعه کنید.
  • ویژگی تراتبدیل رسانه سازگار در ارائه‌دهندگان رسانه: این مؤلفه که در ارائه‌دهندگان رسانه یافت می‌شود، برنامه‌هایی را که به فایل‌های رسانه دسترسی دارند رهگیری می‌کند و براساس قابلیت‌های اعلام‌شده برنامه، فایل اصلی یا فایل تراتبدیل‌شده را ارائه می‌دهد. اگر برنامه‌ای از قالب فایل رسانه پشتیبانی کند، نیاز به پردازش ویژه نیست. اگر برنامه‌ای از این قالب پشتیبانی نکند، وقتی برنامه به فایل دسترسی پیدا می‌کند، چارچوب فایل را به قالب قدیمی‌تری مثل AVC تبدیل می‌کند.

شکل ۱ نمای کلی فرایند تراتبدیل رسانه را نشان می‌دهد.

فرایند تراتبدیل رسانه سازگار

شکل ۱. نمای کلی تراتبدیل رسانه‌های سازگار.

قالب‌های پشتیبانی‌شده

ویژگی تراتبدیل رسانه سازگار از تبدیل‌های قالب زیر پشتیبانی می‌کند:

  • HEVC (8-bit) به AVC: تبدیل کدک ازطریق اتصال یک کدبند رسانه‌ای و یک کدبند رسانه‌ای انجام می‌شود.
  • ‫HDR10+‎ (‏۱۰ بیتی) به AVC (SDR): تبدیل‌های HDR به SDR بااستفاده از نمونه‌های mediacodec و یک افزایه فروشنده به نمونه‌های کدبند انجام می‌شود. برای اطلاعات بیشتر، به کدبندی HDR به SDR مراجعه کنید.

منابع محتوای پشتیبانی‌شده

ویژگی تراتبدیل رسانه سازگار از رسانه تولیدشده در دستگاه توسط برنامه دوربین OEM بومی که در پوشه DCIM/Camera/ در حجم خارجی اصلی ذخیره شده است پشتیبانی می‌کند. این ویژگی از رسانه در فضای ذخیره‌سازی ثانویه پشتیبانی نمی‌کند. محتوایی که ازطریق ایمیل یا کارت SD به دستگاه‌ها منتقل می‌شود پشتیبانی نمی‌شود.

برنامه‌ها براساس مسیرهای فایل مختلف به فایل‌ها دسترسی پیدا می‌کنند. در زیر مسیرهای فایل که در آن‌ها تراتبدیل فعال یا دور زده می‌شود توضیح داده شده است:

  • تراتبدیل فعال شد:

    • دسترسی برنامه ازطریق میاناهای برنامه‌سازی کاربردی MediaStore
    • دسترسی برنامه ازطریق میاناهای برنامه‌سازی کاربردی مسیر فایل مستقیم ازجمله Java و کد بومی
    • دسترسی برنامه ازطریق «چارچوب دسترسی به فضای ذخیره‌سازی» (SAF)
    • دسترسی برنامه ازطریق «هدف‌های برگ هم‌رسانی سیستم‌عامل». (فقط نشانی وب MediaStore)
    • انتقال فایل MTP/PTP از تلفن به رایانه
  • تراتبدیل دور زده شد:

    • انتقال فایل از دستگاه با بیرون آوردن کارت SD
    • انتقال فایل از دستگاهی به دستگاه دیگر بااستفاده از گزینه‌هایی مثل «هم‌رسانی با اطراف» یا انتقال ازطریق بلوتوث.

افزودن مسیرهای فایل سفارشی برای تراتبدیل

تولیدکنندگان دستگاه می‌توانند به‌صورت اختیاری مسیرهای فایل را برای تراتبدیل رسانه در دایرکتوری DCIM/ اضافه کنند. هر مسیری خارج از فهرست راهنمای DCIM/ رد می‌شود. افزودن این مسیرهای فایل ممکن است برای برآورده کردن الزامات شرکت مخابراتی یا مقررات محلی لازم باشد.

برای افزودن مسیر فایل، از مسیر تراتبدیل رونوشت منبع زمان اجرا (RRO)، config_supported_transcoding_relative_paths استفاده کنید. در زیر نمونه‌ای از نحوه افزودن مسیر فایل آمده است:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

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

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

نمای کلی معماری

این بخش معماری ویژگی تراتبدیل رسانه را شرح می‌دهد.

معماری تراتبدیل رسانه

شکل ۲. معماری تراتبدیل رسانه.

معماری تراتبدیل رسانه از مؤلفه‌های زیر تشکیل شده است:

  • میانای برنامه‌سازی کاربردی سیستم MediaTranscodingManager: رابطی که به کارخواه اجازه می‌دهد با سرویس MediaTranscoding ارتباط برقرار کند. واحد MediaProvider از این API استفاده می‌کند.
  • MediaTranscodingService: سرویس بومی که اتصالات کارخواه را مدیریت می‌کند، درخواست‌های تراتبدیل را زمان‌بندی می‌کند، و دفترداری را برای TranscodingSessions مدیریت می‌کند.
  • MediaTranscoder: کتابخانه بومی که تراتبدیل را انجام می‌دهد. این کتابخانه روی چارچوب رسانه NDK ساخته شده است تا با واحدها سازگار باشد.

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

دسترسی به فایل

تراتبدیل رسانه سازگار برپایه سیستم فایل در فضای کاربر (FUSE) ساخته شده است، که برای فضای ذخیره‌سازی محدودشده استفاده می‌شود. ‫FUSE به واحد MediaProvider امکان می‌دهد عملکرد فایل‌ها را در فضای کاربر بررسی کند و دسترسی به فایل‌ها را براساس خط‌مشی اجازه دادن، رد کردن، یا محو کردن دسترسی کنترل کند.

وقتی برنامه‌ای تلاش می‌کند به فایلی دسترسی پیدا کند، کارگزار FUSE دسترسی خواندن فایل از برنامه را رهگیری می‌کند. اگر برنامه از قالب جدیدتری (مثل HEVC) پشتیبانی کند، فایل اصلی برگردانده می‌شود. اگر برنامه از این قالب پشتیبانی نکند، فایل به قالب قدیمی‌تری (مانند AVC) تراتبدیل می‌شود یا اگر نسخه تراتبدیل‌شده‌ای دردسترس باشد، از حافظه نهان برگردانده می‌شود.

درخواست فایل‌های تراتبدیل‌شده

ویژگی تراتبدیل رسانه سازگار به‌طور پیش‌فرض غیرفعال است. برنامه‌ها می‌توانند بااستفاده از گزینه‌های زیر، دارایی‌های تراتبدیل‌شده را درخواست کنند:

  • قالب‌های پشتیبانی‌نشده را در فایل مانیفست اعلام کنید. برای جزئیات، به اعلام قابلیت‌ها در منبع و اعلام قابلیت‌ها در کد مراجعه کنید.
  • قالب‌های پشتیبانی‌شده را با چارچوب سازگاری برنامه در زمان اجرا غیرفعال کنید (کاربران همچنین می‌توانند این ویژگی را برای هر برنامه در «تنظیمات» غیرفعال کنند).
  • فایلی را با MediaStore باز کنید و درعین‌حال قالب‌های پشتیبانی‌نشده را به‌طور صریح با openTypedAssetFileDescriptor API مشخص کنید.

برای انتقال USB (دستگاه به رایانه)، کدبندی تراتبدیل به‌طور پیش‌فرض غیرفعال است اما کاربران می‌توانند بااستفاده از کلید تبدیل ویدیوها به AVC در صفحه تنظیمات تنظیمات برگزیده USB، همان‌طور که در «شکل ۳» نشان داده شده است، کدبندی تراتبدیل را فعال کنند.

کلید تغییر وضعیت برای فعال کردن تراتبدیل رسانه

شکل ۳. برای فعال کردن تراتبدیل رسانه در صفحه «تنظیمات برگزیده USB»، کلید تغییر وضعیت را روشن کنید.

محدودیت‌های درخواست فایل‌های تراتبدیل‌شده

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

  • ‫۱۰ جلسه متوالی
  • مجموع زمان اجرا سه دقیقه

اگر برنامه‌ای از همه این محدودیت‌ها فراتر رود، چارچوب توصیفگر فایل اصلی را برمی‌گرداند.

پیش‌نیازهای دستگاه

برای پشتیبانی از ویژگی تراتبدیل رسانه سازگار، دستگاه‌ها باید الزامات زیر را برآورده کنند:

  • دستگاه به‌طور پیش‌فرض کدبندی HEVC را در برنامه دوربین بومی فعال کرده است
  • (دستگاه‌هایی که از تراتبدیل HDR به SDR پشتیبانی می‌کنند) دستگاه از ضبط ویدیو HDR پشتیبانی می‌کند

برای اطمینان از عملکرد دستگاه برای تراتبدیل رسانه، عملکرد دسترسی خواندن/نوشتن سخت‌افزار ویدیو و فضای ذخیره‌سازی باید بهینه شود. وقتی کدک‌های رسانه با اولویت برابر با 1 پیکربندی می‌شوند، کدک‌ها باید با بالاترین توان عملیاتی ممکن کار کنند. توصیه می‌کنیم که عملکرد تراتبدیل به حداقل ۲۰۰ فریم در ثانیه برسد. برای آزمایش عملکرد سخت‌افزار، معیار سنجش تراتبدیل رسانه را در frameworks/av/media/libmediatranscoding/transcoder/benchmark اجرا کنید.

اعتبارسنجی

برای اعتبارسنجی ویژگی تراتبدیل رسانه سازگار، آزمون‌های CTS زیر را اجرا کنید:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

فعال کردن تراتبدیل رسانه در سطح جهانی

برای آزمایش چارچوب تراتبدیل رسانه یا عملکرد برنامه با تراتبدیل، می‌توانید ویژگی تراتبدیل رسانه سازگار را به‌صورت سراسری فعال یا غیرفعال کنید. در صفحه گزینه‌های توسعه‌دهندگان تنظیمات > سیستم > توسعه‌دهندگان > تراتبدیل رسانه، کلید لغو پیش‌فرض‌های تراتبدیل را روی روشن تنظیم کنید و سپس کلید فعال کردن تراتبدیل را روی روشن یا خاموش تنظیم کنید. اگر این تنظیم فعال باشد، تراتبدیل رسانه ممکن است در پس‌زمینه برای برنامه‌هایی غیراز برنامه‌ای که درحال توسعه آن هستید رخ دهد.

بررسی وضعیت تراتبدیل

درطول آزمایش، می‌توانید از دستور پوسته ADB زیر برای بررسی وضعیت تراتبدیل، ازجمله جلسات تراتبدیل فعلی و گذشته، استفاده کنید:

adb shell dumpsys media.transcoding

افزایش محدودیت طول ویدیو

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

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

منبع و مراجع AOSP

در زیر کد منبع AOSP مربوط به تراتبدیل رسانه سازگار ارائه شده است.

کدبندی HDR به SDR

برای پشتیبانی از کدبندی HDR به SDR، سازندگان دستگاه می‌توانند از افزایه فیلتر نمونه AOSP Codec 2.0 واقع در /platform/frameworks/av/media/codec2/hidl/plugin/ استفاده کنند. این بخش نحوه عملکرد افزایه فیلتر، نحوه پیاده‌سازی افزایه، و نحوه آزمایش افزایه را شرح می‌دهد.

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

روش کار

این بخش رفتار کلی افزایه فیلتر Codec 2.0 را توضیح می‌دهد.

پس‌زمینه

‫Android پیاده‌سازی لایه سازگاری بین میانای Codec 2.0 و میانای android.hardware.media.c2 HAL در android::hardware::media::c2 ارائه می‌دهد. برای افزایه‌های فیلتر، AOSP شامل یک سازوکار پوشاننده است که رمزگشاها را همراه با افزایه‌های فیلتر می‌پوشاند. MediaCodec این عناصر پیچیده‌شده را به‌عنوان کدبند با ویژگی‌های فیلتر کردن تشخیص می‌دهد.

نمای کلی

کلاس FilterWrapper کدک‌های فروشنده را می‌گیرد و کدک‌های پیچیده‌شده را به لایه سازگاری media.c2 برمی‌گرداند. کلاس FilterWrapper ‫libc2filterplugin.so را ازطریق میانای برنامه‌سازی کاربردی FilterWrapper::Plugin بار می‌کند و فیلترهای دردسترس را از افزایه ضبط می‌کند. در زمان ایجاد، FilterWrapper همه فیلترهای دردسترس را نمونه‌سازی می‌کند. فقط فیلترهایی که میان‌گیر را تغییر می‌دهند در شروع آغاز می‌شوند.

معماری افزایه فیلتر

شکل ۴. معماری افزایه فیلتر.

میانای افزایه فیلتر

رابط FilterPlugin.h میاناهای برنامه‌سازی کاربردی زیر را برای نمایش فیلترها تعریف می‌کند:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    یک شیء C2ComponentStore را که حاوی فیلترها است برمی‌گرداند. این مورد از آنچه پیاده‌سازی Codec 2.0 فروشنده نشان می‌دهد جدا است. معمولاً این فروشگاه فقط شامل فیلترهای استفاده‌شده توسط کلاس FilterWrapper است.

  • bool describe(C2String name, Descriptor *desc)

    فیلترها را علاوه‌بر آنچه در C2ComponentStore دردسترس است توصیف می‌کند. شرح‌های زیر تعریف شده است:

    • ‫controlParam: پارامترهایی که رفتار فیلترها را کنترل می‌کنند. برای مثال، برای نگاشت‌گر رنگ HDR به SDR، پارامتر کنترل تابع انتقال هدف است.
    • ‫affectedParams: پارامترهایی که تحت‌تأثیر عملیات فیلتر کردن قرار می‌گیرند. برای مثال، برای نگاشت‌کننده رنگ HDR به SDR، پارامترهای تحت‌تأثیر جنبه‌های رنگ هستند.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    اگر عنصر فیلتر بافر را تغییر دهد، true را برمی‌گرداند. برای مثال، اگر تابع انتقال هدف SDR باشد و تابع انتقال ورودی HDR (HLG یا PQ) باشد، فیلتر نگاشت تن true را برمی‌گرداند.

جزئیات FilterWrapper

این بخش جزئیات کلاس FilterWrapper را شرح می‌دهد.

تاریخ ایجاد

مؤلفه پیچیده شده، رمزگشای زیرین و همه فیلترهای تعریف‌شده را در زمان ایجاد نمونه‌سازی می‌کند.

پُرسمان و پیکربندی

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

پُرسمان و پیکربندی

شکل ۵. پُرسمان و پیکربندی.

شروع

در شروع، عنصر پیچیده‌شده رمزگشا و همه فیلترهایی را که بافرهای تغییر می‌دهند شروع می‌کند. اگر هیچ فیلتری فعال نباشد، عنصر بسته‌بندی‌شده رمزگشا را شروع می‌کند و بافرها را عبور می‌دهد و فرمان‌ها را به خود رمزگشا ارسال می‌کند.

مدیریت میان‌گیری

مدیریت میان‌گیری

شکل ۶. مدیریت میان‌گیر.

میان‌گیرهای صف‌شده به کدبند پیچیده به کدبند زیرین می‌روند. مؤلفه پیچیده شده میان‌گیر خروجی را ازطریق فراخوانی برگشتی onWorkDone_nb() از رمزگشا می‌گیرد و سپس آن را در صف فیلترها قرار می‌دهد. بافر برونداد نهایی از آخرین فیلتر به کارخواه گزارش می‌شود.

برای اینکه این مدیریت میان‌گیر کار کند، عنصر پیچیده‌شده باید C2PortBlockPoolsTuning را برای آخرین فیلتر پیکربندی کند تا چارچوب میان‌گیرهای برونداد را از استخر بلوک موردانتظار تولید کند.

توقف، بازنشانی، و رها کردن

در توقف، عنصر پیچیده‌شده رمزگشا و همه فیلترهای فعال‌شده‌ای را که شروع شده بودند متوقف می‌کند. در بازنشانی و انتشار، همه عناصر بازنشانی یا منتشر می‌شوند صرف‌نظر از اینکه فعال باشند یا نه.

پیاده‌سازی افزایه فیلتر نمونه

برای فعال کردن افزایه، مراحل زیر را انجام دهید:

  1. واسط FilterPlugin را در کتابخانه پیاده‌سازی کنید و آن را در /vendor/lib[64]/libc2filterplugin.so. رها کنید
  2. درصورت نیاز، اجازه‌های بیشتری به mediacodec.te اضافه کنید.
  3. لایه سازگاری را به Android 12 به‌روزرسانی کنید و سرویس media.c2 را بازسازی کنید.

آزمایش افزایه

برای آزمایش افزایه نمونه، مراحل زیر را انجام دهید:

  1. دستگاه را بازسازی و فلش کنید.
  2. افزونه نمونه را بااستفاده از فرمان زیر بسازید:

    m sample-codec2-filter-plugin
    
  3. دستگاه را مجدداً نصب کنید و افزایه فروشنده را تغییر نام دهید تا توسط سرویس کدک شناسایی شود.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot