[FFmpeg-devel] [PATCH]Fix 1bpp palettized png with width not a multiple of 8
Carl Eugen Hoyos
cehoyos at ag.or.at
Wed Jan 30 00:20:07 CET 2013
On Tuesday 29 January 2013 03:23:12 pm Michael Niedermayer wrote:
> > +++ b/libavcodec/pngdec.c
> > @@ -768,7 +768,15 @@ static int decode_frame(AVCodecContext *avctx,
> > int i, j;
> > uint8_t *pd = s->current_picture->data[0];
> > for (j = 0; j < s->height; j++) {
> > + i = s->width / 8;
> > + if ((s->width&7) >= 7) pd[8*i + 6] = (pd[i]>>1) & 1;
> > + if ((s->width&7) >= 6) pd[8*i + 5] = (pd[i]>>2) & 1;
> > + if ((s->width&7) >= 5) pd[8*i + 4] = (pd[i]>>3) & 1;
> > + if ((s->width&7) >= 4) pd[8*i + 3] = (pd[i]>>4) & 1;
> > + if ((s->width&7) >= 3) pd[8*i + 2] = (pd[i]>>5) & 1;
> > + if ((s->width&7) >= 2) pd[8*i + 1] = (pd[i]>>6) & 1;
> > + if ((s->width&7) >= 1) pd[8*i + 0] = pd[i]>>7;
>
> should be ok if it works
> alternatively this maybe could be simplified with a loop
New patch attached.
Please review, Carl Eugen
-------------- next part --------------
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 593df60..97c0ad1 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -765,10 +765,14 @@ static int decode_frame(AVCodecContext *avctx,
exit_loop:
if (s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE){
- int i, j;
+ int i, j, k;
uint8_t *pd = s->current_picture->data[0];
for (j = 0; j < s->height; j++) {
- for (i = s->width/8-1; i >= 0; i--) {
+ i = s->width / 8;
+ for (k = 7; k >= 1; k--)
+ if ((s->width&7) >= k)
+ pd[8*i + k - 1] = (pd[i]>>8-k) & 1;
+ for (i--; 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;
More information about the ffmpeg-devel
mailing list