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

إصلاح الآثارفلاتر

الفلاتر: داخل الحلقة وخارجها

التكميم يترك آثاراً (مربّعات، رنين)، والمحتوى القديم interlaced، والمصدر قد يكون مشوّشاً. الفلاتر تعالج هذا — لكن أين توضع كلٌّ منها (داخل حلقة الترميز أم بعد الفكّ) قرارٌ معماريّ عميق يميّز الفيديو عن الصورة.

بعد التكميم العنيف تظهر "مربّعات" عند حدود البلوكات (نفس blocking في مسار الصور). تريد تنعيمها. عندك خياران لموضع الفلتر:

(أ) بعد فكّ الإطار للعرض فقط (post-processing). (ب) داخل حلقة المرمّز/الفكّاك، فيصبح الإطار المنعَّم هو المرجع للتنبّؤ التالي.

أيّهما تختار؟ تذكّر من العقدة ٠٣–٠٤: المرمّز والفكّاك يجب أن يبقيا متطابقين وإلا drift. ما أثر كل خيار على تراكم الخطأ عبر GOP؟ ولماذا قد تريد كلا الموضعين لأغراض مختلفة؟

فلاتر داخل الحلقة (in-loop) — حلّ اللغز

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

الفلترالموضعيعالج
Deblockingداخل الحلقةمربّعات حدود البلوكات
CDEF (AV1)داخل الحلقةالرنين (ringing) حول الحواف
Loop Restoration (AV1)داخل الحلقةاستعادة تفاصيل بفلاتر Wiener
Deinterlaceقبل الترميز / بعد الفكّ"أسنان المشط" من المحتوى interlaced
Denoiseقبل الترميز (pre)ضجيج المصدر — يحسّن الضغط بطرد عشوائية لا تُضغط
FIG 1 مواضع الفلاتر الثلاثة في خطّ المعالجة
pre: denoise الكوديك (حلقة)in-loop: deblock/CDEF دفق فكّ post: عرض/تكبير داخل الحلقة ⇒ يصبح مرجعاً للتنبّؤ ⇒ يحسّن الجودة والضغط، بلا drift post ⇒ للعرض فقط
pre-filter يطرد العشوائية قبل الضغط؛ in-loop يصلح آثار التكميم ويغذّي التنبّؤ؛ post يجمّل للعرض. الموضع يحدّد الأثر على الضغط والـdrift.
ليش denoise قبل الترميز يصغّر الملف

ضجيج المصدر عشوائيّ — غير قابل للضغط (نظرية المعلومات، مسار الصور العقدة ١): إنتروبيه أقصى. تركه يجبر الكوديك على إنفاق بِتّات على فوضى لا أحد يريدها. تنظيفه قبل الترميز يصغّر الملف ويحسّن الجودة المُدرَكة معاً. هذا قرار "فلتر" بأثر ضغطٍ مباشر — درس يربط الفلاتر بنظرية المعلومات.

جذر خطأ — تطبيق فلتر بنيويّ كـpost فقط

لو طبّقت deblocking كـpost-processing فقط (لا داخل الحلقة)، فالمرمّز يتنبّأ من إطارات غير منعّمة بينما الفكّاك يعرض منعّمة — وعلى مدى GOP يتراكم اختلاف المراجع (drift). لهذا الكوديكات الحديثة تجعله in-loop. الخطأ جذره: تجاهل أن مرجع التنبّؤ يجب أن يطابق ما يعرضه الطرفان.

  1. على إطار مضغوط بجودة منخفضة (من تمرين ٠٤)، نفّذ deblocking بسيطاً: عند كل حدّ بلوك ٨×٨، نعّم البِكسلات المتجاورة عبر الحدّ (متوسّط مشروط بحجم القفزة). قارن بصرياً.
  2. اختبر in-loop مقابل post: أعِد بناء سلسلة P-frames مرّةً مع deblocking داخل الحلقة (المرجع منعَّم) ومرّةً post فقط. راكم ٢٠ إطاراً وقارن الانحراف — شاهد الـdrift في حالة post.
  3. نفّذ denoise بسيطاً (متوسّط زمنيّ عبر إطارين متطابقين تقريباً) قبل الترميز، وقِس كم صغّر حجم الملف. اربطه بانخفاض الإنتروبي.
  4. deinterlace: خذ إطاراً interlaced (ادمج حقلين من لحظتين) وأرِ "أسنان المشط"، ثم أصلِحها باستيفاء بين الحقول.
الخلاصة

الفلاتر ثلاثة مواضع: pre (طرد العشوائية، يصغّر الملف)، in-loop (إصلاح آثار التكميم، يغذّي التنبّؤ بلا drift)، post (تجميل العرض). الموضع قرارٌ يحدّد الأثر على الضغط والـdrift. حتى الآن فلاترنا تعالج بلوكات. لكن لبناء فلاتر متقدّمة (إبطاء، تكبير ذكيّ) نحتاج أن نعرف حركة كل بِكسل لا كل بلوك. هذا التدفّق البصري.