في الإصدار 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
ووضع العبور.
الشكل 2: مخطّط بياني للمكونات داخل طبقة تجريد الأجهزة (HAL) للموالف
سير العمل العام
توضّح المخططات البيانية أدناه تسلسلات المكالمات لتشغيل البث المباشر.
ضبط إعدادات الجهاز
الشكل 3: تسلسل الإعداد لتشغيل البث المباشر
التعامل مع الصوت والفيديو
الشكل 4: معالجة الصوت والفيديو لتشغيل البث المباشر
التعامل مع المحتوى المشوش
الشكل 5: معالجة المحتوى المشفَّر لتشغيل البث المباشر
معالجة بيانات الصوت والفيديو
الشكل 6: معالجة المحتوى الصوتي والمرئي لتشغيل البث المباشر
Tuner SDK API
تعالج واجهة برمجة التطبيقات Tuner SDK التفاعلات مع أدوات Tuner JNI وTunner HAL
وTunerResourceManager
. يستخدم تطبيق TIS واجهة برمجة التطبيقات Tuner SDK API للوصول إلى موارد Tuner
والمكوّنات الفرعية، مثل الفلتر وجهاز فك التشفير. الواجهة الأمامية و
demux هما مكوّنان داخليان.
الشكل 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
الشكل 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 الإعداد التالي المتاح. وبخلاف ذلك، يستخدم 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 أخرى. |
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::* والجدول الزمني الداخلي، نفِّذ أحد الإجراءات التالية:
|
بالنسبة إلى بيانات الفهرس: يتم نقلها في الحمولة المرتبطة بالحدث. للمحتوى المسجّل: بث لتكنولوجيا البث المباشر المختلَط باستخدام 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: التدفق لإنشاء مؤشر PSI/SI
افتح فلترًا.
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
. - حرر مقبض الصوت والفيديو عند استهلاك البيانات.
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. خطوات بدء سجلّ
افتح
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: مخطّط بياني للتفاعل بين وحدات 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: مخطّط بياني لآلية الاسترداد في حال حدوث تعارض بين موارد أداة الضبط