Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Çerçeve, tedarikçi firmaların donanım ardışık düzenini kullandığından hem düşük hem de yüksek kaliteli SoC'ler 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 yayınlamanın güvenli bir yolunu sunar. Bu sayede, yüksek düzeyde kısıtlanmış bir içerik koruma ortamında kullanılabilir.
Tuner ile Android CAS arasındaki standartlaştırılmış 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 bir dünya çözümü oluşturmak amacıyla MediaCodec
ve AudioTrack
ile çalışır.
Tuner arayüzü, önemli yayın standartlarına göre hem dijital TV'yi hem de analog TV'yi destekler.
Bileşenler
Android 11 için üç bileşen özel olarak TV platformu için tasarlanmıştır.
- Tuner HAL: Çerçeve ile tedarikçiler arasındaki bir arayüz
- Tuner SDK API: Çerçeve ile uygulamalar arasındaki bir arayüz
- Tuner Kaynak Yöneticisi (TRM): Tuner donanım 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.
- Aktarma akışı (TS)
- MPEG medya aktarma protokolü (MMTP)
- İnternet protokolü (IP)
- Tür uzunluğu değeri (TLV)
- ATSC bağlantı katmanı protokolü (ALP)
Şifre çözücü, aşağıdaki içerik korumalarını destekler.
- Güvenli medya yolu
- Medya yolunu temizleme
- Yerel kaydı güvence altına alma
- Yerel oynatma için güvenlik
Tuner 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 temiz olduğu ES yükü
- Güvenli bellek tutamacıyla 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.
- Ön uç, çoklu yayın ayırıcı ve kod çözücü işlevlerini
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
veILnb
arayüzleri aracılığıyla çerçeveye aktarır. - Tuner HAL'i
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 izin kontrolüne ve büyük miktarlarda kayıt veya oynatma verisinin 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.
- Uygulamalardan yetersiz kaynakları geri almak 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 ekleme 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ünellenmiş oynatma sırasında donanım A/V senkronizasyonu yapacak şekilde yapılandırılmış.
ES_payload
ve geçiş modu için yapılandırılmış destek.
Şekil 2. Tuner HAL'deki 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ı ayarlama
A/V'yi kullanma
Şekil 4. Canlı yayın oynatma için A/V'yi yönetme
Karıştırılmış içeriği ele alma
Şekil 5. Canlı yayın oynatımı için kodlanmış içeriği işleme
A/V verilerini işleme
Şekil 6. Canlı yayın oynatma için ses ve görüntü işleme
Tuner SDK API
Tuner SDK API'si, Tuner JNI, Tuner HAL ve TunerResourceManager
ile etkileşimleri yönetir. TIS uygulaması, Tuner SDK API'sini kullanarak Tuner kaynaklarına ve filtre ile kod çözücü gibi alt bileşenlere erişir. Ön uç ve demux, dahili bileşenlerdir.
Şekil 7. Tuner SDK API'si ile etkileşimler
Sürümler
Tuner SDK API, Android 12'den itibaren Tuner 1.0'un geriye dönük uyumlu bir sürüm yükseltmesi olan Tuner HAL 1.1'deki yeni özelliği destekler.
Ç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 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
Şekil 8. Tuner SDK API paketleri
Android.media.tv.tuner
Tuner paketi, Tuner çerçevesini kullanmaya yönelik bir giriş noktasıdır. TIS uygulaması, ilk ayarı ve geri çağırma işlevini belirterek paketi kullanarak kaynak örneklerini başlatır ve edinir.
tuner()
:useCase
vesessionId
parametrelerini belirterek bir Tuner örneğini başlatır.tune()
:FrontendSetting
parametresini belirterek bir ön uç kaynağı edinir ve ayar yapar.openFilter()
: Filtre türünü belirterek bir filtre örneği edinir.openDvrRecorder()
: Arabellek boyutunu belirterek bir kayıt örneği edinir.openDvrPlayback()
: Arabellek boyutunu belirterek bir oynatma örneği edinir.openDescrambler()
: Kod çözücü örneği edinir.openLnb()
: Dahili bir LNB örneği alır.openLnbByName()
: Harici bir LNB örneği edinir.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ümleri içeren Android 12'den itibaren aşağıdaki DTV standardı desteklenir.
DtmbFrontendSettings
FrontendCapabilities
, aşağıdaki sınıflar tarafından farklı DTV standartları için türetilir.
AnalogFrontendCapabilities
Atsc3FrontendCapabilities
AtscFrontendCapabilities
DvbcFrontendCapabilities
DvbsFrontendCapabilities
DvbtFrontendCapabilities
Isdbs3FrontendCapabilities
IsdbsFrontendCapabilities
IsdbtFrontendCapabilities
Tuner HAL 1.1 veya sonraki sürümleri içeren Android 12'den itibaren aşağıdaki DTV standardı desteklenir.
DtmbFrontendCapabilities
FrontendInfo
, kullanıcı arayüzünün bilgilerini alır.
FrontendStatus
, ön uç kullanıcı arayüzünün 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ı
Uygulama, TV'yi kurmak için olası frekansları tarar ve kullanıcıların erişebileceği bir kanal listesi oluşturur. TIS, kanal taramasını tamamlamak için Tuner.tune
, Tuner.scan(BLIND_SCAN)
veya Tuner.scan(AUTO_SCAN)
kullanabilir.
TIS'de sinyal için doğru yayın bilgileri (ör. frekans, standart [ör. T/T2, S/S2]) ve gerekli ek bilgiler (ör. PLD kimliği) varsa daha hızlı seçenek olarak Tuner.tune
önerilir.
Kullanıcı Tuner.tune
numarasını aradığında aşağıdaki işlemler gerçekleşir:
- TIS,
Tuner.tune
kullanarakFrontendSettings
öğesini gerekli bilgilerle doldurur. - HAL, sinyal kilitliyse ayar
LOCKED
mesajlarını bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
'ü kullanır. - TIS, sıklık listesinde sonraki kullanılabilir frekansa geçer.
TIS, tüm frekanslar tükenene kadar Tuner.tune
'yi tekrar çağırır.
Ayarlama sırasında stopTune()
veya close()
tuşlarına basarak Tuner.tune
aramayı duraklatabilir veya sonlandırabilirsiniz.
Tuner.scan(AUTO_SCAN)
TIS'de Tuner.tune
kullanmak için yeterli bilgi yoksa ancak bir frekans listesi ve standart türü (ör. DVB T/C/S) varsa Tuner.scan(AUTO_SCAN)
önerilir.
Kullanıcı Tuner.scan(AUTO_SCAN)
numarasını aradığında aşağıdaki işlemler gerçekleşir:
TIS, sıklık değeriyle doldurulmuş
FrontendSettings
ileTuner.scan(AUTO_SCAN)
kullanır.HAL, sinyal kilitliyse
LOCKED
mesajlarının tarandığını bildirir. 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 bir 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ükenene kadar Tuner.scan(AUTO_SCAN)
'yi 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, kullanıcı tarafından belirtilen ön uç kaynağını almak için kullanıcı tarafından belirtilen ön uç kaynağının sıklık değerini arayabiliyorsa Tuner.scan(BLIND_SCAN)
önerilir.
- TIS,
Tuner.scan(BLIND_SCAN)
kullanır. Başlangıç sıklığı içinFrontendSettings
'te bir sıklık belirtilebilir ancak TIS,FrontendSettings
'teki diğer ayarları yoksayar. - HAL, sinyal kilitliyse bir tarama
LOCKED
mesajı bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, taramaya devam etmek için
Tuner.scan
'yi tekrar çağırır. (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
değerini bildirir.
TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)
'yi tekrar çağırır.
HAL, tarama işleminin tamamlandığını belirtmek için END
değerini bildirir.
Tarama sırasında stopScan()
veya close()
tuşlarına basarak taramayı duraklatabilir ya da sonlandırabilirsiniz.
Şekil 9. 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
Filtreden alınan 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'ın MQ'sinden istemci arabelleğine kopyalanır. |
Bir araya getirilmiş 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'ın MQ'sinden istemci arabelleğine kopyalanır. |
||
TS.PES |
isRaw: |
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. |
Bir araya getirilmiş bir PES paketi, FMQ'de başka bir PES paketiyle 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'ın MQ'sinden istemci arabelleğine kopyalanır. |
||
MMTP.PES |
isRaw: |
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. |
Bir araya getirilmiş bir MFU paketi, FMQ'de başka bir MFU paketiyle 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'ın 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'ın MQ'sinden istemci arabelleğine kopyalanır. |
ts başlığıyla ts filtrelendiFMQ'de doldurulur. |
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 'i 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: geçersiz
İsteğe bağlı: geçersiz |
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++ Kaydedilen içerikler 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 başlığıyla 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'ın 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. |
IP yükü paketi, FMQ'de başka bir IP yükü paketiyle doldurulur. |
IP.IP TLV.TLV ALP.ALP |
isPassthrough: |
İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
Filtrelenmiş protokol alt akışı, filtre zincirindeki sonraki filtreye beslenir. | 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'de 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 oluşturmak için filtre kullanmaya yönelik örnek akış
Şekil 10. KMSİ/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ın ve 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şlenecek.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'i kullanmaya yönelik örnek akış
Şekil 11. Filtreden MediaEvent'i kullanma akışı
- A/V filtrelerini açın, yapılandırın ve başlatın.
MediaEvent
işlenecek.MediaEvent
alın.- Doğrusal bloğu
codec
'e alın. - Veriler tüketildiğinde A/V işleyicisini 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şlatma 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
değişkenini 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); } } };
Tuner HAL
Tuner HAL, HIDL'yi takip eder 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 özgü 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 özgü 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 ağaç olarak bağlanır, yakın yola izin verilmez.
- 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 temizlenir.
Aşağıdaki kod bloğu ve Şekil 14, birden fazla katmanın filtrelenmesi örneğini göstermektedir.
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ış şeması
Tuner Resource Manager
Tuner Kaynak Yöneticisi (TRM) kullanılmadan önce iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Giriş Çerçevesi (TIF), "ilk gelen alır" mekanizması kullanır. Yani kaynağı ilk alan uygulama kaynağı elinde tutar. 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, Tuner çerçevesinin, MediaCas
ve TvInputHardwareManager
'nin kaynakları kaydettirmesi, istemesi veya serbest bırakması için ITunerResourceManager.aidl
'te AIDL arayüzlerini gösterir.
İ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 gelen 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çi firmalar 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, platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml
sablon olarak kullanılabilir.
Örneğin, yeni bir tedarikçi kullanım alanı VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000]
.
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.
nice değeri, istemcinin başka bir istemciyle çakıştığında davranışının ne kadar esnek olduğunu gösterir. Güzel değer, öncelik değeri sorunlu müşteriyle karşılaştırılmadan önce müşterinin öncelik değerini düşürür.
Geri alma mekanizması
Aşağıdaki diyagramda, kaynak çakışması olduğunda kaynakların nasıl yeniden alındığını ve atandığını görebilirsiniz.
Şekil 15. Tuner kaynakları arasındaki bir çakışmaya yönelik yeniden alma mekanizmasının şeması