Transcoding media yang kompatibel

Transcoding media yang kompatibel, yang diperkenalkan di Android 12, adalah fitur yang memungkinkan perangkat menggunakan format media yang lebih modern dan menghemat penyimpanan untuk perekaman video, seperti HEVC, sekaligus mempertahankan kompatibilitas dengan aplikasi. Dengan fitur ini, produsen perangkat dapat menggunakan HEVC, bukan AVC, secara default untuk meningkatkan kualitas video sekaligus mengurangi persyaratan penyimpanan dan bandwidth. Untuk perangkat yang mengaktifkan transcoding media yang kompatibel, Android dapat otomatis mengonversi video (berdurasi hingga satu menit) yang direkam dalam format seperti HEVC atau HDR saat video dibuka oleh aplikasi yang tidak mendukung format tersebut. Hal ini memungkinkan aplikasi berfungsi meskipun video direkam dalam format yang lebih baru di perangkat.

Fitur transcoding media yang kompatibel dinonaktifkan secara default. Untuk meminta transcoding media, aplikasi harus mendeklarasikan kemampuan medianya. Untuk informasi selengkapnya tentang mendeklarasikan kemampuan media, lihat Transcoding media yang kompatibel di situs Android Developers.

Cara kerjanya

Fitur transcoding media yang kompatibel terdiri dari dua bagian utama:

  • Layanan transcoding dalam framework media: Layanan ini mengonversi file dari satu format ke format lain menggunakan hardware untuk latensi rendah dan konversi berkualitas tinggi. Hal ini mencakup API transcoding, layanan transcoding, plugin OEM untuk filter kustom, dan hardware. Untuk mengetahui detail selengkapnya, lihat Ringkasan arsitektur.
  • Fitur transcoding media yang kompatibel di penyedia media: Komponen ini yang ditemukan di penyedia media mencegat aplikasi yang mengakses file media dan menayangkan file asli atau file yang ditranscoding berdasarkan kemampuan yang dideklarasikan aplikasi. Jika aplikasi mendukung format file media, tidak perlu penanganan khusus. Jika aplikasi tidak mendukung format tersebut, framework akan mengonversi file ke format yang lebih lama, seperti AVC, saat aplikasi mengakses file tersebut.

Gambar 1 menunjukkan ringkasan proses transcoding media.

Proses transcoding media yang kompatibel

Gambar 1. Ringkasan transcoding media yang kompatibel.

Format yang didukung

Fitur transcoding media yang kompatibel mendukung konversi format berikut:

  • HEVC (8-bit) ke AVC: Konversi codec dilakukan melalui menghubungkan satu decoder mediacodec dan satu encoder mediacode.
  • HDR10+ (10-bit) ke AVC (SDR): Konversi HDR ke SDR dilakukan menggunakan instance mediacodec dan hook plugin vendor ke instance decoder. Untuk mengetahui informasi selengkapnya, lihat encoding HDR ke SDR.

Sumber konten yang didukung

Fitur transcoding media yang kompatibel mendukung media di perangkat yang dihasilkan oleh aplikasi kamera OEM native yang disimpan di folder DCIM/Camera/ di volume eksternal utama. Fitur ini tidak mendukung media di penyimpanan sekunder. Konten yang diteruskan ke perangkat melalui email atau kartu SD tidak didukung.

Aplikasi mengakses file berdasarkan berbagai jalur file. Berikut adalah jalur file tempat transcoding diaktifkan atau diabaikan:

  • Transcoding diaktifkan:

    • Akses aplikasi melalui MediaStore API
    • Akses aplikasi melalui API jalur file langsung termasuk kode Java dan native
    • Akses aplikasi melalui Storage Access Framework (SAF)
    • Akses aplikasi melalui Intent sheet berbagi OS. (Khusus URI MediaStore)
    • Transfer file MTP/PTP dari ponsel ke PC
  • Transcoding diabaikan:

    • Mentransfer file dari perangkat dengan mengeluarkan kartu SD
    • Mentransfer file dari perangkat ke perangkat menggunakan opsi seperti Berbagi Langsung atau transfer Bluetooth.

Menambahkan jalur file yang disesuaikan untuk transcoding

Produsen perangkat dapat secara opsional menambahkan jalur file untuk transcoding media di direktori DCIM/. Jalur apa pun di luar direktori DCIM/ akan ditolak. Menambahkan jalur file tersebut mungkin diperlukan untuk memenuhi persyaratan operator atau peraturan lokal.

Untuk menambahkan jalur file, gunakan jalur transcoding runtime resource overlay (RRO), config_supported_transcoding_relative_paths. Berikut adalah contoh cara menambahkan jalur file:

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

Untuk memverifikasi jalur file yang dikonfigurasi, gunakan:

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

Ringkasan arsitektur

Bagian ini menjelaskan arsitektur fitur transcoding media.

media-transcoding-architecture

Gambar 2. Arsitektur transcoding media.

Arsitektur transcoding media terdiri dari komponen berikut:

  • MediaTranscodingManager system API: Antarmuka yang memungkinkan klien berkomunikasi dengan layanan MediaTranscoding. Modul MediaProvider menggunakan API ini.
  • MediaTranscodingService: Layanan native yang mengelola koneksi klien, menjadwalkan permintaan transcoding, dan mengelola pembukuan untuk TranscodingSessions.
  • MediaTranscoder: Library native yang menjalankan transcoding. Library ini dibuat di atas NDK framework media agar kompatibel dengan modul.

Fitur transcoding media yang kompatibel mencatat metrik transcoding di layanan dan transcoder media. Sisi klien dan kode sisi layanan ada dalam modul MediaProvider untuk memungkinkan perbaikan bug dan update yang tepat waktu.

Akses file

Transcoding media yang kompatibel di-build di atas Sistem file di sistem file Userspace (FUSE), yang digunakan untuk penyimpanan terbatas. FUSE memungkinkan modul MediaProvider untuk memeriksa operasi file di ruang pengguna dan membatasi akses ke file berdasarkan kebijakan untuk mengizinkan, menolak, atau menyamarkan akses.

Saat aplikasi mencoba mengakses file, daemon FUSE akan mencegat akses baca file dari aplikasi. Jika aplikasi mendukung format yang lebih baru (seperti HEVC), file asli akan ditampilkan. Jika aplikasi tidak mendukung format ini, file akan di-transcoding ke format yang lebih lama (seperti AVC) atau ditampilkan dari cache jika versi yang di-transcoding tersedia.

Meminta file yang ditranskode

Fitur transcoding media yang kompatibel dinonaktifkan secara default, yang berarti bahwa jika perangkat mendukung HEVC, Android tidak akan mentranskode file kecuali jika ditentukan oleh aplikasi dalam file manifes atau dalam daftar transcoding paksa.

Aplikasi dapat meminta aset yang ditranskode menggunakan opsi berikut:

  • Mendeklarasikan format yang tidak didukung dalam file manifes. Untuk mengetahui detailnya, lihat Mendeklarasikan kemampuan dalam resource dan Mendeklarasikan kemampuan dalam kode.
  • Tambahkan aplikasi ke daftar transkode paksa yang disertakan dalam modul MediaProvider. Hal ini memungkinkan transcoding untuk aplikasi yang belum memperbarui file manifesnya. Setelah aplikasi mengupdate file manifesnya dengan format yang tidak didukung, aplikasi harus dihapus dari daftar transcoding paksa. Produsen perangkat dapat menominasikan aplikasi mereka untuk ditambahkan atau dihapus dari daftar transcoding paksa dengan mengirimkan patch atau dengan melaporkan bug. Tim Android secara berkala meninjau daftar dan dapat menghapus aplikasi dari daftar.
  • Nonaktifkan format yang didukung dengan framework kompatibilitas aplikasi saat runtime (pengguna juga dapat menonaktifkannya untuk setiap aplikasi di Setelan).
  • Buka file dengan MediaStore sambil secara eksplisit menentukan format yang tidak didukung dengan openTypedAssetFileDescriptor API.

Untuk transfer USB (perangkat ke PC), transcoding dinonaktifkan secara default, tetapi pengguna dapat memilih untuk mengaktifkan transcoding menggunakan tombol Konversi video ke AVC di layar setelan USB Preferences seperti yang ditunjukkan pada Gambar 3.

Tombol untuk mengaktifkan transcoding media

Gambar 3. Klik tombol untuk mengaktifkan transcoding media di layar Preferensi USB.

Batasan untuk meminta file yang ditranskode

Untuk mencegah permintaan transcoding mengunci resource sistem dalam jangka waktu yang lama, aplikasi yang meminta sesi transcoding dibatasi pada:

  • 10 sesi berturut-turut
  • total waktu berjalan selama tiga menit

Jika aplikasi melebihi semua batasan ini, framework akan menampilkan deskripsi file asli.

Persyaratan perangkat

Untuk mendukung fitur transcoding media yang kompatibel, perangkat harus memenuhi persyaratan berikut:

  • Perangkat mengaktifkan encoding HEVC secara default pada aplikasi kamera native
  • (Perangkat yang mendukung transcoding HDR ke SDR) Perangkat mendukung perekaman video HDR

Untuk memastikan performa perangkat untuk transcoding media, performa akses baca/tulis hardware video dan penyimpanan harus dioptimalkan. Jika codec media dikonfigurasi dengan prioritas yang sama dengan 1, codec harus beroperasi pada throughput setinggi mungkin. Sebaiknya performa transcoding mencapai minimal 200 fps. Untuk menguji performa hardware, jalankan benchmark transcoder media di frameworks/av/media/libmediatranscoding/transcoder/benchmark.

Validasi

Untuk memvalidasi fitur transcoding media yang kompatibel, jalankan pengujian CTS berikut:

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

Mengaktifkan transcoding media secara global

Untuk menguji framework transcoding media atau perilaku aplikasi dengan transcoding, Anda dapat mengaktifkan atau menonaktifkan fitur transcoding media yang kompatibel secara global. Di halaman opsi developer Setelan > Sistem > Developer > Transcoding media, setel tombol Ganti transcoding default ke aktif, lalu setel tombol Aktifkan transcoding ke aktif atau nonaktif. Jika setelan ini diaktifkan, transcoding media mungkin terjadi di latar belakang untuk aplikasi selain yang Anda kembangkan.

Memeriksa status transcoding

Selama pengujian, Anda dapat menggunakan perintah shell ADB berikut untuk memeriksa status transcoding, termasuk sesi transcoding saat ini dan sebelumnya:

adb shell dumpsys media.transcoding

Perpanjang batas durasi video

Untuk tujuan pengujian, Anda dapat memperpanjang batasan durasi video satu menit untuk transcoding menggunakan perintah berikut. Anda mungkin perlu memulai ulang setelah menjalankan perintah ini.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Sumber dan referensi AOSP

Berikut adalah kode sumber AOSP yang terkait dengan transcoding media yang kompatibel.

Encoding HDR ke SDR

Untuk mendukung encoding HDR ke SDR, produsen perangkat dapat menggunakan plugin filter Codec 2.0 sampel AOSP yang terletak di /platform/frameworks/av/media/codec2/hidl/plugin/. Bagian ini menjelaskan cara kerja plugin filter, cara menerapkan plugin, dan cara menguji plugin.

Jika perangkat tidak menyertakan plugin yang mendukung encoding HDR ke SDR, aplikasi yang mengakses video HDR akan mendapatkan deskripsi file asli, terlepas dari kemampuan media aplikasi yang dideklarasikan dalam manifes.

Cara kerjanya

Bagian ini menjelaskan perilaku umum plugin filter Codec 2.0.

Latar belakang

Android menyediakan implementasi lapisan adaptasi antara antarmuka Codec 2.0 dan antarmuka HAL android.hardware.media.c2 di android::hardware::media::c2. Untuk plugin filter, AOSP menyertakan mekanisme wrapper yang menggabungkan decoder dengan plugin filter. MediaCodec mengenali komponen yang digabungkan ini sebagai dekoder dengan fitur pemfilteran.

Ringkasan

Class FilterWrapper mengambil codec vendor dan menampilkan codec yang digabungkan kembali ke lapisan adaptasi media.c2. Class FilterWrapper memuat libc2filterplugin.so melalui FilterWrapper::Plugin API dan mencatat filter yang tersedia dari plugin. Saat pembuatan, FilterWrapper akan membuat instance semua filter yang tersedia. Hanya filter yang mengubah buffering yang dimulai pada awal.

Arsitektur plugin filter

Gambar 1. Arsitektur plugin filter.

Antarmuka plugin filter

Antarmuka FilterPlugin.h menentukan API berikut untuk mengekspos filter:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Menampilkan objek C2ComponentStore yang berisi filter. Hal ini terpisah dari apa yang diekspos oleh implementasi Codec 2.0 vendor. Biasanya, penyimpanan ini hanya berisi filter yang digunakan oleh class FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    Menjelaskan filter selain yang tersedia dari C2ComponentStore. Deskripsi berikut ditentukan:

    • controlParam: Parameter yang mengontrol perilaku filter. Misalnya, untuk tone-mapper HDR ke SDR, parameter kontrol adalah fungsi transfer target.
    • affectedParams: Parameter yang terpengaruh oleh operasi pemfilteran. Misalnya, untuk tone-mapper HDR ke SDR, parameter yang terpengaruh adalah aspek warna.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Menampilkan true jika komponen filter mengubah buffer. Misalnya, filter tone-mapping menampilkan true jika fungsi transfer target adalah SDR dan fungsi transfer input adalah HDR (HLG atau PQ).

Detail FilterWrapper

Bagian ini menjelaskan detail class FilterWrapper.

Pembuatan

Komponen yang digabungkan membuat instance decoder yang mendasarinya dan semua filter yang ditentukan saat pembuatan.

Kueri dan konfigurasi

Komponen yang digabungkan memisahkan parameter masuk dari kueri atau permintaan konfigurasi sesuai dengan deskripsi filter. Misalnya, konfigurasi parameter kontrol filter dirutekan ke filter yang sesuai, dan parameter yang terpengaruh dari filter tersebut ada di kueri (bukan membaca dari decoder yang tidak memiliki parameter yang tidak terpengaruh).

Kueri dan konfigurasi

Gambar 2. Kueri dan konfigurasi.

Mulai

Pada awalnya, komponen yang digabungkan akan memulai decoder dan semua filter yang mengubah buffer. Jika tidak ada filter yang diaktifkan, komponen yang digabungkan akan memulai decoder dan buffer pass-through serta mengirimkan perintah ke decoder itu sendiri.

Penanganan buffering

Penanganan buffering

Gambar 3. Penanganan buffer.

Buffer yang diantrekan ke decoder yang digabungkan akan masuk ke decoder yang mendasarinya. Komponen yang digabungkan mengambil buffer output dari decoder melalui callback onWorkDone_nb(), lalu mengantrekannya ke filter. Buffer output akhir dari filter terakhir dilaporkan ke klien.

Agar penanganan buffer ini berfungsi, komponen yang digabungkan harus mengonfigurasi C2PortBlockPoolsTuning ke filter terakhir sehingga output framework di-buffer dari kumpulan blok yang diharapkan.

Menghentikan, mereset, dan melepas

Saat perhentian, komponen yang digabungkan akan menghentikan decoder dan semua filter aktif yang dimulai. Saat direset dan dirilis, semua komponen akan direset atau dirilis terlepas dari apakah komponen diaktifkan atau tidak.

Mengimplementasikan plugin filter contoh

Untuk mengaktifkan plugin, lakukan hal berikut:

  1. Implementasikan antarmuka FilterPlugin di library, lalu lepaskan di /vendor/lib[64]/libc2filterplugin.so.
  2. Tambahkan izin tambahan ke mediacodec.te jika diperlukan.
  3. Update lapisan adaptasi ke Android 12 dan buat ulang layanan media.c2.

Menguji plugin

Untuk menguji plugin contoh, lakukan hal berikut:

  1. Build ulang dan flash perangkat.
  2. Build plugin contoh menggunakan perintah berikut:

    m sample-codec2-filter-plugin
    
  3. Pasang kembali perangkat dan ganti nama plugin vendor agar dikenali oleh layanan codec.

    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