Ayarlayıcı Çerçevesi

Android 11 veya üstü için, A/V içeriği sunmak için Android Tuner çerçevesini kullanabilirsiniz. Çerçeve, satıcılardan gelen donanım hattını kullanır ve bu da onu hem düşük seviye hem de üst seviye SoC için uygun hale getirir. Çerçeve, güvenilir bir yürütme ortamı (TEE) ve güvenli ortam yolu (SMP) tarafından korunan A/V içeriği sağlamak için güvenli bir yol sağlar ve yüksek düzeyde kısıtlı, içerik koruma ortamında kullanılmasına izin verir.

Tuner ve Android CAS arasındaki standartlaştırılmış arayüz, Tuner satıcıları ve CAS satıcıları arasında daha hızlı bir entegrasyon sağlar. Tuner arayüzü, Android TV için tek bir dünya çözümü oluşturmak üzere MediaCodec ve AudioTrack ile birlikte çalışır. Tuner arayüzü, ana yayın standartlarına dayalı olarak hem dijital TV'yi hem de analog TV'yi destekler.

Bileşenler

Android 11 için, TV platformu için özel olarak tasarlanmış üç bileşen vardır.

  • Tuner HAL: Çerçeve ve satıcılar arasında bir arayüz
  • Tuner SDK API: Çerçeve ve uygulamalar arasında bir arayüz
  • Tuner Resource Manager (TRM): Tuner HW kaynaklarını koordine eder

Android 11 için aşağıdaki bileşenler geliştirildi.

  • CAS V2
  • TvInputService veya TV Input Service (TIS)
  • TvInputManagerService veya TV Input Manager Service (TIMS)
  • MediaCodec veya medya codec bileşeni
  • AudioTrack veya ses parçası
  • MediaResourceManager veya medya kaynağı yöneticisi (MRM)

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

Şekil 1. Android TV bileşenleri arasındaki etkileşimler

Özellikleri

Ön uç aşağıdaki DTV standartlarını destekler.

  • ATSC
  • ATSC3
  • DVB C/S/T
  • ISDB S/S3/T
  • analog

Android 12'de Tuner HAL 1.1 veya daha yüksek sürüme sahip ön uç, aşağıdaki DTV standardını destekler.

  • DTMB

Demux, aşağıdaki akış protokollerini destekler.

  • Taşıma akışı (TS)
  • MPEG medya taşıma protokolü (MMTP)
  • İnternet protokolü (IP)
  • Tip uzunluk değeri (TLV)
  • ATSC bağlantı katmanı protokolü (ALP)

Descrambler aşağıdaki içerik korumalarını destekler.

  • Güvenli medya yolu
  • Medya yolunu temizle
  • Güvenli yerel kayıt
  • Güvenli yerel oynatma

Ayarlayıcı API'leri aşağıdaki kullanım örneklerini destekler.

  • Tarama
  • Canlı olarak
  • Geri çalma
  • Kayıt

Tuner, MediaCodec ve AudioTrack aşağıdaki veri akışı modlarını destekler.

  • Net bellek arabelleğine sahip ES yükü
  • Güvenli bellek tutamacı ile ES yükü
  • geçiş

Genel tasarım

Tuner HAL, Android çerçevesi ve satıcının donanımı arasında tanımlanır.

  • Çerçevenin satıcıdan ne beklediğini ve satıcının bunu nasıl yapabileceğini açıklar.
  • IFrontend , IDemux , IDescrambler , IFilter , IDvr ve ILnb arabirimleri aracılığıyla ön uç, demux ve descrambler işlevlerini çerçeveye aktarır.
  • Tuner HAL'ı MediaCodec ve AudioTrack gibi diğer çerçeve bileşenleriyle entegre etme işlevlerini içerir.

Bir Tuner Java sınıfı ve yerel sınıf oluşturulur.

  • Tuner Java API, uygulamaların genel API'ler aracılığıyla Tuner HAL'a erişmesine izin verir.
  • Yerel sınıf, Tuner HAL ile büyük miktarda kayıt veya oynatma verisinin izin kontrolüne ve işlenmesine izin verir.
  • Native Tuner modülü, Tuner Java sınıfı ile Tuner HAL arasında bir köprüdür.

Bir TRM sınıfı oluşturulur.

  • Ön Uç, LNB, CAS oturumları gibi sınırlı Tuner kaynaklarını ve TV girişi HAL'den bir TV giriş cihazı yönetir.
  • Uygulamalardan yetersiz kaynakları geri almak için kurallar uygular. Varsayılan kural, ön plandaki galibiyettir.

Media CAS ve CAS HAL, aşağıdaki özelliklerle geliştirilmiştir.

  • Farklı kullanımlar ve algoritmalar için CAS oturumları açar.
  • CICAM kaldırma ve yerleştirme gibi dinamik CAS sistemlerini destekler.
  • Anahtar belirteçleri sağlayarak Tuner HAL ile bütünleşir.

MediaCodec ve AudioTrack , aşağıdaki özelliklerle geliştirilmiştir.

  • İçerik girişi olarak güvenli A/V belleği alır.
  • Tünelli oynatmada donanım A/V senkronizasyonu yapmak üzere yapılandırılmıştır.
  • ES_payload ve geçiş modu için yapılandırılmış destek.

Tuner HAL'ın genel tasarımı.

Şekil 2. Tuner HAL içindeki bileşenlerin şeması

Genel iş akışı

Aşağıdaki şemalar, canlı yayın oynatma için arama dizilerini göstermektedir.

Kurmak

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

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

A/V İşleme

Canlı yayın oynatma şeması için A/V işleme.

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

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

Canlı yayın oynatma şeması için şifreli içeriğin işlenmesi.

Şekil 5. Canlı yayın oynatma için karıştırılmış içeriğin işlenmesi

A/V verilerinin işlenmesi

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

Şekil 6. Canlı yayın oynatma için A/V işleme

Ayarlayıcı SDK API'sı

Tuner SDK API, Tuner JNI, Tuner HAL ve TunerResourceManager ile etkileşimleri yönetir. TIS uygulaması, Tuner kaynaklarına ve filtre ve şifre çözücü gibi alt bileşenlere erişmek için Tuner SDK API'sini kullanır. Ön uç ve demux dahili bileşenlerdir.

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

Şekil 7. Tuner SDK API ile Etkileşimler

Sürümler

Android 12'den itibaren, Tuner SDK API, Tuner 1.0'ın geriye dönük uyumlu bir sürüm yükseltmesi olan Tuner HAL 1.1'deki yeni özelliği destekler.

Çalışan HAL sürümünü kontrol etmek için aşağıdaki API'yi kullanın.

  • android.media.tv.tuner.TunerVersionChecker.getTunerVersion()

Gerekli minimum HAL sürümü, yeni Android 12 API'lerinin belgelerinde bulunabilir.

paketler

Tuner SDK API, aşağıdaki dört paketi sağlar.

  • android.media.tv.tuner
  • android.media.tv.tuner.frontend
  • android.media.tv.tuner.filter
  • android.media.tv.tuner.dvr

Tuner SDK API paketlerinin akış şeması.

Şekil 8. Tuner SDK API paketleri

Android.media.tv.tuner

Tuner paketi, Tuner çerçevesini kullanmak için bir giriş noktasıdır. TIS uygulaması, başlangıç ​​ayarını ve geri aramayı belirterek kaynak örneklerini başlatmak ve almak için paketi kullanır.

  • tuner() : useCase 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 descrambler örneği alır.
  • openLnb() : Dahili bir LNB örneği alır.
  • openLnbByName() : Harici bir LNB örneği alır.
  • openTimeFilter() : Bir zaman filtresi örneği alır.

Tuner paketi, filtre, DVR ve ön uç paketleri kapsamında olmayan işlevler sağlar. İşlevler aşağıda listelenmiştir.

  • cancelTuning
  • scan / cancelScanning
  • getAvSyncHwId
  • getAvSyncTime
  • connectCiCam1 / disconnectCiCam kesCiCam
  • shareFrontendFromTuner
  • updateResourcePriority
  • setOnTuneEventListener
  • setResourceLostListener

Android.media.tv.tuner.frontend

Ön uç paketi, ön uçla ilgili ayarlar, bilgiler, durumlar, olaylar ve yetenekler koleksiyonlarını içerir.

sınıflar

FrontendSettings , aşağıdaki sınıflar tarafından farklı DTV standartları için türetilmiştir.

  • AnalogFrontendSettings
  • Atsc3FrontendSettings
  • AtscFrontendSettings
  • DvbcFrontendSettings
  • DvbsFrontendSettings
  • DvbtFrontendSettings
  • Isdbs3FrontendSettings
  • IsdbsFrontendSettings
  • IsdbtFrontendSettings

Tuner HAL 1.1 veya üstü ile Android 12'den itibaren aşağıdaki DTV standardı desteklenir.

  • DtmbFrontendSettings

FrontendCapabilities , aşağıdaki sınıflar tarafından farklı DTV standartları için türetilmiştir.

  • AnalogFrontendCapabilities
  • Atsc3FrontendCapabilities
  • AtscFrontendCapabilities
  • DvbcFrontendCapabilities
  • DvbsFrontendCapabilities
  • DvbtFrontendCapabilities
  • Isdbs3FrontendCapabilities
  • IsdbsFrontendCapabilities
  • IsdbtFrontendCapabilities

Tuner HAL 1.1 veya üstü ile Android 12'den itibaren aşağıdaki DTV standardı desteklenir.

  • DtmbFrontendCapabilities

FrontendInfo , ön uç bilgilerini alır. FrontendStatus , ön ucun geçerli durumunu alır. OnTuneEventListener , ön uçtaki olayları dinler. TIS uygulaması, ön uçtan gelen tarama mesajlarını işlemek için ScanCallback kullanır.

kanal taraması

Bir TV kurmak için uygulama, olası frekansları tarar ve kullanıcıların erişmesi için bir kanal dizisi oluşturur. TIS, kanal taramayı tamamlamak için Tuner.tune , Tuner.scan(BLIND_SCAN) veya Tuner.scan(AUTO_SCAN) kullanabilir.

TIS, frekans, standart (örneğin, T/T2, S/S2) ve ek gerekli bilgiler (örneğin, PLD ID) gibi sinyal için doğru teslimat bilgilerine sahipse, daha hızlı seçenek olarak Tuner.tune önerilir. .

Kullanıcı Tuner.tune aradığında aşağıdaki eylemler gerçekleşir:

  • TIS, Tuner.tune kullanarak FrontendSettings gerekli bilgilerle doldurur.
  • HAL, sinyal kilitliyse, LOCKED mesajların ayarlanacağını bildirir.
  • TIS, gerekli bilgileri toplamak için Frontend.getStatus kullanır.
  • TIS, frekans listesinde bir sonraki uygun frekansa geçer.

TIS, tüm frekanslar tükenene kadar Tuner.tune tekrar çağırır.

Ayarlama sırasında, Tuner.tune aramasını duraklatmak veya sonlandırmak için Tuner.tune stopTune() veya close() öğesini çağırabilirsiniz.

Tuner.scan(AUTO_SCAN)

TIS, Tuner.tune kullanmak için yeterli bilgiye sahip değilse, ancak bir frekans listesine ve standart tipe (örneğin, DVB T/C/S) sahipse, Tuner.scan(AUTO_SCAN) önerilir.

Kullanıcı Tuner.scan(AUTO_SCAN) , aşağıdaki eylemler gerçekleşir:

  • TIS, frekansla doldurulmuş FrontendSettings ile Tuner.scan(AUTO_SCAN) kullanır.

  • HAL, sinyal kilitliyse, LOCKED mesajları taradığını bildirir. HAL, sinyal hakkında ek bilgi sağlamak için diğer tarama mesajlarını da rapor edebilir.

  • TIS, gerekli bilgileri toplamak için Frontend.getStatus kullanır.

  • TIS, HAL'ın aynı frekansta bir sonraki ayara devam etmesi için Tuner.scan çağırır. FrontendSettings yapısı boşsa, HAL sonraki kullanılabilir ayarı kullanır. Aksi takdirde, HAL bir kerelik tarama için FrontendSettings kullanır ve tarama işleminin bittiğini belirtmek için END gönderir.

  • TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar.

  • HAL, tarama işleminin bittiğini belirtmek için END gönderir.

  • TIS, frekans listesinde bir sonraki uygun frekansa geçer.

TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN) tekrar çağırır.

Tarama sırasında, taramayı duraklatmak veya sonlandırmak için stopScan() veya close() öğesini çağırabilirsiniz.

Tuner.scan(BLIND_SCAN)

TIS'in bir frekans listesi yoksa ve Satıcı HAL, ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun frekansını arayabilirse, Tuner.scan(BLIND_SCAN) önerilir.

  • TIS, Tuner.scan(BLIND_SCAN) kullanır. Başlangıç ​​frekansı için FrontendSettings içinde bir frekans belirtilebilir, ancak TIS FrontendSettings içindeki diğer ayarları yok sayar.
  • HAL, sinyal kilitliyse bir tarama LOCKED mesajı bildirir.
  • TIS, gerekli bilgileri toplamak için Frontend.getStatus kullanır.
  • TIS, taramaya devam etmek için Tuner.scan tekrar çağırır. ( FrontendSettings yoksayılır.)
  • TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar. HAL, TIS'den herhangi bir işlem gerektirmeden frekansı artırır. HAL PROGRESS bildirir.

TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN) tekrar çağırır. HAL, tarama işleminin bittiğini belirtmek için END bildirir.

Tarama sırasında, taramayı duraklatmak veya sonlandırmak için stopScan() veya close() öğesini çağırabilirsiniz.

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

Şekil 9. Bir TIS taramasının akış şeması

Android.media.tv.tuner.filtre

Filtre paketi, yapılandırma, ayarlar, geri aramalar ve olaylarla birlikte bir filtre işlemleri koleksiyonudur. Paket aşağıdaki işlemleri içerir. İşlemlerin tam listesi için Android kaynak koduna bakın.

  • configure()
  • start()
  • stop()
  • flush()
  • read()

Tam liste için Android kaynak koduna bakın.

FilterConfiguration , aşağıdaki sınıflardan türetilmiştir. Konfigürasyonlar ana filtre tipi içindir ve filtrenin verileri çıkarmak için hangi protokolü kullandığını belirtirler.

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

Ayarlar aşağıdaki sınıflardan türetilmiştir. Ayarlar, filtre alt türü içindir ve filtrenin ne tür verileri hariç tutabileceğini belirtir.

  • SectionSettings
  • AvSettings
  • PesSettings
  • RecordSettings
  • DownloadSettings

FilterEvent , farklı veri türleri için olayları raporlamak için aşağıdaki sınıflardan türetilmiştir.

  • SectionEvent
  • MediaEvent
  • PesEvent
  • TsRecordEvent
  • MmtpRecordEvent
  • TemiEvent
  • DownloadEvent
  • IpPayloadEvent

Tuner HAL 1.1 veya sonraki sürümlere sahip Android 12'den itibaren aşağıdaki olaylar desteklenir.

  • IpCidChangeEvent
  • RestartEvent
  • ScramblingStatusEvent
Filtreden olaylar ve veri formatı
Filtre tipi Bayraklar Olaylar Veri işlemi Veri formatı
TS.SECTION
MMTP.SECTION
IP.SECTION
TLV.SECTION
ALP.SECTION
isRaw:
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'ın MQ'sundan istemci arabelleğine kopyalanır.
Birleştirilmiş bir oturum paketi, başka bir oturum paketi tarafından FMQ'ya 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'ın 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'ın MQ'sundan istemci arabelleğine kopyalanır.
Birleştirilmiş bir PES paketi, başka bir PES paketi tarafından FMQ'ya 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'ın 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'ın MQ'sundan istemci arabelleğine kopyalanır.
Birleştirilmiş bir MFU paketi, başka bir MFU paketi tarafından FMQ'ya 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'ın MQ'sundan istemci arabelleğine kopyalanır.
TS.TS
Yok Zorunlu:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

Tavsiye edilen:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
Etkinliğe ve dahili programa göre, çalıştırın
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez.

Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır.
ts başlığı ile filtrelenmiş ts
FMQ'da doldurulur.
TS.Audio
TS.Video
MMTP.Audio
MMTP.Video
isPassthrough:
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 Filter.flush 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 belleğinde ES veya kısmi ES verileri.
TS.PCR
IP.NTP
ALP.PTP
Yok Zorunlu: Yok
İsteğe bağlı: Yok
Yok Yok
TS.RECORD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterTsRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
Dizin verileri için:
for i=0; i<n; i++
DemuxFilterTsRecordEvent[i];


Kayıtlı içerik için , RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • DvrRecord.write(adustedSize) depolama için bir veya birkaç kez çalıştırın.
    Veriler, HAL'ın MQ'sundan depolamaya aktarılır.
  • DvrRecord.write(buffer, adustedSize) bir veya daha fazla kez çalıştırın.
    Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır.
Dizin verileri için: Olay yükünde taşınır.

Kaydedilen içerik için: FMQ ile doldurulmuş Muxed TS akışı.
TS.TEMI Yok Zorunlu:
DemuxFilterEvent::DemuxFilterTemiEvent[n]

İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
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'ın MQ'sundan istemci arabelleğine kopyalanır.
mmtp başlığıyla filtrelenmiş mmtp
FMQ'da doldurulur.
MMTP.RECORD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
İndeks verileri for i=0; i<n; i++
DemuxFilterMmtpRecordEvent[i];


Kayıtlı içerik için , RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • DvrRecord.write(adjustedSize) depolama için bir veya daha fazla kez çalıştırın.
    Veriler, HAL'ın MQ'sundan depolamaya aktarılır.
  • DvrRecord.write(buffer, adjustedSize) bir veya daha fazla kez çalıştırın.
    Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır.
Dizin verileri için: Olay yükünde taşınır.

Kayıtlı içerik için: FMQ ile doldurulmuş Muxed kayıtlı akış.

Kayıt için filtre kaynağı TLV.TLV IP.IP ise, kaydedilen akışın bir TLV ve IP başlığı vardır.
MMTP.DOWNLOAD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterDownloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

İsteğe bağlı:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterDownloadEvent[i].size)

Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır.
İndirme paketi, başka bir IP indirme paketi tarafından FMQ'da doldurulur.
IP.IP_PAYLOAD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

İsteğe bağlı:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size)

Veriler, HAL'ın MQ'sundan istemci arabelleğine kopyalanır.
IP payload paketi, başka bir IP payload paketi tarafından FMQ'ya doldurulur.
IP.IP
TLV.TLV
ALP.ALP
isPassthrough:
true
İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
Filtrelenmiş protokol alt akışı, filtre zincirindeki 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'ın MQ'sundan istemci arabelleğine kopyalanır.
Protokol başlığına sahip filtrelenmiş protokol alt akışı FMQ'da doldurulur.
IP.PAYLOAD_THROUGH
TLV.PAYLOAD_THROUGH
ALP.PAYLOAD_THROUGH
Yok İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
Filtrelenmiş protokol yükü, filtre zincirindeki bir sonraki filtreyi besler. Yok
PSI/SI oluşturmak için filtre kullanmak için örnek akış

PSI/SI oluşturmak için filtre kullanmak için örnek akış.

Şekil 10. PSI/SI oluşturmak için 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); }
          }
        }
    };
    
Filtreden MediaEvent kullanmak için örnek akış

Filtreden MediaEvent kullanmak için örnek akış.

Şekil 11. Filtreden MediaEvent kullanmak için akış

  1. A/V filtrelerini açın, yapılandırın ve başlatın.
  2. MediaEvent işleyin.
  3. MediaEvent alın.
  4. Doğrusal bloğu codec 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 bildirmek için kullanılır.

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

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

Şekil 12. Bir kaydı başlatmak için 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 arabirimi tanımlar. Satıcılar, Tuner HAL'ı uygulamak için arabirimi kullanır ve çerçeve, Tuner HAL uygulamasıyla iletişim kurmak için bunu kullanır.

Modüller

Ayarlayıcı HAL 1.0

Modüller Temel kontroller Modüle özel kontroller HAL dosyaları
ITuner Yok frontend(open, getIds, getInfo) , openDemux , openDescrambler , openLnb , getDemuxCaps ITuner.hal
IFrontend setCallback , getStatus , close tune , stopTune , scan , stopScan , setLnb IFrontend.hal
IFrontendCallback.hal
IDemux close setFrontendDataSource , openFilter , openDvr , getAvSyncHwId , getAvSyncTime , connect / disconnectCiCam kesCiCam IDemux.hal
IDvr close , start , stop , configure attach/detachFilters , getQueueDesc , flush IDvr.hal
IDvrCallback.hal
IFilter close , start , stop , configure , getId flush , getQueueDesc , releaseAvHandle , setDataSource IFilter.hal
IFilterCallback.hal
ILnb close , setCallback setVoltage , setTone , setSatellitePosition , sendDiseqcMessage ILnb.hal
ILnbCallback.hal
IDescrambler close setDemuxSource , setKeyToken , addPid , removePid IDescrambler.hal

Tuner HAL 1.1 (Tuner HAL 1.0'dan türetilmiştir)

Modüller Temel kontroller Modüle özel kontroller HAL dosyaları
ITuner Yok getFrontendDtmbCapabilities @1.1::ITuner.hal
IFrontend tune_1_1 , scan_1_1 , getStatusExt1_1 link/unlinkCiCam @1.1::IFrontend.hal
@1.1::IFrontendCallback.hal
IFilter getStatusExt1_1 configureIpCid , configureAvStreamType , getAvSharedHandle , configureMonitorEvent @1.1::IFilter.hal
@1.1::IFilterCallback.hal

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

Şekil 13. Tuner HAL modülleri arasındaki etkileşimlerin şeması

Filtre bağlantısı

Tuner HAL, filtrelerin birden çok katman için diğer filtrelere bağlanabileceği şekilde filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uyar.

  • Filtreler bir ağaç olarak bağlanır, yolu kapatmaya izin verilmez.
  • Kök düğüm demux'dur.
  • Filtreler bağımsız olarak çalışır.
  • Tüm filtreler veri almaya başlar.
  • Filtre bağlantısı son filtrede yıkanır.

Aşağıdaki kod bloğu ve Şekil 14, birden çok katmanı filtrelemenin bir örneğini göstermektedir.

demuxCaps = ITuner.getDemuxCap;
If (demuxCaps[IP][MMTP] == true) {
        ipFilter = ITuner.openFilter(<IP, ..>)
        mmtpFilter1 = ITuner.openFilter(<MMTP ..>)
        mmtpFilter2 = ITuner.openFilter(<MMTP ..>)
        mmtpFilter1.setDataSource(<ipFilter>)
        mmtpFilter2.setDataSource(<ipFilter>)
}

Filtre bağlantı örneği diyagramı.

Şekil 14. Birden çok katman için bir filtre bağlantısının akış şeması

Ayarlayıcı Kaynak Yöneticisi

Tuner Resource Manager'dan (TRM) önce, iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Girdi Çerçevesi (TIF), "ilk elde eden kazanma" mekanizmasını kullandı; bu, kaynağı ilk alan uygulama kaynağı koruduğu anlamına gelir. Ancak bu mekanizma bazı karmaşık kullanım durumları için ideal olmayabilir.

TRM, uygulamalar için Tuner, TVInput ve CAS donanım kaynaklarını yönetmek için bir sistem hizmeti olarak çalışır. TRM, uygulamanın ön plan veya arka plan durumuna göre uygulamanın önceliğini hesaplayan ve vaka tipini kullanan bir "ön planda kazanma" mekanizması kullanır. TRM, önceliğe göre kaynağı verir veya iptal eder. TRM, yayın, OTT ve DVR için ATV kaynak yönetimini merkezileştirir.

TRM arayüzü

TRM, kaynakları kaydetmek, istemek veya serbest bırakmak için Tuner çerçevesi, MediaCas ve ITunerResourceManager.aidl için TvInputHardwareManager AIDL arayüzlerini sunar.

İstemci yönetimi için arayüzler aşağıda listelenmiştir.

  • registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
  • unregisterClientProfile(in int clientId)

Kaynakları istemek ve serbest bırakmak için arayüzler aşağıda listelenmiştir.

  • requestFrontend(TunerFrontendRequest request, int[] frontendHandle) / releaseFrontend
  • requestDemux(TunerDemuxRequest request, int[] demuxHandle) / releaseDemux
  • requestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle) / releaseDescrambler
  • requestCasSession(CasSessionRequest request, int[] casSessionHandle) / releaseCasSession
  • requestLnb(TunerLnbRequest request, int[] lnbHandle) / releaseLnb

İstemci ve istek sınıfları aşağıda listelenmiştir.

  • ResourceClientProfile
  • ResourcesReclaimListener
  • TunerFrontendRequest
  • TunerDemuxRequest
  • TunerDescramblerRequest
  • CasSessionRequest
  • TunerLnbRequest

Müşteri önceliği

TRM, istemcinin profilindeki parametreleri ve yapılandırma dosyasındaki öncelik değerini kullanarak istemcinin önceliğini hesaplar. Öncelik, istemciden gelen rastgele bir öncelik değeriyle de güncellenebilir.

Müşterinin profilindeki parametreler

TRM, bir uygulamanın ön plan mı yoksa arka plan uygulaması mı olduğuna karar vermek için işlem kimliğini mTvInputSessionId alır. mTvInputSessionId , TvInputService.onCreateSession veya TvInputService.onCreateRecordingSession oluşturmak için bir TIS oturumu başlatır.

mUseCase , oturumun kullanım durumunu gösterir. Önceden tanımlanmış kullanım durumları aşağıda listelenmiştir.

TvInputService.PriorityHintUseCaseType  {
  PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK
  PRIORITY_HINT_USE_CASE_TYPE_LIVE
  PRIORITY_HINT_USE_CASE_TYPE_RECORD,
  PRIORITY_HINT_USE_CASE_TYPE_SCAN,
  PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND
}

Yapılandırma dosyası

Varsayılan yapılandırma dosyası

Aşağıdaki varsayılan yapılandırma dosyası, önceden tanımlanmış kullanım durumları için öncelik değerleri sağlar. Kullanıcılar, özelleştirilmiş bir yapılandırma dosyası kullanarak değerleri değiştirebilir.

kullanım durumu ön plan Arka plan
LIVE 490 400
PLAYBACK 480 300
RECORD 600 500
SCAN 450 200
BACKGROUND 180 100
Özelleştirilmiş yapılandırma dosyası

Satıcılar, /vendor/etc/tunerResourceManagerUseCaseConfig.xml yapılandırma dosyasını özelleştirebilir. Bu dosya, kullanım durumu türlerini ve kullanım durumu öncelik değerlerini eklemek, kaldırmak veya güncellemek için kullanılır. Özelleştirilmiş dosya, şablon olarak platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml .

Örneğin, yeni bir satıcı kullanım örneği VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000] . Biçim, platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd .

Keyfi öncelik değeri ve nice değeri

TRM, istemcinin isteğe bağlı öncelik değerini ve Nice değerini güncellemesi için updateClientPriority sağlar. Rastgele öncelik değeri, kullanım durumu türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazar.

Nice değeri, müşterinin davranışının başka bir müşteriyle çeliştiğinde ne kadar yumuşak olduğunu gösterir. Nice değeri, müşterinin öncelik değerini, zorlu müşteriyle karşılaştırılmadan önce azaltır.

geri alma mekanizması

Aşağıdaki şema, bir kaynak çakışması meydana geldiğinde kaynakların nasıl geri alındığını ve atandığını gösterir.

Geri alma mekanizması sürecinin şeması.

Şekil 15. Ayarlayıcı kaynakları arasındaki bir çakışma için geri alma mekanizmasının şeması