diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2003-12-01 15:23:14 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2003-12-01 15:23:14 +0000 |
commit | 332f9ac4e31ce5e6d0c42ac9e0229d7d1b2b4d60 (patch) | |
tree | 4ad6a7c4fd0caa012f851d930b5b8e2ff5be9141 /libavcodec/dsputil.c | |
parent | e692c8634cc01c7091d99ec0f58d25715704702b (diff) | |
download | ffmpeg-332f9ac4e31ce5e6d0c42ac9e0229d7d1b2b4d60.tar.gz |
h263 loop filter
fixed h263 modified quantization
CODEC_FLAG_OBMC
Originally committed as revision 2549 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/dsputil.c')
-rw-r--r-- | libavcodec/dsputil.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 35bc1a33cb..3deb9ebdba 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -2261,6 +2261,75 @@ static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){ wmv2_mspel8_v_lowpass(dst, halfH+8, stride, 8, 8); } +static void h263_v_loop_filter_c(uint8_t *src, int stride, int qscale){ + int x; + const int strength= ff_h263_loop_filter_strength[qscale]; + + for(x=0; x<8; x++){ + int d1, d2, ad1; + int p0= src[x-2*stride]; + int p1= src[x-1*stride]; + int p2= src[x+0*stride]; + int p3= src[x+1*stride]; + int d = (p0 - p3 + 4*(p2 - p1)) / 8; + + if (d<-2*strength) d1= 0; + else if(d<- strength) d1=-2*strength - d; + else if(d< strength) d1= d; + else if(d< 2*strength) d1= 2*strength - d; + else d1= 0; + + p1 += d1; + p2 -= d1; + if(p1&256) p1= ~(p1>>31); + if(p2&256) p2= ~(p2>>31); + + src[x-1*stride] = p1; + src[x+0*stride] = p2; + + ad1= ABS(d1); + + d2= clip((p0-p3)/4, -ad1, ad1); + + src[x-2*stride] = p0 - d2; + src[x+ stride] = p3 + d2; + } +} + +static void h263_h_loop_filter_c(uint8_t *src, int stride, int qscale){ + int y; + const int strength= ff_h263_loop_filter_strength[qscale]; + + for(y=0; y<8; y++){ + int d1, d2, ad1; + int p0= src[y*stride-2]; + int p1= src[y*stride-1]; + int p2= src[y*stride+0]; + int p3= src[y*stride+1]; + int d = (p0 - p3 + 4*(p2 - p1)) / 8; + + if (d<-2*strength) d1= 0; + else if(d<- strength) d1=-2*strength - d; + else if(d< strength) d1= d; + else if(d< 2*strength) d1= 2*strength - d; + else d1= 0; + + p1 += d1; + p2 -= d1; + if(p1&256) p1= ~(p1>>31); + if(p2&256) p2= ~(p2>>31); + + src[y*stride-1] = p1; + src[y*stride+0] = p2; + + ad1= ABS(d1)>>1; + + d2= clip((p0-p3)/4, -ad1, ad1); + + src[y*stride-2] = p0 - d2; + src[y*stride+1] = p3 + d2; + } +} static inline int pix_abs16x16_c(uint8_t *pix1, uint8_t *pix2, int line_size) { @@ -3048,6 +3117,9 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx) c->diff_bytes= diff_bytes_c; c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c; c->bswap_buf= bswap_buf; + + c->h263_h_loop_filter= h263_h_loop_filter_c; + c->h263_v_loop_filter= h263_v_loop_filter_c; #ifdef HAVE_MMX dsputil_init_mmx(c, avctx); |