From fca58a815aa242e707b22db3fce1da44a50ffcd4 Mon Sep 17 00:00:00 2001
From: David Conrad <lessen42@gmail.com>
Date: Sun, 11 Jul 2010 22:52:51 +0000
Subject: vc1: Fix ordering of loop filter for I/B frames

All horizontal edges must be filtered before all vertical edges

Originally committed as revision 24206 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavcodec/vc1dec.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

(limited to 'libavcodec/vc1dec.c')

diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 0d21e1c1a5..8c9cbcd9db 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -162,17 +162,27 @@ enum Imode {
 
 static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
 {
-    int i, j;
-    if(!s->first_slice_line)
+    int j;
+    if (!s->first_slice_line) {
         s->dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
-    s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
-    for(i = !s->mb_x*8; i < 16; i += 8)
-        s->dsp.vc1_h_loop_filter16(s->dest[0] + i, s->linesize, pq);
-    for(j = 0; j < 2; j++){
-        if(!s->first_slice_line)
+        if (s->mb_x)
+            s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
+        s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
+        for(j = 0; j < 2; j++){
             s->dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
-        if(s->mb_x)
-            s->dsp.vc1_h_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
+            if (s->mb_x)
+                s->dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
+        }
+    }
+    s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
+
+    if (s->mb_y == s->mb_height-1) {
+        if (s->mb_x) {
+            s->dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
+            s->dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
+            s->dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
+        }
+        s->dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
     }
 }
 
-- 
cgit v1.2.3