From 60f451b6fe04eab97c18dfae9d3062c600f97581 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Tue, 8 Jul 2008 12:44:08 +0000 Subject: [PATCH] Remove AVPaletteControl from ALG MM demuxer/decoder Originally committed as revision 14109 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mmvideo.c | 30 ++++++++++++++++++------------ libavformat/mm.c | 25 +++---------------------- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/libavcodec/mmvideo.c b/libavcodec/mmvideo.c index e23b664d62..03d86ee9dc 100644 --- a/libavcodec/mmvideo.c +++ b/libavcodec/mmvideo.c @@ -1,6 +1,6 @@ /* * American Laser Games MM Video Decoder - * Copyright (c) 2006 Peter Ross + * Copyright (c) 2006,2008 Peter Ross * * This file is part of FFmpeg. * @@ -41,10 +41,12 @@ #define MM_TYPE_INTER_HH 0xd #define MM_TYPE_INTRA_HHV 0xe #define MM_TYPE_INTER_HHV 0xf +#define MM_TYPE_PALETTE 0x31 typedef struct MmContext { AVCodecContext *avctx; AVFrame frame; + int palette[AVPALETTE_COUNT]; } MmContext; static av_cold int mm_decode_init(AVCodecContext *avctx) @@ -53,11 +55,6 @@ static av_cold int mm_decode_init(AVCodecContext *avctx) s->avctx = avctx; - if (s->avctx->palctrl == NULL) { - av_log(avctx, AV_LOG_ERROR, "mmvideo: palette expected.\n"); - return -1; - } - avctx->pix_fmt = PIX_FMT_PAL8; if (avcodec_check_dimensions(avctx, avctx->width, avctx->height)) @@ -72,6 +69,17 @@ static av_cold int mm_decode_init(AVCodecContext *avctx) return 0; } +static void mm_decode_pal(MmContext *s, const uint8_t *buf, const uint8_t *buf_end) +{ + int i; + buf += 4; + for (i=0; i<128 && buf+2palette[i] = AV_RB24(buf); + s->palette[i+128] = s->palette[i]<<2; + buf += 3; + } +} + static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const uint8_t *buf, int buf_size) { int i, x, y; @@ -153,19 +161,15 @@ static int mm_decode_frame(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { MmContext *s = avctx->priv_data; - AVPaletteControl *palette_control = avctx->palctrl; + const uint8_t *buf_end = buf+buf_size; int type; - if (palette_control->palette_changed) { - memcpy(s->frame.data[1], palette_control->palette, AVPALETTE_SIZE); - palette_control->palette_changed = 0; - } - type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; switch(type) { + case MM_TYPE_PALETTE : mm_decode_pal(s, buf, buf_end); return buf_size; case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break; @@ -176,6 +180,8 @@ static int mm_decode_frame(AVCodecContext *avctx, return -1; } + memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); + *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; diff --git a/libavformat/mm.c b/libavformat/mm.c index bfb88d5644..67d2a94bbb 100644 --- a/libavformat/mm.c +++ b/libavformat/mm.c @@ -52,7 +52,6 @@ #define MM_PALETTE_SIZE (MM_PALETTE_COUNT*3) typedef struct { - AVPaletteControl palette_control; unsigned int audio_pts, video_pts; } MmDemuxContext; @@ -101,7 +100,6 @@ static int mm_read_header(AVFormatContext *s, st->codec->codec_tag = 0; /* no fourcc */ st->codec->width = width; st->codec->height = height; - st->codec->palctrl = &mm->palette_control; av_set_pts_info(st, 64, 1, frame_rate); /* audio stream */ @@ -117,7 +115,6 @@ static int mm_read_header(AVFormatContext *s, av_set_pts_info(st, 64, 1, 8000); /* 8000 hz */ } - mm->palette_control.palette_changed = 0; mm->audio_pts = 0; mm->video_pts = 0; return 0; @@ -129,9 +126,7 @@ static int mm_read_packet(AVFormatContext *s, MmDemuxContext *mm = s->priv_data; ByteIOContext *pb = s->pb; unsigned char preamble[MM_PREAMBLE_SIZE]; - unsigned char pal[MM_PALETTE_SIZE]; unsigned int type, length; - int i; while(1) { @@ -144,22 +139,6 @@ static int mm_read_packet(AVFormatContext *s, switch(type) { case MM_TYPE_PALETTE : - url_fseek(pb, 4, SEEK_CUR); /* unknown data */ - if (get_buffer(pb, pal, MM_PALETTE_SIZE) != MM_PALETTE_SIZE) - return AVERROR(EIO); - url_fseek(pb, length - (4 + MM_PALETTE_SIZE), SEEK_CUR); - - for (i=0; ipalette_control.palette[i] = (r << 16) | (g << 8) | (b); - /* repeat palette, where each components is multiplied by four */ - mm->palette_control.palette[i+128] = (r << 18) | (g << 10) | (b<<2); - } - mm->palette_control.palette_changed = 1; - break; - case MM_TYPE_INTER : case MM_TYPE_INTRA : case MM_TYPE_INTRA_HH : @@ -174,7 +153,9 @@ static int mm_read_packet(AVFormatContext *s, return AVERROR(EIO); pkt->size = length + MM_PREAMBLE_SIZE; pkt->stream_index = 0; - pkt->pts = mm->video_pts++; + pkt->pts = mm->video_pts; + if (type!=MM_TYPE_PALETTE) + mm->video_pts++; return 0; case MM_TYPE_AUDIO :