Android 11 veya sonraki sürümlerde Android A/V içeriği yayınlamak için tarayıcı çerçevesi. Bu çerçevede, sistem tarafından hem düşük uç hem de üst segment SoC'ler için uygun hale getirir. Bu çerçeve, bir video oynatıcıyla korunan A/V içeriğini yayınlamak için güvenilir yürütme ortamı (TEE) ve güvenli medya yolu (SMP) sayesinde kullanılmasının son derece kısıtlayıcı, içerik koruma ortamında kullanılmasına izin verilmelidir.
Tuner ve Android CAS arasındaki standart arayüz sayesinde daha hızlı
Tarayıcı tedarikçi firmaları ile CAS tedarikçileri arasında
entegrasyon elde edebilirsiniz. Tarayıcı arayüzü çalışıyor
MediaCodec
ve AudioTrack
ile işbirliği yaparak Android TV için tek dünya çapında bir çözüm geliştirin.
Tarayıcı arayüzü, analog TV'ye dayalı olarak hem dijital TV'yi hem de
yayın standartlarında bulabilirsiniz.
Bileşenler
Android 11'in üç bileşeni özellikle TV platformu için tasarlandı.
- Tuner HAL: Çerçeve ve tedarikçiler arasında bir arayüz
- Tuner SDK API: Çerçeve ile uygulamalar arasında bir arayüz
- Tuner Resource Manager (TRM): Tuner HW 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 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ümlerin yüklü olduğu 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 aktarım 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
- Güvenli yerel kayıt
- Güvenli yerel oynatma
Tarayıcı API'leri aşağıdaki kullanım alanlarını destekler.
- Dijital izler
- Canlı
- Oynatma
- Kaydet
Tarayıcı, MediaCodec
ve AudioTrack
, aşağıdaki veri akışı modlarını destekler.
- Net bellek arabelleğine sahip 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çinin donanım.
- Çerçevenin tedarikçiden ne beklediğini ve tedarikçinin yap.
- Ön uç, demux ve şifre çözme işlevlerinin işlevlerini
çerçeve:
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
, veILnb
arayüz var. - Tuner HAL'yi diğer çerçeveyle entegre etme işlevlerini içerir
MediaCodec
veAudioTrack
gibi bileşenler.
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 izin verir.
- Yerel sınıf, izin kontrolüne ve yüksek miktarda verinin işlenmesine olanak tanır. Tarayıcı HAL ile kaydetme veya oynatma verilerini analiz edebilirsiniz.
- Native Tuner modülü, Tuner Java sınıfı ile Tuner arasında bir köprüdür HAL.
Bir TRM sınıfı oluşturulur.
- Ön uç, LNB gibi sınırlı Tuner kaynaklarını yönetir. CAS oturumları ve TV giriş HAL'sinden bir TV giriş cihazı.
- Şuradaki yetersiz kaynağı geri almak için kurallar uygular: Varsayılan kural, ön planda kazanma durumudur.
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ğini alır.
- Tünelli oynatmada donanım A/V senkronizasyonu yapacak şekilde 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 şemalarda, canlı yayın oynatma için çağrı sıraları gösterilmektedir.
Kurulum
Şekil 3. Canlı yayın oynatma sırasını ayarlayın
A/V'yi kullanma
4.Şekil Canlı yayın oynatma için A/V'yi kullanma
Karmaşık içeriği işleme
5. Şekil. Canlı yayın oynatma için karışık içerikleri işleme
A/V verileri işleniyor
6. Şekil. Canlı yayın oynatma için A/V işleniyor
Tuner SDK API'si
Tuner SDK API; Tuner JNI, Tuner HAL,
ve TunerResourceManager
. TIS uygulaması, Tuner'a erişmek için Tuner SDK API'sini kullanır
alt bileşenler (ör. filtre ve şifre çözücü) içerir. Ön uç ve
demux dahili bileşenlerdir.
7.Şekil 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. Tuner 1.0'ın geriye dönük uyumlu yeni 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()
Gereken minimum HAL sürümü, yeni Android 12 API'leriyle ilgili belgelerde 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 kullanmak için bir giriş noktasıdır. TIS uygulaması belirterek, kaynak örneklerini başlatmak ve almak için paketi kullanır. geri çağırmayı unutmayın.
tuner()
:useCase
vesessionId
parametreleri.tune()
: Bir ön uç kaynağı edinir veFrontendSetting
parametresinden yararlanın.openFilter()
: Filtre türünü belirterek bir filtre örneği alır.openDvrRecorder()
: Arabelleği belirterek bir kayıt örneği alır seçin.openDvrPlayback()
: Arabelleği belirterek bir oynatma örneği edinir seçin.openDescrambler()
: Bir şifre çözücü örneği edinir.openLnb()
: Dahili LNB örneği alır.openLnbByName()
: Harici bir LNB örneği alır.openTimeFilter()
: Bir zaman filtresi örneği alır.
Tuner paketi, şu özelliklerde bulunmayan işlevler sunar: göz önünde bulundurun. İş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 ayar koleksiyonları ve bilgileri, durumları, etkinlikleri ve özellikleri 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
, sınıflara göre farklı DTV standartları için türetilir
bölümüne göz atın.
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
, ön uçtaki etkinlikleri dinler.
TIS uygulaması, ön uçtan tarama mesajlarını işlemek için ScanCallback
kullanır.
Kanal taraması
Uygulama, TV kurulumu için olası frekansları tarayıp bir kanal oluşturur.
izin verilenler listesine eklenir. TIS Tuner.tune
kullanabilir,
Tuner.scan(BLIND_SCAN)
veya kanalı tamamlamak için Tuner.scan(AUTO_SCAN)
taranıyor.
TIS sinyal için doğru iletim bilgilerine (ör. sıklık) sahipse
standart (örneğin, T/T2, S/S2) ve ek gerekli bilgiler
(örneğin, PLD kimliği)
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 bir sonraki kullanılabilir sıklığa geçer.
TIS, tüm frekanslar tüketilinceye kadar Tuner.tune
öğesini tekrar çağırır.
Ayarlama sırasında stopTune()
veya close()
arayarak şunları duraklatabilir veya sonlandırabilirsiniz:
Tuner.tune
sesli arama.
Tuner.scan(OTO_SCAN)
TIS, Tuner.tune
kullanmak için yeterli bilgiye sahip değilse ancak sıklığı varsa
ve standart tür (örneğin, DVB T/C/S),
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,
FrontendSettings
sıklık ile doldurulmuşTuner.scan(AUTO_SCAN)
kullanıyor.HAL raporları, sinyal kilitliyse
LOCKED
mesajları tarar. HAL, Ayrıca aşağıdaki konularda ek bilgi sağlamak için diğer tarama iletilerini de anlamına gelir.TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır.TIS, HAL için aynı cihazda bir sonraki ayara devam etmek üzere
Tuner.scan
numarasını çağırır. sağlar.FrontendSettings
yapısı boşsa HAL, sonraki kullanılabilir ayardır. Aksi takdirde, HAL bir kerelikFrontendSettings
kullanır tarama işleminin tamamlandığını belirtmek içinEND
gönderir.TIS, frekanstaki tüm ayarlar belirlenene kadar yukarıdaki işlemleri tekrarlar. için çok iyidir.
HAL, tarama işleminin tamamlandığını belirtmek için
END
gönderir.TIS, sıklık listesinde bir sonraki kullanılabilir sıklığa 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()
arayarak
tara.
Tuner.scan(BLIND_SCAN)
TIS'in sıklık listesi yoksa ve Tedarikçi HAL'nin arama sonuçları sayfası
ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun sıklığı ve ardından
Tuner.scan(BLIND_SCAN)
önerilir.
- TIS
Tuner.scan(BLIND_SCAN)
kullanır. Sıklık, Başlangıç sıklığı içinFrontendSettings
, ancak TIS diğer ayarları yoksayarFrontendSettings
içinde. - 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
yok sayıldı.) - TIS, frekanstaki tüm ayarlar belirlenene kadar yukarıdaki işlemleri tekrarlar.
için çok iyidir. 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.filtresi
Filtre paketi, yapılandırma ve yapılandırma ile birlikte filtre işlemlerinden oluşan bir koleksiyondur. ayarlar, geri çağırmalar ve etkinliklerdir. 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üretildi. Yapılandırmalar:
ana filtre türüne karşılık gelir ve filtrenin
verileri çıkarmanıza yardımcı olur.
AlpFilterConfiguration
IpFilterConfiguration
MmtpFilterConfiguration
TlvFilterConfiguration
TsFilterConfiguration
Ayarlar aşağıdaki sınıflardan türetilir. Filtre ayarları alt tür olabilir ve filtrenin hariç tutabileceği veri türlerini belirtir.
SectionSettings
AvSettings
PesSettings
RecordSettings
DownloadSettings
FilterEvent
, farklı için etkinlikleri bildirmek amacıyla aşağıdaki sınıflardan türetilir
anlamına gelir.
SectionEvent
MediaEvent
PesEvent
TsRecordEvent
MmtpRecordEvent
TemiEvent
DownloadEvent
IpPayloadEvent
Tuner HAL 1.1 veya sonraki sürümlerin yüklü olduğu Android 12'den 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öre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Birleştirilmiş oturum paketi FMQ'yu başka bir paketle dolduruldu oturum paketi. |
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öre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Hazırlanan bir PES paketi başka bir FMQ ile dolduruldu. PES paketi. |
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öre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Bir MFU paketi, başka bir FMQ ile doldurulmuş bir MFU paketi MFU paketinden oluşur. |
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
Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
ts başlığıile ts filtrelendi
FMQ ile 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 işlemini 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 :özelliğini kullanmak için for i=0; i<n; i++
AudioTrack adlı cihazın doğrudan ses özelliğini kullanmak için:for i=0; i<n; i++ |
ION belleğindeki 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çeriklerde: RecordStatus::* ve dahili programa göre
şunlardan biri:
|
Dizin verileri için: Etkinlik yükünde taşınır. . . Kaydedilen içerik için: FMQ doldurulan, mux uygulanmış 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 dahili programa göre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
mmtp başlığıile mmtp filtrelendi
FMQ ile 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 dahili zaman planlaması için aşağıdakilerden birini yapın:
takip edin:
|
Dizin verileri için: Etkinlik yükünde taşınır. . . Kaydedilen içerik için: Mux uygulanmış kaydedilmiş yayın dolduruldu FMQ. . . Kayıt için filtre kaynağı TLV.TLV ise
IP.IP ile geçiş yapılmışsa, kaydedilen yayında
TLV ve IP üstbilgisi. |
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 başka bir IP indirme paketi tarafından dolduruldu. |
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'nin 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ışı, filtredeki bir sonraki filtreyi besler oluşturuyoruz. | Yok |
isPassthrough: |
Zorunlu:DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
Önerilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
Etkinliğe ve dahili programa göre şunu çalıştırın:Filter.read(buffer, offset, adjustedSize) bir veya daha fazla
kez.. . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır. |
Protokol başlığı doldurulmuş olan, filtrelenen protokol alt akışı FMQ. | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH |
Yok | İsteğe bağlı:DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
|
Filtrelenen protokol yükü, filtredeki bir sonraki filtreyi besler oluşturuyoruz. | 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şlemini tamamlayın.MediaEvent
al.- Doğrusal bloku
codec
olarak sıraya 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 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
özelliklerini yapılandırmak için kullanılır.
OnPlaybackStatusChangedListener
ve OnRecordStatusChangedListener
kullanılıyor
bir DVR örneğinin durumunu raporlamak için de kullanılır.
Kayıt başlatmak için örnek akış
Şekil 12. Kayıt başlatmak için 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
öğesini 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
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 firma donanımı. Tedarikçi firmalar, Tarayıcı HAL'sini uygulamak için arayüzü kullanır ve çerçevesi, Tuner HAL uygulamasıyla iletişim kurmak için bunu kullanır.
Modüller
Tarayıcı 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 ,
setLnb stopScan |
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şim şeması
Filtre bağlantısı
Tuner HAL, filtrelerin diğer ağlara bağlanabileceği filtre bağlantısını destekler. filtreler oluşturabilirsiniz. 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ğu ve Şekil 14'te birden çok öğe filtrelemeye ilişkin bir örnek katman olarak görünür.
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 için olarak ayarlayabilirsiniz. TV Giriş Çerçevesi (TIF) "ilk edinen kazan" yöntemini kullandı yani kaynağı ilk elde eden uygulama, kaynağı yine tutan uygulamadır. Ancak bu mekanizma bazı karmaşık kullanım alanları için ideal olmayabilir.
TRM; Tuner, TVInput
ve CAS donanımını yönetmek için bir sistem hizmeti olarak çalışır
kaynaklarımız mevcut. TRM "ön plan galibiyeti" kullanıyor hangi mekanizmanın
uygulamanın ön planına veya arka planına göre uygulamanın önceliğini hesaplar
durumu ve kullanım alanı türünü seçin. TRM,
önem verir. TRM; yayın, OTT ve OTT için ATV kaynak yönetimini merkezileştirir.
ve DVR'dan yararlanabilirsiniz.
TRM arayüzü
TRM, Tarayıcı için ITunerResourceManager.aidl
dilinde AIDL arayüzlerini gösteriyor
çerçevesini, MediaCas
ve TvInputHardwareManager
çerçevesini kullanarak,
kaynakları ortaya çıkarmanıza
yardımcı olabilir.
Müşteri yönetimi arayüzleri aşağıda listelenmiştir.
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
unregisterClientProfile(in int clientId)
Kaynakları 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
İstemci önceliği
TRM, istemcinin profili ve yapılandırma dosyasındaki öncelik değerini içerir. Öncelik istemciden gelen rastgele bir öncelik değeriyle de güncellenir.
Müşterinin profilindeki parametreler
TRM, bir uygulamanın olup olmadığına karar vermek için mTvInputSessionId
cihazından işlem kimliğini alır
bir ön plan veya arka plan uygulamasıdır. mTvInputSessionId
oluşturmak için
TvInputService.onCreateSession
veya TvInputService.onCreateRecordingSession
Bu işlem bir TIS oturumu başlatır.
mUseCase
, oturumun kullanım alanını gösterir. Önceden tanımlanmış kullanım alanları şunlardır:
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 için öncelik değerleri sağlar durumlarda işe yarar. Kullanıcılar değerleri özelleştirilmiş yapılandırma dosyası kullanabilirsiniz.
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ılıyor
kullanım alanı türlerini ve kullanım alanı öncelik değerlerini ekleyin, kaldırın veya güncelleyin.
Özelleştirilmiş dosyada
platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml
.
kullanabilirsiniz.
Ö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
Rastgele öncelik değeri ve güzel değer
TRM, istemcinin rastgele güncellemesi için updateClientPriority
sağlar
ve güzel bir değer sunar.
İsteğe bağlı öncelik değeri, hesaplanan öncelik değerinin üzerine yazılır
oturum kimliğinden
yararlanabilirsiniz.
Nitelik değeri, açılış sayfanızdayken istemcinin davranışının ne kadar esnek başka bir müşteriyle çakışıyor. Güzel değer, müşterinin önceliğini azaltır zorlayıcı müşteriyle karşılaştırıldığında o müşterinin öncelik değerinden önceki en yüksek değere sahip olması gerekir.
Geri alma mekanizması
Aşağıdaki şemada, esnasında kaynakların nasıl geri kazanıldığı ve atandığı gösterilmektedir kaynak çakışması olur.
Şekil 15. Tuner arasındaki bir anlaşmazlık için geri hak talebi mekanizmasının şeması kaynaklar