إطار عمل أداة الاستقبال

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

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

المكوّنات

في Android 11، تم تصميم ثلاثة مكونات خصيصًا لمنصة التلفزيون.

  • طبقة تجريد الأجهزة الخاصة بجهاز استقبال البث: هي واجهة بين إطار العمل والمورّدين.
  • واجهة برمجة التطبيقات في حزمة تطوير البرامج (SDK) الخاصة بضبط الصوت: هي واجهة بين إطار العمل والتطبيقات.
  • Tuner Resource Manager (TRM): ينسّق موارد أجهزة Tuner

تم تحسين المكوّنات التالية في نظام التشغيل Android 11.

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

مخطّط انسيابي لمكوّنات إطار عمل Tuner

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

الميزات

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

  • ATSC
  • ATSC3
  • DVB C/S/T
  • ISDB S/S3/T
  • ساعة عادية

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

  • DTMB

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

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

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

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

تتيح واجهات برمجة التطبيقات الخاصة بأجهزة استقبال البث حالات الاستخدام أدناه.

  • فحص
  • Live
  • التشغيل
  • تسجيل

تتيح أدوات الضبط MediaCodec وAudioTrack أوضاع تدفّق البيانات أدناه.

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

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

يتم تحديد طبقة HAL الخاصة بأداة Tuner بين إطار عمل Android والأجهزة التابعة للمورّد.

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

يتم إنشاء فئة Java وفئة أصلية خاصة بأداة الضبط.

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

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

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

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

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

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

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

التصميم العام لطبقة HAL الخاصة بموالف التلفزيون

الشكل 2. مخطّط لمكوّنات Tuner HAL

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

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

ضبط إعدادات الميزة

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

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

التعامل مع الصوت والفيديو

مخطّط التعامل مع الصوت والفيديو لتشغيل البث المباشر

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

التعامل مع المحتوى المشوّش

مخطط بياني للتعامل مع المحتوى المشوّش لتشغيل البث المباشر

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

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

مخطّط تشغيل البث المباشر لبيانات الصوت والفيديو

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

Tuner SDK API

تتعامل واجهة برمجة التطبيقات Tuner SDK مع التفاعلات مع Tuner JNI وTuner HAL وTunerResourceManager. يستخدم تطبيق TIS واجهة برمجة التطبيقات الخاصة بحزمة تطوير البرامج (SDK) الخاصة ببرنامج Tuner للوصول إلى موارد برنامج Tuner ومكوناته الفرعية، مثل الفلتر وبرنامج فك التشفير. الواجهة الأمامية وdemux هما مكوّنان داخليان.

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

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

الإصدارات

بدءًا من الإصدار 12 من نظام التشغيل Android، تتيح واجهة برمجة التطبيقات الخاصة بحزمة تطوير البرامج (SDK) لأداة Tuner ميزة جديدة في الإصدار 1.1 من طبقة تجريد الأجهزة (HAL) لأداة Tuner، وهو إصدار مطوَّر ومتوافق مع الإصدارات السابقة من الإصدار 1.0 من أداة Tuner.

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

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

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

إدارة الحِزم

توفّر واجهة برمجة التطبيقات لحزمة تطوير البرامج (SDK) الخاصة بأداة Tuner الحِزم الأربع أدناه.

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

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

الشكل 8. حِزم واجهة برمجة التطبيقات الخاصة بحزمة تطوير البرامج (SDK) لأداة Tuner

Android.media.tv.tuner

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

  • tuner(): يتم استخدامها لتهيئة مثيل 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 لمعايير DTV المختلفة من خلال الفئات أدناه.

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

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

  • DtmbFrontendSettings

يتم اشتقاق FrontendCapabilities لمعايير DTV المختلفة من خلال الفئات أدناه.

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

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

  • 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، تحدث الإجراءات التالية:

  • تعبئ "خدمة معلومات الضرائب" الحقل FrontendSettings بالمعلومات المطلوبة باستخدام Tuner.tune.
  • تعرض طبقة تجريد الأجهزة (HAL) رسائل الضبط LOCKED إذا كانت الإشارة مقفلة.
  • تستخدم أداة "نظام معلومات الضرائب" 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 أيضًا رسائل فحص أخرى لتقديم معلومات إضافية حول الإشارة.

  • تستخدم "خدمة الترجمة الفورية" Frontend.getStatus لجمع المعلومات اللازمة.

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

  • تكرّر خدمة TIS الإجراءات المذكورة أعلاه إلى أن يتم استنفاد جميع الإعدادات المتعلقة بالتكرار.

  • يرسل HAL END للإشارة إلى انتهاء عملية الفحص.

  • ينتقل نظام TIS إلى التردد المتاح التالي في قائمة الترددات.

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

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

Tuner.scan(BLIND_SCAN)

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

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

تتصل خدمة TIS Tuner.scan(AUTO_SCAN) مرة أخرى إلى أن يتم استنفاد جميع الترددات. تعرض طبقة تجريد الأجهزة 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 مع الإصدار 1.1 أو الإصدارات الأحدث من Tuner HAL، تتوفّر الأحداث التالية.

  • 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) مرة واحدة أو أكثر.

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (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)


يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة HAL إلى المخزن المؤقت للعميل.
TS.PES isRaw:
true
إجراء إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (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)


يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة HAL إلى المخزن المؤقت للعميل.
MMTP.PES isRaw:
true
إجراء إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة إلى المخزن المؤقت للعميل.
يتم ملء حزمة 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)


يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (HAL) إلى المخزن المؤقت للعميل.
TS.TS
لا ينطبق إجراء إلزامي:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة إلى المخزن المؤقت للعميل.
تم ملء 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) مرة واحدة أو أكثر لتخزين البيانات.
    يتم نقل البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة إلى مساحة التخزين.
  • نفِّذ الأمر DvrRecord.write(buffer, adustedSize) مرة واحدة أو أكثر لتخزين البيانات مؤقتًا.
    يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة 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) مرة واحدة أو أكثر.

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة إلى المخزن المؤقت للعميل.
تم ملء 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) مرة واحدة أو أكثر للتخزين.
    يتم نقل البيانات من قائمة انتظار الرسائل في طبقة HAL إلى مساحة التخزين.
  • نفِّذ الأمر DvrRecord.write(buffer, adjustedSize)مرة واحدة أو أكثر لتخزين البيانات مؤقتًا.
    يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (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)

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (HAL) إلى المخزن المؤقت للعميل.
يتم ملء حزمة التنزيل في FMQ بحزمة تنزيل أخرى عبر بروتوكول الإنترنت.
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)

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة (HAL) إلى المخزن المؤقت للعميل.
يتم ملء حزمة حمولة بيانات بروتوكول الإنترنت في FMQ بحزمة حمولة بيانات بروتوكول إنترنت أخرى.
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) مرة واحدة أو أكثر.

يتم نسخ البيانات من قائمة انتظار الرسائل في طبقة تجريد الأجهزة إلى المخزن المؤقت للعميل.
تم ملء FMQ لبروتوكول البث الفرعي الذي تم استبعاده باستخدام عنوان البروتوكول.
IP.PAYLOAD_THROUGH
TLV.PAYLOAD_THROUGH
ALP.PAYLOAD_THROUGH
لا ينطبق اختياري:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
تغذّي حمولة البروتوكول التي تمّت فلترتها الفلتر التالي في سلسلة الفلاتر. لا ينطبق
مثال على مسار استخدام الفلتر لإنشاء مؤشر سرعة الموقع/مؤشر السرعة

مثال على عملية استخدام الفلتر لإنشاء 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. Flow لاستخدام 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 لغة تعريف واجهة 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

الإصدار 1.1 من طبقة تجريد الأجهزة الخاصة بأداة استقبال التلفزيون (مستمد من الإصدار 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

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

الشكل 13. مخطّط تفاعلات وحدات Tuner HAL

ربط الفلتر

تتيح طبقة تجريد الأجهزة (HAL) الخاصة ببرنامج Tuner ربط الفلاتر ببعضها البعض، ما يتيح ربط الفلاتر بفلاتر أخرى لإنشاء طبقات متعددة. تخضع الفلاتر للقواعد التالية.

  • يتم ربط الفلاتر كشجرة، ولا يُسمح بالمسار المغلق.
  • عقدة الجذر هي 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. مخطّط انسيابي لربط الفلاتر بطبقات متعددة

Tuner Resource Manager

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

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

واجهة 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، تبدأ TvInputService.onCreateSession جلسة 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.

قيمة الأولوية العشوائية وقيمة nice

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

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

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

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

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

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