diff options
author | Alexander Strange | 2010-01-14 01:32:49 +0000 |
---|---|---|
committer | Alexander Strange | 2010-01-14 01:32:49 +0000 |
commit | f267d3ac75942bd0fabb38361e00192b8254ba76 (patch) | |
tree | dca4fac9fd11b778c1882d7139d7f65b18f92d3f /libavcodec/huffyuv.c | |
parent | ff5ab5c8c9b87908639861a6d29d6cf330c4ed56 (diff) |
Implement alpha channel decoding for BGR HuffYUV.
Since BGR24 is decoded as BGR32, fill its alpha channel with 255
using the appropriate predictors.
Originally committed as revision 21211 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/huffyuv.c')
-rw-r--r-- | libavcodec/huffyuv.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index 4fa6ddf7f8..3b56bb3869 100644 --- a/libavcodec/huffyuv.c +++ b/libavcodec/huffyuv.c @@ -39,10 +39,12 @@ #define B 3 #define G 2 #define R 1 +#define A 0 #else #define B 0 #define G 1 #define R 2 +#define A 3 #endif typedef enum Predictor{ @@ -406,7 +408,7 @@ static av_cold void alloc_temp(HYuvContext *s){ s->temp[i]= av_malloc(s->width + 16); } }else{ - s->temp[0]= av_malloc(4*s->width + 16); + s->temp[0]= av_mallocz(4*s->width + 16); } } @@ -836,7 +838,7 @@ static av_always_inline void decode_bgr_1(HYuvContext *s, int count, int decorre s->temp[0][4*i+R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); } if(alpha) - get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?! + s->temp[0][4*i+A] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); } } @@ -1116,11 +1118,11 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac } }else{ int y; - int leftr, leftg, leftb; + int leftr, leftg, leftb, lefta; const int last_line= (height-1)*p->linesize[0]; if(s->bitstream_bpp==32){ - skip_bits(&s->gb, 8); + lefta= p->data[0][last_line+A]= get_bits(&s->gb, 8); leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); @@ -1128,6 +1130,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8); leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8); leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8); + lefta= p->data[0][last_line+A]= 255; skip_bits(&s->gb, 8); } @@ -1136,13 +1139,14 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac case LEFT: case PLANE: decode_bgr_bitstream(s, width-1); - s->dsp.add_hfyu_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, &lefta); for(y=s->height-2; y>=0; y--){ //Yes it is stored upside down. decode_bgr_bitstream(s, width); - s->dsp.add_hfyu_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, &lefta); if(s->predictor == PLANE){ + if(s->bitstream_bpp!=32) lefta=0; if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){ s->dsp.add_bytes(p->data[0] + p->linesize[0]*y, p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride); |