الخلاصة

  • تقدم RFC 9628 عقدين لوصف اعتماد صور VP9: يحمل الوضع المرن ما يصل إلى ثلاثة فروق P_DIFF مع الصورة المتنبأ بها، بينما يعلن الوضع غير المرن Picture Group دورية في بيانات SS.
  • تصف Picture ID وحقول الطبقة والمراجع وعلامات البداية والنهاية البنية التي يصرح بها المرسل؛ ولا تثبت وصول كل أجزاء RTP أو وجود الصور المرجعية أو سلامة حالة codec الداخلية أو العرض المرئي.
  • يجمع الإيصال التشغيلي بين سياق SDP وعصر الوضع والبنية وتغطية الحزم وانغلاق المراجع الفعلية وفحص bitstream ونتيجة decoder وقرار playout.

في تقرير الحادث كانت الأسهم كلها متصلة. أعاد المحلل بناء كل مرجع من Picture ID، وطابقت الطبقات النمط المعلن، ووصلت الحزمة التي تحمل Marker. لذلك قيل إن الصورة اكتملت.

أما decoder فلم يكن يملك إحدى الصور التي تشير إليها الأسهم.

لا تناقض هنا. تحدد RFC 9628 كيفية نقل VP9 في RTP وإظهار طبقات الفيديو القابلة للتدرج. إنها تجعل بنية الاعتماد قابلة للقراءة، لكنها لا تمنح header معرفة بما بقي في ذاكرة المستقبل أو بما عُرض على الشاشة.

في الوضع المرن يسافر المرجع مع الصورة

عندما يكون F=1 تصبح Picture ID إلزامية. تحمل الصورة المتنبأ بها حقلاً واحداً إلى ثلاثة حقول P_DIFF. يطرح كل فرق من PID الحالي ضمن فضاء سبعة أو خمسة عشر بتاً ليحدد صورة سابقة. الصفر غير صالح.

يسمح ذلك للمرمّز بتغيير هرمه الزمني من دون انتظار استبدال نمط ثابت. يقرأ receiver أو middlebox المراجع المعلنة للصورة الحالية مباشرة من descriptor.

لكن الرقم لا يحمل الصورة المرجعية معه. قد تكون فُقدت، أو حذفها SFU حذفاً مسموحاً، أو خرجت من buffer. وقد تكون الصورة الحالية نفسها فقدت حزمة بين B وE. يمكن أن يكون P_DIFF صحيحاً تماماً وأن يشير إلى موضع فارغ.

لهذا يجب مقارنة خريطتين: ما أعلنه sender وما يحتفظ به decoder فعلاً. إذا استُبدلت الثانية بالأولى تحولت معرفة المرسل إلى ادعاء عن مستقبل بعيد.

في الوضع غير المرن يقيم المعنى في تاريخ مشترك

عندما يكون F=0 تستطيع بيانات Scalability Structure وصف Picture Group متكررة. تسجل لكل موضع TID ونقطة الصعود وفروق المراجع. تثبت صورة المفتاح الموضع الأول، ثم تتحرك PIDs داخل المجموعة بترديد N_G.

يتابع TL0PICIDX صور الطبقة الزمنية الصفرية. يزيد عند TID=0، ويحدد للطبقات الأعلى صورة الأساس التي تعتمد عليها. وبصفته حقلاً من ثمانية بتات يعود إلى الصفر بعد 255.

يوفر هذا الأسلوب bytes لكنه يحتاج ذاكرة مشتركة. قد تبدأ أداة الالتقاط بعد إعلان SS. وقد يستأنف relay بعد إعادة تشغيله تدفق packets من دون استعادة مرساة key picture. وقد تملك جهتان الجدول نفسه وتختلفان في موضع واحد داخل الدورة.

لذلك يقيد المعيار التغيير: لا يتبدل F إلا في أول packet من key picture، ولا تبدأ بنية جديدة إلا عند الحد الذي تسمح به البنية السابقة. يجب حفظ هذه الحدود كعصر: hash لـSS، والحزمة التي أدخلته، وPID المرساة، وN_G، والطور المحسوب. جدول بلا تاريخ نفاذ لا يكفي لتفسير packet لاحقة.

Picture ID إحداثي محلي لا هوية دائمة

قد تكون PID سبعة أو خمسة عشر بتاً، وتبدأ عشوائياً، وتلتف عند النهاية، وقد يتغير عرضها أثناء الجلسة. الانتقال إلى خمسة عشر بتاً يمدد القيمة بأصفار، والعودة إلى سبعة تقطعها. لا يجوز للreceiver افتراض عرض ثابت.

تشترك كل frames المكانية في picture واحدة في PID. وحتى picture ذات show_frame=0، التي تحدث مرجعاً ولا تُعرض، تحصل على رقم مستقل. لذلك لا تعد PID الصور التي شاهدها الإنسان.

يمكن للوسيط أيضاً حذف pictures وفق بنية التدرج، فلا يلزم أن تكون PIDs المستلمة متجاورة. قد تعني الفجوة قرار اختيار لا loss. أما التجاور فلا يكشف حزمة مفقودة داخل frame واحدة.

مفتاح التحقيق الكامل يضم session وSSRC وtimestamp وعرض PID وقيمتها وعصر الوضع والطبقة ونقطة الرصد. إذا بقي الرقم وحده فسيتكرر بعد wrap ويحمل معنى حادثة أخرى.

علامة النهاية تحدد الحد ولا تملأ الفراغ

تبدأ VP9 frame بحزمة B=1 وتنتهي بحزمة E=1. توضع RTP Marker في آخر حزمة من أعلى frame مكاني في picture. وإذا حذف forwarder الطبقات الأعلى فعليه نقل Marker إلى آخر حزمة من الطبقة التي أبقاها.

هذه قواعد للحدود. لا تثبت وجود كل ما بينها. قد تصل E بعد غياب sequence number وسطية. وقد تصل Marker فيما الطبقة الدنيا المطلوبة بسبب D=1 ناقصة. ويمكن أن تكون إعادة كتابة Marker صحيحة مع فقد مرجع زمني أقدم.

لا يقدم التنسيق وصولاً أدق إلى جزء من VP9 frame. لذلك يحتاج وصف الاكتمال إلى تغطية RTP من B حتى E، وtimestamp موحد، وترتيب مكاني صحيح، وMarker مناسب بعد الاختيار. رؤية الباب الأخير لا تثبت مرور كل الشحنة.

تخفي VP9 حالة لا ترسمها الأسهم

يعتمد codec أيضاً على جداول احتمالات للترميز الانتروبي والشجري. يعيد error_resilient_mode ضبط هذه الحالة الإضافية. وفي stream قابل للتدرج يجب ألا يترك frame يمكن حذفه قانوناً حالة إلزامية تحتاج إليها frames اللاحقة.

هنا تنتهي سلطة فاحص headers وحده. قد تنغلق كل روابط P_DIFF ويصح طور المجموعة، ومع ذلك يعتمد payload على جدول مفقود. تحدد مواصفة bitstream لـVP9 المعنى الداخلي، ويقدم decoder العامل دليلاً آخر على التنفيذ.

فحص descriptor وفحص bitstream ونتيجة decode ثلاث طبقات مختلفة. إذا منحنا الأولى حق التوقيع عن البقية فقدنا القدرة على تحديد موضع الفشل.

تمنح حقول الطبقة إذناً محدوداً

تسمي TID وSID الطبقة الزمنية والمكانية. يعلن D اعتماد frame على الطبقة المكانية الأدنى مباشرة في picture نفسها. يعلن U نقطة صعود لا تعتمد بعدها الطبقات الزمنية الأعلى على بعض الصور القديمة. ويعلن Z أن الطبقات المكانية الأعلى لا تعتمد على frame الحالي، فيمكن لمستقبل يستهدف الأعلى أن يحذفه.

لا يحمل أي منها حكماً على التجربة. لا يثبت U=1 أن نقطة التحول وصلت. ولا يثبت Z=1 أن الحذف وافق جودة المستخدم. ولا يعني SID=2 دقة مطلقة. ويزيل D=0 رابطاً مكانياً واحداً من دون إزالة المراجع الزمنية.

يجب أن يسجل SFU فعله: الطبقة المستهدفة، والقاعدة، وما مرره أو حذفه، وإعادة كتابة Marker، وسبب congestion. حفظ البت الذي سمح بالفعل وحده يمحو صاحب القرار.

يقترب RPSI من decoder ولا يصل إلى الشاشة

يستطيع receiver إرسال RPSI يحمل PID لـgolden frame أو altref frame فك ترميزها بصورة صحيحة، أو اقتراح مرجع مفضل بعد loss. هذا أقوى من قراءة PID أرسلها الطرف الآخر، لأنه يصدر بعد محاولة decoding.

لكن موضوعه ضيق. لا يثبت أن كل الطبقات المكانية أصبحت متاحة، أو أن التطبيق اختار picture للـplayout، أو أن العرض وقع قبل الموعد. يطلب FIR تحديثاً كاملاً، ويطلب LRR تحديث طبقة محددة. لا تتحول أوامر التحديث أو القدرة على تتبع الروابط إلى إيصال بصري.

يمتلك مقال RFC 9627 المسافة بين الأمر والتعافي. ويمتلك هذا المقال المسافة بين وصف اعتماد VP9 والمرجع الموجود ونتيجة decoder والشاشة.

يسبق قاموس SDP كل حقل في descriptor

يربط SDP VP9 بـdynamic payload type وساعة 90 kHz. يجب أن يكون profile-id متناظراً بين offer وanswer، وغيابه يعني Profile 0. أما max-fr وmax-fs فهما إعلان لقدرة receiver لا قياس لما استلمه.

يقر المعيار بأن pre-encoded media أو selective forwarding قد لا يملك نسخة تناسب الحدود تماماً. لذلك لا يثبت قبول offer أن كل frame لاحقة وافقت القدرة أو نجح فكها.

يبدأ الإيصال من offer وanswer وpayload mapping وprofile والقدرات وSSRC وكل renegotiation. قد ينجح parser في قراءة descriptor وفق قاموس جلسة قديم، فتكون البنية صحيحة والصياغة التشغيلية خاطئة.

المصادر