Uyumlu medya kodlama dönüştürme

Android 12'de kullanıma sunulan uyumlu medya dönüştürme, cihazların video çekimi için daha modern ve depolama alanı açısından verimli medya biçimlerini (ör. HEVC) kullanmasına olanak tanıyan bir özelliktir. Bu özellik, uygulamalarla uyumluluğu da korur. Bu özellik sayesinde cihaz üreticileri, depolama ve bant genişliği gereksinimlerini azaltırken video kalitesini artırmak için varsayılan olarak AVC yerine HEVC kullanabilir. Uyumlu medya dönüştürme özelliği etkinleştirilmiş cihazlarda Android, biçimi desteklemeyen bir uygulama tarafından açıldığında HEVC veya HDR gibi biçimlerde kaydedilen videoları (en fazla bir dakika uzunluğunda) otomatik olarak dönüştürebilir. Bu sayede, cihazda yeni biçimlerde çekilen videolarla bile uygulamalar çalışabilir.

Uyumlu medya kodlama dönüştürme özelliği varsayılan olarak devre dışıdır. Uygulamaların medya dönüştürme isteğinde bulunabilmesi için medya özelliklerini bildirmesi gerekir. Medya özelliklerini beyan etme hakkında daha fazla bilgi için Android Developers sitesindeki Uyumlu medya kodlama dönüştürme bölümüne bakın.

İş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 gecikmeli ve yüksek kaliteli dönüştürmeler için donanım kullanarak dosyaları bir biçimden diğerine dönüştürür. Bu kapsamda kod dönüştürme API'si, kod dönüştürme hizmeti, özel filtreler için bir OEM eklentisi ve donanım yer alır. Daha fazla bilgi için Mimariye genel bakış başlıklı makaleyi inceleyin.
  • Medya sağlayıcılarda uyumlu medya kodlama dönüştürme özelliği: Medya sağlayıcılarda bulunan bu bileşen, medya dosyalarına erişen uygulamaları yakalar 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 bir işlem yapılması 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ış sunulmaktadır.

Uyumlu medya kod dönüştürme işlemi

Şekil 1. Uyumlu medya kodlama 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üştürmelerini destekler:

  • HEVC (8 bit) - AVC: Codec dönüştürmeleri, bir mediacodec kod çözücüsü ve bir mediacode kodlayıcısı bağlanarak gerçekleştirilir.
  • HDR10+ (10 bit) - AVC (SDR): HDR - SDR dönüştürmeleri, mediacodec örnekleri ve kod çözücü örneklerine bağlanan bir satıcı 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 kodlama dönüştürme özelliği, birincil harici birimde DCIM/Camera/ klasöründe depolanan, yerel OEM Kamera uygulaması tarafından oluşturulan cihaz üzerinde medyayı destekler. Bu özellik, ikincil depolama alanındaki medyaları desteklemez. E-posta veya SD kartlar aracılığıyla cihazlara aktarılan 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 uygulamaya erişim
    • 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 üzerinden 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 dosyaları cihazdan aktarma
    • Yakındakilerle Paylaş veya Bluetooth aktarımı gibi seçenekleri kullanarak cihazlar arasında dosya aktarma

Transkodlama için özelleştirilmiş dosya yolları ekleme

Cihaz üreticileri, isteğe bağlı olarak DCIM/ dizini altında medya transkodlaması için dosya yolları ekleyebilir. DCIM/ dizininin dışındaki tüm yollar reddedilir. Bu tür dosya yollarının eklenmesi, kargo şirketi şartlarını veya yerel düzenlemeleri karşılamak için gerekli olabilir.

Dosya yolu eklemek için çalışma zamanında kaynak eşlemesi (RRO) kod dönüştürme yolunu 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ılan 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 dönüştürme özelliğinin mimarisi açıklanmaktadır.

media-transcoding-architecture

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

Medya 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 medya çerçevesi NDK'sının üzerine kurulmuştur.

Uyumlu medya kod dönüştürme özelliği, kod dönüştürme metriklerini hem hizmette hem de medya kod dönüştürücüde günlüğe kaydeder. İstemci tarafı ve hizmet tarafı kodu, zamanında hata düzeltmeleri ve güncellemeler yapılmasına olanak tanımak için MediaProvider modülündedir.

Dosya erişimi

Uyumlu medya dönüştürme, kapsamlı depolama için kullanılan Filesystem in Userspace (FUSE) dosya sistemi üzerine kurulmuştur. FUSE, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesini ve erişimi izin verme, reddetme veya erişimi düzeltme 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 engeller. Uygulama daha yeni bir biçimi (ör. HEVC) destekliyorsa orijinal dosya döndürülür. Uygulama biçimi desteklemiyorsa dosya daha eski bir biçime (ör. AVC) dönüştürülür veya dönüştürülmüş bir sürüm varsa önbellekten döndürülür.

Dönüştürülmüş dosyaları isteme

Uyumlu medya kodlama dönüştürme özelliği varsayılan olarak devre dışıdır. Uygulamalar, aşağıdaki seçenekleri kullanarak kod geçişi yapılan öğeler isteyebilir:

  • Desteklenmeyen biçimleri manifest dosyasında bildirin. Ayrıntılar için Bir kaynakta özellikleri bildirme ve Kodda özellikleri bildirme başlıklı makaleleri inceleyin.
  • Desteklenen biçimleri çalışma zamanında uygulama uyumluluğu çerçevesiyle devre dışı bırakma (Kullanıcılar bu özelliği Ayarlar'da her uygulama için ayrı ayrı da devre dışı bırakabilir).
  • openTypedAssetFileDescriptor API'si ile desteklenmeyen biçimleri açıkça belirterek MediaStore ile dosya açma.

USB aktarımlarında (cihazdan PC'ye) varsayılan olarak kod dönüştürme 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 geçiş yapın.

Dönüştürülmüş dosyaları istemeyle ilgili kısıtlamalar

Transkodlama isteklerinin sistem kaynaklarını uzun süre boyunca kilitlemesini önlemek için transkodlama oturumu isteyen uygulamalar şu şekilde sınırlandırılır:

  • 10 ardışık oturum
  • toplam üç dakika çalışma süresi

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

Cihaz gereksinimleri

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

  • Cihazda, yerel kamera uygulamasında varsayılan olarak HEVC kodlama etkinleştirilmiş olmalıdır.
  • (HDR'den SDR'ye dönüştürmeyi destekleyen cihazlar) Cihaz, HDR video çekimini destekliyor olmalıdır.

Medya kodu dönüştürme için cihaz performansını sağlamak üzere video donanımı ve depolama alanı okuma/yazma erişim performansı optimize edilmelidir. Medya codec'leri 1 önceliğiyle yapılandırıldığında codec'ler mümkün olan en yüksek işleme hızında çalışmalıdır. Transkodlama performansının en az 200 fps olmasını öneririz. Donanım performansınızı test etmek için frameworks/av/media/libmediatranscoding/transcoder/benchmark adresinde medya dönüştürücü karşılaştırma testini çalıştırın.

Doğrulama

Uyumlu medya 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 genel olarak 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 genel olarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Ayarlar > Sistem > Geliştirici > Medya dönüştürme geliştirici seçenekleri sayfasında Dönüştürme varsayılanlarını geçersiz kıl anahtarını açık, Dönüştürmeyi etkinleştir anahtarını ise açık veya kapalı olarak ayarlayın. Bu ayar etkinleştirilirse geliştirdiğiniz uygulama dışındaki uygulamalarda medya dönüştürme işlemi arka planda gerçekleşebilir.

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ı genişletme

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ı genişletebilirsiniz. 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ürme ile 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/ konumunda 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, manifestte 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, Codec 2.0 arayüzü ile android.hardware.media.c2 HAL arayüzü arasında android::hardware::media::c2 konumunda bir uyarlama katmanı uygulaması sağlar. AOSP, filtre eklentileri için kod çözücüleri filtre eklentileriyle birlikte sarmalayan bir sarmalayıcı mekanizma içerir. MediaCodec Bu sarmalanmış bileşenleri, filtreleme özelliklerine sahip kod çözücüler olarak tanır.

Genel Bakış

FilterWrapper sınıfı, satıcı codec'lerini alır ve sarmalanmış codec'leri media.c2 uyarlama katmanına geri döndürür. FilterWrapper sınıfı, libc2filterplugin.so aracılığıyla FilterWrapper::Plugin API'sini yükler ve eklentideki mevcut filtreleri kaydeder. Oluşturma sırasında FilterWrapper tüm kullanılabilir filtreleri başlatır. 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 kullanıma sunmak için aşağıdaki API'leri tanımlar:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Filtreleri içeren bir C2ComponentStore nesnesi döndürür. Bu, satıcının Codec 2.0 uygulamasının sunduklarından ayrıdır. Genellikle bu mağazada yalnızca FilterWrapper sınıfı tarafından kullanılan filtreler bulunur.

  • bool describe(C2String name, Descriptor *desc)

    C2ComponentStore'da sunulanlara 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ş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 yönleridir.
  • 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ı

Bu bölümde, FilterWrapper sınıfının ayrıntıları açıklanmaktadır.

içerik üretimi

Sarmalanmış bileşen, oluşturma sırasında temel kod çözücüyü ve tanımlanan tüm filtreleri başlatır.

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ırılması ilgili filtreye yönlendirilir ve filtrelerden etkilenen parametreler, sorgularda yer alır (etkilenmeyen parametreleri olan kod çözücüden okumak yerine).

Sorgu ve yapılandırma

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

Başlat

Sarmalanmış bileşen, başlangıçta kod çözücüyü ve arabellekleri değiştiren tüm filtreleri başlatır. Filtre etkinleştirilmemişse sarmalanmış bileşen, kod çözücüyü ve geçiş arabelleklerini başlatır ve kod çözücünün kendisine komutlar gönderir.

Arabellek işleme

Arabellek işleme

Şekil 6. Arabellek işleme.

Sarmalanmış kod çözücüye gönderilen 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 gönderir. Son filtrenin nihai çıkış arabelleği istemciye bildirilir.

Bu arabellek işleme özelliğinin çalışması için sarmalanmış bileşenin, çerçeve çıkış arabelleklerinin beklenen blok havuzundan gelmesi amacıyla C2PortBlockPoolsTuning son filtreye yapılandırılması gerekir.

Durdurma, sıfırlama ve bırakma

Sarma işlemi durdurulduğunda, sarılmış bileşen kod çözücüyü ve başlatılmış olan tüm etkin filtreleri durdurur. Sıfırlama ve yayınlama sırasında, etkin olup olmadıklarına bakılmaksızın tüm bileşenler sıfırlanır veya yayınlanır.

Örnek filtre eklentisini uygulama

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

  1. Kitaplıkta FilterPlugin arayüzünü uygulayın ve /vendor/lib[64]/libc2filterplugin.so. konumuna bırakın.
  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 yükleyin.
  2. Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:

    m sample-codec2-filter-plugin
    
  3. Cihazı yeniden monte edin ve satıcı eklentisini, codec hizmeti tarafından tanınacak şekilde 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