comparison cinepak.c @ 2105:b293b6c3a1a6 libavcodec

Paletted cvid support
author rtognimp
date Sun, 27 Jun 2004 14:46:02 +0000
parents 9e0b49e1c7ff
children f68c446a5b97
comparison
equal deleted inserted replaced
2104:586a6e8f3290 2105:b293b6c3a1a6
33 33
34 #include "common.h" 34 #include "common.h"
35 #include "avcodec.h" 35 #include "avcodec.h"
36 #include "dsputil.h" 36 #include "dsputil.h"
37 37
38 #define PALETTE_COUNT 256
39 38
40 typedef struct { 39 typedef struct {
41 uint8_t y0, y1, y2, y3; 40 uint8_t y0, y1, y2, y3;
42 uint8_t u, v; 41 uint8_t u, v;
43 } cvid_codebook_t; 42 } cvid_codebook_t;
61 unsigned char *data; 60 unsigned char *data;
62 int size; 61 int size;
63 62
64 int width, height; 63 int width, height;
65 64
66 unsigned char palette[PALETTE_COUNT * 4];
67 int palette_video; 65 int palette_video;
68 cvid_strip_t strips[MAX_STRIPS]; 66 cvid_strip_t strips[MAX_STRIPS];
69 67
70 } CinepakContext; 68 } CinepakContext;
71 69
359 } 357 }
360 358
361 static int cinepak_decode_init(AVCodecContext *avctx) 359 static int cinepak_decode_init(AVCodecContext *avctx)
362 { 360 {
363 CinepakContext *s = (CinepakContext *)avctx->priv_data; 361 CinepakContext *s = (CinepakContext *)avctx->priv_data;
364 /*
365 int i;
366 unsigned char r, g, b;
367 unsigned char *raw_palette;
368 unsigned int *palette32;
369 */
370 362
371 s->avctx = avctx; 363 s->avctx = avctx;
372 s->width = (avctx->width + 3) & ~3; 364 s->width = (avctx->width + 3) & ~3;
373 s->height = (avctx->height + 3) & ~3; 365 s->height = (avctx->height + 3) & ~3;
374 366
375 // check for paletted data 367 // check for paletted data
376 s->palette_video = 0; 368 if (avctx->palctrl == NULL) {
377 369 s->palette_video = 0;
378 370 avctx->pix_fmt = PIX_FMT_YUV420P;
379 avctx->pix_fmt = PIX_FMT_YUV420P; 371 } else {
372 s->palette_video = 1;
373 avctx->pix_fmt = PIX_FMT_PAL8;
374 }
375
380 avctx->has_b_frames = 0; 376 avctx->has_b_frames = 0;
381 dsputil_init(&s->dsp, avctx); 377 dsputil_init(&s->dsp, avctx);
382 378
383 s->frame.data[0] = NULL; 379 s->frame.data[0] = NULL;
384 380
401 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); 397 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
402 return -1; 398 return -1;
403 } 399 }
404 400
405 cinepak_decode(s); 401 cinepak_decode(s);
402
403 if (s->palette_video) {
404 memcpy (s->frame.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
405 if (avctx->palctrl->palette_changed) {
406 s->frame.palette_has_changed = 1;
407 avctx->palctrl->palette_changed = 0;
408 } else
409 s->frame.palette_has_changed = 0;
410 }
406 411
407 *data_size = sizeof(AVFrame); 412 *data_size = sizeof(AVFrame);
408 *(AVFrame*)data = s->frame; 413 *(AVFrame*)data = s->frame;
409 414
410 /* report that the buffer was completely consumed */ 415 /* report that the buffer was completely consumed */