Android 11 veya üzeri sürümlerde A/V içeriği sunmak için Android Tuner çerçevesini kullanabilirsiniz. Çerçeve, satıcıların donanım hattını kullanıyor ve bu da onu hem düşük hem de üst düzey SoC için uygun hale getiriyor. Çerçeve, güvenilir bir yürütme ortamı (TEE) ve güvenli ortam yolu (SMP) tarafından korunan A/V içeriğinin sunulması için güvenli bir yol sağlayarak, bunun oldukça kısıtlı bir içerik koruma ortamında kullanılmasına olanak tanır.
Tuner ile Android CAS arasındaki standartlaştırılmış arayüz, Tuner satıcıları ile CAS satıcıları arasında daha hızlı bir entegrasyon sağlar. Tuner arayüzü, Android TV için tek dünya çözümü oluşturmak üzere MediaCodec
ve AudioTrack
ile birlikte çalışır. Tuner arayüzü, ana yayın standartlarına göre hem dijital TV'yi hem de analog TV'yi destekler.
Bileşenler
Android 11 için üç bileşen TV platformuna özel olarak tasarlanmıştır.
- Tuner HAL: Çerçeve ve satıcılar arasında bir arayüz
- Tuner SDK API'si: Çerçeve ve uygulamalar arasında bir arayüz
- Ayarlayıcı Kaynak Yöneticisi (TRM): Ayarlayıcı HW kaynaklarını koordine eder
Android 11 için aşağıdaki bileşenler geliştirildi.
- CAS V2
-
TvInputService
veya TV Giriş Hizmeti (TIS) -
TvInputManagerService
veya TV Giriş Yöneticisi Hizmeti (TIMS) -
MediaCodec
veya medya codec bileşeni -
AudioTrack
veya ses parçası -
MediaResourceManager
veya medya kaynak 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 üzeri sürüme sahip Android 12'deki ön uç, aşağıdaki DTV standardını destekler.
- DTMB
Demux aşağıdaki akış protokollerini destekler.
- Taşıma akışı (TS)
- MPEG medya aktarım protokolü (MMTP)
- İnternet protokolü (IP)
- Uzunluk değerini yazın (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
Tuner API'leri aşağıdaki kullanım örneklerini destekler.
- Tara
- Canlı
- Geri çalma
- Kayıt
Tuner, MediaCodec
ve AudioTrack
aşağıdaki veri akışı modlarını destekler.
- Temiz bellek arabelleğine sahip ES yükü
- Güvenli bellek tanıtıcılı ES yükü
- Geçiş
Genel tasarım
Tuner HAL, Android çerçevesi ile 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.
- Ö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 etmeye yönelik işlevleri 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'ye erişmesine olanak tanır.
- Yerel sınıf, Tuner HAL ile büyük miktarlarda kayıt veya oynatma verilerinin izin kontrolüne ve işlenmesine olanak tanır.
- Yerel Tuner modülü, Tuner Java sınıfı ile Tuner HAL arasında bir köprüdür.
Bir TRM sınıfı oluşturulur.
- Ön uç, LNB, CAS oturumları ve TV giriş cihazı HAL'den 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 plandaki galibiyettir.
Media CAS ve CAS HAL aşağıdaki özelliklerle geliştirilmiştir.
- Farklı kullanımlar ve algoritmalar için CAS oturumlarını açar.
- CICAM çıkarma 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ğini kullanır.
- Tünellenmiş oynatmada donanım A/V senkronizasyonu yapacak şekilde 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 diyagramlar canlı yayın oynatımı için çağrı sıralarını göstermektedir.
Kurmak
Şekil 3. Canlı yayın oynatma için kurulum sırası
A/V'yi işleme
Şekil 4. Canlı yayın oynatımı için A/V'nin kullanılması
Karıştırılmış içeriğin işlenmesi
Şekil 5. Canlı yayın oynatımı için karıştırılmış içeriğin kullanılması
A/V verilerinin işlenmesi
Şekil 6. Canlı yayın oynatımı için A/V'nin işlenmesi
Ayarlayıcı SDK API'si
Tuner SDK API'si Tuner JNI, Tuner HAL ve TunerResourceManager
ile olan 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'si ile Etkileşimler
Sürümler
Android 12'den itibaren Tuner SDK API'si, Tuner 1.0'ın geriye dönük uyumlu 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'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
Ş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 edinmek 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 şifre çözücü ö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ç paketlerinin kapsamına girmeyen 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ın, bilgilerin, durumların, olayların ve yeteneklerin koleksiyonlarını içerir.
Sınıflar
FrontendSettings
aşağıdaki sınıflara göre farklı DTV standartları için türetilmiştir.
-
AnalogFrontendSettings
-
Atsc3FrontendSettings
-
AtscFrontendSettings
-
DvbcFrontendSettings
-
DvbsFrontendSettings
-
DvbtFrontendSettings
-
Isdbs3FrontendSettings
-
IsdbsFrontendSettings
-
IsdbtFrontendSettings
Tuner HAL 1.1 veya üzeri Android 12'den itibaren aşağıdaki DTV standardı desteklenir.
-
DtmbFrontendSettings
FrontendCapabilities
farklı DTV standartları için aşağıdaki sınıflara göre türetilmiştir.
-
AnalogFrontendCapabilities
-
Atsc3FrontendCapabilities
-
AtscFrontendCapabilities
-
DvbcFrontendCapabilities
-
DvbsFrontendCapabilities
-
DvbtFrontendCapabilities
-
Isdbs3FrontendCapabilities
-
IsdbsFrontendCapabilities
-
IsdbtFrontendCapabilities
Tuner HAL 1.1 veya üzeri 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ı, tarama mesajlarını ön uçtan işlemek için ScanCallback
kullanır.
Kanal taraması
Uygulama, bir TV ayarlamak için olası frekansları tarar ve kullanıcıların erişebileceği bir kanal listesi 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) gibi sinyal için doğru iletim bilgilerine ve gerekli ek bilgilere (örneğin, PLD ID) sahipse, daha hızlı seçenek olarak Tuner.tune
önerilir. .
Kullanıcı Tuner.tune
öğesini çağırdığında aşağıdaki eylemler gerçekleşir:
- TIS,
Tuner.tune
kullanarakFrontendSettings
gerekli bilgilerle doldurur. - HAL, sinyal kilitliyse
LOCKED
mesajları ayarlar. - TIS, gerekli bilgileri toplamak için
Frontend.getStatus
kullanır. - TIS, frekans listesindeki bir sonraki kullanılabilir frekansa geçer.
TIS, tüm frekanslar bitene kadar Tuner.tune
tekrar çağırır.
Ayarlama sırasında Tuner.tune
çağrısını duraklatmak veya sonlandırmak için 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 türe (örneğin, DVB T/C/S) sahipse Tuner.scan(AUTO_SCAN)
önerilir.
Kullanıcı Tuner.scan(AUTO_SCAN)
öğesini çağırdığında aşağıdaki eylemler gerçekleşir:
TIS, frekansla doldurulmuş
FrontendSettings
ileTuner.scan(AUTO_SCAN)
işlevini kullanır.HAL raporları, sinyal kilitliyse
LOCKED
mesajları tarar. HAL ayrıca 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'in aynı frekansta bir sonraki ayara devam etmesi için
Tuner.scan
çağırır.FrontendSettings
yapısı boşsa HAL bir sonraki kullanılabilir ayarı kullanır. Aksi halde HAL, bir kerelik tarama içinFrontendSettings
kullanır ve tarama işleminin bittiğini belirtmek içinEND
gönderir.TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrarlar.
HAL, tarama işleminin bittiğini belirtmek için
END
gönderir.TIS, frekans listesindeki bir sonraki kullanılabilir frekansa geçer.
TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)
işlevini tekrar çağırır.
Tarama sırasında taramayı duraklatmak veya sonlandırmak için stopScan()
veya close()
öğesini çağırabilirsiniz.
Tuner.taraması(BLIND_SCAN)
TIS'in bir frekans listesi yoksa ve Satıcı HAL, ön uç kaynağını almak için kullanıcı tarafından belirlenen ön uç frekansını arayabilirse Tuner.scan(BLIND_SCAN)
önerilir.
- TIS
Tuner.scan(BLIND_SCAN)
işlevini kullanır. Başlangıç frekansı içinFrontendSettings
bir sıklık belirtilebilir, ancak TIS,FrontendSettings
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
dikkate alınmaz.) - TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrarlar. HAL, TIS'ten herhangi bir işlem yapılmasına gerek kalmadan frekansı artırır. HAL
PROGRESS
raporunu verir.
TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)
işlevini tekrar çağırır. HAL, tarama işleminin bittiğini belirtmek için END
raporunu verir.
Tarama sırasında taramayı duraklatmak veya sonlandırmak için stopScan()
veya close()
öğesini çağırabilirsiniz.
Şekil 9. TIS taramasının akış şeması
Android.media.tv.tuner.filter
Filtre paketi, yapılandırma, ayarlar, geri aramalar ve olaylarla birlikte filtre işlemlerinin bir koleksiyonudur. Paket aşağıdaki işlemleri içermektedir. İş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 verileri çıkarmak için hangi protokolü kullandığını belirtir.
-
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ürlerine ilişkin 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 üzeri Android 12'den itibaren aşağıdaki etkinlikler 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'in MQ'sundan istemci arabelleğine kopyalanır. | Birleştirilmiş bir oturum paketi, FMQ'da başka bir oturum paketi tarafından 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'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'in MQ'sundan istemci arabelleğine kopyalanır. | Birleştirilmiş bir PES paketi, FMQ'ya başka bir PES paketi tarafından doldurulur. |
isRaw: | Zorunlu:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ Veriler HAL'in 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'in MQ'sundan istemci arabelleğine kopyalanır. | Birleştirilmiş bir MFU paketi, FMQ'ya başka bir MFU paketi tarafından doldurulur. |
isRaw: | Zorunlu:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW İsteğe bağlı: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ Veriler HAL'in 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'in MQ'sundan 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ğı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 hafızasındaki 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:
| İndeks verileri için: Olay yükünde taşınır. Kaydedilen içerik için: FMQ'ya 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'in MQ'sundan 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 | İndeks 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:
| İndeks verileri için: Olay yükünde taşınır. Kayıtlı içerik için: FMQ'ya doldurulmuş muxed kayıtlı akış. Kayıt için filtre kaynağı geçişli TLV.TLV IP.IP ise, kaydedilen akışın bir TLV'si 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'in MQ'sundan istemci arabelleğine kopyalanır. | İndirme paketi FMQ'da 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'in MQ'sundan istemci arabelleğine kopyalanır. | IP verisi paketi FMQ'da başka bir IP verisi paketi tarafından doldurulur. |
IP.IP TLV.TLV ALP.ALP | isPassthrough: | İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | Filtrelenen protokol alt akışı, filtre zincirindeki bir sonraki filtreyi besler. | Yok |
isPassthrough: | Zorunlu:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW 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'in MQ'sundan istemci arabelleğine kopyalanır. | Filtrelenen protokol alt akışı, protokol başlığıyla birlikte FMQ'ya doldurulur. | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH | Yok | İsteğe bağlı:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | Filtrelenen protokol verisi, filtre zincirindeki bir sonraki filtreyi besler. | Yok |
PSI/SI oluşturmak için filtreyi kullanmaya yönelik ö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ı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); } } } };
MediaEvent'i filtreden kullanmak için örnek akış
Şekil 11. MediaEvent'i filtreden kullanma akışı
- A/V filtrelerini açın, yapılandırın ve başlatın.
-
MediaEvent
işle. -
MediaEvent
alın. - Doğrusal bloğu
codec
kadar sıraya 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 raporlamak 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
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 arayüzü tanımlar. Satıcılar arayüzü Tuner HAL'i uygulamak için kullanır ve çerçeve de onu Tuner HAL uygulamasıyla iletişim kurmak için kullanır.
Modüller
Ayarlayıcı HAL 1.0
Modüller | Temel kontroller | 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 , disconnectCiCam connect / bağlantısını kes | 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 kontroller | 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ı
Filtre bağlantısı
Tuner HAL, filtrelerin birden fazla katman için diğer filtrelere bağlanabileceği şekilde filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uygundur.
- Filtreler bir ağaç olarak bağlantılıdır, yolun kapatılmasına 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 yıkanır.
Aşağıdaki kod bloğu ve Şekil 14, birden fazla katmanın filtrelenmesine ilişkin bir örneği 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. Çoklu katmanlar için filtre bağlantısının akış diyagramı
Ayarlayıcı Kaynak Yöneticisi
Tuner Resource Manager'dan (TRM) önce, iki uygulama arasında geçiş yapmak aynı Tuner donanımını gerektiriyordu. TV Giriş Çerçevesi (TIF), "ilk edinen kazanır" mekanizmasını kullandı; bu, kaynağı ilk alan uygulamanın 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 üzere bir sistem hizmeti olarak çalışır. TRM, uygulamanın ön plan veya arka plan durumuna ve kullanım durumu türüne göre uygulamanın önceliğini hesaplayan bir "ön plan 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 TvInputHardwareManager
için ITunerResourceManager.aidl
AIDL arayüzlerini kullanıma sunar.
İstemci yönetimine yönelik arayüzler aşağıda listelenmiştir.
-
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
-
unregisterClientProfile(in int clientId)
Kaynak istemek ve serbest bırakmak için kullanılan 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
Client ve request sınıfları aşağıda listelenmiştir.
-
ResourceClientProfile
-
ResourcesReclaimListener
-
TunerFrontendRequest
-
TunerDemuxRequest
-
TunerDescramblerRequest
-
CasSessionRequest
-
TunerLnbRequest
Müşteri önceliği
TRM, istemcinin önceliğini, istemci profilindeki parametreleri ve yapılandırma dosyasındaki öncelik değerini kullanarak hesaplar. Öncelik, istemciden gelen isteğe bağlı bir öncelik değeriyle de güncellenebilir.
Müşterinin profilindeki parametreler
TRM, bir uygulamanın ön plan uygulaması mı yoksa arka plan uygulaması mı olduğuna karar vermek için mTvInputSessionId
işlem kimliğini alır. mTvInputSessionId
oluşturmak için TvInputService.onCreateSession
veya TvInputService.onCreateRecordingSession
bir TIS oturumunu 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ğerlerini sağlar. Kullanıcılar özelleştirilmiş bir yapılandırma dosyası kullanarak değerleri değiştirebilirler.
Kullanım örneği | Ö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 senaryosu türlerini ve kullanım senaryosu öncelik değerlerini eklemek, kaldırmak veya güncellemek için kullanılır. Özelleştirilmiş dosya, şablon olarak platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml
kullanabilir.
Örneğin, yeni bir satıcı kullanım durumu VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000]
şeklindedir. Format platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd
uygun olmalıdır.
Keyfi öncelik değeri ve hoş değer
TRM, istemcinin isteğe bağlı öncelik değerini ve hoş değeri güncellemesi için updateClientPriority
sağlar. Rastgele öncelik değeri, kullanım senaryosu türünden ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazar.
Nice değeri, başka bir müşteriyle çatışma halindeyken müşterinin davranışının ne kadar hoşgörülü olduğunu gösterir. Güzel değer, öncelik değeri zorlu müşteriyle karşılaştırılmadan önce müşterinin öncelik değerini 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östermektedir.
Şekil 15. Ayarlayıcı kaynakları arasındaki bir çakışmaya ilişkin geri alma mekanizmasının şeması