Tuner çerçevesi

Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Bu çerçeve, satıcılardan alınan donanım işlem hattını kullandığı için hem düşük hem de yüksek seviye SoC'ler için uygundur. Çerçeve, güvenilir yürütme ortamı (TEE) ve güvenli medya yolu (SMP) ile korunan A/V içeriklerini güvenli bir şekilde sunar. Bu sayede, son derece kısıtlanmış bir içerik koruma ortamında kullanılabilir.

Tuner ile Android CAS arasındaki standartlaştırılmış 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 bir dünya çözümü oluşturmak üzere MediaCodec ve AudioTrack ile birlikte çalışır. Tuner arayüzü, büyük yayın standartlarına göre hem dijital TV'yi hem de analog TV'yi destekler.

Bileşenler

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

  • Tuner HAL: Çerçeve ve satıcılar arasındaki arayüz
  • Tuner SDK API'si: Çerçeve ile uygulamalar arasındaki arayüz
  • Tuner Resource Manager (TRM): Tuner donanım 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 kaynak yöneticisi (MRM)

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

1. şekil. 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

Android 12'deki Tuner HAL 1.1 veya sonraki sürümlerle birlikte ö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ğeri (TLV)
  • ATSC bağlantı katmanı protokolü (ALP)

Descrambler, aşağıdaki içerik koruma yöntemlerini destekler.

  • Güvenli medya yolu
  • Medya yolunu temizleme
  • Yerel kaydı güvenli hale getirme
  • Güvenli yerel oynatma

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

  • Dijital izler
  • Live
  • Oynatma
  • Kaydet

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

  • Bellek arabelleği temizlenmiş ES yükü
  • Güvenli bellek tutma yeri içeren ES yükü
  • Gerçek görüntü

Genel tasarım

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

  • Çerçevenin tedarikçiden beklentilerini ve tedarikçinin bunları nasıl karşılayabileceğini açıklar.
  • Ön uç, demux ve şifre çözücü işlevlerini IFrontend, IDemux, IDescrambler, IFilter, IDvr ve ILnb arayüzleri aracılığıyla çerçeveye aktarır.
  • Tuner HAL'ı MediaCodec ve AudioTrack gibi diğer çerçeve bileşenleriyle entegre etme işlevlerini içerir.

Bir 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 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.
  • Native Tuner modülü, Tuner Java sınıfı ile Tuner HAL'ı arasında bir köprüdür.

TRM sınıfı oluşturulur.

  • Frontend, LNB, CAS oturumları ve TV giriş HAL'sinden bir TV giriş cihazı gibi sınırlı Tuner kaynaklarını yönetir.
  • Uygulamalardan yetersiz kaynakları geri almak için kurallar uygular. Varsayılan kural, ön 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'ın çıkarılması ve takılması gibi dinamik CAS sistemlerini destekler.
  • Önemli jetonlar sağlayarak Tuner HAL ile entegre olur.

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

  • İçerik girişi olarak güvenli A/V belleği alır.
  • Tünellenmiş oynatmada donanım A/V senkronizasyonu yapacak şekilde yapılandırılmış olmalıdır.
  • ES_payload ve geçiş modu için destek yapılandırıldı.

Tuner HAL'nin genel tasarımı.

Şekil 2. Tuner HAL'deki bileşenlerin şeması

Genel iş akışı

Aşağıdaki şemalarda, canlı yayın oynatma için arama sıraları gösterilmektedir.

Kurulum

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

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

Ses ve video ekipmanlarının kullanımı

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

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

Karıştırılmış içeriği ele alma

Canlı yayın oynatma için karıştırılmış içeriği işleme diyagramı.

5.şekil Canlı yayın oynatımı için karıştırılmış içeriği işleme

Ses ve video verilerini işleme

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

6.şekil Canlı yayın oynatımı için A/V işleme

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 ile karıştırma çö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'si ile etkileşimler

Sürümler

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

Ç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ünü yeni Android 12 API'lerinin belgelerinde bulabilirsiniz.

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ı, ilk ayarı ve geri çağırmayı belirterek kaynak örneklerini başlatmak ve edinmek için paketi kullanır.

  • tuner(): useCase ve sessionId parametrelerini belirterek bir Tuner örneğini başlatır.
  • tune(): FrontendSetting parametresini belirterek bir ön uç kaynağı edinir ve ayarlama yapar.
  • openFilter(): Filtre türünü belirterek bir filtre örneği edinir.
  • openDvrRecorder(): Arabellek boyutu belirtilerek bir kayıt örneği alınır.
  • openDvrPlayback(): Arabellek boyutunu belirterek bir oynatma örneği edinir.
  • openDescrambler(): Bir karıştırıcı çözücü örneği edinir.
  • openLnb(): Dahili bir LNB örneği edinir.
  • openLnbByName(): Harici bir LNB örneği edinir.
  • openTimeFilter(): Bir zaman filtresi örneği edinir.

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
  • shareFrontendFromTuner
  • updateResourcePriority
  • setOnTuneEventListener
  • setResourceLostListener

Android.media.tv.tuner.frontend

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

Sınıflar

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

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

Android 12'den itibaren Tuner HAL 1.1 veya sonraki sürümlerde aşağıdaki DTV standardı desteklenir.

  • DtmbFrontendSettings

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

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

Android 12'den itibaren Tuner HAL 1.1 veya sonraki sürümlerde 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 gelen tarama mesajlarını işlemek için ScanCallback kullanır.

Kanal taraması

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

TIS'te sinyalle ilgili doğru yayın bilgileri (ör. frekans, standart (ör. T/T2, S/S2) ve gerekli ek bilgiler (ör. PLD kimliği)) varsa daha hızlı bir seçenek olarak Tuner.tune önerilir.

Kullanıcı Tuner.tune numarasını aradığında aşağıdaki işlemler gerçekleşir:

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

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

Ayarlama sırasında stopTune() veya close() diyerek Tuner.tune görüşmesini duraklatabilir ya da sonlandırabilirsiniz.

Tuner.scan(AUTO_SCAN)

TIS'in Tuner.tune kullanmak için yeterli bilgisi yoksa ancak bir frekans listesi ve standart türü (ör. DVB T/C/S) varsa Tuner.scan(AUTO_SCAN) önerilir.

Kullanıcı Tuner.scan(AUTO_SCAN) numarasını aradığında aşağıdaki işlemler gerçekleşir:

  • TIS, sıklıkla dolu FrontendSettings ile Tuner.scan(AUTO_SCAN) kullanır.

  • HAL, sinyal kilitliyse LOCKED mesajlarını 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 ayara geçmesi için Tuner.scan çağrısı yapar. FrontendSettings yapısı boşsa HAL, bir sonraki kullanılabilir 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 tükenene kadar yukarıdaki işlemleri tekrarlar.

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

  • TIS, frekans listesindeki bir sonraki kullanılabilir frekansa geçer.

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

Tarama sırasında stopScan() veya close() tuşlarına basarak taramayı duraklatabilir ya da sonlandırabilirsiniz.

Tuner.scan(BLIND_SCAN)

TIS'de bir frekans listesi yoksa ve Vendor HAL, ön uç kaynağını almak için kullanıcı tarafından belirtilen ön ucun frekansını arayabiliyorsa 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ı yoksayar.
  • Sinyal kilitliyse HAL, tarama LOCKED mesajı bildirir.
  • TIS, gerekli bilgileri toplamak için Frontend.getStatus kullanır.
  • TIS, taramaya devam etmek için Tuner.scan tekrar arar. (FrontendSettings yoksayılır.)
  • TIS, frekanstaki tüm ayarlar tükenene kadar yukarıdaki işlemleri tekrarlar. HAL, TIS'in herhangi bir işlem yapmasına gerek kalmadan frekansı artırır. HAL raporları PROGRESS.

Tüm frekanslar tükenene kadar TIS tekrar Tuner.scan(AUTO_SCAN) çağrılır. HAL, tarama işleminin tamamlandığını belirtmek için END raporunu verir.

Tarama sırasında stopScan() veya close()'ı arayarak taramayı duraklatabilir ya da sonlandırabilirsiniz.

TIS tarama sürecinin akış şeması.

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

Android.media.tv.tuner.filter

Filtre paketi, yapılandırma, ayarlar, geri çağırmalar ve etkinliklerle birlikte 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üretilmiştir. Yapılandırmalar, ana filtre türü içindir ve filtrenin veri ayıklamak için hangi protokolü kullandığını belirtir.

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

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

  • SectionSettings
  • AvSettings
  • PesSettings
  • RecordSettings
  • DownloadSettings

FilterEvent, farklı türlerdeki veriler için etkinlikleri bildirmek üzere aşağıdaki sınıflardan türetilir.

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

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

  • IpCidChangeEvent
  • RestartEvent
  • ScramblingStatusEvent
Filtreden gelen 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.
Filter.read(buffer, offset, adjustedSize)

Veriler, HAL'nin MQ'sundan istemci arabelleğine kopyalanır.
Birleştirilmiş bir oturum paketi, başka bir oturum paketi tarafından FMQ'da doldurulur.
isRaw:
false
Zorunlu:
DemuxFilterEvent::DemuxFilterSectionEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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


Veriler, HAL'in MQ'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 şirket içi programa göre bir veya daha fazla kez çalıştırın.
Filter.read(buffer, offset, adjustedSize)

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Birleştirilmiş 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'in 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.
Filter.read(buffer, offset, adjustedSize)

Veriler, HAL'nin MQ'sinden 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'nin MQ'sundan 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.
Filter.read(buffer, offset, adjustedSize)

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
ts başlığıyla ts filtrelendi
FMQ'da doldurulur.
TS.Audio
TS.Video
MMTP.Audio
MMTP.Video
isPassthrough:
true
İsteğe bağlı:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
İstemci, DemuxFilterStatus::DATA_READY aldıktan sonra MediaCodec başlatabilir.
İstemci, DemuxFilterStatus::DATA_OVERFLOW aldıktan sonra Filter.flush çağrısı yapabilir.
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 Ses'i 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çerikler için, RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • DvrRecord.write(adustedSize) komutunu bir veya daha fazla kez çalıştırarak depolama alanına kaydedin.
    Veriler, HAL'nin MQ'sundan depolama alanına aktarılır.
  • Arabelleğe almak için DvrRecord.write(buffer, adustedSize) bir veya daha fazla kez çalıştırın.
    Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Dizin verileri için: Etkinlik yükünde taşınır.

Kayıtlı içerik için: FMQ'da doldurulmuş çoklu 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 şirket içi programa göre bir veya daha fazla kez çalıştırın.
Filter.read(buffer, offset, adjustedSize)

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
mmtp başlığıyla mmtp filtrelendi
FMQ'da doldurulur.
MMTP.RECORD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

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


Kayıtlı içeriklerde, RecordStatus::* ve dahili programa göre aşağıdakilerden birini yapın:
  • DvrRecord.write(adjustedSize) öğesini depolama alanına bir veya daha fazla kez çalıştırın.
    Veriler, HAL'nin MQ'sundan 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'nin MQ'sinden istemci arabelleğine kopyalanır.
Dizin verileri için: Etkinlik yükünde taşınır.

Kayıtlı içerik için: FMQ'da doldurulmuş, çoklu formatlı kayıtlı 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'in MQ'sinden istemci arabelleğine kopyalanır.
İndirme paketi, başka bir IP indirme paketi tarafından FMQ'ya dolduruluyor.
IP.IP_PAYLOAD Yok Zorunlu:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

Veriler, HAL'in MQ'sinden istemci arabelleğine kopyalanır.
IP yükü paketi, FMQ'da başka bir IP yükü paketiyle 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 bir sonraki filtreyi besler. Yok
isPassthrough:
false
Zorunlu:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

Veriler, HAL'nin MQ'sinden istemci arabelleğine kopyalanır.
Protokol başlığı doldurulmuş protokol alt akışı FMQ ile filtrelenir.
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 kullanma örneği

Filtre kullanarak PSI/SI oluşturma ile ilgili örnek akış.

10.şekil KMSİ/DSİ 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. İş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 kullanma akışı örneği

Filtreden MediaEvent&#39;i kullanma örneği.

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

  1. A/V filtrelerini açın, yapılandırın ve başlatın.
  2. İşlem MediaEvent.
  3. MediaEvent alma
  4. Doğrusal blokları codec olarak sıraya alın.
  5. Veriler tüketildiğinde A/V tutma yerini serbest bırakın.

Android.media.tv.tuner.dvr

DvrRecorder, kayıt için aşağıdaki 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 öğelerini yapılandırmak için kullanılır. OnPlaybackStatusChangedListener ve OnRecordStatusChangedListener, DVR örneğinin durumunu bildirmek için kullanılır.

Kayıt başlatma akışı örneği

Kaydı başlatmak için örnek akış.

Şekil 12. Kayıt başlatma 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 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 öğesini 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);
          }
        }
      };
    

Tuner HAL

Tuner HAL, HIDL'yi takip eder ve çerçeve ile satıcı donanımı arasındaki arayüzü tanımlar. Tedarikçiler, Tuner HAL'ı 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&#39;in 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 fazla katman için diğer filtrelere bağlanabilmesi amacıyla filtre bağlantısını destekler. Filtreler aşağıdaki kurallara uyar.

  • Filtreler ağaç olarak bağlanır, kapalı yola izin verilmez.
  • Kök düğüm demux'tur.
  • Filtreler bağımsız olarak çalışır.
  • Tüm filtreler veri almaya başlar.
  • Filtre bağlantısı, son filtrede temizlenir.

Aşağıdaki kod bloğu ve Şekil 14, birden fazla katmanı filtreleme örneğini gösterir.

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ış şeması

Tuner Resource Manager

Tuner Resource Manager (TRM) öncesinde, iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Input Framework (TIF) "ilk gelen alır" mekanizmasını kullanır. Bu mekanizma, kaynağı ilk alan uygulamanın kaynağı tutacağı anlamına gelir. 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 bir sistem hizmeti olarak çalışır. TRM, uygulamanın ön plan veya arka plan durumuna ve kullanım alanı türüne göre uygulamanın önceliğini hesaplayan bir "ön plan kazanımı" mekanizması kullanır. TRM, kaynağı önceliğe göre 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çevesinde (ITunerResourceManager.aidl), MediaCas ve TvInputHardwareManager AIDL arayüzlerini kullanıma sunar.

Müşteri yönetimi için kullanılan arayüzler aşağıda listelenmiştir.

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

Kaynak 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

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 planda mı yoksa arka planda mı çalıştığına karar vermek için mTvInputSessionId'dan işlem kimliğini alır. mTvInputSessionId oluşturmak için TvInputService.onCreateSession veya TvInputService.onCreateRecordingSession, TIS oturumunu 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ında, önceden tanımlanmış kullanım alanları için öncelik değerleri sağlanmaktadır. Kullanıcılar, değerleri özelleştirilmiş bir yapılandırma dosyası kullanarak 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 kullanılabilir.

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

İsteğe bağlı öncelik değeri ve nice değeri

TRM, istemcinin rastgele öncelik değerini ve nice değerini güncellemesi için updateClientPriority sağlar. Rastgele öncelik değeri, kullanım alanı türü ve oturum kimliğinden hesaplanan öncelik değerinin üzerine yazar.

Nice değeri, istemcinin başka bir istemciyle çakıştığında ne kadar esnek davrandığını gösterir. Nice değeri, öncelik değeri zorlu istemciyle karşılaştırılmadan önce istemcinin öncelik değerini azaltır.

Geri isteme mekanizması

Aşağıdaki şemada, kaynak çakışması olduğunda kaynakların nasıl geri alındığı ve atandığı gösterilmektedir.

Geri alma mekanizması sürecinin diyagramı.

15.şekil Tuner kaynakları arasındaki çakışma için geri alma mekanizmasının şeması