Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Bu çerçeve, satıcılardan alınan donanım işlem hattını kullandığı için hem düşük hem de yüksek seviye SoC'ler için uygundur. Çerçeve, güvenilir yürütme ortamı (TEE) ve güvenli medya yolu (SMP) ile korunan A/V içeriklerini güvenli bir şekilde sunar. Bu sayede, son derece 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 üzere MediaCodec
ve AudioTrack
ile birlikte çalışır.
Tuner arayüzü, büyük yayın standartlarına göre hem dijital TV'yi hem de analog TV'yi destekler.
Bileşenler
Android 11'de üç bileşen özellikle TV platformu için tasarlanmıştır.
- Tuner HAL: Çerçeve ve satıcılar arasındaki arayüz
- Tuner SDK API'si: Çerçeve ile uygulamalar arasındaki arayüz
- Tuner Resource Manager (TRM): Tuner donanım kaynaklarını koordine eder.
Android 11'de aşağıdaki bileşenler geliştirilmiştir.
- 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 kaynak yöneticisi (MRM)
1. şekil. 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
Android 12'deki Tuner HAL 1.1 veya sonraki sürümlerle birlikte ön uç, aşağıdaki DTV standardını destekler.
- DTMB
Demux aşağıdaki akış protokollerini destekler.
- Aktarım akışı (TS)
- MPEG medya aktarım protokolü (MMTP)
- İnternet protokolü (IP)
- Tür uzunluk değeri (TLV)
- ATSC bağlantı katmanı protokolü (ALP)
Descrambler, aşağıdaki içerik koruma yöntemlerini destekler.
- Güvenli medya yolu
- Medya yolunu temizleme
- Yerel kaydı güvenli hale getirme
- Güvenli yerel oynatma
Tuner API'leri aşağıdaki kullanım alanlarını destekler.
- Dijital izler
- Live
- Oynatma
- Kaydet
Tuner, MediaCodec
ve AudioTrack
aşağıdaki veri akışı modlarını destekler.
- Bellek arabelleği temizlenmiş ES yükü
- Güvenli bellek tutma yeri içeren ES yükü
- Gerçek görüntü
Genel tasarım
Tuner HAL, Android çerçevesi ile satıcının donanımı arasında tanımlanır.
- Çerçevenin tedarikçiden beklentilerini ve tedarikçinin bunları nasıl karşılayabileceğini açıklar.
- Ön uç, demux ve şifre çözücü işlevlerini
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
veILnb
arayüzleri aracılığıyla çerçeveye aktarır. - Tuner HAL'ı
MediaCodec
veAudioTrack
gibi diğer çerçeve bileşenleriyle entegre etme işlevlerini içerir.
Bir 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'ye 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.
- Native Tuner modülü, Tuner Java sınıfı ile Tuner HAL'ı arasında bir köprüdür.
TRM sınıfı oluşturulur.
- Frontend, LNB, CAS oturumları ve TV giriş HAL'sinden bir 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'ın çıkarılması ve takılması gibi dinamik CAS sistemlerini destekler.
- Önemli jetonlar sağlayarak Tuner HAL ile entegre olur.
MediaCodec
ve AudioTrack
aşağıdaki özelliklerle geliştirilmiştir.
- İçerik girişi olarak güvenli A/V belleği alır.
- Tünellenmiş oynatmada donanım A/V senkronizasyonu yapacak şekilde yapılandırılmış olmalıdır.
ES_payload
ve geçiş modu için destek yapılandırıldı.
Şekil 2. Tuner HAL'deki bileşenlerin şeması
Genel iş akışı
Aşağıdaki şemalarda, canlı yayın oynatma için arama sıraları gösterilmektedir.
Kurulum
3.Şekil Canlı yayın oynatma için kurulum sırası
Ses ve video ekipmanlarının kullanımı
Şekil 4. Canlı yayın oynatma için A/V'yi işleme
Karıştırılmış içeriği ele alma
5.şekil Canlı yayın oynatımı için karıştırılmış içeriği işleme
Ses ve video verilerini işleme
6.şekil Canlı yayın oynatımı için A/V işleme
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 ile karıştırma çö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'si ile etkileşimler
Sürümler
Android 12'den itibaren Tuner SDK API, Tuner HAL 1.1'deki yeni özelliği destekler. Bu, Tuner 1.0'ın geriye dönük uyumlu sürüm yükseltmesidir.
Ç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ünü yeni Android 12 API'lerinin belgelerinde bulabilirsiniz.
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 kullanmak için bir giriş noktasıdır. TIS uygulaması, ilk ayarı ve geri çağırmayı belirterek kaynak örneklerini başlatmak ve edinmek için paketi kullanır.
tuner()
:useCase
vesessionId
parametrelerini belirterek bir Tuner örneğini başlatır.tune()
:FrontendSetting
parametresini belirterek bir ön uç kaynağı edinir ve ayarlama yapar.openFilter()
: Filtre türünü belirterek bir filtre örneği edinir.openDvrRecorder()
: Arabellek boyutu belirtilerek bir kayıt örneği alınır.openDvrPlayback()
: Arabellek boyutunu belirterek bir oynatma örneği edinir.openDescrambler()
: Bir karıştırıcı çözücü örneği edinir.openLnb()
: Dahili bir LNB örneği edinir.openLnbByName()
: Harici bir LNB örneği edinir.openTimeFilter()
: Bir zaman filtresi örneği edinir.
Tuner paketi, filtre, DVR ve ön uç paketleri kapsamında olmayan 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
Ön uç paketi, ön uçla ilgili ayarlar, bilgiler, durumlar, etkinlikler ve özellikler koleksiyonlarını içerir.
Sınıflar
FrontendSettings
, aşağıdaki sınıflar tarafından farklı DTV standartları için türetilir.
AnalogFrontendSettings
Atsc3FrontendSettings
AtscFrontendSettings
DvbcFrontendSettings
DvbsFrontendSettings
DvbtFrontendSettings
Isdbs3FrontendSettings
IsdbsFrontendSettings
IsdbtFrontendSettings
Android 12'den itibaren Tuner HAL 1.1 veya sonraki sürümlerde 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
Android 12'den itibaren Tuner HAL 1.1 veya sonraki sürümlerde aşağıdaki DTV standardı desteklenir.
DtmbFrontendCapabilities
FrontendInfo
ön uç bilgilerini alır.
FrontendStatus
, ön ucun mevcut durumunu alır.
OnTuneEventListener
, ön uçtaki etkinlikleri dinler.
TIS uygulaması, ön uçtan gelen tarama mesajlarını işlemek için ScanCallback
kullanır.
Kanal taraması
Uygulama, TV kurulumu 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'te sinyalle ilgili 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ı bir seçenek olarak Tuner.tune
önerilir.
Kullanıcı Tuner.tune
numarasını aradığında aşağıdaki işlemler gerçekleşir:
- TIS,
FrontendSettings
alanınıTuner.tune
kullanarak gerekli bilgilerle doldurur. - HAL, sinyal kilitliyse ayarlama
LOCKED
mesajlarını bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, frekans listesindeki bir sonraki kullanılabilir frekansa geçer.
Tüm frekanslar tükenene kadar TIS tekrar Tuner.tune
çağrılır.
Ayarlama sırasında stopTune()
veya close()
diyerek Tuner.tune
görüşmesini duraklatabilir ya da sonlandırabilirsiniz.
Tuner.scan(AUTO_SCAN)
TIS'in Tuner.tune
kullanmak için yeterli bilgisi 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ıkla dolu
FrontendSettings
ileTuner.scan(AUTO_SCAN)
kullanır.HAL, sinyal kilitliyse
LOCKED
mesajlarını 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 ayara geçmesi için
Tuner.scan
çağrısı yapar.FrontendSettings
yapısı boşsa HAL, bir sonraki kullanılabilir 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 tükenene kadar yukarıdaki işlemleri tekrarlar.
HAL, tarama işleminin tamamlandığını belirtmek için
END
gönderir.TIS, frekans listesindeki bir sonraki kullanılabilir frekansa geçer.
Tüm frekanslar tükenene kadar TIS tekrar Tuner.scan(AUTO_SCAN)
çağrılır.
Tarama sırasında stopScan()
veya close()
tuşlarına basarak taramayı duraklatabilir ya da sonlandırabilirsiniz.
Tuner.scan(BLIND_SCAN)
TIS'de bir frekans listesi yoksa ve Vendor HAL, ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun frekansını arayabiliyorsa Tuner.scan(BLIND_SCAN)
önerilir.
- TIS,
Tuner.scan(BLIND_SCAN)
kullanır. Başlangıç frekansı içinFrontendSettings
içinde bir frekans belirtilebilir ancak TIS,FrontendSettings
içindeki diğer ayarları yoksayar. - Sinyal kilitliyse HAL, tarama
LOCKED
mesajı bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, taramaya devam etmek için
Tuner.scan
tekrar arar. (FrontendSettings
yoksayılır.) - TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar. HAL, TIS'in herhangi bir işlem yapmasına gerek kalmadan frekansı artırır.
HAL raporları
PROGRESS
.
Tüm frekanslar tükenene kadar TIS tekrar Tuner.scan(AUTO_SCAN)
çağrılır.
HAL, tarama işleminin tamamlandığını belirtmek için END
raporunu verir.
Tarama sırasında stopScan()
veya close()
'ı arayarak taramayı duraklatabilir ya da sonlandırabilirsiniz.
Şekil 9. TIS taramasının akış şeması
Android.media.tv.tuner.filter
Filtre paketi, yapılandırma, ayarlar, geri çağırmalar ve etkinliklerle birlikte 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üretilmiştir. Yapılandırmalar, ana filtre türü içindir ve filtrenin veri ayıklamak için hangi protokolü kullandığını belirtir.
AlpFilterConfiguration
IpFilterConfiguration
MmtpFilterConfiguration
TlvFilterConfiguration
TsFilterConfiguration
Ayarlar aşağıdaki sınıflardan türetilir. Ayarlar, filtre alt türü içindir ve filtrenin hangi tür verileri hariç tutabileceğini belirtir.
SectionSettings
AvSettings
PesSettings
RecordSettings
DownloadSettings
FilterEvent
, farklı türlerdeki veriler için etkinlikleri bildirmek üzere aşağıdaki sınıflardan türetilir.
SectionEvent
MediaEvent
PesEvent
TsRecordEvent
MmtpRecordEvent
TemiEvent
DownloadEvent
IpPayloadEvent
Android 12'den itibaren Tuner HAL 1.1 veya sonraki sürümlerde aşağıdaki etkinlikler desteklenir.
IpCidChangeEvent
RestartEvent
ScramblingStatusEvent
Filtreden gelen 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sundan istemci arabelleğine kopyalanır. |
Birleştirilmiş bir oturum paketi, başka bir oturum paketi tarafından FMQ'da 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'in 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Birleştirilmiş 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'in 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Birleştirilmiş bir MFU paketi, başka bir MFU paketi tarafından FMQ'ya 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'sundan istemci arabelleğine kopyalanır. |
||
TS.TS |
Yok | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
ts başlığıyla ts filtrelendiFMQ'da 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 çağrısı yapabilir. |
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 Doğrudan Ses'i 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çerikler için, RecordStatus::* ve dahili programa göre aşağıdakilerden
birini yapın:
|
Dizin verileri için: Etkinlik yükünde taşınır. Kayıtlı içerik için: FMQ'da doldurulmuş çoklu 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 Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
mmtp başlığıyla mmtp filtrelendiFMQ'da 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çeriklerde, RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
|
Dizin verileri için: Etkinlik yükünde taşınır. Kayıtlı içerik için: FMQ'da doldurulmuş, çoklu formatlı kayıtlı 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'in MQ'sinden istemci arabelleğine kopyalanır. |
İndirme paketi, başka bir IP indirme paketi tarafından FMQ'ya dolduruluyor. |
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'in MQ'sinden istemci arabelleğine kopyalanır. |
IP yükü paketi, FMQ'da 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 bir sonraki filtreyi besler. | Yok |
isPassthrough: |
Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve şirket içi programa göre bir veya daha fazla kez çalıştırın.Filter.read(buffer, offset, adjustedSize) Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Protokol başlığı doldurulmuş protokol alt akışı FMQ ile filtrelenir. | |
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 filtreyi besler. | Yok |
PSI/SI oluşturmak için filtre kullanma örneği
10.şekil KMSİ/DSİ 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();
İşlem
SectionEvent
.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 kullanma akışı örneği
11.Şekil Filtreden MediaEvent kullanmak için akış
- A/V filtrelerini açın, yapılandırın ve başlatın.
- İşlem
MediaEvent
. MediaEvent
alma- Doğrusal blokları
codec
olarak sıraya alın. - Veriler tüketildiğinde A/V tutma yerini serbest bırakın.
Android.media.tv.tuner.dvr
DvrRecorder
, kayıt için aşağıdaki yöntemleri sunar.
configure
attachFilter
detachFilter
start
flush
stop
setFileDescriptor
write
DvrPlayback
, oynatma için bu yöntemleri sunar.
configure
start
flush
stop
setFileDescriptor
read
DvrSettings
, DvrRecorder
ve DvrPlayback
öğelerini yapılandırmak için kullanılır.
OnPlaybackStatusChangedListener
ve OnRecordStatusChangedListener
, DVR örneğinin durumunu bildirmek için kullanılır.
Kayıt başlatma akışı örneği
Şekil 12. Kayıt başlatma akışı
DvrRecorder
uygulamasını 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
alın ve 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
öğesini başlatın ve kayıt verilerini saklayı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 satıcı donanımı arasındaki arayüzü tanımlar. Tedarikçiler, Tuner HAL'ı 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ı
Filtre bağlantısı
Tuner HAL, filtrelerin birden fazla katman için diğer filtrelere bağlanabilmesi amacıyla filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uyar.
- Filtreler ağaç olarak bağlanır, kapalı 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ı filtreleme örneğini gösterir.
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 Resource Manager (TRM) öncesinde, iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Input Framework (TIF) "ilk gelen alır" mekanizmasını kullanır. Bu mekanizma, kaynağı ilk alan uygulamanın kaynağı tutacağı anlamına gelir. 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 bir sistem hizmeti olarak çalışır. TRM, uygulamanın ön plan veya arka plan durumuna ve kullanım alanı türüne göre uygulamanın önceliğini hesaplayan bir "ön plan kazanımı" mekanizması kullanır. TRM, kaynağı önceliğe göre 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 serbest bırakmak için Tuner çerçevesinde (ITunerResourceManager.aidl
), MediaCas
ve TvInputHardwareManager
AIDL arayüzlerini kullanıma sunar.
Müşteri yönetimi için kullanılan arayüzler aşağıda listelenmiştir.
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
unregisterClientProfile(in int clientId)
Kaynak isteme ve 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
Müşteri ö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ı çalıştığına karar vermek için mTvInputSessionId
'dan işlem kimliğini alır. mTvInputSessionId
oluşturmak için TvInputService.onCreateSession
veya TvInputService.onCreateRecordingSession
, TIS oturumunu 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ında, önceden tanımlanmış kullanım alanları için öncelik değerleri sağlanmaktadır. Kullanıcılar, değerleri özelleştirilmiş bir yapılandırma dosyası kullanarak 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
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
olmalıdır.
İsteğe bağlı öncelik değeri ve nice değeri
TRM, istemcinin rastgele öncelik değerini ve nice değerini güncellemesi için updateClientPriority
sağlar.
Rastgele öncelik değeri, kullanım alanı türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazar.
Nice değeri, istemcinin başka bir istemciyle çakıştığında ne kadar esnek davrandığını gösterir. Nice değeri, öncelik değeri zorlu istemciyle karşılaştırılmadan önce istemcinin öncelik değerini azaltır.
Geri isteme mekanizması
Aşağıdaki şemada, kaynak çakışması olduğunda kaynakların nasıl geri alındığı ve atandığı gösterilmektedir.
15.şekil Tuner kaynakları arasındaki çakışma için geri alma mekanizmasının şeması