Android 11 veya üstü için, A/V içeriği sunmak için Android Tuner çerçevesini kullanabilirsiniz. Çerçeve, satıcılardan gelen donanım hattını kullanır ve bu da onu hem düşük seviye hem de üst seviye SoC için uygun hale getirir. Çerçeve, güvenilir bir yürütme ortamı (TEE) ve güvenli ortam yolu (SMP) tarafından korunan A/V içeriği sağlamak için güvenli bir yol sağlar ve yüksek düzeyde kısıtlı, içerik koruma ortamında kullanılmasına izin verir.
Tuner ve Android CAS arasındaki standartlaştırılmış arayüz, Tuner satıcıları ve CAS satıcıları arasında daha hızlı bir 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ü, ana yayın standartlarına dayalı olarak hem dijital TV'yi hem de analog TV'yi destekler.
Bileşenler
Android 11 için, TV platformu için özel olarak tasarlanmış üç bileşen vardır.
- Tuner HAL: Çerçeve ve satıcılar arasında bir arayüz
- Tuner SDK API: Çerçeve ve uygulamalar arasında 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 Input Service (TIS) -
TvInputManagerService
veya TV Input Manager Service (TIMS) -
MediaCodec
veya medya codec bileşeni -
AudioTrack
veya ses parçası -
MediaResourceManager
veya medya kaynağı yöneticisi (MRM)
Şekil 1. Android TV bileşenleri arasındaki etkileşimler
Özellikleri
Ön uç aşağıdaki DTV standartlarını destekler.
- ATSC
- ATSC3
- DVB C/S/T
- ISDB S/S3/T
- analog
Android 12'de Tuner HAL 1.1 veya daha yüksek sürüme sahip ön uç, aşağıdaki DTV standardını destekler.
- DTMB
Demux, aşağıdaki akış protokollerini destekler.
- Taşıma akışı (TS)
- MPEG medya taşıma protokolü (MMTP)
- İnternet protokolü (IP)
- Tip uzunluk değeri (TLV)
- ATSC bağlantı katmanı protokolü (ALP)
Descrambler aşağıdaki içerik korumalarını destekler.
- Güvenli medya yolu
- Medya yolunu temizle
- Güvenli yerel kayıt
- Güvenli yerel oynatma
Ayarlayıcı API'leri aşağıdaki kullanım örneklerini destekler.
- Tarama
- Canlı olarak
- Geri çalma
- Kayıt
Tuner, MediaCodec
ve AudioTrack
aşağıdaki veri akışı modlarını destekler.
- Net bellek arabelleğine sahip ES yükü
- Güvenli bellek tutamacı ile ES yükü
- geçiş
Genel tasarım
Tuner HAL, Android çerçevesi ve satıcının donanımı arasında tanımlanır.
- Çerçevenin satıcıdan ne beklediğini ve satıcının bunu nasıl yapabileceğini açıklar.
-
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
veILnb
arabirimleri aracılığıyla ön uç, demux ve descrambler işlevlerini ç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 genel API'ler aracılığıyla Tuner HAL'a erişmesine izin verir.
- Yerel sınıf, Tuner HAL ile büyük miktarda kayıt veya oynatma verisinin izin kontrolüne ve işlenmesine izin verir.
- Native Tuner modülü, Tuner Java sınıfı ile Tuner HAL arasında bir köprüdür.
Bir TRM sınıfı oluşturulur.
- Ön Uç, LNB, CAS oturumları gibi sınırlı Tuner kaynaklarını ve TV girişi HAL'den bir TV giriş cihazı yönetir.
- Uygulamalardan yetersiz kaynakları geri almak için kurallar uygular. Varsayılan kural, ön plandaki galibiyettir.
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 belirteçleri sağlayarak Tuner HAL ile bütünleşir.
MediaCodec
ve AudioTrack
, aşağıdaki özelliklerle geliştirilmiştir.
- İç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ılmıştır.
-
ES_payload
ve geçiş modu için yapılandırılmış destek.
Şekil 2. Tuner HAL içindeki bileşenlerin şeması
Genel iş akışı
Aşağıdaki şemalar, canlı yayın oynatma için arama dizilerini göstermektedir.
Kurmak
Şekil 3. Canlı yayın oynatma için kurulum sırası
A/V İşleme
Şekil 4. Canlı yayın oynatma için A/V'yi kullanma
Karıştırılmış içeriğin işlenmesi
Şekil 5. Canlı yayın oynatma için karıştırılmış içeriğin işlenmesi
A/V verilerinin işlenmesi
Şekil 6. Canlı yayın oynatma için A/V işleme
Ayarlayıcı SDK API'sı
Tuner SDK API, 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
Android 12'den itibaren, Tuner SDK API, Tuner 1.0'ın 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 belgelerinde 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 kullanmak için bir giriş noktasıdır. TIS uygulaması, başlangıç ayarını ve geri aramayı 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ğı alır veFrontendSetting
parametresini belirterek ayar yapar. -
openFilter()
: Filtre türünü belirterek bir filtre örneği alır. -
openDvrRecorder()
: Arabellek boyutunu belirterek bir kayıt örneği alır. -
openDvrPlayback()
: Arabellek boyutunu belirterek bir oynatma örneği alır. -
openDescrambler()
: Bir descrambler örneği alır. -
openLnb()
: Dahili bir LNB örneği alır. -
openLnbByName()
: Harici bir LNB örneği alır. -
openTimeFilter()
: Bir zaman filtresi örneği alır.
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
kesCiCam -
shareFrontendFromTuner
-
updateResourcePriority
-
setOnTuneEventListener
-
setResourceLostListener
Android.media.tv.tuner.frontend
Ön uç paketi, ön uçla ilgili ayarlar, bilgiler, durumlar, olaylar ve yetenekler koleksiyonlarını içerir.
sınıflar
FrontendSettings
, aşağıdaki sınıflar tarafından farklı DTV standartları için türetilmiştir.
-
AnalogFrontendSettings
-
Atsc3FrontendSettings
-
AtscFrontendSettings
-
DvbcFrontendSettings
-
DvbsFrontendSettings
-
DvbtFrontendSettings
-
Isdbs3FrontendSettings
-
IsdbsFrontendSettings
-
IsdbtFrontendSettings
Tuner HAL 1.1 veya üstü ile 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üretilmiştir.
-
AnalogFrontendCapabilities
-
Atsc3FrontendCapabilities
-
AtscFrontendCapabilities
-
DvbcFrontendCapabilities
-
DvbsFrontendCapabilities
-
DvbtFrontendCapabilities
-
Isdbs3FrontendCapabilities
-
IsdbsFrontendCapabilities
-
IsdbtFrontendCapabilities
Tuner HAL 1.1 veya üstü ile Android 12'den itibaren aşağıdaki DTV standardı desteklenir.
-
DtmbFrontendCapabilities
FrontendInfo
, ön uç bilgilerini alır. FrontendStatus
, ön ucun geçerli durumunu alır. OnTuneEventListener
, ön uçtaki olayları dinler. TIS uygulaması, ön uçtan gelen tarama mesajlarını işlemek için ScanCallback
kullanır.
kanal taraması
Bir TV kurmak için uygulama, olası frekansları tarar ve kullanıcıların erişmesi için bir kanal dizisi oluşturur. TIS, kanal taramayı tamamlamak için Tuner.tune
, Tuner.scan(BLIND_SCAN)
veya Tuner.scan(AUTO_SCAN)
kullanabilir.
TIS, frekans, standart (örneğin, T/T2, S/S2) ve ek gerekli bilgiler (örneğin, PLD ID) gibi sinyal için doğru teslimat bilgilerine sahipse, daha hızlı seçenek olarak Tuner.tune
önerilir. .
Kullanıcı Tuner.tune
aradığında aşağıdaki eylemler gerçekleşir:
- TIS,
Tuner.tune
kullanarakFrontendSettings
gerekli bilgilerle doldurur. - HAL, sinyal kilitliyse,
LOCKED
mesajların ayarlanacağını bildirir. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, frekans listesinde bir sonraki uygun frekansa geçer.
TIS, tüm frekanslar tükenene kadar Tuner.tune
tekrar çağırır.
Ayarlama sırasında, Tuner.tune aramasını duraklatmak veya sonlandırmak için Tuner.tune
stopTune()
veya close()
öğesini çağırabilirsiniz.
Tuner.scan(AUTO_SCAN)
TIS, Tuner.tune
kullanmak için yeterli bilgiye sahip değilse, ancak bir frekans listesine ve standart tipe (örneğin, DVB T/C/S) sahipse, Tuner.scan(AUTO_SCAN)
önerilir.
Kullanıcı Tuner.scan(AUTO_SCAN)
, aşağıdaki eylemler gerçekleşir:
TIS, frekansla doldurulmuş
FrontendSettings
ileTuner.scan(AUTO_SCAN)
kullanır.HAL, sinyal kilitliyse,
LOCKED
mesajları taradığını bildirir. HAL, sinyal hakkında ek bilgi sağlamak için diğer tarama mesajlarını da rapor edebilir.TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır.TIS, HAL'ın aynı frekansta bir sonraki ayara devam etmesi için
Tuner.scan
çağırır.FrontendSettings
yapısı boşsa, HAL sonraki kullanılabilir ayarı kullanır. Aksi takdirde, HAL bir kerelik tarama içinFrontendSettings
kullanır ve tarama işleminin bittiğini belirtmek içinEND
gönderir.TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar.
HAL, tarama işleminin bittiğini belirtmek için
END
gönderir.TIS, frekans listesinde bir sonraki uygun frekansa geçer.
TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)
tekrar çağırır.
Tarama sırasında, taramayı duraklatmak veya sonlandırmak için stopScan()
veya close()
öğesini çağırabilirsiniz.
Tuner.scan(BLIND_SCAN)
TIS'in bir frekans listesi yoksa ve Satıcı HAL, ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun frekansını arayabilirse, Tuner.scan(BLIND_SCAN)
önerilir.
- TIS,
Tuner.scan(BLIND_SCAN)
kullanır. Başlangıç frekansı içinFrontendSettings
içinde bir frekans belirtilebilir, ancak TISFrontendSettings
içindeki diğer ayarları yok sayar. - 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
tekrar çağırır. (FrontendSettings
yoksayılır.) - TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar. HAL, TIS'den herhangi bir işlem gerektirmeden frekansı artırır. HAL
PROGRESS
bildirir.
TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)
tekrar çağırır. HAL, tarama işleminin bittiğini belirtmek için END
bildirir.
Tarama sırasında, taramayı duraklatmak veya sonlandırmak için stopScan()
veya close()
öğesini çağırabilirsiniz.
Şekil 9. Bir TIS taramasının akış şeması
Android.media.tv.tuner.filtre
Filtre paketi, yapılandırma, ayarlar, geri aramalar ve olaylarla birlikte bir filtre işlemleri 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. Konfigürasyonlar ana filtre tipi içindir ve filtrenin verileri çıkarmak için hangi protokolü kullandığını belirtirler.
-
AlpFilterConfiguration
-
IpFilterConfiguration
-
MmtpFilterConfiguration
-
TlvFilterConfiguration
-
TsFilterConfiguration
Ayarlar aşağıdaki sınıflardan türetilmiştir. 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ürleri için olayları raporlamak için aşağıdaki sınıflardan türetilmiştir.
-
SectionEvent
-
MediaEvent
-
PesEvent
-
TsRecordEvent
-
MmtpRecordEvent
-
TemiEvent
-
DownloadEvent
-
IpPayloadEvent
Tuner HAL 1.1 veya sonraki sürümlere sahip Android 12'den itibaren aşağıdaki olaylar desteklenir.
-
IpCidChangeEvent
-
RestartEvent
-
ScramblingStatusEvent
Filtreden olaylar ve veri formatı
Filtre tipi | Bayraklar | Olaylar | Veri işlemi | Veri formatı |
---|---|---|---|---|
TS.SECTION MMTP.SECTION IP.SECTION TLV.SECTION ALP.SECTION | isRaw: | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır. | Birleştirilmiş bir oturum paketi, başka bir oturum paketi tarafından FMQ'ya 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'sundan istemci arabelleğine kopyalanır. | ||
TS.PES | isRaw: | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır. | Birleştirilmiş bir PES paketi, başka bir PES 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'ın MQ'sundan istemci arabelleğine kopyalanır. | ||
MMTP.PES | isRaw: | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan 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'ın MQ'sundan istemci arabelleğine kopyalanır. | ||
TS.TS | Yok | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır. | ts başlığı ile filtrelenmiş ts FMQ'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 Filter.flush sonra Filter.flush'ı çağırabilir. | 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 Sesini 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 dahili programa göre aşağıdakilerden birini yapın:
| Dizin verileri için: Olay yükünde taşınır. Kaydedilen içerik için: FMQ ile doldurulmuş Muxed 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 Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır. | mmtp başlığıyla filtrelenmiş mmtp FMQ'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 | İndeks verileri for i=0; i<n; i++ Kayıtlı içerik için , RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
| Dizin verileri için: Olay yükünde taşınır. Kayıtlı içerik için: FMQ ile doldurulmuş Muxed kayıtlı akış. Kayıt için filtre kaynağı TLV.TLV IP.IP ise, kaydedilen akışın bir TLV ve IP başlığı vardır. |
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'sundan istemci arabelleğine kopyalanır. | İndirme paketi, başka bir IP indirme paketi tarafından FMQ'da 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'sundan istemci arabelleğine kopyalanır. | IP payload paketi, başka bir IP payload paketi tarafından FMQ'ya 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 filtreyi besler. | Yok |
isPassthrough: | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW Tavsiye edilen: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | Etkinliğe ve dahili programa göre, çalıştırınFilter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır. | Protokol başlığına sahip filtrelenmiş 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 filtreyi besler. | Yok |
PSI/SI oluşturmak için filtre kullanmak için örnek akış
Şekil 10. PSI/SI oluşturmak için 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();
İş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 kullanmak için örnek akış
Şekil 11. Filtreden MediaEvent kullanmak için akış
- A/V filtrelerini açın, yapılandırın ve başlatın.
-
MediaEvent
işleyin. -
MediaEvent
alın. - Doğrusal bloğu
codec
alın. - Veriler tüketildiğinde A/V tutamacını 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
yapılandırmak için kullanılır. OnPlaybackStatusChangedListener
ve OnRecordStatusChangedListener
, bir DVR örneğinin durumunu bildirmek için kullanılır.
Bir kaydı başlatmak için örnek akış
Şekil 12. Bir kaydı 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
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
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); } } };
Ayarlayıcı HAL
Tuner HAL, HIDL'yi takip eder ve çerçeve ile satıcı donanımı arasındaki arabirimi tanımlar. Satıcılar, Tuner HAL'ı uygulamak için arabirimi kullanır ve çerçeve, Tuner HAL uygulamasıyla iletişim kurmak için bunu kullanır.
Modüller
Ayarlayıcı HAL 1.0
Modüller | Temel kontroller | 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 kesCiCam | IDemux.hal |
IDvr | close , start , stop , configure | attach/detachFilters , getQueueDesc , flush | 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 kontroller | 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 çok katman için diğer filtrelere bağlanabileceği şekilde filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uyar.
- Filtreler bir ağaç olarak bağlanır, yolu kapatmaya izin verilmez.
- Kök düğüm demux'dur.
- Filtreler bağımsız olarak çalışır.
- Tüm filtreler veri almaya başlar.
- Filtre bağlantısı son filtrede yıkanır.
Aşağıdaki kod bloğu ve Şekil 14, birden çok katmanı filtrelemenin bir ö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 çok katman için bir filtre bağlantısının akış şeması
Ayarlayıcı Kaynak Yöneticisi
Tuner Resource Manager'dan (TRM) önce, iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Girdi Çerçevesi (TIF), "ilk elde eden kazanma" mekanizmasını kullandı; bu, kaynağı ilk alan uygulama kaynağı koruduğu anlamına gelir. Ancak bu mekanizma bazı karmaşık kullanım durumları için ideal olmayabilir.
TRM, uygulamalar için Tuner, TVInput
ve CAS donanım kaynaklarını yönetmek için bir sistem hizmeti olarak çalışır. TRM, uygulamanın ön plan veya arka plan durumuna göre uygulamanın önceliğini hesaplayan ve vaka tipini kullanan 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 serbest bırakmak için Tuner çerçevesi, MediaCas
ve ITunerResourceManager.aidl
için TvInputHardwareManager
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)
Kaynakları istemek ve serbest bırakmak için arayüzler 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 plan mı yoksa arka plan uygulaması mı olduğuna karar vermek için işlem kimliğini mTvInputSessionId
alır. mTvInputSessionId
, TvInputService.onCreateSession
veya TvInputService.onCreateRecordingSession
oluşturmak için bir TIS oturumu başlatır.
mUseCase
, oturumun kullanım durumunu gösterir. Önceden tanımlanmış kullanım durumları 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 durumları 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 durumu | ö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ı
Satıcılar, /vendor/etc/tunerResourceManagerUseCaseConfig.xml
yapılandırma dosyasını özelleştirebilir. Bu dosya, kullanım durumu türlerini ve kullanım durumu ö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
.
Örneğin, yeni bir satıcı kullanım örneği VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000]
. Biçim, platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd
.
Keyfi öncelik değeri ve nice değeri
TRM, istemcinin isteğe bağlı öncelik değerini ve Nice değerini güncellemesi için updateClientPriority
sağlar. Rastgele öncelik değeri, kullanım durumu türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazar.
Nice değeri, müşterinin davranışının başka bir müşteriyle çeliştiğinde ne kadar yumuşak olduğunu gösterir. Nice değeri, müşterinin öncelik değerini, zorlu müşteriyle karşılaştırılmadan önce azaltır.
geri alma mekanizması
Aşağıdaki şema, bir kaynak çakışması meydana geldiğinde kaynakların nasıl geri alındığını ve atandığını gösterir.
Şekil 15. Ayarlayıcı kaynakları arasındaki bir çakışma için geri alma mekanizmasının şeması