diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index c193117deb..16fe4ed8f6 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1305,6 +1305,25 @@ typedef struct AVPicture { int linesize[4]; ///< number of bytes per line } AVPicture; +/** + * AVPaletteControl + * This structure defines a method for communicating palette changes + * between and demuxer and a decoder. + */ +typedef struct AVPaletteControl { + + /* demuxer sets this to 1 to indicate the palette has changed; + * decoder resets to 0 */ + int palette_changed; + + /* 256 3-byte RGB palette entries; the components should be + * formatted in the buffer as "RGBRGB..." and should be scaled to + * 8 bits if they originally represented 6-bit VGA palette + * components */ + unsigned char palette[256 * 3]; + +} AVPaletteControl; + extern AVCodec ac3_encoder; extern AVCodec mp2_encoder; extern AVCodec mp3lame_encoder; diff --git a/libavcodec/xan.c b/libavcodec/xan.c index fa41c1da9b..918048f45f 100644 --- a/libavcodec/xan.c +++ b/libavcodec/xan.c @@ -115,9 +115,9 @@ static int xan_decode_init(AVCodecContext *avctx) s->avctx = avctx; if ((avctx->codec->id == CODEC_ID_XAN_WC3) && - (s->avctx->extradata_size != PALETTE_CONTROL_SIZE)) { + (s->avctx->extradata_size != sizeof(AVPaletteControl))) { printf (" WC3 Xan video: expected extradata_size of %d\n", - PALETTE_CONTROL_SIZE); + sizeof(AVPaletteControl)); return -1; } @@ -809,13 +809,13 @@ static int xan_decode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size) { XanContext *s = avctx->priv_data; - unsigned char *palette_control = avctx->extradata; + AVPaletteControl *palette_control = (AVPaletteControl *)avctx->extradata; int keyframe = 0; - if (palette_control[0]) { + if (palette_control->palette_changed) { /* load the new palette and reset the palette control */ - xan_wc3_build_palette(s, &palette_control[1]); - palette_control[0] = 0; + xan_wc3_build_palette(s, palette_control->palette); + palette_control->palette_changed = 0; keyframe = 1; } diff --git a/libavformat/wc3movie.c b/libavformat/wc3movie.c index cdd8c8bdb5..16e4412681 100644 --- a/libavformat/wc3movie.c +++ b/libavformat/wc3movie.c @@ -74,9 +74,6 @@ #define PALETTE_SIZE (256 * 3) #define PALETTE_COUNT 256 -/* palette is 3 bytes per entry plus 1 byte at the front to indicate to the - * decoder if the palette has changed */ -#define PALETTE_CONTROL_SIZE ((PALETTE_COUNT * 3) + 1) typedef struct Wc3DemuxContext { int width; @@ -87,8 +84,7 @@ typedef struct Wc3DemuxContext { int video_stream_index; int audio_stream_index; - /* save a reference to extradata */ - unsigned char *palette_control; + AVPaletteControl palette_control; } Wc3DemuxContext; @@ -163,7 +159,6 @@ static int wc3_read_header(AVFormatContext *s, wc3->palette_count = 0; wc3->pts = 0; wc3->video_stream_index = wc3->audio_stream_index = 0; - wc3->palette_control = av_mallocz(PALETTE_CONTROL_SIZE);; /* skip the first 3 32-bit numbers */ url_fseek(pb, 12, SEEK_CUR); @@ -263,8 +258,8 @@ static int wc3_read_header(AVFormatContext *s, st->codec.height = wc3->height; /* palette considerations */ - st->codec.extradata_size = PALETTE_CONTROL_SIZE; - st->codec.extradata = wc3->palette_control; + st->codec.extradata_size = sizeof(AVPaletteControl); + st->codec.extradata = &wc3->palette_control; st = av_new_stream(s, 0); if (!st) @@ -324,11 +319,10 @@ static int wc3_read_packet(AVFormatContext *s, palette_number = LE_32(&preamble[0]); if (palette_number >= wc3->palette_count) return AVERROR_INVALIDDATA; - memcpy(wc3->palette_control + 1, + memcpy(wc3->palette_control.palette, &wc3->palettes[palette_number * PALETTE_COUNT * 3], PALETTE_COUNT * 3); - /* indicate a palette change */ - wc3->palette_control[0] = 1; + wc3->palette_control.palette_changed = 1; break; case VGA__TAG: @@ -396,7 +390,6 @@ static int wc3_read_close(AVFormatContext *s) Wc3DemuxContext *wc3 = (Wc3DemuxContext *)s->priv_data; av_free(wc3->palettes); - av_free(wc3->palette_control); return 0; }