summaryrefslogtreecommitdiff
path: root/libavcodec/cinepak.c
diff options
context:
space:
mode:
authorRoberto Togni <r_togni@tiscali.it>2004-06-27 14:46:02 +0000
committerRoberto Togni <r_togni@tiscali.it>2004-06-27 14:46:02 +0000
commitdab1c4c612ccb1a7e2ee72e13ca9f7754f0c9c97 (patch)
tree5b64d83c5887ab9317b02d4a06717c78860707ba /libavcodec/cinepak.c
parentd99fbbf4d7e3f6abea0d052849a515730f552608 (diff)
Paletted cvid support
Originally committed as revision 3263 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/cinepak.c')
-rw-r--r--libavcodec/cinepak.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c
index f72d690ee6..df7aa0e480 100644
--- a/libavcodec/cinepak.c
+++ b/libavcodec/cinepak.c
@@ -35,7 +35,6 @@
#include "avcodec.h"
#include "dsputil.h"
-#define PALETTE_COUNT 256
typedef struct {
uint8_t y0, y1, y2, y3;
@@ -63,7 +62,6 @@ typedef struct CinepakContext {
int width, height;
- unsigned char palette[PALETTE_COUNT * 4];
int palette_video;
cvid_strip_t strips[MAX_STRIPS];
@@ -361,22 +359,20 @@ static int cinepak_decode (CinepakContext *s)
static int cinepak_decode_init(AVCodecContext *avctx)
{
CinepakContext *s = (CinepakContext *)avctx->priv_data;
-/*
- int i;
- unsigned char r, g, b;
- unsigned char *raw_palette;
- unsigned int *palette32;
-*/
s->avctx = avctx;
s->width = (avctx->width + 3) & ~3;
s->height = (avctx->height + 3) & ~3;
-// check for paletted data
-s->palette_video = 0;
-
+ // check for paletted data
+ if (avctx->palctrl == NULL) {
+ s->palette_video = 0;
+ avctx->pix_fmt = PIX_FMT_YUV420P;
+ } else {
+ s->palette_video = 1;
+ avctx->pix_fmt = PIX_FMT_PAL8;
+ }
- avctx->pix_fmt = PIX_FMT_YUV420P;
avctx->has_b_frames = 0;
dsputil_init(&s->dsp, avctx);
@@ -404,6 +400,15 @@ static int cinepak_decode_frame(AVCodecContext *avctx,
cinepak_decode(s);
+ if (s->palette_video) {
+ memcpy (s->frame.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
+ if (avctx->palctrl->palette_changed) {
+ s->frame.palette_has_changed = 1;
+ avctx->palctrl->palette_changed = 0;
+ } else
+ s->frame.palette_has_changed = 0;
+ }
+
*data_size = sizeof(AVFrame);
*(AVFrame*)data = s->frame;