Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Tedarikçi firmaların donanım ardışık düzenini kullanan çerçeve, hem düşük hem de üst segment SoC için uygundur. Çerçeve, güvenilir yürütme ortamı (TEE) ve güvenli medya yolu (SMP) tarafından korunan A/V içeriğini sunmak için güvenli bir yöntem sunarak son derece kısıtlı, içerik koruma ortamında kullanılabilmesini sağlar.
Tuner ve Android CAS arasındaki standart arayüz, Tuner tedarikçileri ile CAS tedarikçileri arasında daha hızlı entegrasyon sağlar. Tuner arayüzü, Android TV için tek küresel bir çözüm geliştirmek üzere MediaCodec
ve AudioTrack
ile çalışır.
Tarayıcı arayüzü, başlıca yayın standartlarına dayalı olarak hem dijital TV'yi hem de analog TV'yi destekler.
Bileşenler
Android 11'de üç bileşen özel olarak TV platformu için tasarlanmıştır.
- Tuner HAL: Çerçeve ve tedarikçiler arasında bir arayüz
- Tuner SDK API: Çerçeve ile uygulamalar arasındaki bir arayüz
- Tuner Resource Manager (TRM): Tuner HW kaynaklarını koordine eder
Android 11 için aşağıdaki bileşenler geliştirildi.
- CAS V2
TvInputService
veya TV Giriş Hizmeti (TIS)TvInputManagerService
veya TV Giriş Yöneticisi Hizmeti (TIMS)MediaCodec
veya medya codec'iAudioTrack
veya ses parçasıMediaResourceManager
veya medya kaynağı yöneticisi (MRM)
Şekil 1. Android TV bileşenleri arasındaki etkileşimler
Özellikler
Ön uç, aşağıdaki DTV standartlarını destekler.
- ATSC
- ATSC3
- DVB C/S/T
- ISDB S/S3/T
- Analog
Tuner HAL 1.1 veya sonraki sürümleri içeren Android 12'deki ön uç, aşağıdaki DTV standardını destekler.
- DTMB
Demux, aşağıdaki akış protokollerini destekler.
- Aktarım akışı (TS)
- MPEG medya aktarma protokolü (MMTP)
- İnternet protokolü (IP)
- Tür uzunluk değerini (TLV)
- ATSC bağlantı katmanı protokolü (ALP)
Şifre Çözücü, aşağıdaki içerik korumalarını destekler.
- Güvenli medya yolu
- Medya yolunu temizle
- Yerel kaydı güvence altına alma
- Güvenli yerel oynatma
Tarayıcı API'leri aşağıdaki kullanım alanlarını destekler.
- Dijital izler
- Canlı
- Oynatma
- Kaydet
Tuner, MediaCodec
ve AudioTrack
aşağıdaki veri akışı modlarını destekler.
- Bellek arabelleğinin temizlendiği ES yükü
- Güvenli bellek tutma yerine sahip ES yükü
- Gerçek görüntü
Genel tasarım
Tuner HAL, Android çerçevesi ile tedarikçi firmanın donanımı arasında tanımlanır.
- Çerçevenin tedarikçi firmadan ne beklediğini ve tedarikçi firmanın bunu nasıl yapabileceğini açıklar.
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
veILnb
arayüzleri aracılığıyla ön uç, demux ve şifre çözücü işlevlerini çerçeveye aktarır.- Tuner HAL'yi
MediaCodec
veAudioTrack
gibi diğer çerçeve bileşenleriyle entegre etme işlevlerini içerir.
Tuner Java sınıfı ve yerel sınıfı oluşturulur.
- Tuner Java API, uygulamaların herkese açık API'ler aracılığıyla Tuner HAL'e erişmesine olanak tanır.
- Yerel sınıf, Tuner HAL ile büyük miktarda kayıt veya oynatma verisinin izin kontrolüne ve işlenmesine olanak tanır.
- Yerel Tuner modülü, Tuner Java sınıfı ile Tuner HAL arasında bir köprüdür.
TRM sınıfı oluşturulur.
- Ön uç, LNB, CAS oturumları ve TV giriş HAL'inden TV giriş cihazı gibi sınırlı tuner kaynaklarını yönetir.
- Uygulamalardaki yetersiz kaynakları geri kazanmak için kurallar uygular. Varsayılan kural, ön planın kazanmasıdır.
Media CAS ve CAS HAL, aşağıdaki özelliklerle geliştirilmiştir.
- Farklı kullanımlar ve algoritmalar için CAS oturumları açar.
- CICAM kaldırma ve yerleştirme gibi dinamik CAS sistemlerini destekler.
- Anahtar jetonları sağlayarak Tuner HAL ile entegre olur.
MediaCodec
ve AudioTrack
aşağıdaki özelliklerle geliştirildi.
- İçerik girişi olarak güvenli A/V belleği alır.
- Tünelli oynatmada donanım A/V senkronizasyonu yapmak üzere yapılandırıldı.
ES_payload
ve geçiş modu için destek yapılandırıldı.
Şekil 2. Tarayıcı HAL'sindeki bileşenlerin şeması
Genel iş akışı
Aşağıdaki şemalar, canlı yayın oynatma için çağrı sıralarını göstermektedir.
Kurulum
Şekil 3. Canlı yayın oynatma sırasını ayarlayın
A/V'yi kullanma
Şekil 4. Canlı yayın oynatma için A/V'yi yönetme
Karmaşık içeriği işleme
Şekil 5. Canlı yayın oynatma için kodlanmış içeriği işleme
A/V verileri işleniyor
Şekil 6. Canlı yayın oynatma için A/V işleniyor
Tuner SDK API'si
Tuner SDK API'si, Tuner JNI, Tuner HAL ve TunerResourceManager
ile etkileşimleri yönetir. TIS uygulaması, Tuner kaynaklarına ve filtre ve şifre çözücü gibi alt bileşenlere erişmek için Tuner SDK API'sini kullanır. Ön uç ve demux dahili bileşenlerdir.
Şekil 7. Tuner SDK API ile etkileşimler
Sürümler
Tuner SDK API, Android 12'den itibaren Tuner HAL 1.1'deki yeni özelliği destekler. Bu özellik, Tuner 1.0'ın geriye dönük uyumlu yeni bir sürümüdür.
Çalışan HAL sürümünü kontrol etmek için aşağıdaki API'yi kullanın.
android.media.tv.tuner.TunerVersionChecker.getTunerVersion()
Gerekli minimum HAL sürümü, yeni Android 12 API'lerinin dokümanlarında bulunabilir.
Paketler
Tuner SDK API'si, aşağıdaki dört paketi sağlar.
android.media.tv.tuner
android.media.tv.tuner.frontend
android.media.tv.tuner.filter
android.media.tv.tuner.dvr
8. Şekil. Tuner SDK API paketleri
Android.media.tv.tuner
Tuner paketi, Tuner çerçevesini kullanmaya yönelik bir giriş noktasıdır. TIS uygulaması, başlangıç ayarını ve geri çağırmayı belirterek kaynak örneklerini başlatmak ve almak için paketi kullanır.
tuner()
:useCase
vesessionId
parametrelerini belirterek bir Tuner örneğini başlatır.tune()
: Bir ön uç kaynağı edinir veFrontendSetting
parametresini belirterek ayarlama yapar.openFilter()
: Filtre türünü belirterek bir filtre örneği alır.openDvrRecorder()
: Arabellek boyutunu belirterek bir kayıt örneği edinir.openDvrPlayback()
: Arabellek boyutunu belirterek bir oynatma örneği edinir.openDescrambler()
: Bir şifre çözücü örneği edinir.openLnb()
: Dahili bir LNB örneği alır.openLnbByName()
: Harici bir LNB örneği alır.openTimeFilter()
: Zaman filtresi örneği edinir.
Tuner paketi, filtre, DVR ve ön uç paketleri kapsamında bulunmayan işlevler sağlar. İşlevler aşağıda listelenmiştir.
cancelTuning
scan
/cancelScanning
getAvSyncHwId
getAvSyncTime
connectCiCam1
/disconnectCiCam
shareFrontendFromTuner
updateResourcePriority
setOnTuneEventListener
setResourceLostListener
Android.media.tv.tuner.frontend
Kullanıcı arayüzü paketi, kullanıcı arayüzüyle ilgili ayar, bilgi, durum, etkinlik ve özellik koleksiyonlarını içerir.
Sınıflar
FrontendSettings
, aşağıdaki sınıflara göre farklı DTV standartları için türetilir.
AnalogFrontendSettings
Atsc3FrontendSettings
AtscFrontendSettings
DvbcFrontendSettings
DvbsFrontendSettings
DvbtFrontendSettings
Isdbs3FrontendSettings
IsdbsFrontendSettings
IsdbtFrontendSettings
Tuner HAL 1.1 veya sonraki sürümlerin yüklü olduğu Android 12'den aşağıdaki DTV standardı desteklenir.
DtmbFrontendSettings
FrontendCapabilities
, aşağıdaki sınıflara göre farklı DTV standartları için türetilir.
AnalogFrontendCapabilities
Atsc3FrontendCapabilities
AtscFrontendCapabilities
DvbcFrontendCapabilities
DvbsFrontendCapabilities
DvbtFrontendCapabilities
Isdbs3FrontendCapabilities
IsdbsFrontendCapabilities
IsdbtFrontendCapabilities
Tuner HAL 1.1 veya sonraki sürümlerin yüklü olduğu Android 12'den aşağıdaki DTV standardı desteklenir.
DtmbFrontendCapabilities
FrontendInfo
, ön uç bilgilerini alır.
FrontendStatus
, ön ucun mevcut durumunu alır.
OnTuneEventListener
, kullanıcı arayüzündeki etkinlikleri dinler.
TIS uygulaması, ön uçtan gelen tarama mesajlarını işlemek için ScanCallback
kullanır.
Kanal taraması
TV kurulumu için uygulama olası frekansları tarar ve kullanıcıların erişebileceği bir kanal listesi oluşturur. TIS, kanal tarama işlemini tamamlamak için Tuner.tune
, Tuner.scan(BLIND_SCAN)
veya Tuner.scan(AUTO_SCAN)
kullanabilir.
TIS; sıklık, standart (örneğin, T/T2, S/S2) ve gerekli ek bilgiler (örneğin, PLD kimliği) gibi sinyal için doğru iletim bilgilerine sahipse daha hızlı seçenek olarak Tuner.tune
önerilir.
Kullanıcı Tuner.tune
adlı kişiyi çağırdığında aşağıdaki işlemler gerçekleşir:
- TIS,
Tuner.tune
öğesini kullanarakFrontendSettings
öğesini gerekli bilgilerle doldurur. - HAL raporları, sinyal kilitliyse
LOCKED
mesajlarını ayarlar. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
yöntemini kullanır. - TIS, sıklık listesinde sonraki kullanılabilir frekansa geçer.
TIS, tüm frekanslar tüketilinceye kadar Tuner.tune
öğesini tekrar çağırır.
Ayarlama sırasında, Tuner.tune
görüşmesini duraklatmak veya sonlandırmak için stopTune()
ya da close()
çağırabilirsiniz.
Tuner.scan(OTO_SCAN)
TIS, Tuner.tune
özelliğini kullanmak için yeterli bilgiye sahip değilse ancak bir sıklık listesine ve standart türe (ör. DVB T/C/S) sahipse Tuner.scan(AUTO_SCAN)
önerilir.
Kullanıcı Tuner.scan(AUTO_SCAN)
adlı kişiyi çağırdığında aşağıdaki işlemler gerçekleşir:
TIS, sıklık değeriyle doldurulmuş
FrontendSettings
ileTuner.scan(AUTO_SCAN)
kullanır.HAL raporları, sinyal kilitliyse
LOCKED
mesajları tarar. HAL, sinyal hakkında ek bilgi sağlamak için diğer tarama mesajlarını da bildirebilir.TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır.TIS, HAL'in aynı frekansta bir sonraki ayarlamaya devam etmesi için
Tuner.scan
'ü çağırır.FrontendSettings
yapısı boşsa HAL, kullanılabilir bir sonraki ayarı kullanır. Aksi takdirde, HAL tek seferlik tarama içinFrontendSettings
kullanır ve tarama işleminin tamamlandığını belirtmek içinEND
gönderir.TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrar eder.
HAL, tarama işleminin tamamlandığını belirtmek için
END
gönderir.TIS, sıklık listesinde sonraki kullanılabilir frekansa geçer.
TIS, tüm frekanslar tüketilinceye kadar Tuner.scan(AUTO_SCAN)
öğesini tekrar çağırır.
Tarama sırasında stopScan()
veya close()
tuşlarına basarak taramayı duraklatabilir ya da sonlandırabilirsiniz.
Tuner.scan(BLIND_SCAN)
TIS'de sıklık listesi yoksa ve tedarikçi HAL'si ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun sıklığını arayabiliyorsa Tuner.scan(BLIND_SCAN)
önerilir.
- TIS,
Tuner.scan(BLIND_SCAN)
kullanır. Başlangıç sıklığı içinFrontendSettings
içinde bir sıklık belirtilebilir ancak TIS,FrontendSettings
içindeki diğer ayarları yoksayar. - Sinyal kilitliyse HAL bir tarama
LOCKED
mesajı bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, taramaya devam etmek için
Tuner.scan
numarasını tekrar arar. (FrontendSettings
yoksayılır.) - TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrar eder. HAL, TIS'nin herhangi bir işlem yapmasına gerek kalmadan sıklığı artırır.
HAL,
PROGRESS
bildiriyor.
TIS, tüm frekanslar tüketilinceye kadar Tuner.scan(AUTO_SCAN)
öğesini tekrar çağırır.
HAL, tarama işleminin tamamlandığını belirtmek için END
değerini bildirir.
Tarama sırasında, taramayı duraklatmak veya sonlandırmak için stopScan()
ya da close()
numaralı telefonu çağırabilirsiniz.
9. Şekil. TIS taramasının akış diyagramı
Android.media.tv.tuner.filter
Filtre paketi, yapılandırma, ayarlar, geri çağırma ve etkinliklerin yanı sıra filtre işlemlerinin bir koleksiyonudur. Paket aşağıdaki işlemleri içerir. İşlemlerin tam listesi için Android kaynak koduna bakın.
configure()
start()
stop()
flush()
read()
Tam liste için Android kaynak koduna bakın.
FilterConfiguration
, aşağıdaki sınıflardan türetilir. Yapılandırmalar, ana filtre türü içindir ve filtrenin verileri ayıklamak için kullandığı protokolü belirtir.
AlpFilterConfiguration
IpFilterConfiguration
MmtpFilterConfiguration
TlvFilterConfiguration
TsFilterConfiguration
Ayarlar aşağıdaki sınıflardan türetilir. Bu ayarlar filtre alt türü içindir ve filtrenin ne tür verileri hariç tutabileceğini belirtir.
SectionSettings
AvSettings
PesSettings
RecordSettings
DownloadSettings
FilterEvent
, farklı veri türleriyle ilgili etkinlikleri bildirmek için aşağıdaki sınıflardan türetilir.
SectionEvent
MediaEvent
PesEvent
TsRecordEvent
MmtpRecordEvent
TemiEvent
DownloadEvent
IpPayloadEvent
Tuner HAL 1.1 veya sonraki sürümlerin bulunduğu Android 12'den itibaren aşağıdaki etkinlikler desteklenir.
IpCidChangeEvent
RestartEvent
ScramblingStatusEvent
Filtredeki etkinlikler ve veri biçimi
Filtre türü | Bayraklar | Etkinlikler | Veri işlemi | Veri biçimi |
---|---|---|---|---|
TS.SECTION MMTP.SECTION IP.SECTION TLV.SECTION ALP.SECTION |
isRaw: |
Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Bir araya getirilmiş bir oturum paketi, FMQ'de başka bir oturum paketiyle doldurulur. |
isRaw: |
Zorunlu:DemuxFilterEvent::DemuxFilterSectionEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
||
TS.PES |
isRaw: |
Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Hazırlanan bir PES paketi başka bir PES paketi tarafından FMQ ile doldurulur. |
isRaw: |
Zorunlu:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
||
MMTP.PES |
isRaw: |
Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Birleştirilmiş MFU paketi, FMQ'yu başka bir MFU paketi tarafından doldurulur. |
isRaw: |
Zorunlu:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
||
TS.TS |
Yok | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilir: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Filtrelenmiş ts ve ts başlığıFMQ ile doldurulmuş. |
TS.Audio TS.Video MMTP.Audio MMTP.Video |
isPassthrough: |
İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
İstemci, DemuxFilterStatus::DATA_READY aldıktan sonra MediaCodec 'ü başlatabilir.İstemci DemuxFilterStatus::DATA_OVERFLOW aldıktan sonra Filter.flush numarasını arayabilir. |
Yok |
isPassthrough: |
Zorunlu:DemuxFilterEvent::DemuxFilterMediaEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
MediaCodec 'ü kullanmak için:for i=0; i<n; i++ AudioTrack 'ın Doğrudan İşitsel reklamını kullanmak için:for i=0; i<n; i++ |
ION belleğinde ES veya kısmi ES verileri. | |
TS.PCR IP.NTP ALP.PTP |
Yok | Zorunlu: Yok
İsteğe bağlı: Yok |
Yok | Yok |
TS.RECORD |
Yok | Zorunlu: DemuxFilterEvent::DemuxFilterTsRecordEvent[n] RecordStatus::DATA_READY RecordStatus::DATA_OVERFLOW RecordStatus::LOW_WATER RecordStatus::HIGH_WATER İsteğe bağlı: DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Dizin verileri için:for i=0; i<n; i++ Kayıtlı içerik için, RecordStatus::* ve şirket içi programa göre aşağıdakilerden birini yapın:
|
Dizin verileri için: Etkinlik yükünde taşınır. Kaydedilen içerik için: FMQ'de doldurulmuş birleştirilmiş TS akışı. |
TS.TEMI |
Yok | Zorunlu:DemuxFilterEvent::DemuxFilterTemiEvent[n] İsteğe bağlı: DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ |
Yok |
MMTP.MMTP |
Yok | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilir: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır. |
mmtp üstbilgisi olan mmtp filtrelendiFMQ'de doldurulur. |
MMTP.RECORD |
Yok | Zorunlu:DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n] RecordStatus::DATA_READY RecordStatus::DATA_OVERFLOW RecordStatus::LOW_WATER RecordStatus::HIGH_WATER İsteğe bağlı: DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Dizin verileri için: for i=0; i<n; i++ Kayıtlı içerik için, RecordStatus::* ve şirket içi programa göre aşağıdakilerden birini
yapın:
|
Dizin verileri için: Etkinlik yükünde taşınır. Kaydedilen içerikler için: FMQ ile doldurulmuş, karıştırılmış kaydedilmiş akış. Kayıt için filtre kaynağı, geçişli TLV.TLV ile IP.IP ise kaydedilen akışta TLV ve IP üstbilgisi bulunur. |
MMTP.DOWNLOAD |
Yok | Zorunlu:DemuxFilterEvent::DemuxFilterDownloadEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterDownloadEvent[i].size) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
İndirme paketi, FMQ'de başka bir IP indirme paketi tarafından doldurulur. |
IP.IP_PAYLOAD |
Yok | Zorunlu:DemuxFilterEvent::DemuxFilterIpPayloadEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size) Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır. |
FMQ'da IP yük paketi başka bir IP yük paketi tarafından doldurulur. |
IP.IP TLV.TLV ALP.ALP |
isPassthrough: |
İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
Filtrelenen protokol alt akışı, filtre zincirindeki bir sonraki filtreyi besler. | Yok |
isPassthrough: |
Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilir: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göreFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır. |
Protokol başlığıyla filtrelenen protokol alt akışı FMQ'da doldurulur. | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH |
Yok | İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
Filtrelenmiş protokol yükü, filtre zincirindeki bir sonraki filtreye beslenir. | Yok |
PSI/SI değeri oluşturmak için filtrenin kullanıldığı örnek akış
Şekil 10. PSI/SI oluşturma akışı
Bir filtre açın.
Filter filter = tuner.openFilter( Filter.TYPE_TS, Filter.SUBTYPE_SECTION, /* bufferSize */1000, executor, filterCallback );
Filtreyi yapılandırıp başlatın.
Settings settings = SectionSettingsWithTableInfo .builder(Filter.TYPE_TS) .setTableId(2) .setVersion(1) .setCrcEnabled(true) .setRaw(false) .setRepeat(false) .build(); FilterConfiguration config = TsFilterConfiguration .builder() .setTpid(10) .setSettings(settings) .build(); filter.configure(config); filter.start();
SectionEvent
işlemini tamamlayın.FilterCallback filterCallback = new FilterCallback() { @Override public void onFilterEvent(Filter filter, FilterEvent[] events) { for (FilterEvent event : events) { if (event instanceof SectionEvent) { SectionEvent sectionEvent = (SectionEvent) event; int tableId = sectionEvent.getTableId(); int version = sectionEvent.getVersion(); int dataLength = sectionEvent.getDataLength(); int sectionNumber = sectionEvent.getSectionNumber(); filter.read(buffer, 0, dataLength); } } } };
Filtreden MediaEvent kullanımı için örnek akış
Şekil 11. Filtreden MediaEvent kullanma akışı
- A/V filtrelerini açın, yapılandırın ve başlatın.
MediaEvent
işlenecek.MediaEvent
al.- Doğrusal bloğu
codec
'e alın. - Veriler tüketildiğinde A/V tutma yerini bırakın.
Android.media.tv.tuner.dvr
DvrRecorder
, kayıt için bu yöntemleri sağlar.
configure
attachFilter
detachFilter
start
flush
stop
setFileDescriptor
write
DvrPlayback
, oynatma için bu yöntemleri sağlar.
configure
start
flush
stop
setFileDescriptor
read
DvrSettings
, DvrRecorder
ve DvrPlayback
öğelerini yapılandırmak için kullanılır.
OnPlaybackStatusChangedListener
ve OnRecordStatusChangedListener
, bir DVR örneğinin durumunu bildirmek için kullanılır.
Kayıt başlatmak için örnek akış
Şekil 12. Kayıt başlatmak için akış
DvrRecorder
'ü açın, yapılandırın ve başlatın.DvrRecorder recorder = openDvrRecorder(/* bufferSize */ 1000, executor, listener); DvrSettings dvrSettings = DvrSettings .builder() .setDataFormat(DvrSettings.DATA_FORMAT_TS) .setLowThreshold(100) .setHighThreshold(900) .setPacketSize(188) .build(); recorder.configure(dvrSettings); recorder.attachFilter(filter); recorder.setFileDescriptor(fd); recorder.start();
RecordEvent
aldıktan sonra dizin bilgilerini alın.FilterCallback filterCallback = new FilterCallback() { @Override public void onFilterEvent(Filter filter, FilterEvent[] events) { for (FilterEvent event : events) { if (event instanceof TsRecordEvent) { TsRecordEvent recordEvent = (TsRecordEvent) event; int tsMask = recordEvent.getTsIndexMask(); int scMask = recordEvent.getScIndexMask(); int packetId = recordEvent.getPacketId(); long dataLength = recordEvent.getDataLength(); // handle the masks etc. } } } };
OnRecordStatusChangedListener
uygulamasını başlatın ve kayıt verilerini depolayın.OnRecordStatusChangedListener listener = new OnRecordStatusChangedListener() { @Override public void onRecordStatusChanged(int status) { // a customized way to consume data efficiently by using status as a hint. if (status == Filter.STATUS_DATA_READY) { recorder.write(size); } } };
Tarayıcı HAL'si
Tuner HAL, HIDL'yi izler ve çerçeve ile tedarikçi donanımı arasındaki arayüzü tanımlar. Tedarikçi firmalar, Tuner HAL'i uygulamak için arayüzü kullanır ve çerçeve, Tuner HAL uygulamasıyla iletişim kurmak için bu arayüzü kullanır.
Modüller
Tuner HAL 1.0
Modüller | Temel kumanda işlemleri | Modüle özel kontroller | HAL dosyaları |
---|---|---|---|
ITuner |
Yok | frontend(open, getIds, getInfo) , openDemux ,
openDescrambler , openLnb ,
getDemuxCaps |
ITuner.hal |
IFrontend |
setCallback , getStatus , close
| tune , stopTune , scan ,
stopScan , setLnb |
IFrontend.hal IFrontendCallback.hal |
IDemux |
close |
setFrontendDataSource , openFilter , openDvr , getAvSyncHwId ,
getAvSyncTime , connect / disconnectCiCam |
IDemux.hal |
IDvr |
close , start , stop , configure |
attach/detachFilters , flush , getQueueDesc |
IDvr.hal IDvrCallback.hal |
IFilter |
close , start , stop , configure , getId |
flush , getQueueDesc , releaseAvHandle , setDataSource |
IFilter.hal IFilterCallback.hal |
ILnb |
close , setCallback |
setVoltage , setTone , setSatellitePosition , sendDiseqcMessage |
ILnb.hal ILnbCallback.hal |
IDescrambler |
close |
setDemuxSource , setKeyToken ,
addPid , removePid |
IDescrambler.hal |
Tuner HAL 1.1 (Tuner HAL 1.0'dan türetilmiştir)
Modüller | Temel kumanda işlemleri | Modüle özel kontroller | HAL dosyaları |
---|---|---|---|
ITuner |
Yok | getFrontendDtmbCapabilities |
@1.1::ITuner.hal |
IFrontend |
tune_1_1 , scan_1_1 , getStatusExt1_1 |
link/unlinkCiCam |
@1.1::IFrontend.hal @1.1::IFrontendCallback.hal |
IFilter |
getStatusExt1_1 |
configureIpCid , configureAvStreamType , getAvSharedHandle , configureMonitorEvent |
@1.1::IFilter.hal @1.1::IFilterCallback.hal |
Şekil 13. Tuner HAL modülleri arasındaki etkileşimlerin şeması
Bağlantıyı filtreleme
Tuner HAL, filtrelerin birden fazla katman için diğer filtrelere bağlanabilmesini sağlayacak şekilde filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uyar.
- Filtreler bir ağaç olarak bağlı, kapatma yoluna izin verilmiyor.
- Kök düğüm demux'tur.
- Filtreler bağımsız olarak çalışır.
- Tüm filtreler veri almaya başlar.
- Filtre bağlantısı son filtrede boşlaşır.
Aşağıdaki kod bloğunda ve Şekil 14'te birden çok katmanı filtrelemeye ilişkin bir örnek gösterilmektedir.
demuxCaps = ITuner.getDemuxCap;
If (demuxCaps[IP][MMTP] == true) {
ipFilter = ITuner.openFilter(<IP, ..>)
mmtpFilter1 = ITuner.openFilter(<MMTP ..>)
mmtpFilter2 = ITuner.openFilter(<MMTP ..>)
mmtpFilter1.setDataSource(<ipFilter>)
mmtpFilter2.setDataSource(<ipFilter>)
}
Şekil 14. Birden fazla katman için filtre bağlantısının akış diyagramı
Tuner Kaynak Yöneticisi
Tuner Resource Manager'dan (TRM) önce, iki uygulama arasında geçiş yapmak aynı Tuner donanımını gerektiriyordu. TV Giriş Çerçevesi (TIF), "ilk edinen kazan" mekanizmasını kullanır. Yani kaynağı ilk elde eden uygulama, kaynağı ilk elden tutan uygulamadır. Ancak bu mekanizma, bazı karmaşık kullanım alanları için ideal olmayabilir.
TRM, uygulamalar için tuner, TVInput
ve CAS donanım kaynaklarını yönetmek üzere sistem hizmeti olarak çalışır. TRM, uygulamanın önceliğini uygulamanın ön plan veya arka plan durumuna ve kullanım alanı türüne göre hesaplayan bir "ön planda kazanma" mekanizması kullanır. TRM, önceliğe göre kaynağı verir veya iptal eder. TRM; yayın, OTT ve DVR için ATV kaynak yönetimini merkezileştirir.
TRM arayüzü
TRM, kaynakları kaydetmek, istemek veya yayınlamak amacıyla Tuner çerçevesi için MediaCas
ve TvInputHardwareManager
için ITunerResourceManager.aidl
içinde AIDL arayüzlerini sunar.
İstemci yönetimi için arayüzler aşağıda listelenmiştir.
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
unregisterClientProfile(in int clientId)
Kaynak isteğinde bulunma ve kaynak serbest bırakma arayüzleri aşağıda listelenmiştir.
requestFrontend(TunerFrontendRequest request, int[] frontendHandle)
/releaseFrontend
requestDemux(TunerDemuxRequest request, int[] demuxHandle)
/releaseDemux
requestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle)
/releaseDescrambler
requestCasSession(CasSessionRequest request, int[] casSessionHandle)
/releaseCasSession
requestLnb(TunerLnbRequest request, int[] lnbHandle)
/releaseLnb
İstemci ve istek sınıfları aşağıda listelenmiştir.
ResourceClientProfile
ResourcesReclaimListener
TunerFrontendRequest
TunerDemuxRequest
TunerDescramblerRequest
CasSessionRequest
TunerLnbRequest
İstemci önceliği
TRM, istemcinin profilindeki parametreleri ve yapılandırma dosyasındaki öncelik değerini kullanarak istemcinin önceliğini hesaplar. Öncelik, istemciden rastgele bir öncelik değeriyle de güncellenebilir.
Müşterinin profilindeki parametreler
TRM, bir uygulamanın ön planda mı yoksa arka planda mı olduğuna karar vermek için mTvInputSessionId
'ten işlem kimliğini alır. mTvInputSessionId
, TvInputService.onCreateSession
veya TvInputService.onCreateRecordingSession
oluşturmak için bir TIS oturumu başlatır.
mUseCase
, oturumun kullanım alanını gösterir. Önceden tanımlanmış kullanım alanları aşağıda listelenmiştir.
TvInputService.PriorityHintUseCaseType {
PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK
PRIORITY_HINT_USE_CASE_TYPE_LIVE
PRIORITY_HINT_USE_CASE_TYPE_RECORD,
PRIORITY_HINT_USE_CASE_TYPE_SCAN,
PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND
}
Yapılandırma dosyası
Varsayılan yapılandırma dosyası
Aşağıdaki varsayılan yapılandırma dosyası, önceden tanımlanmış kullanım alanları için öncelik değerleri sağlar. Kullanıcılar, özelleştirilmiş bir yapılandırma dosyası kullanarak değerleri değiştirebilir.
Kullanım alanı | Ön plan | Arka plan |
---|---|---|
LIVE |
490 | 400 |
PLAYBACK |
480 | 300 |
RECORD |
600 | 500 |
SCAN |
450 | 200 |
BACKGROUND |
180) | 100 |
Özelleştirilmiş yapılandırma dosyası
Tedarikçiler yapılandırma dosyasını özelleştirebilir
/vendor/etc/tunerResourceManagerUseCaseConfig.xml
. Bu dosya, kullanım alanı türlerini ve kullanım alanı öncelik değerlerini eklemek, kaldırmak veya güncellemek için kullanılır.
Özelleştirilmiş dosya şablon olarak platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml
kullanabilir.
Örneğin, tedarikçi firma kullanım alanı VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000]
olarak ayarlanmıştır.
Biçim, platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd
'e uygun olmalıdır.
İsteğe bağlı öncelik değeri ve güzel değer
TRM, istemcinin keyfi öncelik değerini ve güzel değeri güncellemesi için updateClientPriority
sağlar.
İsteğe bağlı öncelik değeri, kullanım alanı türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazılır.
Nitelik değeri, müşterinin başka bir müşteriyle çeliştiği zaman davranışının ne kadar esnek olduğunu gösterir. Güzel değeri, öncelik değeri zorlayıcı müşteriye kıyasla öncelik değerini düşürür.
Geri alma mekanizması
Aşağıdaki şemada, kaynak çakışması gerçekleştiğinde kaynakların nasıl geri kazanıldığı ve atandığı gösterilmektedir.
Şekil 15. Tuner kaynakları arasındaki anlaşmazlık için geri ödeme mekanizmasının şeması