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

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

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

المكوّنات

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

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

في نظام 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
  • ساعة عادية

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

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

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

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

يتوافق برنامج فك التشويش مع وسائل حماية المحتوى التالية.

  • مسار وسائط آمن
  • محو مسار الوسائط
  • تأمين السجلّ المحلي
  • تشغيل المحتوى على الجهاز فقط

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

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

تتيح أداة "المُعدِّل" وMediaCodec وAudioTrack أوضاع تدفق البيانات أدناه.

  • حمولة ES مع محو ذاكرة التخزين المؤقت
  • حمولة ES مع معرّف ذاكرة آمن
  • رؤية العالم المحيط

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

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

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

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

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

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

  • إدارة موارد محدودة لوحدة التحكّم في الترميز، مثل واجهة المستخدم الأمامية ووحدة 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 API

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

توفّر حزمة Tuner وظائف لا تتوفر في حِزم الفلتر وDVR والواجهة الأمامية. وفي ما يلي قائمة بالوظائف.

  • 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

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

  • DtmbFrontendCapabilities

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

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

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

إذا كانت شهادة TIS تتضمّن معلومات تسليم دقيقة للإشارة، مثل معدّل التكرار والسعر العادي (على سبيل المثال، T/T2 وS/S2) ومعلومات إضافية ضرورية (مثل رقم تعريف PLD)، يُنصح باستخدام 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

بدءًا من الإصدار 12 من نظام التشغيل Android مع 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 إلى المخزن المؤقت للعميل.
يتم ملء حزمة PES مجمّعة واحدة في 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 أخرى.
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 إلى المخزن المؤقت للعميل.
بالنسبة إلى بيانات الفهرس: يتم نقلها في الحمولة المرتبطة بالحدث.

للمحتوى المسجّل: بث لتكنولوجيا البث المباشر المختلَط باستخدام 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 لإبلاغ عن حالة مثيل DVR.

مثال على مسار بدء تسجيل

مثال على مسار بدء تسجيل

الشكل 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 ويحدِّد الواجهة بين إطار العمل و أجهزة المورّد. يستخدم المورّدون الواجهة لتنفيذ Tuner HAL ويستخدم الإطار العمل الواجهة للتواصل مع تنفيذ Tuner HAL.

الوحدات

Tuner 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 كخدمة نظام لإدارة موارد أجهزة Tuner وTVInput وCAS للتطبيقات. يستخدم "نظام إدارة الموارد" آلية "الفوز في المقدّمة" التي تُحتسب أولوية التطبيق استنادًا إلى حالة التطبيق في المقدّمة أو في الخلفية ونوع حالة الاستخدام. تمنح TRM المورد أو تلغيه بناءً على الأولوية. تُجمِّع إدارة الموارد في الوقت الفعلي (TRM) إدارة موارد ATV للبث وخدمات الفيديو عند الطلب (OTT) وDVR.

واجهة TRM

تعرض TRM واجهات AIDL في ITunerResourceManager.aidl لإطار عمل أداة Tuner، و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 معرّف العملية من 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.

قيمة الأولوية التعسّفية والقيمة اللطيفة

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

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

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

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

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

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