summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2003-09-12 03:48:14 +0000
committerMike Melanson <mike@multimedia.cx>2003-09-12 03:48:14 +0000
commitba118447d561a18b35e719f1249a6d578e237c4b (patch)
tree3dd2990a29c392df2c2d96c04fb5f34ca97a266c
parent50f52fcdc3e6a5a7ee6991360a4dcf4a36975ed6 (diff)
deploy palette control API
Originally committed as revision 2266 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h19
-rw-r--r--libavcodec/xan.c12
-rw-r--r--libavformat/wc3movie.c17
3 files changed, 30 insertions, 18 deletions
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;
}