Remove AVPaletteControl from ALG MM demuxer/decoder
Originally committed as revision 14109 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
1835cda65a
commit
60f451b6fe
@ -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+2<buf_end; i++) {
|
||||
s->palette[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;
|
||||
|
||||
|
@ -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; i<MM_PALETTE_COUNT; i++) {
|
||||
int r = pal[i*3 + 0];
|
||||
int g = pal[i*3 + 1];
|
||||
int b = pal[i*3 + 2];
|
||||
mm->palette_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 :
|
||||
|
Loading…
Reference in New Issue
Block a user