From 2d2b86c207ff434dfa91940818faf9af4a4ec1be Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 31 May 2006 04:52:02 +0000 Subject: Palette support for newer KMVC Originally committed as revision 5435 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/kmvc.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'libavcodec/kmvc.c') diff --git a/libavcodec/kmvc.c b/libavcodec/kmvc.c index 333c909aa8..036efa5593 100644 --- a/libavcodec/kmvc.c +++ b/libavcodec/kmvc.c @@ -242,8 +242,17 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint return -1; } - header = buf[0]; - buf++; + header = *buf++; + + /* blocksize 127 is really palette change event */ + if (buf[0] == 127) { + buf += 3; + for (i = 0; i < 127; i++) { + ctx->pal[i + (header & 0x81)] = (buf[0] << 16) | (buf[1] << 8) | buf[2]; + buf += 4; + } + buf -= 127 * 4 + 3; + } if (header & KMVC_KEYFRAME) { ctx->pic.key_frame = 1; @@ -253,6 +262,13 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint ctx->pic.pict_type = FF_P_TYPE; } + /* if palette has been changed, copy it from palctrl */ + if (ctx->avctx->palctrl && ctx->avctx->palctrl->palette_changed) { + memcpy(ctx->pal, ctx->avctx->palctrl->palette, AVPALETTE_SIZE); + ctx->setpal = 1; + ctx->avctx->palctrl->palette_changed = 0; + } + if (header & KMVC_PALETTE) { ctx->pic.palette_has_changed = 1; // palette starts from index 1 and has 127 entries @@ -272,12 +288,16 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint blocksize = *buf++; - if (blocksize != 8) { + if (blocksize != 8 && blocksize != 127) { av_log(avctx, AV_LOG_ERROR, "Block size = %i\n", blocksize); return -1; } memset(ctx->cur, 0, 320 * 200); switch (header & KMVC_METHOD) { + case 0: + case 1: // used in palette changed event + memcpy(ctx->cur, ctx->prev, 320 * 200); + break; case 3: kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height); break; @@ -351,11 +371,14 @@ static int decode_init(AVCodecContext * avctx) if (avctx->extradata_size == 1036) { // palette in extradata uint8_t *src = avctx->extradata + 12; - for (i = 0; i < c->palsize; i++) { + for (i = 0; i < 256; i++) { c->pal[i] = LE_32(src); src += 4; } c->setpal = 1; + if (c->avctx->palctrl) { + c->avctx->palctrl->palette_changed = 0; + } } avctx->pix_fmt = PIX_FMT_PAL8; -- cgit v1.2.3