Commit 5e29abf8 authored by Roberto Togni's avatar Roberto Togni

Make avi and asf demuxer export palette in palctrl

Originally committed as revision 2465 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 2e99641b
...@@ -908,6 +908,22 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -908,6 +908,22 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec.extradata = av_mallocz(st->codec.extradata_size); st->codec.extradata = av_mallocz(st->codec.extradata_size);
get_buffer(pb, st->codec.extradata, 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_tag = tag1;
st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1); st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);
} }
...@@ -1226,6 +1242,7 @@ static int asf_read_close(AVFormatContext *s) ...@@ -1226,6 +1242,7 @@ static int asf_read_close(AVFormatContext *s)
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
av_free(st->priv_data); av_free(st->priv_data);
av_free(st->codec.extradata); av_free(st->codec.extradata);
av_free(st->codec.palctrl);
} }
return 0; return 0;
} }
......
...@@ -243,6 +243,21 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -243,6 +243,21 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
if(st->codec.extradata_size & 1) //FIXME check if the encoder really did this correctly if(st->codec.extradata_size & 1) //FIXME check if the encoder really did this correctly
get_byte(pb); get_byte(pb);
/* 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;
}
#ifdef DEBUG #ifdef DEBUG
print_tag("video", tag1, 0); print_tag("video", tag1, 0);
#endif #endif
...@@ -382,6 +397,7 @@ static int avi_read_close(AVFormatContext *s) ...@@ -382,6 +397,7 @@ static int avi_read_close(AVFormatContext *s)
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
// av_free(st->priv_data); // av_free(st->priv_data);
av_free(st->codec.extradata); av_free(st->codec.extradata);
av_free(st->codec.palctrl);
} }
if (avi->dv_demux) if (avi->dv_demux)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment