summaryrefslogtreecommitdiff
path: root/libavformat/asf.c
diff options
context:
space:
mode:
authorRoberto Togni <r_togni@tiscali.it>2003-11-02 21:55:38 +0000
committerRoberto Togni <r_togni@tiscali.it>2003-11-02 21:55:38 +0000
commit5e29abf8b7efe6cfeee41d9f5e5f9fc98c1fcb93 (patch)
tree286cb4fe2a1fd0f2daae9bdb55806875449f80f7 /libavformat/asf.c
parent2e99641b1a366142e71f6816c1e7fcfeba8eca7b (diff)
Make avi and asf demuxer export palette in palctrl
Originally committed as revision 2465 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/asf.c')
-rw-r--r--libavformat/asf.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/libavformat/asf.c b/libavformat/asf.c
index 044ba72d9b..b069b1d086 100644
--- a/libavformat/asf.c
+++ b/libavformat/asf.c
@@ -908,6 +908,22 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec.extradata = av_mallocz(st->codec.extradata_size);
get_buffer(pb, st->codec.extradata, st->codec.extradata_size);
}
+
+ /* Extract palette from extradata if bpp <= 8 */
+ /* This code assumes that extradata contains only palette */
+ /* This is true for all paletted codecs implemented in ffmpeg */
+ if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) {
+ st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl));
+#ifdef WORDS_BIGENDIAN
+ for (i = 0; i < FFMIN(st->codec.extradata_size / 4, 256); i++)
+ st->codec.palctrl->palette[i] = bswap_32(st->codec.extradata)[i * 4]);
+#else
+ memcpy(st->codec.palctrl->palette, st->codec.extradata,
+ FFMIN(st->codec.extradata_size, AVPALETTE_SIZE));
+#endif
+ st->codec.palctrl->palette_changed = 1;
+ }
+
st->codec.codec_tag = tag1;
st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);
}
@@ -1226,6 +1242,7 @@ static int asf_read_close(AVFormatContext *s)
AVStream *st = s->streams[i];
av_free(st->priv_data);
av_free(st->codec.extradata);
+ av_free(st->codec.palctrl);
}
return 0;
}