الفلاتر: داخل الحلقة وخارجها
التكميم يترك آثاراً (مربّعات، رنين)، والمحتوى القديم interlaced، والمصدر قد يكون مشوّشاً. الفلاتر تعالج هذا — لكن أين توضع كلٌّ منها (داخل حلقة الترميز أم بعد الفكّ) قرارٌ معماريّ عميق يميّز الفيديو عن الصورة.
بعد التكميم العنيف تظهر "مربّعات" عند حدود البلوكات (نفس blocking في مسار الصور). تريد تنعيمها. عندك خياران لموضع الفلتر:
(أ) بعد فكّ الإطار للعرض فقط (post-processing). (ب) داخل حلقة المرمّز/الفكّاك، فيصبح الإطار المنعَّم هو المرجع للتنبّؤ التالي.
أيّهما تختار؟ تذكّر من العقدة ٠٣–٠٤: المرمّز والفكّاك يجب أن يبقيا متطابقين وإلا drift. ما أثر كل خيار على تراكم الخطأ عبر GOP؟ ولماذا قد تريد كلا الموضعين لأغراض مختلفة؟
فلاتر داخل الحلقة (in-loop) — حلّ اللغز
الخيار (ب) هو الصحيح للآثار البنيوية: deblocking ينعّم حدود البلوكات داخل الحلقة. لماذا؟ لأن الإطار المرجعيّ المنعَّم أفضل أساساً للتنبّؤ (أقرب للحقيقة)، فيقلّ الباقي، فيتحسّن الضغط والجودة معاً. ولأنه داخل الحلقة، المرمّز والفكّاك يطبّقانه بالتطابق → لا drift.
| الفلتر | الموضع | يعالج |
|---|---|---|
| Deblocking | داخل الحلقة | مربّعات حدود البلوكات |
| CDEF (AV1) | داخل الحلقة | الرنين (ringing) حول الحواف |
| Loop Restoration (AV1) | داخل الحلقة | استعادة تفاصيل بفلاتر Wiener |
| Deinterlace | قبل الترميز / بعد الفكّ | "أسنان المشط" من المحتوى interlaced |
| Denoise | قبل الترميز (pre) | ضجيج المصدر — يحسّن الضغط بطرد عشوائية لا تُضغط |
ضجيج المصدر عشوائيّ — غير قابل للضغط (نظرية المعلومات، مسار الصور العقدة ١): إنتروبيه أقصى. تركه يجبر الكوديك على إنفاق بِتّات على فوضى لا أحد يريدها. تنظيفه قبل الترميز يصغّر الملف ويحسّن الجودة المُدرَكة معاً. هذا قرار "فلتر" بأثر ضغطٍ مباشر — درس يربط الفلاتر بنظرية المعلومات.
لو طبّقت deblocking كـpost-processing فقط (لا داخل الحلقة)، فالمرمّز يتنبّأ من إطارات غير منعّمة بينما الفكّاك يعرض منعّمة — وعلى مدى GOP يتراكم اختلاف المراجع (drift). لهذا الكوديكات الحديثة تجعله in-loop. الخطأ جذره: تجاهل أن مرجع التنبّؤ يجب أن يطابق ما يعرضه الطرفان.
- على إطار مضغوط بجودة منخفضة (من تمرين ٠٤)، نفّذ deblocking بسيطاً: عند كل حدّ بلوك ٨×٨، نعّم البِكسلات المتجاورة عبر الحدّ (متوسّط مشروط بحجم القفزة). قارن بصرياً.
- اختبر in-loop مقابل post: أعِد بناء سلسلة P-frames مرّةً مع deblocking داخل الحلقة (المرجع منعَّم) ومرّةً post فقط. راكم ٢٠ إطاراً وقارن الانحراف — شاهد الـdrift في حالة post.
- نفّذ denoise بسيطاً (متوسّط زمنيّ عبر إطارين متطابقين تقريباً) قبل الترميز، وقِس كم صغّر حجم الملف. اربطه بانخفاض الإنتروبي.
- deinterlace: خذ إطاراً interlaced (ادمج حقلين من لحظتين) وأرِ "أسنان المشط"، ثم أصلِحها باستيفاء بين الحقول.
الفلاتر ثلاثة مواضع: pre (طرد العشوائية، يصغّر الملف)، in-loop (إصلاح آثار التكميم، يغذّي التنبّؤ بلا drift)، post (تجميل العرض). الموضع قرارٌ يحدّد الأثر على الضغط والـdrift. حتى الآن فلاترنا تعالج بلوكات. لكن لبناء فلاتر متقدّمة (إبطاء، تكبير ذكيّ) نحتاج أن نعرف حركة كل بِكسل لا كل بلوك. هذا التدفّق البصري.