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