ayarlayıcı çerçevesi

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)

Tuner çerçeve bileşenlerinin akış diyagramı.

Ş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 ve ILnb arayüzleri aracılığıyla çerçeveye aktarır.
  • Tuner HAL'ı MediaCodec ve AudioTrack 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.

Tuner HAL'ın genel tasarımı.

Ş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

Canlı yayın oynatma diyagramının kurulum sırası.

Şekil 3. Canlı yayın oynatma için kurulum sırası

A/V'yi işleme

Canlı yayın oynatma diyagramı için A/V'nin kullanılması.

Şekil 4. Canlı yayın oynatımı için A/V'nin kullanılması

Karıştırılmış içeriğin işlenmesi

Canlı yayın oynatma diyagramı için 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

Canlı yayın oynatma diyagramı için A/V verilerini işleyin.

Ş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.

Tuner SDK API'sinin akış diyagramı.

Ş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

Tuner SDK API paketlerinin akış diyagramı.

Ş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 ve sessionId parametrelerini belirterek bir Tuner örneğini başlatır.
  • tune() : Bir ön uç kaynağı alır ve FrontendSetting 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 kullanarak FrontendSettings 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 ile Tuner.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çin FrontendSettings kullanır ve tarama işleminin bittiğini belirtmek için END 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çin FrontendSettings 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.

TIS Tarama işleminin akış şeması.

Ş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:
true
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ın
Filter.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:
false
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++
Filter.read(buffer, offset, DemuxFilterSectionEven[i].size)


Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
TS.PES isRaw:
true
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ın
Filter.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:
false
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++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
MMTP.PES isRaw:
true
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ın
Filter.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:
false
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++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


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ın
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.

Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
ts başlığıyla ts filtrelendi
FMQ'da doldurulur.
TS.Audio
TS.Video
MMTP.Audio
MMTP.Video
isPassthrough:
true
İ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:
false
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++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()


AudioTrack Doğrudan Sesini kullanmak için:
for i=0; i<n; i++
audioHandle = MediaEvent[i].getAudioHandle();
audiotrack.write(encapsulated(audiohandle))
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++
DemuxFilterTsRecordEvent[i];


Kayıtlı içerik için RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • Depolamaya DvrRecord.write(adustedSize) dosyasını bir veya daha fazla çalıştırın.
    Veriler HAL'in MQ'sundan depolamaya aktarılır.
  • Ara belleğe almak için DvrRecord.write(buffer, adustedSize) komutunu bir veya daha fazla çalıştırın.
    Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
İ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++
DemuxFilterTemiEvent[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ın
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.

Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
mmtp başlığıyla mmtp filtrelendi
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 için: for i=0; i<n; i++
DemuxFilterMmtpRecordEvent[i];


Kayıtlı içerik için RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • DvrRecord.write(adjustedSize) depolamaya bir veya daha fazla kez çalıştırın.
    Veriler HAL'in MQ'sundan depolamaya aktarılır.
  • Ara belleğe almak için DvrRecord.write(buffer, adjustedSize) komutunu bir veya daha fazla çalıştırın.
    Veriler HAL'in MQ'sundan istemci arabelleğine kopyalanır.
İ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:
true
İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
Filtrelenen protokol alt akışı, filtre zincirindeki bir sonraki filtreyi besler. Yok
isPassthrough:
false
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ın
Filter.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ış

PSI/SI oluşturmak için filtre kullanımına ilişkin örnek akış.

Şekil 10. PSI/SI oluşturma akışı

  1. Bir filtre açın.

    Filter filter = tuner.openFilter(
      Filter.TYPE_TS,
      Filter.SUBTYPE_SECTION,
      /* bufferSize */1000,
      executor,
      filterCallback
    );
    
  2. 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();
    
  3. İş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ış

MediaEvent'i filtreden kullanmak için örnek akış.

Şekil 11. MediaEvent'i filtreden kullanma akışı

  1. A/V filtrelerini açın, yapılandırın ve başlatın.
  2. MediaEvent işle.
  3. MediaEvent alın.
  4. Doğrusal bloğu codec kadar sıraya alın.
  5. 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ış

Bir kaydı başlatmak için örnek akış.

Şekil 12. Kayıt başlatma akışı

  1. 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();
    
  2. 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. }
          }
        }
    };
    
  3. 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

Tuner HAL modülleri arasındaki etkileşimlerin akış diyagramı.

Ş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>)
}

Filtre bağlantı örneğinin şeması.

Ş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.

Geri kazanım mekanizması sürecinin şeması.

Şekil 15. Ayarlayıcı kaynakları arasındaki bir çakışmaya ilişkin geri alma mekanizmasının şeması