على نظام التشغيل Android 11 أو الإصدارات الأحدث، يمكنك استخدام إطار عمل موالف لتقديم محتوى الصوت والفيديو يستخدم إطار العمل الأجهزة من الموردين، مما يجعلها مناسبة لكل من منظومة على الرقاقة (SoC) المنخفضة والعالية التطور. يوفر هذا الإطار طريقة آمنة لتقديم محتوى الصوت والفيديو المحمي بواسطة بيئة تنفيذ موثوقة (TEE) ومسار وسائط آمن (SMP)، ما يسمح الاستخدام في بيئة محمية بالمحتوى ومحدودة للغاية
تؤدي الواجهة الموحّدة بين Tuner وAndroid CAS إلى توفير تجربة أسرع
التكامل بين مورّدي الموالف ومورّدي خدمات CAS. تعمل واجهة أداة Tuner
مع MediaCodec
وAudioTrack
لإنشاء حلّ شامل لـ Android TV.
تتوافق واجهة الموالف مع كل من التلفزيون الرقمي والتلفزيون التناظري استنادًا إلى
معايير البث.
المكوّنات
بالنسبة إلى نظام التشغيل Android 11، هناك ثلاثة مكونات خاصة مصمم لمنصة التلفزيون.
- Tuner HAL: واجهة بين إطار العمل والمورّدين
- Tuner SDK API: واجهة بين إطار العمل والتطبيقات
- مدير موارد الموالف (TRM): تنسيق موارد الأجهزة الخاصة بموالف الموالف
بالنسبة إلى نظام التشغيل 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
- ساعة عادية
تتوافق الواجهة الأمامية في نظام التشغيل Android 12 مع Tuner HAL 1.1 أو الإصدارات الأحدث مع معيار DTV أدناه.
- التحكم في النطاق الرقمي (DTMB)
يتوافق Demux مع بروتوكولات البث أدناه.
- البث المباشر (TS)
- بروتوكول نقل وسائط MPEG (MMTP)
- بروتوكول الإنترنت (IP)
- قيمة طول النوع (TLV)
- بروتوكول طبقة الرابط ATSC (ALP)
يدعم برنامج فك ترميز المحتوى إجراءات حماية المحتوى أدناه.
- مسار وسائط آمن
- محو مسار الوسائط
- تأمين السجلّ المحلي
- التشغيل المحلي الآمن
تتوافق واجهات برمجة التطبيقات Tuner API مع حالات الاستخدام أدناه.
- فحص
- مباشر
- التشغيل
- تسجيل
يتيح التوليف وMediaCodec
وAudioTrack
استخدام أوضاع تدفق البيانات أدناه.
- حمولة ES مع محو ذاكرة التخزين المؤقت
- حمولة البيانات ES مع مؤشر أمان الذاكرة
- رؤية العالم المحيط
التصميم العام
يتم تحديد HAL الموالف بين إطار عمل Android وإطار عمل البائع الأجهزة.
- يصف ما يتوقعه إطار العمل من البائع وكيف يمكن أن القيام بذلك.
- تصدِّر وظائف الواجهة الأمامية وإزالة فك التشفير وفك تشذيب البيانات إلى
إطار عمل من خلال
IFrontend
وIDemux
وIDescrambler
وIFilter
وIDvr
وILnb
واجهة. - يتضمن الدوال الخاصة بدمج Tuner HAL مع إطار العمل الآخر.
مثل
MediaCodec
وAudioTrack
.
يتم إنشاء فئة Tuner Java وفئة أصلية.
- تسمح واجهة برمجة التطبيقات Tuner Java API للتطبيقات بالوصول إلى Tuner HAL من خلال واجهات برمجة التطبيقات العامة.
- تتيح الفئة الأصلية التحكم في الأذونات والتعامل مع الكميات الكبيرة من تسجيل البيانات أو تشغيلها باستخدام طبقة تجريد الأجهزة (HAL) الخاصة بموالف
- وحدة الموالف الأصلي هي عبارة عن جسر بين فئة أداة Tuner Java والأداة الموالف HAL.
يتم إنشاء فئة TRM.
- يدير موارد أداة الضبط المحدودة، مثل Frontend وLNB جلسات CAS وجهاز إدخال تلفزيون من إدخال HAL على التلفزيون.
- يتم تطبيق قواعد لاسترداد موارد غير كافية من التطبيقات. القاعدة التلقائية هي الفوز في المقدّمة.
تم تحسين CAS وCAS HAL من خلال الميزات الواردة أدناه.
- لفتح جلسات CAS للاستخدامات والخوارزميات المختلفة.
- دعم أنظمة CAS الديناميكية، مثل إزالة CICAM وإدراجه.
- تتكامل مع Tuner HAL من خلال توفير الرموز المميّزة الرئيسية.
تم تحسين MediaCodec
وAudioTrack
من خلال الميزات أدناه.
- يتم استخدام ذاكرة صوت/فيديو آمنة لإدخال المحتوى.
- تم الضبط على مزامنة الصوت والصورة على الجهاز أثناء التشغيل النفقي.
- تم ضبط التوافق مع
ES_payload
ووضع العبور.
الشكل 2. مخطّط بياني للمكونات داخل طبقة تجريد الأجهزة (HAL) للموالف
سير العمل العام
توضّح الرسومات البيانية أدناه تسلسلات المكالمات لتشغيل البث المباشر.
ضبط إعدادات الجهاز
الشكل 3. إعداد التسلسل لتشغيل البث المباشر
التعامل مع الصوت والصورة
الشكل 4. معالجة الصوت والفيديو لتشغيل البث المباشر
التعامل مع المحتوى المشفَّر
الشكل 5. معالجة المحتوى المشفَّر لتشغيل البث المباشر
معالجة بيانات الصوت والفيديو
الشكل 6. جارٍ معالجة الصوت والفيديو لتشغيل البث المباشر
واجهة برمجة تطبيقات Tuner SDK
تتعامل واجهة برمجة التطبيقات Tuner SDK API مع كل من 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()
: لإعداد مثيل أداة التوليف من خلال تحديد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
لمعايير التلفزيون الرقمي المختلفة حسب الفئات أدناه.
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
يتوافق معيار DTV التالي مع نظام التشغيل Android 12 مع Tuner HAL 1.1 أو الإصدارات الأحدث.
DtmbFrontendCapabilities
يسترد FrontendInfo
معلومات الواجهة الأمامية.
تسترد الدالة FrontendStatus
الحالة الحالية للواجهة الأمامية.
يرصد تطبيق "OnTuneEventListener
" الأحداث على الواجهة الأمامية.
يستخدم تطبيق TIS ScanCallback
لمعالجة رسائل الفحص من الواجهة الأمامية.
البحث عن القنوات
لإعداد جهاز تلفزيون، يفحص التطبيق الترددات المحتملة للفيديو لإنشاء قناة
للمستخدمين للوصول إليها. قد تستخدم TIS العلامة Tuner.tune
،
Tuner.scan(BLIND_SCAN)
أو Tuner.scan(AUTO_SCAN)
لإكمال القناة
مسح ضوئي.
إذا كانت هناك معلومات تسليم دقيقة في ما يتعلق بالإشارة، مثل معدل التكرار
المعيار (على سبيل المثال، T/T2 وS/S2) والمعلومات الضرورية الإضافية
(على سبيل المثال، PLD ID)، ثم
يُنصَح باستخدام 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
بدءًا من نظام التشغيل Android 12 المزود بالإصدار 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 إلى المخزن المؤقت للعميل. |
تتم تعبئة حزمة واحدة مجمّعة في مؤتمر خبراء المنتجات في 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. التدفق لإنشاء مؤشر 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
.
للإبلاغ عن حالة مسجِّل فيديو رقمي.
مثال على عملية بدء سجلّ
الشكل 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 ويحدد الواجهة بين إطار العمل البائع. يستخدم الموردون الواجهة لتنفيذ طبقة تجريد الأجهزة (HAL) الخاصة بموالف هذا النموذج للتواصل مع تطبيق Tuner HAL.
الوحدات
موالف 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 كخدمة نظام لإدارة جهاز التوليف وTVInput
وأجهزة CAS.
والموارد الخاصة بالتطبيقات. تستخدم TRM ميزة "الفوز في المقدمة" الآلية، التي
تحسب أولوية التطبيق استنادًا إلى مقدمة التطبيق أو خلفيته
الحالة ونوع حالة الاستخدام. تمنح TRM المورد أو إبطاله استنادًا إلى
الأولوية. تستخدم TRM عملية مركزية لإدارة موارد ATV في ما يتعلق بالبث وخدمة البث المباشر على الإنترنت (OTT)
ومسجِّل فيديو رقمي.
واجهة TRM
تعرض TRM واجهات AIDL في ITunerResourceManager.aidl
لأداة الضبط
إطار العمل 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 أولوية العميل باستخدام معلمات من ملف قيمة الملف الشخصي وقيمة الأولوية من ملف التهيئة. قد تكون الأولوية يتم تعديلها أيضًا من خلال قيمة أولوية عشوائية من العميل.
المَعلمات في الملف الشخصي للعميل
تسترد 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
قيمة أولوية عشوائية وقيمة جيدة
توفّر إدارة علاقات العملاء (TRM) السمة updateClientPriority
للعميل لتعديل الإعدادات العشوائية.
قيمة الأولوية والقيمة الجيدة.
تحلّ قيمة الأولوية العشوائية محلّ قيمة الأولوية المحسوبة.
من نوع حالة الاستخدام ومعرّف الجلسة.
تشير القيمة الجيدة إلى مدى التساهل في سلوك العميل عندما يكون في تتعارض مع عميل آخر. تقلل القيمة الجيدة من أولوية العميل قيمتها قبل مقارنة قيمة الأولوية بالعميل المليء بالتحدي.
آلية الاسترداد
يوضح الرسم التخطيطي أدناه كيفية استرداد الموارد وتعيينها عند حدوث تعارض في الموارد.
الشكل 15. مخطّط بياني لآلية الاسترداد في حال حدوث تعارض بين الموالف المراجِع