Tarayıcı çerçevesi

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'i
  • AudioTrack veya ses parçası
  • MediaResourceManager veya medya kaynağı yöneticisi (MRM)

Tuner çerçevesi 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 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, ve ILnb arayüz var.
  • Tuner HAL'yi diğer çerçeveyle entegre etme işlevlerini içerir MediaCodec ve AudioTrack 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ı.

Tuner HAL'nin genel tasarımı.

Ş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

Canlı yayın oynatma şemasının kurulum sırası.

Şekil 3. Canlı yayın oynatma sırasını ayarlayın

A/V'yi kullanma

Canlı yayın oynatma diyagramı için A/V kullanımı.

4.Şekil Canlı yayın oynatma için A/V'yi kullanma

Karmaşık içeriği işleme

Canlı yayın oynatma diyagramı için karışık içerik işleme.

5. Şekil. Canlı yayın oynatma için karışık içerikleri işleme

A/V verileri işleniyor

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

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.

Tuner SDK API'sinin akış şeması.

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

Tuner SDK API paketlerinin akış şeması.

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 ve sessionId parametreleri.
  • tune(): Bir ön uç kaynağı edinir ve FrontendSetting 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 kullanarak FrontendSettings öğ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 kerelik FrontendSettings kullanır tarama işleminin tamamlandığını belirtmek için END 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çin FrontendSettings, ancak TIS diğer ayarları yoksayar FrontendSettings 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.

TIS Tarama işleminin akış diyagramı.

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:
true
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:
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'nin MQ'sinden istemci arabelleğine kopyalanır.
TS.PES isRaw:
true
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:
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'nin MQ'sinden istemci arabelleğine kopyalanır.
MMTP.PES isRaw:
true
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:
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'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:
true
İ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:
false
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++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()

AudioTrack adlı cihazın doğrudan ses özelliğini kullanmak için:
for i=0; i<n; i++
audioHandle = MediaEvent[i].getAudioHandle();
audiotrack.write(encapsulated(audiohandle))
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++
DemuxFilterTsRecordEvent[i];

Kayıtlı içeriklerde: RecordStatus::* ve dahili programa göre şunlardan biri:
  • DvrRecord.write(adustedSize) çalıştır depolama alanına bir veya daha fazla kez ekleyin.
    . Veriler, HAL'nin MQ'sından depolama alanına aktarılır.
  • DvrRecord.write(buffer, adustedSize) çalıştır en az bir kez arabelleğe alınabilir.
    . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
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++
DemuxFilterTemiEvent[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++
DemuxFilterMmtpRecordEvent[i];


Kayıtlı içerik için: RecordStatus::* ve dahili zaman planlaması için aşağıdakilerden birini yapın: takip edin:
  • DvrRecord.write(adjustedSize) uygulamasını bir veya daha fazla kez çalıştır .
    . Veriler, HAL'nin MQ'sından depolama alanına aktarılır.
  • Bir DvrRecord.write(buffer, adjustedSize) çalıştır veya daha fazla zaman alabilir.
    . Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
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:
true
İsteğe bağlı:

DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
Filtrelenen protokol alt akışı, filtredeki bir sonraki filtreyi besler oluşturuyoruz. Yok
isPassthrough:
false
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ış

PSI/SI değeri oluşturmak için filtre kullanmaya dair ö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ı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();
    
  3. 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ış

Filtreden MediaEvent kullanımı için örnek akış.

Şekil 11. Filtreden MediaEvent kullanma akışı

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

Kayıt başlatmak için örnek akış.

Şekil 12. Kayıt başlatmak için akış

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

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

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

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

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

Geri alma mekanizması sürecinin şeması.

Şekil 15. Tuner arasındaki bir anlaşmazlık için geri hak talebi mekanizmasının şeması kaynaklar