Transcoding media yang kompatibel

Transcoding media yang kompatibel, diperkenalkan di Android 12, adalah fitur yang memungkinkan perangkat menggunakan format media yang lebih modern dan hemat penyimpanan untuk pengambilan video, seperti HEVC, sambil tetap menjaga kompatibilitas dengan aplikasi. Dengan fitur ini, produsen perangkat dapat menggunakan HEVC, bukan AVC, secara default untuk meningkatkan kualitas video sekaligus mengurangi kebutuhan penyimpanan dan bandwidth. Untuk perangkat dengan transcoding media yang kompatibel diaktifkan, Android dapat secara otomatis mengkonversi video (durasi hingga satu menit) yang direkam dalam format seperti HEVC atau HDR ketika video dibuka oleh aplikasi yang tidak mendukung format tersebut. Hal ini memungkinkan aplikasi berfungsi bahkan ketika video diambil 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 Pengembang Android.

Bagaimana itu bekerja

Fitur transcoding media yang kompatibel terdiri dari dua bagian utama:

  • Layanan transcoding dalam kerangka media: Layanan ini mengonversi file dari satu format ke format lain menggunakan perangkat keras untuk latensi rendah dan konversi berkualitas tinggi. Ini termasuk API transcoding, layanan transcoding, plugin OEM untuk filter khusus, dan perangkat keras. Untuk detail lebih lanjut, lihat Ikhtisar arsitektur .
  • Fitur transcoding media yang kompatibel di penyedia media: Komponen yang ditemukan di penyedia media ini mencegat aplikasi yang mengakses file media dan menyajikan file asli atau file yang ditranskode berdasarkan kemampuan aplikasi yang dinyatakan. Jika suatu aplikasi mendukung format file media, tidak diperlukan 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 gambaran umum proses transcoding media.

Proses transcoding media yang kompatibel

Gambar 1. Ikhtisar 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 mediacode.
  • HDR10+ (10-bit) ke AVC (SDR): Konversi HDR ke SDR dilakukan menggunakan instans mediacodec dan plugin vendor yang terhubung ke instans dekoder. Untuk informasi selengkapnya, lihat Pengkodean HDR ke SDR .

Sumber konten yang didukung

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

Aplikasi mengakses file berdasarkan berbagai jalur file. Berikut ini penjelasan jalur file tempat transcoding diaktifkan atau dilewati:

  • Transkode diaktifkan:

    • Akses aplikasi melalui API MediaStore
    • Akses aplikasi melalui API jalur file langsung termasuk Java dan kode asli
    • Akses aplikasi melalui Storage Access Framework (SAF)
    • Akses aplikasi melalui lembar berbagi OS Intent. (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 Terdekat atau transfer Bluetooth.

Tambahkan jalur file khusus untuk transcoding

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

Untuk menambahkan jalur file, gunakan overlay sumber daya runtime (RRO) jalur transkode, config_supported_transcoding_relative_paths . Berikut ini 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

Ikhtisar arsitektur

Bagian ini menjelaskan arsitektur fitur transcoding media.

arsitektur-transcoding-media

Gambar 2. Arsitektur transcoding media.

Arsitektur transcoding media terdiri dari komponen-komponen berikut:

  • API sistem MediaTranscodingManager: Antarmuka yang memungkinkan klien berkomunikasi dengan layanan MediaTranscoding. Modul MediaProvider menggunakan API ini.
  • MediaTranscodingService: Layanan asli yang mengelola koneksi klien, menjadwalkan permintaan transcoding, dan mengelola pembukuan untuk TranscodingSessions .
  • MediaTranscoder: Pustaka asli yang melakukan transcoding. Pustaka ini dibangun di atas kerangka media NDK agar kompatibel dengan modul .

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

Akses berkas

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 membuka akses ke file berdasarkan kebijakan untuk mengizinkan, menolak, atau menyunting akses.

Saat aplikasi mencoba mengakses file, daemon FUSE memotong akses baca file dari aplikasi. Jika aplikasi mendukung format yang lebih baru (seperti HEVC), file asli akan dikembalikan. Jika aplikasi tidak mendukung format tersebut, file akan ditranskode ke format yang lebih lama (seperti AVC) atau dikembalikan dari cache jika versi transkode tersedia.

Minta file yang ditranskode

Fitur transkode media yang kompatibel dinonaktifkan secara default, artinya jika perangkat mendukung HEVC, Android tidak melakukan transkode file kecuali ditentukan oleh aplikasi dalam file manifes atau dalam daftar transkode paksa .

Aplikasi dapat meminta aset yang ditranskode menggunakan opsi berikut:

  • Deklarasikan format yang tidak didukung dalam file manifes. Untuk detailnya, lihat Mendeklarasikan kemampuan dalam sumber daya 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 memperbarui file manifesnya dengan format yang tidak didukung, aplikasi tersebut harus dihapus dari daftar transkode paksa. Produsen perangkat dapat menominasikan aplikasi mereka untuk ditambahkan atau dihapus dari daftar transkode paksa dengan mengirimkan patch atau melaporkan bug . Tim Android meninjau daftar tersebut secara berkala dan dapat menghapus aplikasi dari daftar.
  • Nonaktifkan format yang didukung dengan kerangka kompatibilitas aplikasi pada waktu proses (pengguna juga dapat menonaktifkan ini untuk setiap aplikasi di Pengaturan).
  • Buka file dengan MediaStore sambil secara eksplisit menentukan format yang tidak didukung dengan API openTypedAssetFileDescriptor .

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 pengaturan Preferensi USB seperti yang ditunjukkan pada Gambar 3.

Alihkan untuk mengaktifkan transcoding media

Gambar 3. Beralih untuk mengaktifkan transcoding media di layar Preferensi USB.

Batasan dalam meminta file yang ditranskode

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

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

Jika suatu aplikasi melampaui semua batasan ini, kerangka kerja akan mengembalikan deskriptor file asli.

Persyaratan perangkat

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

  • Perangkat memiliki pengkodean HEVC yang diaktifkan secara default pada aplikasi kamera asli
  • (Perangkat yang mendukung transcoding HDR ke SDR) Perangkat mendukung pengambilan video HDR

Untuk memastikan kinerja perangkat untuk transcoding media, kinerja akses baca/tulis perangkat keras video dan penyimpanan harus dioptimalkan. Ketika codec media dikonfigurasi dengan prioritas sama dengan 1 , codec harus beroperasi pada throughput setinggi mungkin. Kami merekomendasikan agar kinerja transcoding mencapai minimal 200 fps. Untuk menguji kinerja perangkat keras Anda, 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

Aktifkan transcoding media secara global

Untuk menguji kerangka transcoding media atau perilaku aplikasi dengan transcoding, Anda dapat mengaktifkan atau menonaktifkan fitur transcoding media yang kompatibel secara global. Di halaman Pengaturan > Sistem > Pengembang > Opsi pengembang transcoding media , atur tombol Override transcoding defaults ke aktif , lalu atur tombol Aktifkan transcoding ke aktif atau nonaktif . Jika pengaturan ini diaktifkan, transcoding media mungkin terjadi di latar belakang untuk aplikasi selain yang Anda kembangkan.

Periksa status transkode

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 batasan panjang video

Untuk tujuan pengujian, Anda dapat memperpanjang batasan durasi video satu menit untuk transcoding dengan menggunakan perintah berikut. Reboot mungkin diperlukan 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 ini adalah kode sumber AOSP terkait dengan transcoding media yang kompatibel.

Pengkodean HDR ke SDR

Untuk mendukung pengkodean 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 mengimplementasikan plugin, dan cara menguji plugin.

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

Bagaimana itu bekerja

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 pembungkus yang menggabungkan dekoder dengan plugin filter. MediaCodec mengenali komponen yang dibungkus ini sebagai decoder dengan fitur pemfilteran.

Ringkasan

Kelas FilterWrapper mengambil codec vendor dan mengembalikan codec yang dibungkus ke lapisan adaptasi media.c2 . Kelas FilterWrapper memuat libc2filterplugin.so melalui FilterWrapper::Plugin API dan mencatat filter yang tersedia dari plugin. Saat pembuatan, FilterWrapper membuat instance semua filter yang tersedia. Hanya filter yang mengubah buffer yang dimulai di awal.

Filter arsitektur plugin

Gambar 1. Arsitektur plugin filter.

Filter antarmuka plugin

Antarmuka FilterPlugin.h mendefinisikan API berikut untuk mengekspos filter:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Mengembalikan objek C2ComponentStore yang berisi filter. Hal ini terpisah dari implementasi Codec 2.0 vendor. Biasanya, penyimpanan ini hanya berisi filter yang digunakan oleh kelas FilterWrapper .

  • bool describe(C2String name, Descriptor *desc)

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

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

    Mengembalikan true jika komponen filter mengubah buffer. Misalnya, filter pemetaan nada mengembalikan true jika fungsi transfer target adalah SDR dan fungsi transfer input adalah HDR (HLG atau PQ).

Detail FilterWrapper

Bagian ini menjelaskan detail kelas FilterWrapper .

Penciptaan

Komponen yang dibungkus membuat instance dekoder yang mendasarinya dan semua filter yang ditentukan saat pembuatan.

Kueri dan konfigurasi

Komponen yang dibungkus 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 (alih-alih membaca dari decoder yang memiliki parameter tidak terpengaruh).

Kueri dan konfigurasi

Gambar 2. Kueri dan konfigurasi.

Awal

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

Penanganan penyangga

Penanganan penyangga

Gambar 3. Penanganan buffer.

Buffer yang diantri ke dekoder yang dibungkus akan menuju ke dekoder yang mendasarinya. Komponen yang dibungkus mengambil buffer output dari decoder melalui callback onWorkDone_nb() , lalu mengantrikannya ke filter. Buffer keluaran akhir dari filter terakhir dilaporkan ke klien.

Agar penanganan buffer ini berfungsi, komponen yang dibungkus harus mengonfigurasi C2PortBlockPoolsTuning ke filter terakhir sehingga kerangka menghasilkan buffer dari kumpulan blok yang diharapkan.

Hentikan, setel ulang, dan lepaskan

Saat berhenti, komponen yang dibungkus menghentikan dekoder dan semua filter aktif yang dimulai. Saat reset dan rilis, semua komponen direset atau dilepaskan terlepas dari apakah komponen tersebut diaktifkan atau tidak.

Terapkan plugin filter sampel

Untuk mengaktifkan plugin, lakukan hal berikut:

  1. Implementasikan antarmuka FilterPlugin di perpustakaan dan letakkan di /vendor/lib[64]/libc2filterplugin.so.
  2. Tambahkan izin tambahan ke mediacodec.te jika diperlukan.
  3. Perbarui lapisan adaptasi ke Android 12 dan bangun kembali layanan media.c2 .

Uji pluginnya

Untuk menguji plugin sampel, lakukan hal berikut:

  1. Bangun kembali dan flash perangkat.
  2. Bangun plugin sampel menggunakan perintah berikut:

    m sample-codec2-filter-plugin
    
  3. Pasang kembali perangkat dan ganti nama plugin vendor sehingga 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