changeset 2045:9447bbd8a7e9 libavcodec

rewrite h261 loop filter no malloc(64) memcpy free stuff no filter1 A->B then filter2 A->B (yes not B->A) no incorrect rouding after the 1d filter
author michael
date Sun, 30 May 2004 21:21:13 +0000
parents b6f2add2511e
children 863ce5459aec
files dsputil.c dsputil.h h261.c
diffstat 3 files changed, 30 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/dsputil.c	Sun May 30 20:37:15 2004 +0000
+++ b/dsputil.c	Sun May 30 21:21:13 2004 +0000
@@ -2360,32 +2360,29 @@
     }
 }
 
-static void h261_v_loop_filter_c(uint8_t *dest,uint8_t *src, int stride){
-    int i,j,xy,yz;
-    int res;
-    for(i=0; i<8; i++){
-        for(j=1; j<7; j++){
-            xy = j * stride + i;
-            yz = j * 8 + i;
-            res = (int)src[yz-1*8] + ((int)(src[yz+0*8]) * 2) + (int)src[yz+1*8];
-            res +=2;
-            res >>=2;
-            dest[xy] = (uint8_t)res;
+static void h261_loop_filter_c(uint8_t *src, int stride){
+    int x,y,xy,yz;
+    int temp[64];
+
+    for(x=0; x<8; x++){
+        temp[x      ] = 4*src[x           ];
+        temp[x + 7*8] = 4*src[x + 7*stride];
+    }
+    for(y=1; y<7; y++){
+        for(x=0; x<8; x++){
+            xy = y * stride + x;
+            yz = y * 8 + x;
+            temp[yz] = src[xy - stride] + 2*src[xy] + src[xy + stride];
         }
     }
-}
-
-static void h261_h_loop_filter_c(uint8_t *dest,uint8_t *src, int stride){
-    int i,j,xy,yz;
-    int res;    
-    for(i=1; i<7; i++){
-        for(j=0; j<8; j++){
-            xy = j * stride + i;
-            yz = j * 8 + i;
-            res = (int)src[yz-1] + ((int)(src[yz]) *2) + (int)src[yz+1];
-            res+=2;
-            res>>=2;
-            dest[xy] = (uint8_t)res;
+        
+    for(y=0; y<8; y++){
+        src[  y*stride] = (temp[  y*8] + 2)>>2;
+        src[7+y*stride] = (temp[7+y*8] + 2)>>2;
+        for(x=1; x<7; x++){
+            xy = y * stride + x;
+            yz = y * 8 + x;
+            src[xy] = (temp[yz-1] + 2*temp[yz] + temp[yz+1] + 8)>>4;
         }
     }
 }
@@ -3325,8 +3322,7 @@
     c->h263_h_loop_filter= h263_h_loop_filter_c;
     c->h263_v_loop_filter= h263_v_loop_filter_c;
     
-    c->h261_h_loop_filter= h261_h_loop_filter_c;
-    c->h261_v_loop_filter= h261_v_loop_filter_c;
+    c->h261_loop_filter= h261_loop_filter_c;
     
     c->try_8x8basis= try_8x8basis_c;
     c->add_8x8basis= add_8x8basis_c;
--- a/dsputil.h	Sun May 30 20:37:15 2004 +0000
+++ b/dsputil.h	Sun May 30 21:21:13 2004 +0000
@@ -261,8 +261,7 @@
     void (*h263_v_loop_filter)(uint8_t *src, int stride, int qscale);
     void (*h263_h_loop_filter)(uint8_t *src, int stride, int qscale);
 
-    void (*h261_v_loop_filter)(uint8_t *dest,uint8_t *src, int stride);
-    void (*h261_h_loop_filter)(uint8_t *dest,uint8_t *src, int stride);
+    void (*h261_loop_filter)(uint8_t *src, int stride);
 
     /* (I)DCT */
     void (*fdct)(DCTELEM *block/* align 16*/);
--- a/h261.c	Sun May 30 20:37:15 2004 +0000
+++ b/h261.c	Sun May 30 21:21:13 2004 +0000
@@ -64,44 +64,13 @@
     uint8_t *dest_y = s->dest[0];
     uint8_t *dest_cb= s->dest[1];
     uint8_t *dest_cr= s->dest[2];
-    uint8_t *src;
-
-    CHECKED_ALLOCZ((src),sizeof(uint8_t) * 64 );
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_y+i*linesize,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_y, src, linesize);
-    s->dsp.h261_h_loop_filter(dest_y, src, linesize);
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_y+i*linesize + 8,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_y + 8, src, linesize);
-    s->dsp.h261_h_loop_filter(dest_y + 8, src, linesize);
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_y+(i+8)*linesize,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_y + 8 * linesize, src, linesize);
-    s->dsp.h261_h_loop_filter(dest_y + 8 * linesize, src, linesize);
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_y+(i+8)*linesize + 8,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_y + 8 * linesize + 8, src, linesize);
-    s->dsp.h261_h_loop_filter(dest_y + 8 * linesize + 8, src, linesize);
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_cb+i*uvlinesize,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_cb, src, uvlinesize);
-    s->dsp.h261_h_loop_filter(dest_cb, src, uvlinesize);
-
-    for(i=0; i<8;i++)
-        memcpy(src+i*8,dest_cr+i*uvlinesize,sizeof(uint8_t) * 8 );
-    s->dsp.h261_v_loop_filter(dest_cr, src, uvlinesize);
-    s->dsp.h261_h_loop_filter(dest_cr, src, uvlinesize);
-
-fail:
-    av_free(src);
-
-    return;
+    
+    s->dsp.h261_loop_filter(dest_y                   , linesize);
+    s->dsp.h261_loop_filter(dest_y                + 8, linesize);
+    s->dsp.h261_loop_filter(dest_y + 8 * linesize    , linesize);
+    s->dsp.h261_loop_filter(dest_y + 8 * linesize + 8, linesize);
+    s->dsp.h261_loop_filter(dest_cb, uvlinesize);
+    s->dsp.h261_loop_filter(dest_cr, uvlinesize);
 }
 
 static int h261_decode_block(H261Context *h, DCTELEM *block,