VIDEO·CODEC
الفيديو · العقدة 03
↩ البوابة

الباقي صورة خطأيبني على مسار الصور

التحويل والتكميم للباقي

بعد التنبّؤ (الزمني بالحركة، أو المكاني intra)، يبقى الباقي — صورة خطأ صغيرة. ماذا نفعل بها؟ نعاملها بكل ما تعلّمناه في مسار الصور: تحويل لمجال التردد، تكميم، ترميز. لكن مع لمسات تخصّ الفيديو.

الباقي بعد تعويض الحركة ليس "صورة طبيعية" — هو غالباً قيمٌ صغيرة متناثرة، وأحياناً حوافّ حادّة حيث فشل التنبّؤ (حافة جسم متحرّك).

تعرف من مسار الصور أن DCT يركّز طاقة الصور الطبيعية. لكن هل DCT أمثل لـالباقي؟ وإذا كان الكوديك سيُنفَّذ على ملايين الأجهزة (هواتف، تلفزيونات)، فهل تريد DCT بأعداد عشرية (float) قد تختلف نتيجته من معالج لآخر — فينحرف الفكّاك عن المرمّز؟ ما البديل الذي يضمن تطابقاً بِتّياً عبر كل الأجهزة؟

التحويل على الباقي — نفس DCT بمنطق مختلف

نطبّق تحويلاً (DCT أو شبيهه) على بلوكات الباقي تماماً كـJPEG: يركّز الطاقة في معاملات قليلة، فالتكميم يرمي الترددات العالية للباقي (التي تخفيها العين)، ثم zig-zag + ترميز إنتروبي. الفرق الجوهري: الإدخال هنا خطأ تنبّؤ لا بِكسلات أصلية — فطاقته أقلّ بكثير أصلاً، فالضغط أعلى.

إطار حالي → تنبّؤ (حركة [٠٢] أو intra مكاني) → أفضل تطابق → residual = الحالي − التنبّؤ (إشارة خطأ منخفضة الطاقة) → transform (DCT/integer) [مسار الصور] → تركيز الطاقة → quantize → الخسارة (نموذج العين) → zig-zag + entropy (CABAC) [٠٥] → بِتّات + المتّجهات + أوضاع التنبّؤ

التحويلات الصحيحة — حلّ اللغز

ليش integer transform بدل DCT العشري

DCT الكلاسيكي يستعمل cos (أعداد غير نسبية) → نتائج float قد تختلف بين معالجٍ وآخر بفروق تقريب دقيقة. في الفيديو هذا كارثة: الفكّاك يبني تنبّؤه على إطارات أعاد بناءها؛ أي انحراف بِتّيّ بينه وبين المرمّز يتراكم عبر GOP (drift) فينهار المشهد. لذا H.264 وما بعده تستعمل تحويلاً صحيحاً (integer transform) — تقريب لـDCT بأعداد صحيحة فقط، يضمن تطابقاً بِتّياً عبر كل جهاز. مقايضة: دقّة تردد أقل قليلاً مقابل حتمية تامّة. هذا درس معماريّ لا تحتاجه الصورة المنفردة (لا drift فيها).

الجانبصورة (JPEG)فيديو (H.264+)
مدخل التحويلبِكسلات أصليةباقي تنبّؤ (طاقة أقل)
نوع التحويلDCT عشري 8×8تحويل صحيح 4×4/8×8+ (حتمي)
أحجام البلوكثابت غالباًمتغيّرة (quadtree)
القلق من driftلا يوجدحاسم (إطارات مرجعية معاد بناؤها)
الحلقة المغلقة — المرمّز يفكّ بنفسه

لتجنّب drift، يحتوي المرمّز فكّاكاً داخله: يعيد بناء الإطار المرجعي بالضبط كما سيراه الفكّاك (بعد التكميم وفقده)، ويتنبّأ منه — لا من الأصل. هذا "الحلقة المغلقة" (closed-loop). تذكّر in-loop filtering من مسار الصور (العقدة ٦): نفس المبدأ — المرمّز والفكّاك يجب أن يبقيا متطابقين خطوةً بخطوة.

  1. خذ الباقي (residual) من تمرين العقدة ٠٢. طبّق عليه DCT 8×8 (أعِد استخدام كودك من مسار الصور) + تكميم + zig-zag + Huffman.
  2. قارن: حجم (باقٍ مضغوط + متّجهات) للإطار P مقابل حجم الإطار I (intra مضغوط). يجب أن يكون P أصغر بكثير.
  3. أرِ الـdrift بنفسك: ابنِ سلسلة P طويلة، وتنبّأ مرّةً من الإطار الأصلي ومرّةً من الإطار المعاد بناؤه (المكمَّم). راكم ٢٠ إطاراً. قارن — النسخة التي تنبّأت من الأصل ستنحرف بصرياً عن الفكّاك. هذا لماذا الحلقة مغلقة.
الخلاصة

الباقي يُعامَل كصورة خطأ: تحويل + تكميم + ترميز (مسار الصور بالكامل). لكن الفيديو يفرض تحويلاً صحيحاً (حتمية بِتّية) وحلقة مغلقة (تنبّؤ من المعاد بناؤه) لتفادي drift. الآن نملك كل القطع: تنبّؤ + تحويل + تكميم. حان وقت تركيبها في الكوديك الهجين الكامل، وتتبّع تطوّره عبر ثلاثين سنة.