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

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

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

المكوّنات

في الإصدار 11 من Android، تم تصميم ثلاثة مكوّنات خصيصًا لنظام التشغيل TV.

  • Tuner HAL: واجهة بين الإطار العمل والمورّدين
  • Tuner SDK API: واجهة بين إطار العمل والتطبيقات
  • مدير موارد Tuner (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
  • ساعة عادية

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

  • DTMB

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

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

تتيح أداة فك التشويش وسائل حماية المحتوى التالية.

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

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

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

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

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

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

يتم تحديد HAL الخاص بتطبيق Tuner بين إطار عمل Android و معدات المورِّد.

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

يتم إنشاء فئة Java وأخرى أصلية لتطبيق Tuner.

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

يتم إنشاء فئة إدارة المخاطر.

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

تم تحسين Media CAS وCAS HAL بالميزات التالية.

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

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

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

التصميم العام لواجهة HAL الخاصة بالموالف

الشكل 2: مخطّط بياني للمكونات ضمن Tuner HAL

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

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

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

رسم بياني لترتيب إعداد تشغيل البث المباشر

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

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

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

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

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

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

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

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

معالجة بيانات الصوت والصورة لعرض مخطّط تشغيل البث المباشر

الشكل 6: معالجة المحتوى الصوتي والمرئي لتشغيل البث المباشر

Tuner SDK API

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

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

الشكل 7: التفاعلات مع Tuner SDK API

الإصدارات

اعتبارًا من Android 12، تتيح حزمة تطوير البرامج (SDK) لواجهة Tuner 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 لمعايير DTV المختلفة حسب الفئات أدناه.

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

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

  • DtmbFrontendSettings

يتم اشتقاق FrontendCapabilities لمعايير DTV المختلفة حسب الفئات التالية:

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

  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. اترك معرّف A/V عند استخدام البيانات.

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

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

الشكل 13: مخطّط بياني للتفاعلات بين وحدات Tuner 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: مخطّط بياني لترابط فلتر لطبقات متعددة

أداة إدارة الموارد في أداة الضبط

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

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

واجهة إدارة المخاطر

يعرِض 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

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

تحسب ميزة إدارة المخاطر أولوية العميل باستخدام المَعلمات من ملف العميل التعريفي وقيمة الأولوية من ملف الضبط. قد تتم أيضًا تعديل الأولوية باستخدام قيمة أولوية عشوائية من العميل.

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

يسترجع "نظام إدارة الموارد" رقم تعريف العملية من 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: رسم بياني لآلية الاسترداد في حال حدوث تعارض بين موارد "مُعدِّل الترميز"