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.
Ş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.
Ş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 belirtirkenMediaStore
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.
Ş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.
Transcoding System API (yalnızca MediaProvider tarafından kullanılır)
ApplicationMediaCapabilities API
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
MediaTranscoding Hizmeti
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Yerel MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
MediaTranscoder için HDR örnek eklentisi
MediaProvider dosya müdahalesi ve kod dönüştürme kodu
MediaTranscoder karşılaştırması
frameworks/av/media/libmediatranscoding/transcoder/benchmark
CTS testleri
cts/tests/tests/mediatranscoding/
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.
Ş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 teFilterWrapper
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 filtresitrue
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).
Ş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ı
Ş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:
FilterPlugin
arayüzünü bir kitaplığa uygulayıp/vendor/lib[64]/libc2filterplugin.so.
- Gerekirse
mediacodec.te
için ek izinler ekleyin. - 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:
- Cihazı yeniden oluşturun ve flaşlayın.
Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:
m sample-codec2-filter-plugin
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