[FFmpeg-cvslog] ico: ignore IconEntry.bpp value, and favour BITMAPHEADER. NumColors value over that in IconEntry

Peter Ross git at videolan.org
Thu Jan 12 16:35:04 CET 2012


ffmpeg | branch: master | Peter Ross <pross at xvid.org> | Thu Jan 12 23:41:50 2012 +1100| [90dbd0812731eb1a744b74dcb7a71112ff22db07] | committer: Michael Niedermayer

ico: ignore IconEntry.bpp value, and favour BITMAPHEADER.NumColors value over that in IconEntry

Fixes ticket 905.

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=90dbd0812731eb1a744b74dcb7a71112ff22db07
---

 libavformat/icodec.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/libavformat/icodec.c b/libavformat/icodec.c
index 214d477..9318c16 100644
--- a/libavformat/icodec.c
+++ b/libavformat/icodec.c
@@ -79,10 +79,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap)
         if (ico->images[i].nb_pal == 255)
             ico->images[i].nb_pal = 0;
 
-        avio_skip(pb, 3);
-        st->codec->bits_per_coded_sample = avio_rl16(pb);
-        if (st->codec->bits_per_coded_sample <= 8 && !ico->images[i].nb_pal)
-            ico->images[i].nb_pal = 1 << st->codec->bits_per_coded_sample;
+        avio_skip(pb, 5);
 
         ico->images[i].size   = avio_rl32(pb);
         ico->images[i].offset = avio_rl32(pb);
@@ -117,6 +114,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
     IcoDemuxContext *ico = s->priv_data;
     IcoImage *image;
     AVIOContext *pb = s->pb;
+    AVStream *st = s->streams[0];
     int ret;
 
     if (ico->current_image >= ico->nb_images)
@@ -142,13 +140,23 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
         bytestream_put_le32(&buf, pkt->size);
         bytestream_put_le16(&buf, 0);
         bytestream_put_le16(&buf, 0);
-        bytestream_put_le32(&buf, 14 + 40 + image->nb_pal * 4);
+        bytestream_put_le32(&buf, 0);
 
         if ((ret = avio_read(pb, buf, image->size)) < 0)
             return ret;
 
+        st->codec->bits_per_coded_sample = AV_RL16(buf + 14);
+
+        if (AV_RL32(buf + 32))
+            image->nb_pal = AV_RL32(buf + 32);
+
+        if (st->codec->bits_per_coded_sample <= 8 && !image->nb_pal) {
+            image->nb_pal = 1 << st->codec->bits_per_coded_sample;
+            AV_WL32(buf + 32, image->nb_pal);
+        }
+
+        AV_WL32(buf - 4, 14 + 40 + image->nb_pal * 4);
         AV_WL32(buf + 8, AV_RL32(buf + 8) / 2);
-        AV_WL32(buf + 32, image->nb_pal);
     }
 
     pkt->stream_index = ico->current_image++;



More information about the ffmpeg-cvslog mailing list