Tarayıcı çerçevesi

Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Tedarikçi firmaların donanım ardışık düzenini kullanan çerçeve, hem düşük hem de üst segment SoC için uygundur. Çerçeve, güvenilir yürütme ortamı (TEE) ve güvenli medya yolu (SMP) tarafından korunan A/V içeriğini sunmak için güvenli bir yöntem sunarak son derece kısıtlı, içerik koruma ortamında kullanılabilmesini sağlar.

Tuner ve Android CAS arasındaki standart arayüz, Tuner tedarikçileri ile CAS tedarikçileri arasında daha hızlı entegrasyon sağlar. Tuner arayüzü, Android TV için tek küresel bir çözüm geliştirmek üzere MediaCodec ve AudioTrack ile çalışır. Tarayıcı arayüzü, başlıca yayın standartlarına dayalı olarak hem dijital TV'yi hem de analog TV'yi destekler.

Bileşenler

Android 11'de üç bileşen özel olarak TV platformu için tasarlanmıştır.

  • Tuner HAL: Çerçeve ve tedarikçiler arasında bir arayüz
  • Tuner SDK API: Çerçeve ile uygulamalar arasındaki 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 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ç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 sonraki sürümleri içeren 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 aktarma 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
  • Yerel kaydı güvence altına alma
  • Güvenli yerel oynatma

Tarayıcı API'leri aşağıdaki kullanım alanlarını destekler.

  • Dijital izler
  • Canlı
  • Oynatma
  • Kaydet

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

  • Bellek arabelleğinin temizlendiği 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çi firmanın donanımı arasında tanımlanır.

  • Çerçevenin tedarikçi firmadan ne beklediğini ve tedarikçi firmanın bunu nasıl yapabileceğini açıklar.
  • IFrontend, IDemux, IDescrambler, IFilter, IDvr ve ILnb arayüzleri aracılığıyla ön uç, demux ve şifre çözücü işlevlerini çerçeveye aktarır.
  • Tuner HAL'yi MediaCodec ve AudioTrack gibi diğer çerçeve bileşenleriyle entegre etme işlevlerini içerir.

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'e erişmesine olanak tanır.
  • Yerel sınıf, Tuner HAL ile büyük miktarda kayıt veya oynatma verisinin 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.

TRM sınıfı oluşturulur.

  • Ön uç, LNB, CAS oturumları ve TV giriş HAL'inden TV giriş cihazı gibi sınırlı tuner kaynaklarını yönetir.
  • Uygulamalardaki yetersiz kaynakları geri kazanmak için kurallar uygular. Varsayılan kural, ön planın kazanmasıdır.

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ği alır.
  • Tünelli oynatmada donanım A/V senkronizasyonu yapmak üzere 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 şemalar, canlı yayın oynatma için çağrı sıralarını göstermektedir.

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 için A/V işleme şeması.

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

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

Canlı yayın oynatma için kodlanmış içeriği işleme şeması.

Şekil 5. Canlı yayın oynatma için kodlanmış içeriği işleme

A/V verileri işleniyor

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

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

Tuner SDK API'si

Tuner SDK API'si, 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

Tuner SDK API, Android 12'den itibaren Tuner HAL 1.1'deki yeni özelliği destekler. Bu özellik, Tuner 1.0'ın geriye dönük uyumlu yeni bir 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()

Gerekli minimum HAL sürümü, yeni Android 12 API'lerinin dokümanlarında 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 kullanmaya yönelik bir giriş noktasıdır. TIS uygulaması, başlangıç ayarını ve geri çağırmayı 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ğı edinir ve FrontendSetting parametresini belirterek ayarlama yapar.
  • openFilter(): Filtre türünü belirterek bir filtre örneği alır.
  • openDvrRecorder(): Arabellek boyutunu belirterek bir kayıt örneği edinir.
  • openDvrPlayback(): Arabellek boyutunu belirterek bir oynatma örneği edinir.
  • openDescrambler(): Bir şifre çözücü örneği edinir.
  • openLnb(): Dahili bir LNB örneği alır.
  • openLnbByName(): Harici bir LNB örneği alır.
  • openTimeFilter(): Zaman filtresi örneği edinir.

Tuner paketi, filtre, DVR ve ön uç paketleri kapsamında bulunmayan 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

Kullanıcı arayüzü paketi, kullanıcı arayüzüyle ilgili ayar, bilgi, durum, etkinlik ve özellik koleksiyonlarını 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, aşağıdaki sınıflara göre farklı DTV standartları için türetilir.

  • 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, kullanıcı arayüzündeki etkinlikleri dinler. TIS uygulaması, ön uçtan gelen tarama mesajlarını işlemek için ScanCallback kullanır.

Kanal taraması

TV kurulumu için uygulama olası frekansları tarar ve kullanıcıların erişebileceği bir kanal listesi oluşturur. TIS, kanal tarama işlemini tamamlamak için Tuner.tune, Tuner.scan(BLIND_SCAN) veya Tuner.scan(AUTO_SCAN) kullanabilir.

TIS; sıklık, standart (örneğin, T/T2, S/S2) ve gerekli ek bilgiler (örneğin, PLD kimliği) gibi sinyal için doğru iletim bilgilerine sahipse 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 sonraki kullanılabilir frekansa geçer.

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

Ayarlama sırasında, Tuner.tune görüşmesini duraklatmak veya sonlandırmak için stopTune() ya da close() çağırabilirsiniz.

Tuner.scan(OTO_SCAN)

TIS, Tuner.tune özelliğini kullanmak için yeterli bilgiye sahip değilse ancak bir sıklık listesine ve standart türe (ör. DVB T/C/S) sahipse 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, sıklık değeriyle doldurulmuş FrontendSettings ile Tuner.scan(AUTO_SCAN) kullanır.

  • HAL raporları, sinyal kilitliyse LOCKED mesajları tarar. HAL, sinyal hakkında ek bilgi sağlamak için diğer tarama mesajlarını da bildirebilir.

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

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

  • TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrar eder.

  • HAL, tarama işleminin tamamlandığını belirtmek için END gönderir.

  • TIS, sıklık listesinde sonraki kullanılabilir frekansa 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() tuşlarına basarak taramayı duraklatabilir ya da sonlandırabilirsiniz.

Tuner.scan(BLIND_SCAN)

TIS'de sıklık listesi yoksa ve tedarikçi HAL'si ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun sıklığını arayabiliyorsa Tuner.scan(BLIND_SCAN) önerilir.

  • TIS, Tuner.scan(BLIND_SCAN) kullanır. Başlangıç sıklığı için FrontendSettings içinde bir sıklık belirtilebilir ancak TIS, FrontendSettings içindeki diğer ayarları yoksayar.
  • 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 yoksayılır.)
  • TIS, frekanstaki tüm ayarlar bitene kadar yukarıdaki işlemleri tekrar eder. 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 sürecinin akış şeması.

9. Şekil. TIS taramasının akış diyagramı

Android.media.tv.tuner.filter

Filtre paketi, yapılandırma, ayarlar, geri çağırma ve etkinliklerin yanı sıra filtre işlemlerinin bir 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üretilir. Yapılandırmalar, ana filtre türü içindir ve filtrenin verileri ayıklamak için kullandığı protokolü belirtir.

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

Ayarlar aşağıdaki sınıflardan türetilir. Bu 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ürleriyle ilgili etkinlikleri bildirmek için aşağıdaki sınıflardan türetilir.

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

Tuner HAL 1.1 veya sonraki sürümlerin bulunduğu Android 12'den itibaren 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
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Bir araya getirilmiş bir oturum paketi, FMQ'de başka bir oturum paketiyle 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'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
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Hazırlanan bir PES paketi başka bir PES paketi tarafından FMQ ile 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'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
Filter.read(buffer, offset, adjustedSize) bir veya daha fazla kez çalıştırın.

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Birleştirilmiş MFU paketi, FMQ'yu 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'nin MQ'sinden istemci arabelleğine kopyalanır.
TS.TS
Yok Zorunlu:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Filtrelenmiş ts ve ts başlığı
FMQ ile doldurulmuş.
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 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'ü kullanmak için:
for i=0; i<n; i++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()


AudioTrack'ın Doğrudan İşitsel reklamını 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 şirket içi programa göre aşağıdakilerden birini yapın:
  • Depolama alanında DvrRecord.write(adustedSize) bir veya daha fazla kez çalıştırın.
    Veriler, HAL'nin MQ'sından depolama alanına aktarılır.
  • Arabelleğe almak için DvrRecord.write(buffer, adustedSize) öğesini bir veya daha fazla kez çalıştırın.
    Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır.
Dizin verileri için: Etkinlik yükünde taşınır.

Kaydedilen içerik için: FMQ'de doldurulmuş birleştirilmiş 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

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

Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır.
mmtp üstbilgisi olan mmtp filtrelendi
FMQ'de 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 şirket içi programa göre aşağıdakilerden birini yapın:
  • Depolama alanına DvrRecord.write(adjustedSize) öğesini bir veya daha fazla kez çalıştırın.
    Veriler, HAL'nin MQ'sından depolama alanına aktarılır.
  • Arabelleğe almak için DvrRecord.write(buffer, adjustedSize)bir veya daha fazla kez çalıştırın.
    Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır.
Dizin verileri için: Etkinlik yükünde taşınır.

Kaydedilen içerikler için: FMQ ile doldurulmuş, karıştırılmış kaydedilmiş akış.

Kayıt için filtre kaynağı, geçişli TLV.TLV ile IP.IP ise kaydedilen akışta TLV ve IP üstbilgisi bulunur.
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&#39;de 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'ın 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ışı, filtre zincirindeki bir sonraki filtreyi besler. Yok
isPassthrough:
false
Zorunlu:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

Veriler HAL'ın MQ'sinden istemci arabelleğine kopyalanır.
Protokol başlığıyla filtrelenen 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 filtreye beslenir. 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şlenecek.
  3. MediaEvent al.
  4. Doğrusal bloğu codec'e 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 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 öğelerini yapılandırmak için kullanılır. OnPlaybackStatusChangedListener ve OnRecordStatusChangedListener, bir DVR örneğinin durumunu bildirmek için 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'ü 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 aldıktan sonra 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 donanımı arasındaki arayüzü tanımlar. Tedarikçi firmalar, Tuner HAL'i uygulamak için arayüzü kullanır ve çerçeve, Tuner HAL uygulamasıyla iletişim kurmak için bu arayüzü kullanır.

Modüller

Tuner 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, stopScan, setLnb 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şimlerin şeması

Bağlantıyı filtreleme

Tuner HAL, filtrelerin birden fazla katman için diğer filtrelere bağlanabilmesini sağlayacak şekilde filtre bağlantısını destekler. 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ğunda ve Şekil 14'te birden çok katmanı filtrelemeye ilişkin bir örnek gösterilmektedir.

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ği ş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 aynı Tuner donanımını gerektiriyordu. TV Giriş Çerçevesi (TIF), "ilk edinen kazan" mekanizmasını kullanır. Yani kaynağı ilk elde eden uygulama, kaynağı ilk elden tutan uygulamadır. Ancak bu mekanizma, bazı karmaşık kullanım alanları için ideal olmayabilir.

TRM, uygulamalar için tuner, TVInput ve CAS donanım kaynaklarını yönetmek üzere sistem hizmeti olarak çalışır. TRM, uygulamanın önceliğini uygulamanın ön plan veya arka plan durumuna ve kullanım alanı türüne göre hesaplayan 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 yayınlamak amacıyla Tuner çerçevesi için MediaCas ve TvInputHardwareManager için ITunerResourceManager.aidl içinde 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)

Kaynak isteğinde bulunma ve kaynak 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 profilindeki parametreleri ve yapılandırma dosyasındaki öncelik değerini kullanarak istemcinin önceliğini hesaplar. Öncelik, istemciden rastgele bir öncelik değeriyle de güncellenebilir.

Müşterinin profilindeki parametreler

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

mUseCase, oturumun kullanım alanını gösterir. Önceden tanımlanmış kullanım alanları 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 alanları 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 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ım alanı türlerini ve kullanım alanı ö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, 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'e uygun olmalıdır.

İsteğe bağlı öncelik değeri ve güzel değer

TRM, istemcinin keyfi öncelik değerini ve güzel değeri güncellemesi için updateClientPriority sağlar. İsteğe bağlı öncelik değeri, kullanım alanı türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazılır.

Nitelik değeri, müşterinin başka bir müşteriyle çeliştiği zaman davranışının ne kadar esnek olduğunu gösterir. Güzel değeri, öncelik değeri zorlayıcı müşteriye kıyasla öncelik değerini düşürür.

Geri alma mekanizması

Aşağıdaki şemada, kaynak çakışması gerçekleştiğinde kaynakların nasıl geri kazanıldığı ve atandığı gösterilmektedir.

Hak talebi mekanizması sürecinin şeması.

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