إطار عمل أداة التوليف

على نظام التشغيل Android 11 أو الإصدارات الأحدث، يمكنك استخدام إطار عمل موالف لتقديم محتوى الصوت والفيديو يستخدم إطار العمل الأجهزة من الموردين، مما يجعلها مناسبة لكل من منظومة على الرقاقة (SoC) المنخفضة والعالية التطور. يوفر هذا الإطار طريقة آمنة لتقديم محتوى الصوت والفيديو المحمي بواسطة بيئة تنفيذ موثوقة (TEE) ومسار وسائط آمن (SMP)، ما يسمح الاستخدام في بيئة محمية بالمحتوى ومحدودة للغاية

تؤدي الواجهة الموحّدة بين Tuner وAndroid CAS إلى توفير تجربة أسرع التكامل بين مورّدي الموالف ومورّدي خدمات CAS. تعمل واجهة أداة Tuner مع MediaCodec وAudioTrack لإنشاء حلّ شامل لـ Android TV. تتوافق واجهة الموالف مع كل من التلفزيون الرقمي والتلفزيون التناظري استنادًا إلى معايير البث.

المكوّنات

بالنسبة إلى نظام التشغيل Android 11، هناك ثلاثة مكونات خاصة مصمم لمنصة التلفزيون.

  • Tuner HAL: واجهة بين إطار العمل والمورّدين
  • Tuner SDK API: واجهة بين إطار العمل والتطبيقات
  • مدير موارد الموالف (TRM): تنسيق موارد الأجهزة الخاصة بموالف الموالف

بالنسبة إلى نظام التشغيل Android 11، تم تقديم المكونات التالية: محسَّنة.

  • الإصدار 2 من شهادة CAS
  • TvInputService أو خدمة إدخال التلفزيون (TIS)
  • TvInputManagerService أو خدمة "مدير إدخال التلفزيون" (TIMS)
  • MediaCodec أو برنامج ترميز الوسائط
  • AudioTrack أو مقطع صوتي
  • MediaResourceManager أو مدير موارد الوسائط (MRM)

مخطط انسيابي لمكونات إطار عمل الموالف.

الشكل 1. التفاعلات بين مكوّنات Android TV

الميزات

تتوافق الواجهة الأمامية مع معايير DTV أدناه.

  • لوحة ATSC
  • لوحة ATSC3
  • DVB C/S/T
  • معيار ISDB S/S3/T
  • ساعة عادية

تتوافق الواجهة الأمامية في نظام التشغيل Android 12 مع Tuner HAL 1.1 أو الإصدارات الأحدث مع معيار DTV أدناه.

  • التحكم في النطاق الرقمي (DTMB)

يتوافق Demux مع بروتوكولات البث أدناه.

  • البث المباشر (TS)
  • بروتوكول نقل وسائط MPEG (MMTP)
  • بروتوكول الإنترنت (IP)
  • قيمة طول النوع (TLV)
  • بروتوكول طبقة الرابط ATSC (ALP)

يدعم برنامج فك ترميز المحتوى إجراءات حماية المحتوى أدناه.

  • مسار وسائط آمن
  • محو مسار الوسائط
  • تأمين السجلّ المحلي
  • التشغيل المحلي الآمن

تتوافق واجهات برمجة التطبيقات Tuner API مع حالات الاستخدام أدناه.

  • فحص
  • مباشر
  • التشغيل
  • تسجيل

يتيح التوليف وMediaCodec وAudioTrack استخدام أوضاع تدفق البيانات أدناه.

  • حمولة ES مع محو ذاكرة التخزين المؤقت
  • حمولة البيانات ES مع مؤشر أمان الذاكرة
  • رؤية العالم المحيط

التصميم العام

يتم تحديد HAL الموالف بين إطار عمل Android وإطار عمل البائع الأجهزة.

  • يصف ما يتوقعه إطار العمل من البائع وكيف يمكن أن القيام بذلك.
  • تصدِّر وظائف الواجهة الأمامية وإزالة فك التشفير وفك تشذيب البيانات إلى إطار عمل من خلال IFrontend وIDemux وIDescrambler وIFilter وIDvr وILnb واجهة.
  • يتضمن الدوال الخاصة بدمج Tuner HAL مع إطار العمل الآخر. مثل MediaCodec وAudioTrack.

يتم إنشاء فئة Tuner Java وفئة أصلية.

  • تسمح واجهة برمجة التطبيقات Tuner Java API للتطبيقات بالوصول إلى Tuner HAL من خلال واجهات برمجة التطبيقات العامة.
  • تتيح الفئة الأصلية التحكم في الأذونات والتعامل مع الكميات الكبيرة من تسجيل البيانات أو تشغيلها باستخدام طبقة تجريد الأجهزة (HAL) الخاصة بموالف
  • وحدة الموالف الأصلي هي عبارة عن جسر بين فئة أداة Tuner Java والأداة الموالف HAL.

يتم إنشاء فئة TRM.

  • يدير موارد أداة الضبط المحدودة، مثل Frontend وLNB جلسات CAS وجهاز إدخال تلفزيون من إدخال HAL على التلفزيون.
  • يتم تطبيق قواعد لاسترداد موارد غير كافية من التطبيقات. القاعدة التلقائية هي الفوز في المقدّمة.

تم تحسين CAS وCAS HAL من خلال الميزات الواردة أدناه.

  • لفتح جلسات CAS للاستخدامات والخوارزميات المختلفة.
  • دعم أنظمة CAS الديناميكية، مثل إزالة CICAM وإدراجه.
  • تتكامل مع Tuner HAL من خلال توفير الرموز المميّزة الرئيسية.

تم تحسين MediaCodec وAudioTrack من خلال الميزات أدناه.

  • يتم استخدام ذاكرة صوت/فيديو آمنة لإدخال المحتوى.
  • تم الضبط على مزامنة الصوت والصورة على الجهاز أثناء التشغيل النفقي.
  • تم ضبط التوافق مع ES_payload ووضع العبور.

التصميم العام لـ Tuner HAL.

الشكل 2. مخطّط بياني للمكونات داخل طبقة تجريد الأجهزة (HAL) للموالف

سير العمل العام

توضّح الرسومات البيانية أدناه تسلسلات المكالمات لتشغيل البث المباشر.

ضبط إعدادات الجهاز

إعداد تسلسل مخطّط تشغيل البث المباشر

الشكل 3. إعداد التسلسل لتشغيل البث المباشر

التعامل مع الصوت والصورة

رسم تخطيطي التعامل مع الصوت والصورة لتشغيل البث المباشر.

الشكل 4. معالجة الصوت والفيديو لتشغيل البث المباشر

التعامل مع المحتوى المشفَّر

الرسم التوضيحي لمعالجة المحتوى المشفَّر لتشغيل البث المباشر

الشكل 5. معالجة المحتوى المشفَّر لتشغيل البث المباشر

معالجة بيانات الصوت والفيديو

معالجة بيانات الصوت والفيديو في الرسم التخطيطي لتشغيل البث المباشر

الشكل 6. جارٍ معالجة الصوت والفيديو لتشغيل البث المباشر

واجهة برمجة تطبيقات Tuner SDK

تتعامل واجهة برمجة التطبيقات Tuner SDK API مع كل من Tuner JNI وTunner HAL، وTunerResourceManager. يستخدم تطبيق TIS واجهة برمجة تطبيقات Tuner SDK API للوصول إلى Tuner. والموارد والمكونات الفرعية مثل عامل التصفية وأداة فك التشفير. الواجهة الأمامية Demux عبارة عن مكونات داخلية.

رسم تخطيطي لـ Tuner SDK API

الشكل 7. التفاعلات مع واجهة برمجة التطبيقات Tuner SDK API

الإصدارات

بدءًا من نظام التشغيل Android 12، توفِّر واجهة برمجة التطبيقات Tuner SDK API ميزة جديدة في Tuner HAL 1.1، وهي هو ترقية إصدار متوافق مع الإصدارات القديمة من Tuner 1.0.

استخدِم واجهة برمجة التطبيقات التالية للتحقّق من إصدار HAL قيد التشغيل.

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

يمكن العثور على الحدّ الأدنى المطلوب لإصدار HAL في المستندات الخاصة بواجهات برمجة التطبيقات الجديدة في Android 12.

الطرود

توفر واجهة برمجة التطبيقات Tuner SDK API الحزم الأربع أدناه.

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

مخطط انسيابي لحزم واجهة برمجة التطبيقات Tuner SDK API.

الشكل 8. حزم واجهة برمجة التطبيقات لـ Tuner SDK API

Android.media.tv.tuner

تعتبر حزمة Tuner نقطة دخول لاستخدام إطار عمل Tuner. تطبيق TIS تستخدم الحزمة لتهيئة مثيلات الموارد والحصول عليها من خلال تحديد الإعداد الأولي ومعاودة الاتصال.

  • tuner(): لإعداد مثيل أداة التوليف من خلال تحديد useCase مَعلمات sessionId
  • tune(): الحصول على مورد واجهة أمامية وضبطه من خلال تحديد مَعلمة FrontendSetting.
  • openFilter(): للحصول على مثيل فلتر من خلال تحديد نوع الفلتر
  • openDvrRecorder(): الحصول على مثيل التسجيل من خلال تحديد المخزن المؤقت الحجم.
  • openDvrPlayback(): الحصول على مثيل تشغيل من خلال تحديد المخزن المؤقت الحجم.
  • openDescrambler(): الحصول على مثيل أداة فك الترميز
  • openLnb(): الحصول على مثيل LNB داخلي
  • openLnbByName(): الحصول على مثيل LNB خارجي.
  • openTimeFilter(): للحصول على مثيل فلتر الوقت

توفر حزمة Tuner وظائف لا تشملها حزم التصفية ومسجِّل الفيديو الرقمي وحزم الواجهة الأمامية. فيما يلي قائمة بالوظائف:

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

Android.media.tv.tuner.frontend

تتضمن حزمة الواجهة الأمامية مجموعات من الإعدادات المتعلقة بالواجهة الأمامية، والمعلومات والحالات والأحداث والإمكانات.

صفوف

تم تحديد قيمة FrontendSettings لمعايير التلفزيون الرقمي المختلفة حسب الفئات أدناه.

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

يتوافق معيار DTV التالي مع نظام التشغيل Android 12 مع Tuner HAL 1.1 أو الإصدارات الأحدث.

  • DtmbFrontendSettings

يتم اشتقاق FrontendCapabilities لمعايير التلفزيون الرقمي المختلفة حسب الفئات. أدناه.

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

يتوافق معيار DTV التالي مع نظام التشغيل Android 12 مع Tuner HAL 1.1 أو الإصدارات الأحدث.

  • DtmbFrontendCapabilities

يسترد FrontendInfo معلومات الواجهة الأمامية. تسترد الدالة FrontendStatus الحالة الحالية للواجهة الأمامية. يرصد تطبيق "OnTuneEventListener" الأحداث على الواجهة الأمامية. يستخدم تطبيق TIS ScanCallback لمعالجة رسائل الفحص من الواجهة الأمامية.

البحث عن القنوات

لإعداد جهاز تلفزيون، يفحص التطبيق الترددات المحتملة للفيديو لإنشاء قناة للمستخدمين للوصول إليها. قد تستخدم TIS العلامة Tuner.tune، Tuner.scan(BLIND_SCAN) أو Tuner.scan(AUTO_SCAN) لإكمال القناة مسح ضوئي.

إذا كانت هناك معلومات تسليم دقيقة في ما يتعلق بالإشارة، مثل معدل التكرار المعيار (على سبيل المثال، T/T2 وS/S2) والمعلومات الضرورية الإضافية (على سبيل المثال، PLD ID)، ثم يُنصَح باستخدام Tuner.tune كخيار أسرع.

عندما يتصل المستخدم بـ Tuner.tune، تحدث الإجراءات التالية:

  • تملأ TIS FrontendSettings بالمعلومات المطلوبة باستخدام Tuner.tune.
  • تضبط تقارير HAL رسائل LOCKED في حال قفل الإشارة.
  • تستخدم منصة TIS ميزة "Frontend.getStatus" لجمع المعلومات اللازمة.
  • ينتقل مقياس نسبة ظهور الإعلان (TIS) إلى معدّل التكرار المتاح التالي في قائمة معدّل التكرار.

تتصل خدمة TIS بـ Tuner.tune مرة أخرى حتى يتم استنفاد جميع الترددات.

أثناء التوليف، يمكنك الاتصال بـ stopTune() أو close() لإيقاف مكالمة Tuner.tune.

Tuner.scan(auto_SCAN)

إذا لم يكن لدى TIS معلومات كافية لاستخدام Tuner.tune، ولكن له معدل تكرار نوع القائمة والنوع القياسي (على سبيل المثال، DVB T/C/S) فمن المستحسن استخدام السمة Tuner.scan(AUTO_SCAN).

عندما يتصل المستخدم بـ Tuner.scan(AUTO_SCAN)، تحدث الإجراءات التالية:

  • تستخدم نسبة ظهور الإعلان في الوقت الفعلي (TIS) القيمة Tuner.scan(AUTO_SCAN) مع نسبة FrontendSettings مع قيم معدّل التكرار.

  • تفحص تقارير HAL رسائل LOCKED في حال كانت الإشارة مقفلة. قد تؤثر HAL أيضًا الإبلاغ عن رسائل الفحص الأخرى لتوفير معلومات إضافية حول الإشارة.

  • تستخدم منصة TIS ميزة "Frontend.getStatus" لجمع المعلومات اللازمة.

  • فريق TIS يستدعي Tuner.scan لتواصل جلسة HAL إلى الإعداد التالي على النحو نفسه والتردد. إذا كانت بنية FrontendSettings فارغة، ستستخدم دالة HAL العنصر التالي الإعداد المتوفر. بخلاف ذلك، تستخدم آلية HAL FrontendSettings لمرة واحدة. إجراء فحص وإرسال END للإشارة إلى اكتمال عملية البحث.

  • تكرر علامة TIS الإجراءات الواردة أعلاه حتى يتم ضبط جميع الإعدادات على معدل التكرار منهك.

  • ترسل طبقة تجريد الأجهزة (HAL) END للإشارة إلى اكتمال عملية البحث.

  • ينتقل مقياس نسبة ظهور الإعلان (TIS) إلى معدّل التكرار المتاح التالي في قائمة معدّل التكرار.

تتصل خدمة TIS بـ Tuner.scan(AUTO_SCAN) مرة أخرى حتى يتم استنفاد جميع الترددات.

أثناء البحث، يمكنك الاتصال بالرقم stopScan() أو close() لإيقاف مسح ضوئي.

Tuner.scan(BLIND_SCAN)

إذا لم يكن لدى TIS قائمة بعدد مرات الظهور ويمكن لـ HAL للمورّد البحث عن تكرار الواجهة الأمامية التي حددها المستخدم للحصول على مورد الواجهة الأمامية، ثم نقترح عليك Tuner.scan(BLIND_SCAN).

  • يستخدم TIS العلامة Tuner.scan(BLIND_SCAN). يمكن تحديد معدل التكرار في FrontendSettings لمعدل تكرار البدء، ولكن TIS يتجاهل الإعدادات الأخرى في FrontendSettings.
  • تُبلِغ قناة HAL عن رسالة فحص LOCKED في حال قفل الإشارة.
  • تستخدم منصة TIS ميزة "Frontend.getStatus" لجمع المعلومات اللازمة.
  • يستدعي نظام TIS Tuner.scan مرة أخرى لمتابعة المسح. (FrontendSettings هو يتم تجاهلها.)
  • تكرر علامة TIS الإجراءات الواردة أعلاه حتى يتم ضبط جميع الإعدادات على معدل التكرار منهك. يزيد مستوى HAL من معدّل التكرار بدون الحاجة إلى اتّخاذ أي إجراء من TIS. تُبلغ تقارير HAL عن PROGRESS.

تتصل خدمة TIS بـ Tuner.scan(AUTO_SCAN) مرة أخرى حتى يتم استنفاد جميع الترددات. تُبلغ تقارير HAL عن END للإشارة إلى اكتمال عملية الفحص.

أثناء المسح، يمكنك الاتصال بالرقم stopScan() أو close() لإيقاف البحث مؤقتًا أو إنهائه.

مخطط انسيابي لعملية مسح TIS ضوئيًا

الشكل 9. مخطط انسيابي لعملية فحص TIS

Android.media.tv.tuner.filter

حزمة التصفية عبارة عن مجموعة من عمليات التصفية إلى جانب التهيئة، والإعدادات وعمليات معاودة الاتصال والأحداث. تتضمن الحزمة العمليات أدناه. يُرجى الرجوع إلى رمز مصدر Android للاطّلاع على القائمة الكاملة للعمليات.

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

يُرجى الرجوع إلى رمز مصدر Android للاطّلاع على القائمة الكاملة.

الدالة FilterConfiguration مشتقة من الفئات أدناه. إن التكوينات هي لنوع الفلتر الرئيسي وتحدد البروتوكول الذي يستخدمه الفلتر واستخراج البيانات

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

يتم إنشاء الإعدادات من الفئات أدناه. الإعدادات خاصة بالفلتر النوع الفرعي وتحدد أنواع البيانات التي يمكن للفلتر استبعادها.

  • SectionSettings
  • AvSettings
  • PesSettings
  • RecordSettings
  • DownloadSettings

يتم اشتقاق FilterEvent من الفئات أدناه للإبلاغ عن أحداث مختلفة أنواع البيانات.

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

بدءًا من نظام التشغيل Android 12 المزود بالإصدار Tuner HAL 1.1 أو الإصدارات الأحدث، يمكن استخدام الأحداث التالية.

  • IpCidChangeEvent
  • RestartEvent
  • ScramblingStatusEvent
تنسيق البيانات والأحداث من الفلتر
نوع الفلتر أعلام الأحداث عملية البيانات تنسيق البيانات
TS.SECTION
MMTP.SECTION
IP.SECTION
TLV.SECTION
ALP.SECTION
isRaw:
true
إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
ملء حزمة جلسة مجمّعة في FMQ من خلال أخرى حزمة الجلسة.
isRaw:
false
إلزامي:
DemuxFilterEvent::DemuxFilterSectionEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER

for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterSectionEven[i].size)

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
TS.PES isRaw:
true
إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
تتم تعبئة حزمة واحدة مجمّعة في مؤتمر خبراء المنتجات في FMQ من خلال أخرى. حزمة PES
isRaw:
false
إلزامي:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER

for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
MMTP.PES isRaw:
true
إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
تعبئة إحدى حزم MFU المجمّعة في FMQ بأخرى حزمة MFU
isRaw:
false
إلزامي:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER

for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
TS.TS
لا ينطبق إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
تمت فلترة ts باستخدام عنوان ts
ملء FMQ.
TS.Audio
TS.Video
MMTP.Audio
MMTP.Video
isPassthrough:
true
اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
يمكن للعميل بدء تشغيل MediaCodec بعد استلام DemuxFilterStatus::DATA_READY.
بإمكان العميل الاتصال بخدمة "Filter.flush" بعد تلقّي "DemuxFilterStatus::DATA_OVERFLOW".
لا ينطبق
isPassthrough:
false
إلزامي:
DemuxFilterEvent::DemuxFilterMediaEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
لاستخدام MediaCodec:
for i=0; i<n; i++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()


لاستخدام ميزة "الصوت المباشر" لـ "AudioTrack":
for i=0; i<n; i++
audioHandle = MediaEvent[i].getAudioHandle();
audiotrack.write(encapsulated(audiohandle))
بيانات ES أو بيانات ES الجزئية في ذاكرة ION.
TS.PCR
IP.NTP
ALP.PTP
لا ينطبق إلزامي: لا ينطبق
اختياري: لا ينطبق
لا ينطبق (لا ينطبق)
TS.RECORD لا ينطبق إلزامي:
DemuxFilterEvent::DemuxFilterTsRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
بالنسبة إلى بيانات الفهرس:
for i=0; i<n; i++
DemuxFilterTsRecordEvent[i];


بالنسبة إلى المحتوى المسجَّل، وفقًا لـ RecordStatus::* والجدول الزمني الداخلي، واحد مما يلي:
  • تشغيل DvrRecord.write(adustedSize) مرة أو أكثر للتخزين.
    يتم نقل البيانات من MQ الخاص بـ HAL إلى التخزين.
  • تشغيل DvrRecord.write(buffer, adustedSize) مرة أو أكثر للتخزين المؤقت.
    يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
بالنسبة إلى بيانات الفهرس: يتم الاحتفاظ بها في حمولة الحدث.

للمحتوى المسجّل: بث TS مختلطة مع تعبئة FMQ
TS.TEMI لا ينطبق إلزامي:
DemuxFilterEvent::DemuxFilterTemiEvent[n]

اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
DemuxFilterTemiEvent[i];
لا ينطبق
MMTP.MMTP لا ينطبق إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
تمت فلترة mmtp باستخدام عنوان mmtp
ملء FMQ.
MMTP.RECORD لا ينطبق إلزامي:
DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
بالنسبة إلى بيانات الفهرس: for i=0; i<n; i++
DemuxFilterMmtpRecordEvent[i];


بالنسبة إلى المحتوى المسجَّل، وفقًا لما يلي: RecordStatus::* والجدول الزمني الداخلي، قم بأحد التالية:
  • تنفيذ "DvrRecord.write(adjustedSize)" مرة واحدة أو أكثر إلى التخزين.
    يتم نقل البيانات من MQ الخاص بـ HAL إلى التخزين.
  • تشغيل DvrRecord.write(buffer, adjustedSize)واحد أو مرات أكثر لتخزين البيانات مؤقتًا.
    يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
بالنسبة إلى بيانات الفهرس: يتم الاحتفاظ بها في حمولة الحدث.

للمحتوى المسجّل: تم ملء بث مسجَّل ممتلئ FMQ.

إذا كان مصدر فلتر التسجيل هو TLV.TLV إلى IP.IP مع إمكانية العبور، والبث المسجّل له عنوان TLV وعنوان IP.
MMTP.DOWNLOAD لا ينطبق إلزامي:
DemuxFilterEvent::DemuxFilterDownloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER

for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterDownloadEvent[i].size)
يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
يتم ملء حزمة التنزيل في FMQ من خلال حزمة تنزيل IP أخرى.
IP.IP_PAYLOAD لا ينطبق إلزامي:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

اختياري:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER

for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size)
يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
يتم ملء حزمة حمولة IP في FMQ من خلال حزمة حمولة IP أخرى.
IP.IP
TLV.TLV
ALP.ALP
isPassthrough:
true
اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
تمت فلترة خلاصات البث الفرعي للبروتوكولات والفلتر التالي في الفلتر. السلسلة. لا ينطبق
isPassthrough:
false
إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

إجراءات ننصح بها:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
وفقًا للحدث والجدول الزمني الداخلي، شغِّل
Filter.read(buffer, offset, adjustedSize) واحد أو أكثر أوقات.

يتم نسخ البيانات من MQ الخاص بـ HAL إلى المخزن المؤقت للعميل.
يتم ملء بث البروتوكول الفرعي الذي تمت فلترته مع عنوان بروتوكول. FMQ.
IP.PAYLOAD_THROUGH
TLV.PAYLOAD_THROUGH
ALP.PAYLOAD_THROUGH
لا ينطبق اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
خلاصات حمولة البروتوكول التي تمت تصفيتها والفلتر التالي في الفلتر السلسلة. لا ينطبق
مثال على التدفق لاستخدام الفلتر لإنشاء مؤشر PSI/SI

مثال على التدفق لاستخدام الفلتر لإنشاء مؤشر PSI/SI

الشكل 10. التدفق لإنشاء مؤشر PSI/SI

  1. افتح أحد الفلاتر.

    Filter filter = tuner.openFilter(
      Filter.TYPE_TS,
      Filter.SUBTYPE_SECTION,
      /* bufferSize */1000,
      executor,
      filterCallback
    );
    
  2. اضبط الفلتر وابدأه.

    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.

    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); }
          }
        }
    };
    
مثال على التدفق لاستخدام MediaEvent من الفلتر

مثال على التدفق لاستخدام MediaEvent من الفلتر

الشكل 11. خطوات استخدام MediaEvent من الفلتر

  1. افتح فلاتر الصوت والفيديو، واضبطها، وشغِّلها.
  2. العملية MediaEvent.
  3. يمكنك استلام MediaEvent.
  4. أضِف القالب الخطي إلى قائمة الانتظار لـ codec.
  5. حرر مقبض الصوت والفيديو عند استهلاك البيانات.

Android.media.tv.tuner.dvr

يوفّر DvrRecorder هذه الطرق للتسجيل.

  • configure
  • attachFilter
  • detachFilter
  • start
  • flush
  • stop
  • setFileDescriptor
  • write

يوفّر DvrPlayback هذه الطرق للتشغيل.

  • configure
  • start
  • flush
  • stop
  • setFileDescriptor
  • read

تُستخدَم DvrSettings لضبط DvrRecorder وDvrPlayback. يتم استخدام OnPlaybackStatusChangedListener وOnRecordStatusChangedListener. للإبلاغ عن حالة مسجِّل فيديو رقمي.

مثال على عملية بدء سجلّ

مثال على التدفق لبدء أحد السجلات

الشكل 12. خطوات بدء سجلّ

  1. فتح DvrRecorder وإعداده وبدء تشغيله

    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 واسترداد معلومات الفهرس.

    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 وتخزين بيانات السجل.

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

أداة ضبط طبقة تجريد الأجهزة (HAL)

يتبع جهاز Tuner HAL معيار HIDL ويحدد الواجهة بين إطار العمل البائع. يستخدم الموردون الواجهة لتنفيذ طبقة تجريد الأجهزة (HAL) الخاصة بموالف هذا النموذج للتواصل مع تطبيق Tuner HAL.

الوحدات

موالف HAL 1.0

الوحدات عناصر التحكّم الأساسية عناصر التحكّم الخاصة بالوحدة ملفات HAL
ITuner لا ينطبق 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)

الوحدات عناصر التحكّم الأساسية عناصر التحكّم الخاصة بالوحدة ملفات HAL
ITuner لا ينطبق 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

مخطط انسيابي للتفاعلات بين وحدات HAL للموالف.

الشكل 13. مخطّط بياني للتفاعل بين وحدات HAL الخاصة بأداة الموالف

ربط الفلاتر

يدعم Tuner HAL ارتباط الفلاتر بحيث يمكن ربط الفلاتر بأخرى عوامل التصفية لطبقات متعددة. تتّبع الفلاتر القواعد أدناه.

  • ترتبط الفلاتر كشجرة، ولا يُسمح بإغلاق المسار.
  • العقدة الجذر هي demux.
  • تعمل الفلاتر بشكل مستقل.
  • تبدأ جميع الفلاتر في الحصول على البيانات.
  • ينتقل ارتباط الفلتر عند تطبيق الفلتر الأخير.

توضح كتلة التعليمات البرمجية أدناه والشكل 14 مثالاً على تصفية متعددة والطبقات.

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

مخطّط يوضّح مثالًا على ارتباط الفلتر

الشكل 14. مخطط انسيابي لرابط فلتر لطبقات متعددة

مدير موارد الموالف

قبل مدير موارد التوليف (TRM)، كان التبديل بين تطبيقين يتطلب نفس جهاز الموالف. استخدم إطار عمل إدخال التلفزيون (TIF) "الفوز أولاً" أي، أي تطبيق يحصل على المورد أولاً يحتفظ بالمورد. ومع ذلك، قد لا تكون هذه الآلية مثالية لبعض حالات الاستخدام المعقدة.

يتم تشغيل TRM كخدمة نظام لإدارة جهاز التوليف وTVInput وأجهزة CAS. والموارد الخاصة بالتطبيقات. تستخدم TRM ميزة "الفوز في المقدمة" الآلية، التي تحسب أولوية التطبيق استنادًا إلى مقدمة التطبيق أو خلفيته الحالة ونوع حالة الاستخدام. تمنح TRM المورد أو إبطاله استنادًا إلى الأولوية. تستخدم TRM عملية مركزية لإدارة موارد ATV في ما يتعلق بالبث وخدمة البث المباشر على الإنترنت (OTT) ومسجِّل فيديو رقمي.

واجهة TRM

تعرض TRM واجهات AIDL في ITunerResourceManager.aidl لأداة الضبط إطار العمل MediaCas وTvInputHardwareManager للتسجيل أو طلب أو إصدار الموارد.

في ما يلي واجهات إدارة العملاء.

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

في ما يلي واجهات طلب الموارد وإصدارها.

  • 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

يتم سرد فئات العملاء والطلبات أدناه.

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

أولوية العميل

تحسب TRM أولوية العميل باستخدام معلمات من ملف قيمة الملف الشخصي وقيمة الأولوية من ملف التهيئة. قد تكون الأولوية يتم تعديلها أيضًا من خلال قيمة أولوية عشوائية من العميل.

المَعلمات في الملف الشخصي للعميل

تسترد TRM معرّف العملية من mTvInputSessionId لتحديد ما إذا كان التطبيق عبارة عن تطبيق يعمل في المقدّمة أو التطبيق في الخلفية. لإنشاء mTvInputSessionId، TvInputService.onCreateSession أو TvInputService.onCreateRecordingSession بتهيئة جلسة TIS.

تشير السمة mUseCase إلى حالة استخدام الجلسة. حالات الاستخدام المحددة مسبقًا هي الواردة أدناه.

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
}

ملف الإعداد

ملف الإعداد التلقائي

يوفّر ملف الإعداد التلقائي أدناه قيم الأولوية للاستخدام المحدَّد مسبقًا. الحالات. يمكن للمستخدمين تغيير القيم باستخدام ملف إعداد مخصّص:

حالة الاستخدام واجهة خلفية
LIVE 490 400
PLAYBACK 480 300
RECORD 600 500
SCAN 450 200
BACKGROUND 180 100
ملف الإعداد المخصّص

يمكن للمورّدين تخصيص ملف الإعداد /vendor/etc/tunerResourceManagerUseCaseConfig.xml هذا الملف مستخدم لإضافة أو إزالة أو تحديث أنواع حالات الاستخدام وقيم أولوية حالات الاستخدام. يمكن للملف المخصص استخدام platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml كقالب.

على سبيل المثال، حالة استخدام المورّد الجديدة هي VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000]. يجب أن يتبع التنسيق platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd

قيمة أولوية عشوائية وقيمة جيدة

توفّر إدارة علاقات العملاء (TRM) السمة updateClientPriority للعميل لتعديل الإعدادات العشوائية. قيمة الأولوية والقيمة الجيدة. تحلّ قيمة الأولوية العشوائية محلّ قيمة الأولوية المحسوبة. من نوع حالة الاستخدام ومعرّف الجلسة.

تشير القيمة الجيدة إلى مدى التساهل في سلوك العميل عندما يكون في تتعارض مع عميل آخر. تقلل القيمة الجيدة من أولوية العميل قيمتها قبل مقارنة قيمة الأولوية بالعميل المليء بالتحدي.

آلية الاسترداد

يوضح الرسم التخطيطي أدناه كيفية استرداد الموارد وتعيينها عند حدوث تعارض في الموارد.

مخطّط بياني لعملية الاسترداد

الشكل 15. مخطّط بياني لآلية الاسترداد في حال حدوث تعارض بين الموالف المراجِع