Uyumlu medya kodu dönüştürme

Android 12'de kullanıma sunulan uyumlu medya kod dönüştürme özelliği, cihazların video kaydı için HEVC gibi daha modern ve depolama alanı açısından verimli medya biçimlerini kullanmasına olanak tanır. Bu sayede uygulamalarla uyumluluk korunur. 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 kod dönüştürme özelliğinin etkin olduğu cihazlarda Android, HEVC veya HDR gibi biçimlerde kaydedilen videoları (bir dakikaya kadar uzunluktaki videolar) bu 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 kodlama 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 sitesinde Uyumlu medya kod dönüştürme başlıklı makaleyi inceleyin.

İşleyiş şekli

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

  • Medya çerçevesindeki kod dönüştürme hizmetleri: Bu hizmetler, düşük gecikme süresi ve yüksek kaliteli dönüştürme için donanım kullanarak dosyaları bir biçimden diğerine dönüştürür. Kod dönüştürme API'si, kod dönüştürme hizmeti, özel filtreler için OEM eklentisi ve donanım buna dahildir. Ayrıntılı bilgi için Mimariye genel bakış başlıklı makaleyi inceleyin.
  • Medya sağlayıcılarda uyumlu medya kod dönüştürme özelliği: Medya sağlayıcılarda bulunan bu bileşen, medya dosyalarına erişen uygulamaların yolunu keser ve uygulamanın beyan edilen özelliklerine göre orijinal dosyayı veya kod dönüştürülmüş bir dosyayı sunar. Bir uygulama, medya dosyasının biçimini destekliyorsa özel işleme gerekmez. Bir uygulama biçimi desteklemiyorsa çerçeve, uygulama dosyaya eriştiğinde dosyayı AVC gibi 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 işlemi

Şekil 1. Uyumlu medya kodlama dönüştürme işlemine genel bakış.

Desteklenen biçimler

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

  • HEVC (8 bit) - AVC: Kodek dönüştürme işlemleri, bir medya codec'i kod çözücü ve bir medya codec'i kodlayıcı bağlanarak gerçekleştirilir.
  • HDR10+ (10 bit) - AVC (SDR): HDR'den SDR'ye dönüştürme işlemleri, mediacodec örnekleri ve kod çözücü örneklerine eklenmiş bir tedarikçi 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 medyaları destekler. Bu özellik, ikincil depolama alanındaki medyayı desteklemez. E-posta veya SD kart aracılığıyla cihazlara iletilen içerikler desteklenmez.

Uygulamalar, dosyalara çeşitli dosya yollarına göre 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ı Intent'leri 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 cihazdan dosya aktarma
    • Yakındakilerle Paylaş veya Bluetooth aktarımı gibi seçenekleri kullanarak cihazlar arasında dosya aktarma.

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

Cihaz üreticileri, isteğe bağlı olarak DCIM/ dizinine medya kod dönüştürme için dosya yolu ekleyebilir. DCIM/ dizininin dışındaki tüm yollar reddedilir. Operatör koşullarını veya yerel düzenlemeleri karşılamak için bu tür dosya yollarını eklemeniz gerekebilir.

Dosya yolu eklemek için kod dönüştürme yolu çalışma zamanı kaynak yer paylaşımını (RRO) kullanın,config_supported_transcoding_relative_paths. 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 şunları 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 kod dönüştürme özelliğinin mimarisi açıklanmaktadır.

media-transcoding-architecture

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

Medya kod 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 muhasebeyi 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ı kodları, zamanında hata düzeltmeleri ve güncellemeler yapılmasına olanak tanımak için MediaProvider modülünde bulunur.

Dosya erişimi

Uyumlu medya kod dönüştürme, kapsamlı depolama için kullanılan Kullanıcı Alanındaki Dosya Sistemi (FUSE) dosya sisteminin üzerine inşa edilmiştir. 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.

Kod 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 uygulama tarafından manifest dosyasında veya zorunlu kod dönüştürme listesinde belirtilmediği sürece dosyaları kod dönüştürmez.

Uygulamalar, aşağıdaki seçenekleri kullanarak kod geçişi yapılan öğeler isteyebilir:

  • Manifest dosyasında desteklenmeyen biçimleri tanımlama Ayrıntılar için Bir kaynakta özellikleri tanımlama ve Özellikleri kodda tanımlama başlıklı makaleleri inceleyin.
  • 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üncelledikten sonra 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österebilir. Android ekibi, listeyi düzenli olarak inceler ve listeden uygulama 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ında (cihazdan bilgisayara) 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 kod dönüştürmeyi etkinleştirmek için açma/kapatma düğmesini kullanın

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

Kod dönüştürülmüş dosya istemesiyle ilgili kısıtlamalar

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

  • 10 art arda 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ısını döndürür.

Cihaz gereksinimleri

Uyumlu medya kod 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 yakalamayı destekler

Medya kod dönüştürme işleminde cihaz performansını sağlamak için video donanımı ve depolama alanı okuma/yazma erişim performansı optimize edilmelidir. Medya codec'leri 1 değerine eşit önceliğe sahip olacak şekilde yapılandırıldığında codec'ler mümkün olan en yüksek işleme hızında çalışmalıdır. 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

Uyumlu medya kod dönüştürme özelliğini doğrulamak için aşağıdaki CTS testlerini çalıştırın:

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

Medya kod dönüştürmeyi dünya genelinde etkinleştirme

Medya kodlama dönüştürme çerçevesini veya kodlama dönüştürme ile uygulama davranışını test etmek için uyumlu medya kodlama dönüştürme özelliğini dünya genelinde 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 ardından Kod dönüştürmeyi etkinleştir açma/kapatma düğmesini açık veya kapalı konuma getirin. Bu ayar etkinse medya kod dönüştürme işlemi, geliştirdiğiniz uygulama dışındaki uygulamalar için arka planda gerçekleşebilir.

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ı uzatma

Test amacıyla, aşağıdaki komutu kullanarak kod dönüştürme işlemi için bir dakikalık video uzunluğu sınırlamasını uzatabilirsiniz. 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 kodlama dönüştürmeyle ilgili AOSP kaynak kodu verilmiştir.

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 belirtilen 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::Plugin 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 4. Filtre eklentisi mimarisi.

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, tedarikçi firmanın Codec 2.0 uygulamasının gösterdiğinden ayrıdır. Bu depo genellikle yalnızca 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ımlanır:

    • controlParam: Filtrelerin davranışını kontrol eden parametreler. Örneğin, HDR'den SDR'ye ton eşleyici 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 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ı

Bu bölümde, FilterWrapper sınıfının 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 5. 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 komut gönderir.

Arabellek işleme

Arabellek işleme

Şekil 6. Arabellek işleme.

Sarmalanmış kod çözücüye yerleştirilen arabellekler temel kod çözücüye gider. Sarmalanmış bileşen, onWorkDone_nb() geri çağırma işlevi aracılığıyla kod çözücüden çıkış arabelleğini alır ve ardından filtrelere ekler. Son filtreden gelen nihai çıkış arabelleği müşteriye bildirilir.

Bu arabellek işlemenin çalışması için sarmalanmış bileşenin, çerçeve çıkışının beklenen blok havuzundan arabellek oluşturması amacıyla C2PortBlockPoolsTuning değerini son filtreye ayarlamalıdı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ın ve /vendor/lib[64]/libc2filterplugin.so. alanına bırakın
  2. Gerekirse mediacodec.te için ek izinler ekleyin.
  3. Uyumlulaştırma 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 derleyin:

    m sample-codec2-filter-plugin
    
  3. Cihazı yeniden takın ve codec hizmeti tarafından tanınması için tedarikçi 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