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 artırmak için varsayılan olarak AVC yerine HEVC kullanabilir. Uyumlu medya kodu dönüştürme özelliğinin etkinleştirildiği cihazlarda Android, HEVC veya HDR gibi biçimlerde kaydedilmiş videoları (en fazla bir dakika uzunluğundaki) videolar biçimi desteklemeyen bir uygulama tarafından açıldığında otomatik olarak dönüştürebilir. Bu sayede, videolar cihazda 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. Uygulamaların medya kod dönüştürme isteğinde bulunabilmesi için medya özelliklerini belirtmesi 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 kodlama 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ılarında 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 kod dönüştürme sürecine genel bir bakış gösterilmektedir.

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 kodlama 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 başlıklı makaleyi inceleyin.

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 etkinleştirildi:

    • MediaStore API'leri aracılığıyla uygulama erişimi
    • Java ve yerel kod dahil olmak üzere doğrudan dosya yolu API'leri aracılığıyla uygulama erişimi
    • Depolama Erişim Çerçevesi (SAF) aracılığıyla uygulama erişimi
    • OS paylaşım sayfası Amaçları aracılığıyla uygulama erişimi. (Yalnızca MediaStore URI'si)
    • Telefondan PC'ye MTP/PTP dosya 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/ dizinine medya kod dönüştürme için dosya yolu 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 ekleme örneği 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 işlemini gerçekleştiren yerel kitaplık. Bu kitaplık, modüllerle uyumlu olması için NDK medya çerçevesinin üzerine inşa edilmiştir.

Uyumlu medya kodlama dönüştürme özelliği, hem hizmette hem de medya kodlama dönüştürücüde kod dönüştürme metriklerini günlüğe kaydeder. İstemci tarafı ve hizmet tarafı kodu, hata düzeltmelerinin ve güncellemelerin zamanında yapılabilmesi 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 incelemesini ve erişime izin verme, erişimi reddetme veya erişimi çıkartma politikasına göre dosyalara erişimi kontrol etmesini sağlar.

Bir uygulama bir dosyaya erişmeye çalıştığında FUSE daemon'ı, uygulamadan gelen dosya okuma erişimini keser. Uygulama daha yeni bir biçimi (HEVC gibi) destekliyorsa orijinal dosya döndürülür. Uygulama biçimi desteklemiyorsa dosya, daha eski bir biçime (ör. AVC) yeniden kodlanır veya yeniden kodlanmış 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üne dahil olan zorunlu kod dönüştürme listesine uygulama ekleyin. Bu, manifest dosyalarını güncellememiş uygulamalarda 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.
  • Uygulama uyumluluk çerçevesiyle desteklenen biçimleri çalışma zamanında devre dışı bırakın (Kullanıcılar bunu Ayarlar'da her uygulama için de devre dışı bırakabilir).
  • openTypedAssetFileDescriptor API'si ile desteklenmeyen biçimleri açıkça belirtirken MediaStore ile bir dosya 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 kod 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 çalışma süresi

Bir uygulama tüm bu kısıtlamaları 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 etkindir.
  • (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 en az 200 fps'ye ulaşmasını öneririz. Donanım performansınızı test etmek için medya kod dönüştürücü karşılaştırmasını frameworks/av/media/libmediatranscoding/transcoder/benchmark adresinde ç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 arka planda, geliştirmekte olduğunuz uygulama dışındaki uygulamalar için medya kodu dönüştürme işlemi yapılabilir.

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

Test sırasında, mevcut ve geçmiş kod dönüştürme oturumları da 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 komut çalıştırıldı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ı bulunmaktadır.

HDR'den SDR'ye kodlama

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

Bir cihazda HDR'den SDR'ye kodlamayı destekleyen bir eklenti yoksa HDR videoya erişen bir uygulama, manifest dosyasında beyan edilen medya özelliklerinden bağımsız olarak 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, android::hardware::media::c2'da Codec 2.0 arayüzü ile android.hardware.media.c2 HAL arayüzü arasında bir uyum 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üler olarak tanır.

Genel Bakış

FilterWrapper sınıfı, tedarikçi firma codec'lerini alır ve sarmalanmış codec'leri media.c2 uyumlulaştırma katmanına döndürür. FilterWrapper sınıfı, libc2filterplugin.so API'si aracılığıyla libc2filterplugin.so'i yükler ve eklentide bulunan filtreleri kaydeder. FilterWrapper, oluşturulduğunda mevcut tüm filtreleri örneklendirir. Yalnızca arabelleği değiştiren filtreler başlangıçta 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()

    Filtreler içeren bir C2ComponentStore nesnesi döndürür. Bu, satıcının Codec 2.0 uygulaması ile ortaya koyduğ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'te bulunanlara ek olarak filtreleri açıklar. 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şleyici için etkilenen parametreler renk özellikleridir.
  • 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.

FilterWrapper 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 tanımlanan tüm filtreleri oluşturulurken örneklendirir.

Sorgu ve yapılandırma

Sarmalanmış bileşen, gelen parametreleri filtre açıklamasına göre sorgulardan veya yapılandırma isteklerinden ayırır. Örneğin, filtre kontrol parametresinin yapılandırması ilgili filtreye yönlendirilir ve filtrelerdeki etkilenen parametreler sorgularda bulunur (etkilenmeyen parametrelerin bulunduğu 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 arabellekleri değiştiren tüm filtreleri başlatır. Hiçbir filtre etkinleştirilmezse sarmalanmış bileşen, kod çözücüyü ve geçiş arabelleklerini başlatır ve kod çözücüye komutlar 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 çıkış arabelleğini alır ve daha sonra filtrelere yerleştirir. Son filtreden gelen nihai çıkış arabelleği 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.

Durdurma, sıfırlama ve bırakma

Sarmalanmış bileşen, durdurulduğunda kod çözücüyü ve başlatılan tüm etkin filtreleri durdurur. Sıfırlama ve serbest bırakma sırasında, etkin olup olmadıklarından bağımsız olarak 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 oluşturun ve flaşlayın.
  2. Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:

    m sample-codec2-filter-plugin
    
  3. Cihazı yeniden takın ve codec hizmeti tarafından tanınması için tedarikçi firma eklentisini yeniden adlandırın.

    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