diff options
author | Nathan Caldwell <saintdev@gmail.com> | 2009-10-06 16:06:15 +0000 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at> | 2009-10-06 16:06:15 +0000 |
commit | 73c6f59830458675e7aef117f0e2ab2c39eb4300 (patch) | |
tree | 7b1fb5c96ceb485ad41a4e671e1bc92bd3c8472d | |
parent | 95ce961d886668bb713094bd0f71b40925cf680f (diff) | |
download | ffmpeg-73c6f59830458675e7aef117f0e2ab2c39eb4300.tar.gz |
Move HuffYUV left prediction to dsputil.
Patch by Nathan Caldwell, saintdev gmail
Originally committed as revision 20179 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/dsputil.c | 55 | ||||
-rw-r--r-- | libavcodec/dsputil.h | 2 | ||||
-rw-r--r-- | libavcodec/huffyuv.c | 77 |
3 files changed, 75 insertions, 59 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 894e592aa6..70110dfea9 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -3608,6 +3608,59 @@ static void sub_hfyu_median_prediction_c(uint8_t *dst, uint8_t *src1, uint8_t *s *left_top= lt; } +static int add_hfyu_left_prediction_c(uint8_t *dst, uint8_t *src, int w, int acc){ + int i; + + for(i=0; i<w-1; i++){ + acc+= src[i]; + dst[i]= acc; + i++; + acc+= src[i]; + dst[i]= acc; + } + + for(; i<w; i++){ + acc+= src[i]; + dst[i]= acc; + } + + return acc; +} + +#if HAVE_BIGENDIAN +#define B 3 +#define G 2 +#define R 1 +#else +#define B 0 +#define G 1 +#define R 2 +#endif +static inline void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){ + int i; + int r,g,b; + r= *red; + g= *green; + b= *blue; + + for(i=0; i<w; i++){ + b+= src[4*i+B]; + g+= src[4*i+G]; + r+= src[4*i+R]; + + dst[4*i+B]= b; + dst[4*i+G]= g; + dst[4*i+R]= r; + } + + *red= r; + *green= g; + *blue= b; +} +#undef B +#undef G +#undef R + #define BUTTERFLY2(o1,o2,i1,i2) \ o1= (i1)+(i2);\ o2= (i1)-(i2); @@ -4737,6 +4790,8 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx) c->diff_bytes= diff_bytes_c; c->add_hfyu_median_prediction= add_hfyu_median_prediction_c; c->sub_hfyu_median_prediction= sub_hfyu_median_prediction_c; + c->add_hfyu_left_prediction = add_hfyu_left_prediction_c; + c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c; c->bswap_buf= bswap_buf; #if CONFIG_PNG_DECODER c->add_png_paeth_prediction= ff_add_png_paeth_prediction; diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index dd7b22d537..b7dc9e1ee3 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -349,6 +349,8 @@ typedef struct DSPContext { */ void (*sub_hfyu_median_prediction)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top); void (*add_hfyu_median_prediction)(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top); + int (*add_hfyu_left_prediction)(uint8_t *dst, uint8_t *src, int w, int acc); + void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue); /* this might write to dst[w] */ void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp); void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w); diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index f8b55c4c60..32a6c0b296 100644 --- a/libavcodec/huffyuv.c +++ b/libavcodec/huffyuv.c @@ -129,47 +129,6 @@ static const unsigned char classic_add_chroma[256] = { 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2, }; -static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){ - int i; - - for(i=0; i<w-1; i++){ - acc+= src[i]; - dst[i]= acc; - i++; - acc+= src[i]; - dst[i]= acc; - } - - for(; i<w; i++){ - acc+= src[i]; - dst[i]= acc; - } - - return acc; -} - -static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){ - int i; - int r,g,b; - r= *red; - g= *green; - b= *blue; - - for(i=0; i<w; i++){ - b+= src[4*i+B]; - g+= src[4*i+G]; - r+= src[4*i+R]; - - dst[4*i+B]= b; - dst[4*i+G]= g; - dst[4*i+R]= r; - } - - *red= r; - *green= g; - *blue= b; -} - static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){ int i; if(w<32){ @@ -1035,10 +994,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac case LEFT: case PLANE: decode_422_bitstream(s, width-2); - lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); + lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); if(!(s->flags&CODEC_FLAG_GRAY)){ - leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); - leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); + leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); + leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); } for(cy=y=1; y<s->height; y++,cy++){ @@ -1049,7 +1008,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac ydst= p->data[0] + p->linesize[0]*y; - lefty= add_left_prediction(ydst, s->temp[0], width, lefty); + lefty= s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty); if(s->predictor == PLANE){ if(y>s->interlaced) s->dsp.add_bytes(ydst, ydst - fake_ystride, width); @@ -1065,10 +1024,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac vdst= p->data[2] + p->linesize[2]*cy; decode_422_bitstream(s, width); - lefty= add_left_prediction(ydst, s->temp[0], width, lefty); + lefty= s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty); if(!(s->flags&CODEC_FLAG_GRAY)){ - leftu= add_left_prediction(udst, s->temp[1], width2, leftu); - leftv= add_left_prediction(vdst, s->temp[2], width2, leftv); + leftu= s->dsp.add_hfyu_left_prediction(udst, s->temp[1], width2, leftu); + leftv= s->dsp.add_hfyu_left_prediction(vdst, s->temp[2], width2, leftv); } if(s->predictor == PLANE){ if(cy>s->interlaced){ @@ -1086,10 +1045,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac case MEDIAN: /* first line except first 2 pixels is left predicted */ decode_422_bitstream(s, width-2); - lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); + lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty); if(!(s->flags&CODEC_FLAG_GRAY)){ - leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); - leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); + leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu); + leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv); } cy=y=1; @@ -1097,20 +1056,20 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac /* second line is left predicted for interlaced case */ if(s->interlaced){ decode_422_bitstream(s, width); - lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty); + lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty); if(!(s->flags&CODEC_FLAG_GRAY)){ - leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu); - leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv); + leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu); + leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv); } y++; cy++; } /* next 4 pixels are left predicted too */ decode_422_bitstream(s, 4); - lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty); + lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty); if(!(s->flags&CODEC_FLAG_GRAY)){ - leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu); - leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv); + leftu= s->dsp.add_hfyu_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu); + leftv= s->dsp.add_hfyu_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv); } /* next line except the first 4 pixels is median predicted */ @@ -1178,12 +1137,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac case LEFT: case PLANE: decode_bgr_bitstream(s, width-1); - add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb); + s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb); for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down. decode_bgr_bitstream(s, width); - add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb); + s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb); if(s->predictor == PLANE){ if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){ s->dsp.add_bytes(p->data[0] + p->linesize[0]*y, |