Mercurial > libavcodec.hg
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 */ |