Uyumlu medya kodu dönüştürme

Android 12'de sunulan uyumlu medya kod dönüştürmesi, cihazların video çekimi için uygulamalarla uyumluluğu korurken HEVC gibi daha modern, depolama açısından verimli medya formatlarını kullanmasına olanak tanıyan bir özelliktir. 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'yi kullanabilir. Uyumlu medya kod dönüştürme özelliğinin etkinleştirildiği cihazlarda Android, HEVC veya HDR gibi formatlarda kaydedilen videoları (uzunluğu bir dakikaya kadar), formatı desteklemeyen bir uygulama tarafından açıldığında otomatik olarak dönüştürebilir. Bu, videolar cihazda daha yeni formatlarda çekildiğinde bile uygulamaların çalışmasına olanak tanır.

Uyumlu medya kod dönüştürme özelliği varsayılan olarak kapalıdır. Medya kod dönüştürme isteğinde bulunmak için uygulamaların medya yeteneklerini beyan etmesi gerekir. Medya yeteneklerini bildirme hakkında daha fazla bilgi için Android Developers sitesindeki Uyumlu medya kod dönüştürme bölümüne bakın.

Nasıl çalışır

Uyumlu medya kod 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ürmeler için donanım kullanarak dosyaları bir formattan 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 bir OEM eklentisi ve donanım dahildir. Daha fazla ayrıntı için bkz . Mimariye genel bakış .
  • 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 uygulamalara müdahale eder ve uygulamanın beyan edilen yeteneklerine 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şleme gerek yoktur. Bir uygulama 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 işlemi

Şekil 1. Uyumlu medya kod dönüştürmesine genel bakış.

Desteklenen formatlar

Uyumlu medya kod dönüştürme özelliği aşağıdaki format dönüştürmelerini destekler:

  • HEVC'den (8 bit) AVC'ye: Codec dönüşümleri, bir mediacodec kod çözücü ve bir mediacode kodlayıcının bağlanmasıyla gerçekleştirilir.
  • HDR10+'dan (10 bit) AVC'ye (SDR): HDR'den SDR'ye dönüşümler, mediacodec örnekleri ve kod çözücü örneklerine bir satıcı eklenti kancası kullanılarak gerçekleştirilir. Daha fazla bilgi için bkz. HDR'den SDR'ye kodlama .

Desteklenen içerik kaynakları

Uyumlu medya kod dönüştürme özelliği, birincil harici birimdeki DCIM/Camera/ klasöründe depolanan, yerel OEM kamera uygulaması tarafından oluşturulan cihaz içi medyayı destekler. Bu özellik, ikincil depolamadaki medyayı desteklemez. E-posta veya SD kartlar aracılığıyla cihazlara aktarılan içerik 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 uygulamaya erişim
    • Depolama Erişim Çerçevesi (SAF) aracılığıyla uygulama erişimi
    • İşletim sistemi paylaşım sayfası Amaçları aracılığıyla uygulamaya erişim. (Yalnızca MediaStore URI'si)
    • Telefondan PC'ye MTP/PTP dosya aktarımı
  • Kod dönüştürme atlandı:

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

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

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

Bir dosya yolu eklemek için kod dönüştürme yolu çalışma zamanı kaynak kaplamasını (RRO) , config_supported_transcoding_relative_paths kullanın. Aşağıda dosya yolunun nasıl ekleneceğine dair 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 kod dönüştürme özelliğinin mimarisi açıklanmaktadır.

medya-kod dönüştürme mimarisi

Ş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ını sağlayan 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 defter tutmayı yöneten yerel hizmet.
  • MediaTranscoder: Kod dönüştürmeyi gerçekleştiren yerel kitaplık. Bu kitaplık, modüllerle uyumlu olacak şekilde NDK medya çerçevesi üzerine inşa edilmiştir.

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

Dosya erişimi

Uyumlu medya kod dönüştürmesi, 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 incelemesine ve erişime izin verme, reddetme veya erişim izni verme politikasına dayalı olarak dosyalara erişimi kapatmasına olanak tanır.

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

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

Uyumlu medya kod dönüştürme özelliği varsayılan olarak devre dışıdır; bu, cihazın HEVC'yi desteklemesi durumunda Android'in, bir bildirim 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ürmediği anlamına gelir.

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

  • Bildiri dosyasında desteklenmeyen biçimleri bildirin. Ayrıntılar için bkz. Kaynaktaki yetenekleri bildirme ve Koddaki yetenekleri bildirme .
  • MediaProvider modülünde bulunan zorunlu kod dönüştürme listesine uygulamalar ekleyin. Bu, bildirim dosyasını güncellememiş uygulamalar için kod dönüştürmeye olanak tanır. Bir uygulama manifest dosyasını desteklenmeyen formatlarla güncellediğinde, zorunlu kod dönüştürme listesinden kaldırılmalıdır. Cihaz üreticileri, bir yama göndererek veya bir hata bildirerek uygulamalarının zorunlu kod dönüştürme listesine eklenmesini veya bu listeden kaldırılmasını önerebilir. Android ekibi listeyi düzenli aralıklarla inceler ve uygulamaları listeden kaldırabilir.
  • Çalışma zamanında uygulama uyumluluk çerçevesiyle desteklenen formatları devre dışı bırakın (kullanıcılar bunu her uygulama için Ayarlar'dan da 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 (aygıttan 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 seçeneğini kullanarak kod dönüştürmeyi etkinleştirmeyi seçebilirler.

Medya kod dönüştürmeyi etkinleştirmek için geçiş yapın

Şekil 3. USB Tercihleri ​​ekranında medya kod dönüştürmeyi etkinleştirmek için geçiş yapın.

Kodu dönüştürülmüş dosyaların istenmesine ilişkin kısıtlamalar

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

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

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 kod dönüştürme özelliğini desteklemek için cihazların aşağıdaki gereksinimleri 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ürmede cihaz performansını garanti altına almak için video donanımı ve depolama okuma/yazma erişim performansının optimize edilmesi gerekir. Medya codec bileşenleri 1 eşit öncelik ile yapılandırıldığında, codec bileşenlerinin mümkün olan en yüksek verimde ç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 adresindeki medya kod dönüştürme karşılaştırmasını ç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 küresel olarak etkinleştirin

Medya kod 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 genel 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 seçeneğini açık olarak ayarlayın ve ardından Kod dönüştürmeyi etkinleştir seçeneğini açık veya kapalı olarak ayarlayın. Bu ayar etkinleştirilirse, geliştirmekte olduğunuz uygulama dışındaki uygulamalar için arka planda medya kod dönüştürmesi meydana gelebilir.

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

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şlet

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

Uyumlu medya kod dönüştürmeyle ilgili AOSP kaynak kodu aşağıdadır.

HDR'den SDR'ye kodlama

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

Bir cihaz, HDR'den SDR'ye kodlamayı destekleyen bir eklenti içermiyorsa HDR videoya erişen uygulama, uygulamanın manifestte belirtilen medya yeteneklerinden bağımsız olarak orijinal dosya tanımlayıcısını alır.

Nasıl çalışır

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

Arka plan

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

Genel Bakış

FilterWrapper sınıfı, satıcı codec bileşenlerini alır ve sarılmış codec bileşenlerini media.c2 uyarlama katmanına geri döndürür. FilterWrapper sınıfı, FilterWrapper::Plugin API'si aracılığıyla libc2filterplugin.so yükler ve eklentideki mevcut filtreleri kaydeder. Oluşturma sırasında, FilterWrapper mevcut tüm filtreleri başlatır. Yalnızca arabelleği değiştiren filtreler başlangıçta başlatılır.

Filtre eklentisi mimarisi

Şekil 1. Filtre eklentisi mimarisi.

Filtre eklentisi arayüzü

FilterPlugin.h arayüzü, filtreleri ortaya çıkarmak 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ının ortaya çıkardığı şeyden farklıdır. Genellikle bu depo yalnızca FilterWrapper sınıfı tarafından kullanılan filtreleri içerir.

  • bool describe(C2String name, Descriptor *desc)

    C2ComponentStore mevcut olanlara 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 ö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 döndürür.

FilterWrapper ayrıntıları

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

Yaratılış

Sarılmış bileşen, oluşturma sırasında temeldeki kod çözücüyü ve tanımlanmış tüm filtreleri başlatır.

Sorgu ve yapılandırma

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

Sorgu ve yapılandırma

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

Başlangıç

Başlangıçta sarılmış bileşen, kod çözücüyü ve arabellekleri değiştiren tüm filtreleri başlatır. Hiçbir filtre etkinleştirilmezse, sarılmış bileşen kod çözücüyü ve geçiş arabelleklerini başlatır ve komutları kod çözücünün kendisine gönderir.

Arabellek kullanımı

Arabellek kullanımı

Şekil 3. Arabellek kullanımı.

Sarılmış kod çözücüde kuyruğa alınan arabellekler, temeldeki kod çözücüye gider. Sarılmış bileşen, onWorkDone_nb() geri çağrısı yoluyla kod çözücüden çıktı arabelleğini alır ve ardından onu filtrelerde sıraya koyar. Son filtreden gelen son çıktı arabelleği istemciye bildirilir.

Bu arabellek işlemenin çalışması için, sarılmış bileşenin C2PortBlockPoolsTuning son filtreye 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

Durdurma sırasında sarılmış bileşen, kod çözücüyü ve başlatılan tüm etkin filtreleri durdurur. Sıfırlama ve bırakma sırasında, etkin olup olmadıklarına bakılmaksızın 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.
  2. Gerekirse mediacodec.te ek izinler ekleyin.
  3. Adaptasyon katmanını Android 12'ye güncelleyin ve media.c2 hizmetini yeniden oluşturun.

Eklentiyi test edin

Ö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 bağlayın 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