]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/bethsoftvideo.c
Merge remote-tracking branch 'shariman/wmall'
[ffmpeg] / libavcodec / bethsoftvideo.c
index fa2db05765d99bdfc3f189e1f521473f9f574d8b..059947feadf57fe167e563126b8616b5c3d68370 100644 (file)
@@ -40,21 +40,27 @@ static av_cold int bethsoftvid_decode_init(AVCodecContext *avctx)
 {
     BethsoftvidContext *vid = avctx->priv_data;
     avcodec_get_frame_defaults(&vid->frame);
-    vid->frame.reference = 1;
+    vid->frame.reference = 3;
     vid->frame.buffer_hints = FF_BUFFER_HINTS_VALID |
         FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
     avctx->pix_fmt = PIX_FMT_PAL8;
     return 0;
 }
 
-static void set_palette(AVFrame * frame, const uint8_t * palette_buffer)
+static int set_palette(AVFrame * frame, const uint8_t * palette_buffer, int buf_size)
 {
     uint32_t * palette = (uint32_t *)frame->data[1];
     int a;
+
+    if (buf_size < 256*3)
+        return AVERROR_INVALIDDATA;
+
     for(a = 0; a < 256; a++){
-        palette[a] = AV_RB24(&palette_buffer[a * 3]) * 4;
+        palette[a] = 0xFF << 24 | AV_RB24(&palette_buffer[a * 3]) * 4;
+        palette[a] |= palette[a] >> 6 & 0x30303;
     }
     frame->palette_has_changed = 1;
+    return 256*3;
 }
 
 static int bethsoftvid_decode_frame(AVCodecContext *avctx,
@@ -81,8 +87,7 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx,
 
     switch(block_type = *buf++){
         case PALETTE_BLOCK:
-            set_palette(&vid->frame, buf);
-            return 0;
+            return set_palette(&vid->frame, buf, buf_size);
         case VIDEO_YOFF_P_FRAME:
             yoffset = bytestream_get_le16(&buf);
             if(yoffset >= avctx->height)