aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/dsputil.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-05-30 21:21:13 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-05-30 21:21:13 +0000
commitfdbbf2e0fc1bb91a5d735a49f39337eb172e68a7 (patch)
tree173022230073f2bcc7d1d3f09bff1fe38168df48 /libavcodec/dsputil.c
parentc6148de2320739d4443fa702f78eac68fc0ab044 (diff)
downloadffmpeg-fdbbf2e0fc1bb91a5d735a49f39337eb172e68a7.tar.gz
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 Originally committed as revision 3177 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/dsputil.c')
-rw-r--r--libavcodec/dsputil.c48
1 files changed, 22 insertions, 26 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 63fb32e426..3e3e550b11 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -2360,32 +2360,29 @@ static void h263_h_loop_filter_c(uint8_t *src, int stride, int qscale){
}
}
-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 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
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;