Transcoding media yang kompatibel, yang diperkenalkan di Android 12, adalah fitur yang memungkinkan perangkat menggunakan format media yang lebih modern dan efisien dalam hal 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 mengonversi video secara otomatis (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 mengetahui 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 di framework media: Layanan ini mengonversi file dari satu format ke format lain menggunakan hardware untuk konversi berkualitas tinggi dan latensi rendah. Hal ini mencakup Transcoding API, layanan transcoding, plugin OEM untuk filter kustom, dan hardware. Untuk 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 di-transcoding berdasarkan kemampuan yang dideklarasikan aplikasi. Jika aplikasi mendukung format file media, tidak diperlukan penanganan khusus. Jika aplikasi tidak mendukung format, framework akan mengonversi file ke format yang lebih lama, seperti AVC, saat aplikasi mengakses file.
Gambar 1 menunjukkan ringkasan proses transcoding media.
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 dengan menghubungkan satu decoder mediacodec dan satu encoder mediacodec.
- 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 bawaan yang disimpan di folder DCIM/Camera/
dalam volume eksternal utama. Fitur ini tidak mendukung media di penyimpanan sekunder.
Konten yang dikirim ke perangkat melalui email atau kartu SD tidak didukung.
Aplikasi mengakses file berdasarkan berbagai jalur file. Berikut ini menjelaskan jalur file tempat transkode diaktifkan atau dilewati:
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 dilewati:
- 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.
Penambahan jalur file tersebut mungkin diperlukan untuk memenuhi persyaratan ekspedisi atau peraturan setempat.
Untuk menambahkan jalur file, gunakan jalur transkode
overlay resource runtime (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.
Gambar 2. Arsitektur transcoding media.
Arsitektur transcoding media terdiri dari komponen berikut:
- API sistem MediaTranscodingManager: 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 melakukan transcoding. Library ini dibangun di atas NDK framework media agar kompatibel dengan modul.
Fitur transcoding media yang kompatibel mencatat metrik transcoding di layanan dan transcoder media. Kode sisi klien dan sisi layanan ada di modul MediaProvider untuk memungkinkan perbaikan bug dan update tepat waktu.
Akses file
Transcoding media yang kompatibel dibangun di atas sistem file Filesystem in Userspace (FUSE), yang digunakan untuk penyimpanan terbatas. FUSE memungkinkan modul MediaProvider 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, file akan ditranskode ke format yang lebih lama (seperti AVC) atau ditampilkan dari cache jika versi yang ditranskode tersedia.
Meminta file yang ditranskode
Fitur transcoding media yang kompatibel dinonaktifkan secara default. Aplikasi dapat meminta aset yang ditranskode menggunakan opsi berikut:
- Mendeklarasikan format yang tidak didukung dalam file manifes. Untuk mengetahui detailnya, lihat Menyatakan kemampuan dalam resource dan Menyatakan kemampuan dalam kode.
- Nonaktifkan format yang didukung dengan framework kompatibilitas aplikasi saat runtime (pengguna juga dapat menonaktifkannya untuk setiap aplikasi di Setelan).
- Membuka file dengan
MediaStore
sambil menentukan format yang tidak didukung secara eksplisit dengan APIopenTypedAssetFileDescriptor
.
Untuk transfer USB (perangkat ke PC), transkode dinonaktifkan secara default, tetapi pengguna dapat memilih untuk mengaktifkan transkode menggunakan tombol Konversi video ke AVC di layar setelan Preferensi USB seperti yang ditunjukkan pada Gambar 3.
Gambar 3. Aktifkan untuk mengaktifkan transcoding media di layar Preferensi USB.
Batasan permintaan file yang ditranskode
Untuk mencegah permintaan transkode mengunci resource sistem dalam jangka waktu yang lama, aplikasi yang meminta sesi transkode dibatasi hingga:
- 10 sesi berturut-turut
- total durasi tiga menit
Jika aplikasi melampaui semua batasan ini, framework akan menampilkan deskriptor file asli.
Persyaratan perangkat
Untuk mendukung fitur transcoding media yang kompatibel, perangkat harus memenuhi persyaratan berikut:
- Perangkat memiliki encoding HEVC yang diaktifkan secara default di aplikasi kamera bawaan
- (Perangkat yang mendukung transkode HDR ke SDR) Perangkat mendukung pengambilan video HDR
Untuk memastikan performa perangkat untuk transcoding media, performa akses baca/tulis hardware dan penyimpanan video harus dioptimalkan. Jika codec media dikonfigurasi dengan prioritas yang sama dengan 1
, codec harus beroperasi pada throughput tertinggi yang memungkinkan. Sebaiknya performa transcoding mencapai
minimal 200 fps. Untuk menguji performa hardware, jalankan benchmark transkoder 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 > Transkode media, setel tombol Ganti default transkode ke aktif, lalu setel tombol Aktifkan transkode ke aktif atau nonaktif. Jika setelan ini diaktifkan, transkode media mungkin terjadi di latar belakang untuk aplikasi selain yang sedang Anda kembangkan.
Memeriksa status transcoding
Selama pengujian, Anda dapat menggunakan perintah shell ADB berikut untuk memeriksa status transkode, termasuk sesi transkode saat ini dan sebelumnya:
adb shell dumpsys media.transcoding
Memperpanjang batasan durasi video
Untuk tujuan pengujian, Anda dapat memperpanjang batasan panjang video satu menit untuk transcoding menggunakan perintah berikut. Anda mungkin perlu melakukan reboot 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.
Transcoding System API (hanya digunakan oleh MediaProvider)
ApplicationMediaCapabilities API
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
Layanan MediaTranscoding
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Native MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
Plugin contoh HDR untuk MediaTranscoder
Kode transcoding dan pencegatan file MediaProvider
Tolok ukur MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder/benchmark
Pengujian CTS
cts/tests/tests/mediatranscoding/
Encoding HDR ke SDR
Untuk mendukung encoding HDR ke SDR, produsen perangkat dapat menggunakan plugin filter Codec 2.0 contoh AOSP yang ada 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 deskriptor 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 dekoder dengan plugin filter.
MediaCodec
mengenali komponen terbungkus ini sebagai dekoder dengan fitur pemfilteran.
Ringkasan
Class FilterWrapper
mengambil codec vendor dan menampilkan codec yang di-wrap 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
meng-instance semua filter yang tersedia. Hanya filter yang mengubah buffer yang
dimulai saat start.
Gambar 4. 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. Ini terpisah dari apa yang diekspos oleh penerapan Codec 2.0 vendor. Biasanya, penyimpanan ini hanya berisi filter yang digunakan oleh classFilterWrapper
.bool describe(C2String name, Descriptor *desc)
Mendeskripsikan filter selain yang tersedia dari
C2ComponentStore
. Deskripsi berikut ditentukan:controlParam
: Parameter yang mengontrol perilaku filter. Misalnya, untuk pemeta nada HDR ke SDR, parameter kontrolnya adalah fungsi transfer target.affectedParams
: Parameter yang terpengaruh oleh operasi pemfilteran. Misalnya, untuk pemeta nada 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 pemetaan nada menampilkantrue
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 di-wrap membuat instance decoder pokok dan semua filter yang ditentukan saat pembuatan.
Kueri dan konfigurasi
Komponen yang di-wrap 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 ada di kueri (bukan dibaca dari dekoder yang memiliki parameter yang tidak terpengaruh).
Gambar 5. Kueri dan konfigurasi.
Mulai
Saat dimulai, komponen yang di-wrap akan memulai decoder dan semua filter yang mengubah buffer. Jika tidak ada filter yang diaktifkan, komponen yang di-wrap akan memulai decoder dan buffer teruskan serta mengirimkan perintah ke decoder itu sendiri.
Penanganan buffer
Gambar 6. Penanganan buffer.
Buffer yang diantrekan ke decoder yang di-wrap diteruskan ke decoder pokok. Komponen
yang di-wrap 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 di-wrap harus mengonfigurasi
C2PortBlockPoolsTuning
ke filter terakhir sehingga buffer output framework
dari kumpulan blok yang diharapkan.
Hentikan, reset, dan lepaskan
Saat berhenti, komponen yang di-wrap akan menghentikan dekoder dan semua filter yang diaktifkan yang telah dimulai. Saat direset dan dilepaskan, semua komponen akan direset atau dilepaskan terlepas dari apakah komponen tersebut diaktifkan atau tidak.
Mengimplementasikan plugin filter contoh
Untuk mengaktifkan plugin, lakukan hal berikut:
- Terapkan antarmuka
FilterPlugin
di library dan letakkan di/vendor/lib[64]/libc2filterplugin.so.
- Tambahkan izin tambahan ke
mediacodec.te
jika diperlukan. - Perbarui lapisan adaptasi ke Android 12 dan
bangun ulang layanan
media.c2
.
Menguji plugin
Untuk menguji plugin contoh, lakukan hal berikut:
- Bangun ulang dan flash perangkat.
Bangun plugin contoh menggunakan perintah berikut:
m sample-codec2-filter-plugin
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