summaryrefslogtreecommitdiff
path: root/libavcodec/pngdec.c
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2011-12-27 18:17:57 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2011-12-27 18:17:57 +0100
commit613cbf31680324fd73558f0e4ad36f1eb062221e (patch)
treedc02d687ed6556b24e2c8b34f3b2c0d6cea4d605 /libavcodec/pngdec.c
parent440e984b712ff02ee0fc5deb7db8d4ae57eed4fc (diff)
Fix some 1bit png samples, they can be palettised.
Fixes ticket #767.
Diffstat (limited to 'libavcodec/pngdec.c')
-rw-r--r--libavcodec/pngdec.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 609b21e2aa..0ede85fe18 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -494,10 +494,10 @@ static int decode_frame(AVCodecContext *avctx,
} else if (s->bit_depth == 16 &&
s->color_type == PNG_COLOR_TYPE_RGB) {
avctx->pix_fmt = PIX_FMT_RGB48BE;
- } else if (s->bit_depth == 1) {
- avctx->pix_fmt = PIX_FMT_MONOBLACK;
} else if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
avctx->pix_fmt = PIX_FMT_PAL8;
+ } else if (s->bit_depth == 1) {
+ avctx->pix_fmt = PIX_FMT_MONOBLACK;
} else if (s->bit_depth == 8 &&
s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
avctx->pix_fmt = PIX_FMT_GRAY8A;
@@ -609,6 +609,23 @@ static int decode_frame(AVCodecContext *avctx,
}
exit_loop:
+ if(s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE){
+ int i, j;
+ uint8_t *pd = s->current_picture->data[0];
+ for(j=0; j < s->height; j++) {
+ for(i=s->width/8-1; i>=0; i--) {
+ pd[8*i+7]= pd[i] &1;
+ pd[8*i+6]= (pd[i]>>1)&1;
+ pd[8*i+5]= (pd[i]>>2)&1;
+ pd[8*i+4]= (pd[i]>>3)&1;
+ pd[8*i+3]= (pd[i]>>4)&1;
+ pd[8*i+2]= (pd[i]>>5)&1;
+ pd[8*i+1]= (pd[i]>>6)&1;
+ pd[8*i+0]= pd[i]>>7;
+ }
+ pd += s->image_linesize;
+ }
+ }
if(s->bits_per_pixel == 2){
int i, j;
uint8_t *pd = s->current_picture->data[0];