Tuner çerçevesi

Android 11 veya sonraki sürümlerde A/V içeriği yayınlamak için Android Tuner çerçevesini kullanabilirsiniz. Çerçeve, tedarikçi firmaların donanım ardışık düzenini kullandığından hem düşük hem de yüksek kaliteli SoC'ler 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 yayınlamanın güvenli bir yolunu sunar. Bu sayede, yüksek düzeyde 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 amacıyla MediaCodec ve AudioTrack ile çalışır. Tuner arayüzü, önemli yayın standartlarına göre hem dijital TV'yi hem de analog TV'yi destekler.

Bileşenler

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

  • Tuner HAL: Çerçeve ile tedarikçiler arasındaki bir arayüz
  • Tuner SDK API: Çerçeve ile uygulamalar arasındaki bir arayüz
  • Tuner Kaynak Yöneticisi (TRM): Tuner donanım 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.

  • Aktarma akışı (TS)
  • MPEG medya aktarma protokolü (MMTP)
  • İnternet protokolü (IP)
  • Tür uzunluğu değeri (TLV)
  • ATSC bağlantı katmanı protokolü (ALP)

Şifre çözücü, aşağıdaki içerik korumalarını destekler.

  • Güvenli medya yolu
  • Medya yolunu temizleme
  • Yerel kaydı güvence altına alma
  • Yerel oynatma için güvenlik

Tuner 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 temiz olduğu ES yükü
  • Güvenli bellek tutamacıyla 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.
  • Ön uç, çoklu yayın ayırıcı ve kod çözücü işlevlerini IFrontend, IDemux, IDescrambler, IFilter, IDvr ve ILnb arayüzleri aracılığıyla çerçeveye aktarır.
  • Tuner HAL'i 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 izin kontrolüne ve büyük miktarlarda kayıt veya oynatma verisinin 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.
  • 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 kaldırma ve ekleme 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ünellenmiş oynatma sırasında donanım A/V senkronizasyonu yapacak şekilde yapılandırılmış.
  • ES_payload ve geçiş modu için yapılandırılmış destek.

Tuner HAL'in genel tasarımı.

Şekil 2. Tuner HAL'deki 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ı ayarlama

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

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

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

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

A/V verilerini işleme

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

Şekil 6. Canlı yayın oynatma için ses ve görüntü işleme

Tuner SDK API

Tuner SDK API'si, Tuner JNI, Tuner HAL ve TunerResourceManager ile etkileşimleri yönetir. TIS uygulaması, Tuner SDK API'sini kullanarak Tuner kaynaklarına ve filtre ile kod çözücü gibi alt bileşenlere erişir. Ö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

Tuner SDK API, Android 12'den itibaren Tuner 1.0'un 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 dokümanlarında 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 kullanmaya yönelik bir giriş noktasıdır. TIS uygulaması, ilk ayarı ve geri çağırma işlevini belirterek paketi kullanarak kaynak örneklerini başlatır ve edinir.

  • tuner(): useCase ve sessionId parametrelerini belirterek bir Tuner örneğini başlatır.
  • tune(): FrontendSetting parametresini belirterek bir ön uç kaynağı edinir ve ayar yapar.
  • openFilter(): Filtre türünü belirterek bir filtre örneği edinir.
  • openDvrRecorder(): Arabellek boyutunu belirterek bir kayıt örneği edinir.
  • openDvrPlayback(): Arabellek boyutunu belirterek bir oynatma örneği edinir.
  • openDescrambler(): Kod çözücü örneği edinir.
  • openLnb(): Dahili bir LNB örneği alır.
  • openLnbByName(): Harici bir LNB örneği edinir.
  • 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ümleri içeren 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üretilir.

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

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

  • DtmbFrontendCapabilities

FrontendInfo, kullanıcı arayüzünün bilgilerini alır. FrontendStatus, ön uç kullanıcı arayüzünün 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ı

Uygulama, TV'yi kurmak 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'de sinyal için 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ı seçenek olarak Tuner.tune önerilir.

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

  • TIS, Tuner.tune kullanarak FrontendSettings öğesini gerekli bilgilerle doldurur.
  • HAL, sinyal kilitliyse ayar LOCKED mesajlarını bildirir.
  • TIS, gerekli bilgileri toplamak için Frontend.getStatus'ü kullanır.
  • TIS, sıklık listesinde sonraki kullanılabilir frekansa geçer.

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

Ayarlama sırasında stopTune() veya close() tuşlarına basarak Tuner.tune aramayı duraklatabilir veya sonlandırabilirsiniz.

Tuner.scan(AUTO_SCAN)

TIS'de Tuner.tune kullanmak için yeterli bilgi 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ık değeriyle doldurulmuş FrontendSettings ile Tuner.scan(AUTO_SCAN) kullanır.

  • HAL, sinyal kilitliyse LOCKED mesajlarının tarandığını bildirir. 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 bir 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ükenene kadar Tuner.scan(AUTO_SCAN)'yi 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, kullanıcı tarafından belirtilen ön uç kaynağını almak için kullanıcı tarafından belirtilen ön uç kaynağının sıklık değerini arayabiliyorsa Tuner.scan(BLIND_SCAN) önerilir.

  • TIS, Tuner.scan(BLIND_SCAN) kullanır. Başlangıç sıklığı için FrontendSettings'te bir sıklık belirtilebilir ancak TIS, FrontendSettings'teki diğer ayarları yoksayar.
  • 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'yi tekrar çağırır. (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 değerini bildirir.

TIS, tüm frekanslar tükenene kadar Tuner.scan(AUTO_SCAN)'yi tekrar çağırır. HAL, tarama işleminin tamamlandığını belirtmek için END değerini bildirir.

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

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

Şekil 9. 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
Filtreden alınan 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'ın MQ'sinden istemci arabelleğine kopyalanır.
Bir araya getirilmiş 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'ın MQ'sinden istemci arabelleğine kopyalanır.
TS.PES isRaw:
true
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.
Bir araya getirilmiş bir PES paketi, FMQ'de başka bir PES paketiyle 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'sinden istemci arabelleğine kopyalanır.
MMTP.PES isRaw:
true
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.
Bir araya getirilmiş bir MFU paketi, FMQ'de başka bir MFU paketiyle 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'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'ın MQ'sinden istemci arabelleğine kopyalanır.
ts başlığıyla ts filtrelendi
FMQ'de 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'i 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: geçersiz
İsteğe bağlı: geçersiz
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];


Kaydedilen içerikler 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'ın MQ'sinden depolama alanına aktarılır.
  • Arabelleğe almak için DvrRecord.write(buffer, adustedSize) komutunu 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 başlığıyla 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)'yi bir veya daha fazla kez çalıştırın.
    Veriler, HAL'ın MQ'sinden 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'ın MQ'sinden istemci arabelleğine kopyalanır.
İndirme paketi, FMQ'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.
IP yükü paketi, FMQ'de 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 sonraki filtreye beslenir. 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'de 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 oluşturmak için filtre kullanmaya yönelik örnek akış

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

Şekil 10. KMSİ/SI oluşturma akışı

  1. Bir filtre açın.

    Filter filter = tuner.openFilter(
      Filter.TYPE_TS,
      Filter.SUBTYPE_SECTION,
      /* bufferSize */1000,
      executor,
      filterCallback
    );
    
  2. Filtreyi yapılandırın ve başlatın.

    Settings settings = SectionSettingsWithTableInfo
        .builder(Filter.TYPE_TS)
        .setTableId(2)
        .setVersion(1)
        .setCrcEnabled(true)
        .setRaw(false)
        .setRepeat(false)
        .build();
      FilterConfiguration config = TsFilterConfiguration
        .builder()
        .setTpid(10)
        .setSettings(settings)
        .build();
      filter.configure(config);
      filter.start();
    
  3. SectionEvent işlenecek.

    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'i kullanmaya yönelik örnek akış

Filtreden MediaEvent&#39;i kullanmaya yönelik örnek akış.

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

  1. A/V filtrelerini açın, yapılandırın ve başlatın.
  2. MediaEvent işlenecek.
  3. MediaEvent alın.
  4. Doğrusal bloğu codec'e alın.
  5. Veriler tüketildiğinde A/V işleyicisini 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şlatma örneği.

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

  1. DvrRecorder'ü açın, yapılandırın ve başlatın.

    DvrRecorder recorder = openDvrRecorder(/* bufferSize */ 1000, executor, listener);
    DvrSettings dvrSettings = DvrSettings
    .builder()
    .setDataFormat(DvrSettings.DATA_FORMAT_TS)
    .setLowThreshold(100)
    .setHighThreshold(900)
    .setPacketSize(188)
    .build();
    recorder.configure(dvrSettings);
    recorder.attachFilter(filter);
    recorder.setFileDescriptor(fd);
    recorder.start();
    
  2. RecordEvent 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 değişkenini 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);
          }
        }
      };
    

Tuner HAL

Tuner HAL, HIDL'yi takip eder 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 özgü kontroller HAL dosyaları
ITuner Yok frontend(open, getIds, getInfo), openDemux, openDescrambler, openLnb, getDemuxCaps ITuner.hal
IFrontend setCallback, getStatus, close tune, stopTune, scan, stopScan, setLnb IFrontend.hal
IFrontendCallback.hal
IDemux close setFrontendDataSource, openFilter, openDvr, getAvSyncHwId, getAvSyncTime, 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 özgü kontroller HAL dosyaları
ITuner Yok getFrontendDtmbCapabilities @1.1::ITuner.hal
IFrontend tune_1_1, scan_1_1, getStatusExt1_1 link/unlinkCiCam @1.1::IFrontend.hal
@1.1::IFrontendCallback.hal
IFilter getStatusExt1_1 configureIpCid, configureAvStreamType, getAvSharedHandle, configureMonitorEvent @1.1::IFilter.hal
@1.1::IFilterCallback.hal

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

Ş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 ağaç olarak bağlanır, yakın 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ın filtrelenmesi ö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ısı örneği şeması.

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

Tuner Resource Manager

Tuner Kaynak Yöneticisi (TRM) kullanılmadan önce iki uygulama arasında geçiş yapmak için aynı Tuner donanımı gerekiyordu. TV Giriş Çerçevesi (TIF), "ilk gelen alır" mekanizması kullanır. Yani kaynağı ilk alan uygulama kaynağı elinde tutar. 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, Tuner çerçevesinin, MediaCas ve TvInputHardwareManager'nin kaynakları kaydettirmesi, istemesi veya serbest bırakması için ITunerResourceManager.aidl'te AIDL arayüzlerini gösterir.

İ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 gelen 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çi firmalar 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, platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml sablon olarak 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'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.

nice değeri, istemcinin başka bir istemciyle çakıştığında davranışının ne kadar esnek olduğunu gösterir. Güzel değer, öncelik değeri sorunlu müşteriyle karşılaştırılmadan önce müşterinin öncelik değerini düşürür.

Geri alma mekanizması

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

Yeniden talep mekanizması sürecinin şeması.

Şekil 15. Tuner kaynakları arasındaki bir çakışmaya yönelik yeniden alma mekanizmasının şeması