Uyumlu Medya Kod Dönüştürme

Android 12'de tanıtılan uyumlu medya kod dönüştürme, cihazların video yakalama için HEVC gibi daha modern, depolama açısından verimli medya formatlarını kullanmasını sağlarken uygulamalarla uyumluluğu korumasını sağlayan bir özelliktir. Bu özellikle, cihaz üreticileri, depolama ve bant genişliği gereksinimlerini azaltırken video kalitesini iyileştirmek 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 biçimlerde kaydedilmiş videoları (bir dakikaya kadar uzunlukta) otomatik olarak dönüştürebilir, videolar bu biçimi desteklemeyen bir uygulama tarafından açıldığında. Bu, videolar cihazda daha yeni biçimlerde çekildiğinde bile uygulamaların çalışmasına olanak tanır.

Uyumlu ortam kod dönüştürme özelliği varsayılan olarak kapalıdır. Medya kod dönüştürme talebinde bulunmak için uygulamaların medya yeteneklerini beyan etmesi gerekir. İlan medya yetenekleri hakkında daha fazla bilgi için bkz Uyumlu medya kod geçişini Android Geliştiricileri sitesinden.

Nasıl çalışır

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

  • Medya çerçevesinde hizmetlerini kod geçişini: Bu hizmetler, düşük gecikme süresi ve yüksek kaliteli dönüşümler için başka kullanan donanım biçimden diğerine dosyalarını dönüştürmek. 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 bilgi için bkz Mimarlık bakış .
  • Medya sağlayıcıları özelliğini transkodlamak Uyumlu medya: Bu bileşen medya sağlayıcıları yakaladığını bulunan medya dosyalarını erişen uygulamaları ve orijinal dosya veya uygulamanın ilan yeteneklerine dayalı bir dönüştürülmüş dosyayı ya vermektedir. Bir uygulama medya dosyasının biçimini destekliyorsa özel bir işlem gerekmez. 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, ortam kod dönüştürme işlemine genel bir bakış gösterir.

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

Uyumlu ortam kodlama Şekil 1. genel.

Desteklenen biçimler

Uyumlu ortam kod dönüştürme özelliği, aşağıdaki biçim dönüştürmelerini destekler:

  • AVC için HEVC (8 bit): Çözücü dönüşüm bir mediacodec kod çözücü ve bir mediacode kodlayıcı bağlantı aracılığıyla gerçekleştirilir.
  • AVC için HDR10 + (10-bit) (SDR): HDR SDR dönüşüm mediacodec örneklerini ve kod çözücü örneklerine bir satıcı eklenti kanca kullanılarak gerçekleştirilir. Daha fazla bilgi için, bkz SDR kodlama HDR .

Desteklenen içerik kaynakları

Özelliği destekleri kod geçişini uyumlu medya Cihazdaki saklanır yerli OEM kamera uygulaması tarafından oluşturulan medya DCIM/Camera/ birincil dış hacimde klasörde. Bu özellik, ikincil depolamadaki medyayı desteklemiyor. 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 etkin:

    • 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
    • İşletim sistemi 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
    • Nearby Share 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 altında transkodlamak medya için filepaths ekleyebilir DCIM/ dizinine. Dışında tüm yollar DCIM/ dizinine reddedilir. Taşıyıcı gereksinimlerini veya yerel düzenlemeleri karşılamak için bu tür dosya yollarının eklenmesi gerekebilir.

Bir dosyayolu eklemek için çapraz kodlama yolu kullanmak çalışma zamanı kaynak bindirme (RRO) , config_supported_transcoding_relative_paths . Aşağıda, bir dosya yolunun nasıl ekleneceğine ilişkin 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üm, medya kod dönüştürme özelliğinin mimarisini açıklar.

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

Şekil mimarisini transkodlamak 2. Medya.

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

  • MediaTranscodingManager sistemi API: Arayüz istemci MediaTranscoding hizmetiyle iletişim kurmasına olanak sağlar. MediaProvider modülü bu API kullanır.
  • MediaTranscodingService: Doğal istemci bağlantılarını yönetir hizmet istekleri kod geçişini programları ve için defter tutma yönetir TranscodingSessions .
  • MediaTranscoder: gerçekleştirdiği kod geçişini olduğunu Yerli kütüphanesi. Bu kütüphane ile uyumlu olacak şekilde ortam çerçevesi NDK üzerine inşa edilmiştir modüllerin .

Uyumlu ortam kod dönüştürme özelliği, hem hizmette hem de ortam 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 ortam kod üzerine inşa edilir Kullanıcı Alanı (SİGORTA) dosya sisteminde Dosya Sistemi kapsamına sahip depolama için kullanılır. FUSE, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesini ve erişime izin verme, reddetme veya redact politikasına dayalı olarak dosyalara erişim kapısı açmasını sağlar.

Bir uygulama bir dosyaya erişmeye çalıştığında, FUSE arka plan programı uygulamadan dosya okuma erişimini engeller. Uygulama daha yeni bir formatı (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 varsa önbellekten döndürülür.

Kodu dönüştürülmüş dosyalar iste

Özelliği transkodlamak uyumlu medya aygıtı HEVC destekliyorsa bir bildirim dosyasında veya bir uygulama tarafından belirtilmediği sürece, Android değil kodlama dosyaları yapar, yani varsayılan olarak devre dışıdır kuvvet kodlama listesinin .

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

  • Bildirim dosyasında desteklenmeyen biçimleri bildirin. Ayrıntılar için bkz bir kaynakta Declare yetenekleri ve kod yetenekleri beyan .
  • İçin uygulamalar ekleyin kuvvet kodlama listesinin dahil olduğunu MediaProvider modülü. Bu, bildirim dosyalarını güncellememiş uygulamalar için kod dönüştürmeyi etkinleştirir. Bir uygulama bildirim dosyasını desteklenmeyen biçimlerle güncelledikten sonra, zorunlu kod dönüştürme listesinden kaldırılmalıdır. Cihaz üreticileri uygulamalar tarafından eklenen veya kuvvet kodlama listesinden kaldırılacak aday gösterebilirsiniz bir yama göndererek veya tarafından bir hatayı bildirmeden . Android ekibi listeyi periyodik olarak gözden geçirir 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 Ayarlar'da her uygulama için de devre dışı bırakabilir).
  • İle dosya açma MediaStore açıkça ile desteklenmeyen formatları belirtilirken openTypedAssetFileDescriptor API.

USB aktarımlar (PC'ye cihaz) için, kod dönüştürme varsayılan olarak devre dışıdır ancak kullanıcılar Şekil 3'te görüldüğü gibi ekran ayarı USB Tercihler geçiş AVC dönüştürme videoları kullanarak transkodlamak etkinleştirmeyi seçebilir.

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

Şekil 3. Geçiş USB Tercihleri ekranında transkodlamak medyayı etkinleştirmek için.

Kodu dönüştürülmüş dosyaları istemeyle 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 oturumları isteyen uygulamalar şunlarla sınırlıdır:

  • 10 ardışık oturum
  • toplam üç dakikalık ç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 ortam kod dönüştürme özelliğini desteklemek için cihazların aşağıdaki gereksinimleri karşılaması gerekir:

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

Medya kod dönüştürme için cihaz performansını sağlamak için video donanımı ve depolama okuma/yazma erişim performansı optimize edilmelidir. Medya codec eşit önceliğe sahip yapılandırıldığında 1 , codec mümkün olan en yüksek verimle çalışması gerekir. Kod dönüştürme performansının minimum 200 fps'ye ulaşmasını öneririz. Donanım performansını test etmek için, medya dönüştürücü kriter çalıştırmak frameworks/av/media/libmediatranscoding/transcoder/benchmark .

doğrulama

Uyumlu ortam 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

Küresel olarak medya kod dönüştürmeyi etkinleştir

Medya kod dönüştürme çerçevesini veya uygulama davranışını kod dönüştürme ile 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 olarak> Medya kod geçişi geliştirici seçenekleri sayfasında, açık veya kapalı duruma getirilmesi, transkodlamak etkinleştirme varsayılan üzerine geliniz geçersiz kılma kod çevrimi ayarlayın ve sonra ayarlayın. Bu ayar etkinleştirilirse, geliştirmekte olduğunuz uygulamalar dışındaki uygulamalar için arka planda medya kod dönüştürme işlemi gerçekleşebilir.

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

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

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ı genişletebilirsiniz. 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ğıdakiler, uyumlu ortam kod dönüştürmeyle ilgili AOSP kaynak kodudur.

HDR'den SDR'ye kodlama

Bulunan eklenti SDR kodlama HDR desteklemek için, cihaz üreticileri AOSP örnek Codec 2,0 filtre kullanabilir /platform/frameworks/av/media/codec2/hidl/plugin/ . Bu bölüm, filtre eklentisinin nasıl çalıştığını, eklentinin nasıl uygulanacağını ve eklentinin nasıl test edileceğini açıklar.

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

Nasıl çalışır

Bu bölüm, Codec 2.0 filtre eklentisinin genel davranışını açıklar.

Arka plan

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

genel bakış

FilterWrapper sınıf satıcı codec ve iadeler sarılmış codec için geri alır media.c2 adaptasyon tabakasının. FilterWrapper sınıf yükleri libc2filterplugin.so aracılığıyla FilterWrapper::Plugin eklentisinden API ve kayıtları mevcut filtreler. Yaratılış günü, FilterWrapper tüm filtreleri başlatır. Yalnızca arabelleği değiştiren filtreler başlangıçta başlatılır.

Filtre eklenti mimarisi

Şekil 1. Filtre eklenti mimarisi.

Filtre eklenti arayüzü

FilterPlugin.h arayüz filtreleri ortaya çıkarmak için aşağıdaki API'leri tanımlar:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Bir İade C2ComponentStore filtreleri içeren nesne. Bu, satıcının Codec 2.0 uygulamasının gösterdiğinden ayrıdır. Tipik haliyle, bu depo sadece te kullanılan filtreleri içeren FilterWrapper sınıfı.

  • bool describe(C2String name, Descriptor *desc)

    Edinilebilir olanlara ilaveten filtreleri açıklar C2ComponentStore . Aşağıdaki açıklamalar tanımlanmıştır:

    • controlParam : Filtrelerin davranışını kontrol parametreleri. Örneğin, HDR'den SDR'ye ton eşleyici için kontrol parametresi hedef aktarım işlevidir.
    • affectedParams : filtreleme işlemleri etkilenir parametreler. Örneğin, HDR'den SDR'ye ton eşleyici için, etkilenen parametreler renk özellikleridir.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    İade true filtre bileşeni kişiliklerden eğer tampon. Örneğin, ton eşleme filtresi döndüren true hedef transfer fonksiyonu SDR ve giriş transfer fonksiyonu HDR (HLG veya PQ) ise.

FilterWrapper ayrıntıları

Bölüm ayrıntılarını açıklar FilterWrapper sınıfında.

oluşturma

Sarılmış bileşen, oluşturma sırasında temeldeki kod çözücüyü ve tüm tanımlanmış 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 filtrelerden etkilenen parametreler sorgularda bulunur (etkilenmemiş parametrelere sahip kod çözücüden okumak yerine).

Sorgu ve yapılandırma

Şekil 2. sorgu ve konfigürasyon.

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ü başlatır ve geçiş arabelleklerini başlatır ve kod çözücünün kendisine komutlar gönderir.

arabellek işleme

arabellek işleme

Şekil 3. Tampon kullanım.

Sarılmış kod çözücüye sıraya alınan arabellekler, temeldeki kod çözücüye gider. Sarılmış bileşeni boyunca dekodere gelen çıktı tamponu kapmak onWorkDone_nb() geri arama ve sonra filtreler için sıralar. Son filtreden alınan son çıktı arabelleği istemciye bildirilir.

Çalışma için gerekli işlemleri, bu tampon için, sarılmış komponentin, yapılandırma C2PortBlockPoolsTuning geçen filtre etmek, böylece beklenen bloğu havuzundan çerçeve çıkış tamponları.

Durdur, sıfırla ve bırak

Durduğunda, 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, etkinleştirilip etkinleştirilmediklerine bakılmaksızın tüm bileşenler sıfırlanır veya serbest bırakılır.

Örnek filtre eklentisini uygulayın

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

  1. Uygulamak FilterPlugin bir kütüphanede arayüzü ve en bırakın /vendor/lib[64]/libc2filterplugin.so.
  2. İçin ek izinler ekleyin mediacodec.te gerekirse.
  3. Android 12'ye adaptasyon katmanı güncelleyin ve yeniden media.c2 hizmeti.

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 kodek hizmeti tarafından tanınması için satıcı 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