deploy palette control API
authorMike Melanson <mike@multimedia.cx>
Fri, 12 Sep 2003 03:48:14 +0000 (03:48 +0000)
committerMike Melanson <mike@multimedia.cx>
Fri, 12 Sep 2003 03:48:14 +0000 (03:48 +0000)
Originally committed as revision 2266 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/xan.c
libavformat/wc3movie.c

index c193117..16fe4ed 100644 (file)
@@ -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;
index fa41c1d..918048f 100644 (file)
@@ -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;
     }
 
index cdd8c8b..16e4412 100644 (file)
@@ -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;
 }