بالنسبة إلى الإصدار 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)
الشكل 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
ووضع "النقل المباشر".
الشكل 2: مخطّط بياني للمكونات ضمن Tuner HAL
سير العمل العام
توضِّح المخططات البيانية أدناه تسلسلات المكالمات لتشغيل البث المباشر.
ضبط إعدادات الجهاز
الشكل 3: تسلسل الإعداد لتشغيل البث المباشر
التعامل مع الصوت والفيديو
الشكل 4: معالجة الصوت والصورة لتشغيل البث المباشر
التعامل مع المحتوى المشوش
الشكل 5: التعامل مع المحتوى المشفَّر لتشغيل البث المباشر
معالجة بيانات الصوت والفيديو
الشكل 6: معالجة المحتوى الصوتي والمرئي لتشغيل البث المباشر
Tuner SDK API
تعالج واجهة برمجة التطبيقات Tuner SDK API التفاعلات مع Tuner JNI وTuner HAL
وTunerResourceManager
. يستخدم تطبيق TIS واجهة برمجة التطبيقات Tuner SDK API للوصول إلى موارد Tuner
والمكوّنات الفرعية، مثل الفلتر وجهاز فك التشفير. الواجهة الأمامية و
demux هما مكوّنان داخليان.
الشكل 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
الشكل 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 الإعداد التالي المتاح. بخلاف ذلك، يستخدم HALFrontendSettings
لفحص لمرة واحدة ويرسل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()
لإيقاف الفحص مؤقتًا أو إنهائه.
الشكل 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: |
مطلوبة:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW مُقترَحة: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
وفقًا للحدث والجدول الزمني الداخلي، يمكنك تنفيذFilter.read(buffer, offset, adjustedSize) مرة واحدة أو أكثر.يتم نسخ البيانات من MQ في HAL إلى ذاكرة التخزين المؤقت للعميل. |
يتم ملء حزمة جلسة مجمّعة واحدة في FMQ بحزمة جلسة أخرى. |
isRaw: |
سمات إلزامية:DemuxFilterEvent::DemuxFilterSectionEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW سمات اختيارية: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ يتم نسخ البيانات من MQ في HAL إلى ذاكرة التخزين المؤقت للعميل. |
||
TS.PES |
isRaw: |
مطلوبة:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW مُقترَحة: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
وفقًا للحدث والجدول الزمني الداخلي، يمكنك تنفيذFilter.read(buffer, offset, adjustedSize) مرة واحدة أو أكثر.يتم نسخ البيانات من MQ في HAL إلى ذاكرة التخزين المؤقت للعميل. |
يتم ملء حزمة PES مجمّعة واحدة في FMQ بحزمة PES أخرى |
isRaw: |
سمات إلزامية:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW سمات اختيارية: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ يتم نسخ البيانات من MQ في HAL إلى ذاكرة التخزين المؤقت للعميل. |
||
MMTP.PES |
isRaw: |
مطلوبة:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW مُقترَحة: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
وفقًا للحدث والجدول الزمني الداخلي، يمكنك تنفيذFilter.read(buffer, offset, adjustedSize) مرة واحدة أو أكثر.يتم نسخ البيانات من MQ في HAL إلى ذاكرة التخزين المؤقت للعميل. |
يتم ملء حزمة MFU مجمّعة واحدة في FMQ بحزمة MFU أخرى. |
isRaw: |
سمات إلزامية:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW سمات اختيارية: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ يتم نسخ البيانات من 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: |
اختياري:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
يمكن للعميل بدء MediaCodec بعد استلام DemuxFilterStatus::DATA_READY .يمكن للعميل الاتصال بـ Filter.flush بعد تلقّي DemuxFilterStatus::DATA_OVERFLOW . |
لا ينطبق |
isPassthrough: |
سمات إلزامية:DemuxFilterEvent::DemuxFilterMediaEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW سمات اختيارية: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
لاستخدام MediaCodec :for i=0; i<n; i++ لاستخدام ميزة "الصوت المباشر" في AudioTrack :for i=0; i<n; i++ |
بيانات 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++ بالنسبة إلى المحتوى المسجّل، عليك تنفيذ أحد الإجراءات التالية، وفقًا لـ RecordStatus::* والجدول الزمني الداخلي:
|
بالنسبة إلى بيانات الفهرس: يتم نقلها في الحمولة البرمجية للحدث. بالنسبة إلى المحتوى المسجّل: بث 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++ |
لا ينطبق |
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++ بالنسبة إلى المحتوى المسجّل، عليك اتّخاذ أحد الإجراءَين التاليَين وفقًا لجدول أعمال RecordStatus::* والجدول الزمني الداخلي:
|
بالنسبة إلى بيانات الفهرس: يتم نقلها في الحمولة البرمجية للحدث. بالنسبة إلى المحتوى المسجّل: يتم ملء البث المسجّل المُدمَج في 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: |
اختياري:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
يغذّي البث الفرعي للبروتوكول الذي تمّت فلترته الفلتر التالي في سلسلت الفلاتر. | لا ينطبق |
isPassthrough: |
مطلوبة: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
الشكل 10: خطوات إنشاء مؤشر معايير التلوّث أو مؤشر جودة الهواء
افتح فلترًا.
Filter filter = tuner.openFilter( Filter.TYPE_TS, Filter.SUBTYPE_SECTION, /* bufferSize */1000, executor, filterCallback );
اضبط الفلتر وابدأه.
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();
عالج
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 من الفلتر
الشكل 11: مسار استخدام MediaEvent من الفلتر
- افتح فلاتر الصوت والفيديو وضبطها وتشغيلها.
- عالج
MediaEvent
. - استلم
MediaEvent
. - أضِف مجموعة الإعلانات المتسلسلة إلى "قائمة المحتوى التالي" في
codec
. - اترك معرّف 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: خطوات بدء التسجيل
افتح
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();
تلقّي
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. } } } };
ابدأ
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 |
الشكل 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: رسم بياني لآلية الاسترداد في حال حدوث تعارض بين موارد "مُعدِّل الترميز"