Uyumlu medya kodu dönüştürme

Android 12'de kullanıma sunulan uyumlu medya kodu dönüştürme özelliği, cihazların uygulamalarla uyumluluğu korurken HEVC gibi video yakalama için daha modern, depolama açısından verimli medya biçimleri kullanmasına olanak tanıyan bir özelliktir. Bu özellik sayesinde cihaz üreticileri, depolama alanı ve bant genişliği gereksinimlerini azaltırken video kalitesini iyileştirmek için varsayılan olarak AVC yerine HEVC kullanabilir. Medya kodu dönüştürmeyle uyumlu olan cihazlarda, videolar biçimi desteklemeyen bir uygulama tarafından açıldığında Android, HEVC veya HDR gibi biçimlerde kaydedilmiş videoları (en fazla bir dakika uzunluğunda) otomatik olarak dönüştürebilir. Bu şekilde, videolar cihazda daha yeni biçimlerde çekilse bile uygulamalar çalışmaya devam edebilir.

Uyumlu medya kodu dönüştürme özelliği varsayılan olarak kapalıdır. Medya kodu dönüştürme isteğinde bulunmak için uygulamaların medya özelliklerini beyan etmesi gerekir. Medya özelliklerini beyan etme hakkında daha fazla bilgi için Android Developers sitesindeki Uyumlu medya kodu dönüştürme sayfasına göz atın.

İşleyiş şekli

Uyumlu medya kodu dönüştürme özelliği iki ana bölümden oluşur:

  • Medya çerçevesinde kod dönüştürme hizmetleri: Bu hizmetler, düşük gecikme ve yüksek kaliteli dönüşümler için donanım kullanarak dosyaları bir biçimden diğerine dönüştürür. Buna kod dönüştürme API'si, kod dönüştürme hizmeti, özel filtreler için OEM eklentisi ve donanım dahildir. Daha fazla ayrıntı için Mimariye genel bakış bölümüne bakın.
  • Medya sağlayıcılarda uyumlu medya kodu dönüştürme özelliği: Medya sağlayıcılarda bulunan bu bileşen, medya dosyalarına erişen uygulamalara müdahale eder ve uygulamanın beyan edilen özelliklerine göre orijinal dosyayı veya kodu dönüştürülmüş bir dosyayı sunar. Bir uygulama, medya dosyasının biçimini destekliyorsa özel bir işlem yapmanız gerekmez. Bir uygulama bu biçimi desteklemiyorsa uygulama dosyaya eriştiğinde çerçeve, dosyayı AVC gibi daha eski bir biçime dönüştürür.

Şekil 1'de medya kodu dönüştürme sürecine ilişkin bir genel bakış gösterilmiştir.

Uyumlu medya kod dönüştürme süreci

Şekil 1. Uyumlu medya kodu dönüştürmeye genel bakış.

Desteklenen biçimler

Uyumlu medya kodu dönüştürme özelliği, aşağıdaki biçim dönüşümlerini destekler:

  • HEVC'den (8 bit) AVC'ye: Codec dönüşümleri, bir medyakod çözücü ile bir medya kodu kodlayıcının bağlanmasıyla gerçekleştirilir.
  • HDR10+ (10 bit) - AVC (SDR): HDR'den SDR'ye dönüştürme, mediacodec örnekleri ve kod çözücü örneklerine tedarikçi firma eklentisi kullanılarak gerçekleştirilir. Daha fazla bilgi için HDR'den SDR'ye kodlama bölümüne bakın.

Desteklenen içerik kaynakları

Uyumlu medya kod dönüştürme özelliği, yerel OEM kamera uygulaması tarafından oluşturulan ve birincil harici birimdeki DCIM/Camera/ klasöründe depolanan cihaz üzerinde medyayı destekler. Bu özellik, ikincil depolama alanındaki medyayı desteklemez. Cihazlara e-posta veya SD kartlar aracılığıyla aktarılan içerikler desteklenmez.

Uygulamalar dosyalara çeşitli dosya yollarını temel alarak erişir. Aşağıda, kod dönüştürmenin etkinleştirildiği veya atlandığı dosya yolları açıklanmaktadır:

  • Kod dönüştürme etkin:

    • MediaStore API'leri aracılığıyla uygulama erişimi
    • Java ve yerel kod dahil olmak üzere doğrudan filepath API'leri üzerinden uygulama erişimi
    • Depolama Erişim Çerçevesi (SAF) üzerinden uygulama erişimi
    • OS paylaşım sayfası Amaçları aracılığıyla uygulama erişimi. (Yalnızca MediaStore URI)
    • Telefondan PC'ye MTP/PTP dosyası aktarımı
  • Kod dönüştürme atlandı:

    • SD kartı çıkararak bir cihazdan dosya aktarma
    • Yakındakilerle Paylaş veya Bluetooth aktarımı gibi seçenekleri kullanarak cihazdan cihaza dosya aktarma.

Kod dönüştürme için özelleştirilmiş dosya yolları ekleme

Cihaz üreticileri, isteğe bağlı olarak DCIM/ dizini altında medya kodu dönüştürme işlemi için dosya yolları ekleyebilir. DCIM/ dizini dışındaki yollar reddedilir. Operatör gereksinimlerini veya yerel düzenlemeleri karşılamak için bu tür dosya yollarının eklenmesi gerekebilir.

Dosya yolu eklemek için çalışma zamanı kaynak yer paylaşımı (RRO) kod dönüştürme yolunu config_supported_transcoding_relative_paths kullanın. Aşağıda, dosya yolu eklemeyle ilgili bir örnek verilmiştir:

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

Yapılandırılmış dosya yollarını doğrulamak için şunu kullanın:

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

Mimariye genel bakış

Bu bölümde, medya kodu dönüştürme özelliğinin mimarisi açıklanmaktadır.

medya-kod dönüştürmesi-mimari

Şekil 2. Medya kodu dönüştürme mimarisi.

Medya kodu dönüştürme mimarisi aşağıdaki bileşenlerden oluşur:

  • MediaTranscodingManager sistem API'si: İstemcinin MediaTranscoding hizmetiyle iletişim kurmasına olanak tanıyan arayüz. MediaProvider modülü bu API'yi kullanır.
  • MediaTranscodingService: İstemci bağlantılarını yöneten, kod dönüştürme isteklerini planlayan ve TranscodingSessions için muhasebe işlemlerini yöneten yerel hizmet.
  • MediaTranscoder: Kod dönüştürme gerçekleştiren yerel kitaplık. Bu kitaplık, modüllerle uyumlu olacak şekilde NDK medya çerçevesinin üzerine kurulmuştur.

Uyumlu medya kod dönüştürme özelliği, hem hizmetteki hem de medya kod dönüştürücüdeki kod dönüştürme metriklerini günlüğe kaydeder. İstemci tarafı ve hizmet tarafı kodu, hata düzeltmelerine ve güncellemelerine zamanında uygulamak için MediaProvider modülündedir.

Dosya erişimi

Uyumlu medya kodu dönüştürme işlemi, kapsamlı depolama için kullanılan Kullanıcı Alanındaki Dosya Sistemi (FUSE) dosya sisteminde oluşturulur. FUSE, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesine ve erişime izin verme, reddetme veya çıkartma politikasına göre dosyalara erişimi denetlemesine olanak tanır.

Bir uygulama bir dosyaya erişmeye çalıştığında FUSE arka plan programı, uygulamadan dosya okuma erişimine müdahale eder. Uygulama daha yeni bir biçimi (HEVC gibi) destekliyorsa orijinal dosya döndürülür. Uygulama, biçimi desteklemiyorsa dosyanın kodu eski bir biçime (ör. AVC) dönüştürülür veya kod dönüştürülmüş bir sürüm varsa önbellekten döndürülür.

Kodu dönüştürülmüş dosyaları isteme

Uyumlu medya kod dönüştürme özelliği varsayılan olarak devre dışıdır. Yani, cihaz HEVC'yi destekliyorsa Android, bir manifest dosyasında veya kod dönüştürmeyi zorunlu kılma listesinde bir uygulama tarafından belirtilmediği sürece dosyaların kodunu dönüştürmez.

Uygulamalar, aşağıdaki seçenekleri kullanarak kodu dönüştürülmüş öğeler isteyebilir:

  • Manifest dosyasındaki desteklenmeyen biçimleri bildirin. Ayrıntılar için Kaynaktaki özellikleri bildirme ve Koddaki özellikleri bildirme bölümlerine bakın.
  • MediaProvider modülünde bulunan kod dönüştürmeyi zorunlu kılma listesine uygulama ekleyin. Bu, manifest dosyalarını güncellememiş uygulamalar için kod dönüştürmeyi etkinleştirir. Bir uygulama, manifest dosyasını desteklenmeyen biçimlerle güncellediğinde, zorunlu kod dönüştürme listesinden kaldırılmalıdır. Cihaz üreticileri, yama göndererek veya bir hatayı bildirerek uygulamalarını zorunlu kod dönüştürme listesine eklenmek veya listeden kaldırılmak üzere aday gösterebilirler. Android ekibi listeyi düzenli olarak inceler ve uygulamaları listeden kaldırabilir.
  • Çalışma zamanında uygulama uyumluluğu çerçevesiyle desteklenen biçimleri devre dışı bırakın (kullanıcılar bunu her uygulama için Ayarlar'da da devre dışı bırakabilir).
  • Desteklenmeyen biçimleri openTypedAssetFileDescriptor API ile açıkça belirtirken dosyayı MediaStore ile açın.

USB aktarımları için (cihazdan PC'ye) kod dönüştürme varsayılan olarak devre dışıdır ancak kullanıcılar Şekil 3'te gösterildiği gibi USB Tercihleri ayar ekranındaki Videoları AVC'ye dönüştür açma/kapatma düğmesini kullanarak kod dönüştürmeyi etkinleştirebilir.

Medya kodu dönüştürmeyi etkinleştirmek için açma/kapatma düğmesini tıklayın

Şekil 3. USB Tercihleri ekranında medya kodu dönüştürmeyi etkinleştirmek için açma/kapatma düğmesini kullanın.

Kodu dönüştürülmüş dosya isteğinde bulunmayla ilgili kısıtlamalar

Kod dönüştürme isteklerinin uzun süre boyunca sistem kaynaklarını kilitlemesini önlemek için kod dönüştürme oturumları isteyen uygulamalar aşağıdakilerle sınırlıdır:

  • Art arda 10 oturum
  • toplam üç dakikalık

Bir uygulama bu kısıtlamaların tümünü aşarsa çerçeve, orijinal dosya tanımlayıcıyı döndürür.

Cihaz gereksinimleri

Uyumlu medya kodu dönüştürme özelliğini desteklemek için cihazların aşağıdaki koşulları karşılaması gerekir:

  • Cihazın yerel kamera uygulamasında HEVC kodlaması varsayılan olarak etkin
  • (HDR'den SDR'ye kod dönüştürmeyi destekleyen cihazlar) Cihaz, HDR video çekimini destekler

Medya kodu dönüştürme işleminde cihaz performansının sağlanması için video donanımı ve depolama alanı okuma/yazma erişimi performansı optimize edilmelidir. Medya codec'leri 1 önceliğiyle yapılandırıldığında codec'lerin mümkün olan en yüksek işleme hızında çalışması gerekir. Kod dönüştürme performansının minimum 200 fps'ye ulaşmasını öneririz. Donanım performansınızı test etmek için frameworks/av/media/libmediatranscoding/transcoder/benchmark adresinden medya kod dönüştürücü karşılaştırmasını çalıştırın.

Doğrulama

Medya kodu dönüştürme özelliğinin uyumlu olduğunu doğrulamak için aşağıdaki CTS testlerini çalıştırın:

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

Medya kodu dönüştürmeyi genel olarak etkinleştir

Medya kodu dönüştürme çerçevesini veya uygulama davranışını kod dönüştürmeyle test etmek için uyumlu medya kod dönüştürme özelliğini global olarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Ayarlar > Sistem > Geliştirici > Medya kod dönüştürme geliştirici seçenekleri sayfasında, Kod dönüştürme varsayılanlarını geçersiz kıl açma/kapatma düğmesini açık konuma getirin ve Kod dönüştürmeyi etkinleştir açma/kapatma düğmesini açık veya kapalı duruma getirin. Bu ayar etkinleştirilirse, geliştirmekte olduğunuz uygulama dışındaki uygulamalar için arka planda medya kodu dönüştürme işlemi yapılabilir.

Kod dönüştürme durumunu kontrol et

Test sırasında, mevcut ve geçmiş kod dönüştürme oturumları dahil olmak üzere kod dönüştürme durumunu kontrol etmek için aşağıdaki ADB kabuk komutunu kullanabilirsiniz:

adb shell dumpsys media.transcoding

Video uzunluğu sınırlamasını uzat

Test amacıyla, aşağıdaki komutu kullanarak kod dönüştürme için bir dakikalık video uzunluğu sınırını artırabilirsiniz. Bu komutu çalıştırdıktan sonra yeniden başlatma gerekebilir.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

AOSP kaynağı ve referansları

Aşağıda, uyumlu medya kodu dönüştürmeyle ilgili AOSP kaynak kodları verilmiştir.

HDR - SDR kodlama

Cihaz üreticileri, HDR'den SDR'ye kodlamayı desteklemek için /platform/frameworks/av/media/codec2/hidl/plugin/ konumunda bulunan AOSP örneği Codec 2.0 filtre eklentisini kullanabilir. Bu bölümde filtre eklentisinin nasıl çalıştığı, eklentinin nasıl uygulanacağı ve nasıl test edileceği açıklanmaktadır.

Cihazda HDR'den SDR'ye kodlamayı destekleyen bir eklenti bulunmuyorsa HDR videoya erişen bir uygulama, uygulamanın manifest'te belirtilen medya özellikleri ne olursa olsun orijinal dosya tanımlayıcısını alır.

İşleyiş şekli

Bu bölümde, Codec 2.0 filtre eklentisinin genel davranışı açıklanmaktadır.

Arka plan

Android, Codec 2.0 arayüzü ile android::hardware::media::c2 adresindeki android.hardware.media.c2 HAL arayüzü arasında bir adaptasyon katmanı uygulaması sağlar. AOSP, filtre eklentileri için kod çözücüleri filtre eklentileriyle birlikte sarmalayan bir sarmalayıcı mekanizması içerir. MediaCodec, bu sarmalanmış bileşenleri filtreleme özelliklerine sahip kod çözücü olarak tanır.

Genel bakış

FilterWrapper sınıfı, tedarikçi codec'lerini alır ve sarmalanmış codec'leri media.c2 uyarlama katmanına geri döndürür. FilterWrapper sınıfı, FilterWrapper::Plugin API'si aracılığıyla libc2filterplugin.so öğesini yükler ve eklentideki mevcut filtreleri kaydeder. FilterWrapper, oluşturma sırasında mevcut tüm filtreleri başlatır. Yalnızca tamponu değiştiren filtreler en baştan başlatılır.

Filtre eklentisi mimarisi

Şekil 1. Eklenti mimarisini filtreleyin.

Filtre eklentisi arayüzü

FilterPlugin.h arayüzü, filtreleri göstermek için aşağıdaki API'leri tanımlar:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Filtre içeren bir C2ComponentStore nesnesi döndürür. Bu, satıcının Codec 2.0 uygulaması ile sunduğundan ayrıdır. Genellikle bu mağaza yalnızca te FilterWrapper sınıfı tarafından kullanılan filtreleri içerir.

  • bool describe(C2String name, Descriptor *desc)

    C2ComponentStore ürününde bulunanlara ek olarak filtreler de açıklanmaktadır. Aşağıdaki açıklamalar tanımlanmıştır:

    • controlParam: Filtrelerin davranışını kontrol eden parametreler. Örneğin, HDR'den SDR'ye ton eşleme aracı için kontrol parametresi, hedef aktarım işlevidir.
    • affectedParams: Filtreleme işlemlerinden etkilenen parametreler. Örneğin, HDR'den SDR'ye ton eşleme için renk özellikleri, etkilenen parametrelerdir.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Filtre bileşeni arabelleği değiştirirse true değerini döndürür. Örneğin, hedef aktarım işlevi SDR ve giriş aktarım işlevi HDR (HLG veya PQ) ise ton eşleme filtresi true değerini döndürür.

Filtre Sarmalayıcı ayrıntıları

Bölümde, FilterWrapper sınıfıyla ilgili ayrıntılar açıklanmaktadır.

içerik üretimi

Sarmalanmış bileşen, temel kod çözücüyü ve oluşturulan tüm tanımlı filtreleri örneklendirir.

Sorgu ve yapılandırma

Sarmalanmış bileşen, filtre açıklamasına göre gelen parametreleri sorgulardan veya yapılandırma isteklerinden ayırır. Örneğin, filtre kontrol parametresinin yapılandırması, karşılık gelen filtreye yönlendirilir ve filtrelerden etkilenen parametreler sorgularda bulunur (etkilenmemiş parametrelere sahip kod çözücüden okumak yerine).

Sorgu ve yapılandırma

Şekil 2. Sorgu ve yapılandırma.

Başlangıç

Sarmalanmış bileşen, başlangıçta kod çözücüyü ve tamponları değiştiren tüm filtreleri başlatır. Etkin bir filtre yoksa sarmalanmış bileşen kod çözücüyü ve geçiş arabelleklerini başlatıp komutları kod çözücüye gönderir.

Arabellek kullanımı

Arabellek kullanımı

Şekil 3. Arabellek kullanımı.

Sarmalanmış kod çözücüye sıraya alınan arabellekler temel kod çözücüye gider. Sarmalanmış bileşen, onWorkDone_nb() geri çağırması aracılığıyla kod çözücüden çıktı arabelleğini alır ve daha sonra filtrelere yerleştirir. Son filtredeki nihai çıkış tamponu müşteriye bildirilir.

Bu arabellek işlemenin çalışması için sarmalanmış bileşenin, son filtrede C2PortBlockPoolsTuning yapılandırması gerekir. Böylece çerçeve çıktısı beklenen blok havuzundan arabelleğe alınır.

Durdurun, sıfırlayın ve bırakın

Durdurulan bileşen, kod çözücüyü ve başlatılmış tüm etkin filtreleri durdurur. Etkin olup olmamalarına bakılmaksızın, sıfırlama ve bırakma sırasında tüm bileşenler sıfırlanır veya serbest bırakılır.

Örnek filtre eklentisini uygulama

Eklentiyi etkinleştirmek için aşağıdakileri yapın:

  1. FilterPlugin arayüzünü bir kitaplığa uygulayıp /vendor/lib[64]/libc2filterplugin.so.
  2. Gerekirse mediacodec.te için ek izinler ekleyin.
  3. Adaptasyon katmanını Android 12'ye güncelleyin ve media.c2 hizmetini yeniden oluşturun.

Eklentiyi test etme

Örnek eklentiyi test etmek için aşağıdakileri yapın:

  1. Cihazı yeniden yapıp cihazı fırlatın.
  2. Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:

    m sample-codec2-filter-plugin
    
  3. Cihazı yeniden takın ve tedarikçi eklentisinin codec hizmeti tarafından tanınması için adını değiştirin.

    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