aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Strange <astrange@ithinksw.com>2010-01-14 01:32:49 +0000
committerAlexander Strange <astrange@ithinksw.com>2010-01-14 01:32:49 +0000
commitf267d3ac75942bd0fabb38361e00192b8254ba76 (patch)
treedca4fac9fd11b778c1882d7139d7f65b18f92d3f
parentff5ab5c8c9b87908639861a6d29d6cf330c4ed56 (diff)
downloadffmpeg-f267d3ac75942bd0fabb38361e00192b8254ba76.tar.gz
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
-rw-r--r--libavcodec/dsputil.c11
-rw-r--r--libavcodec/dsputil.h2
-rw-r--r--libavcodec/huffyuv.c16
3 files changed, 20 insertions, 9 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index a2a313abf6..41a63778bb 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -3632,35 +3632,42 @@ static int add_hfyu_left_prediction_c(uint8_t *dst, const uint8_t *src, int w, i
#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
-static void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue){
+static void add_hfyu_left_prediction_bgr32_c(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha){
int i;
- int r,g,b;
+ int r,g,b,a;
r= *red;
g= *green;
b= *blue;
+ a= *alpha;
for(i=0; i<w; i++){
b+= src[4*i+B];
g+= src[4*i+G];
r+= src[4*i+R];
+ a+= src[4*i+A];
dst[4*i+B]= b;
dst[4*i+G]= g;
dst[4*i+R]= r;
+ dst[4*i+A]= a;
}
*red= r;
*green= g;
*blue= b;
+ *alpha= a;
}
#undef B
#undef G
#undef R
+#undef A
#define BUTTERFLY2(o1,o2,i1,i2) \
o1= (i1)+(i2);\
diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 7b218acaf1..1476ae7ba3 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -350,7 +350,7 @@ typedef struct DSPContext {
void (*sub_hfyu_median_prediction)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top);
void (*add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top);
int (*add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left);
- void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue);
+ void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha);
/* 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 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);