Mercurial > libavcodec.hg
comparison idcinvideo.c @ 1585:6b224ca24033 libavcodec
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
author | melanson |
---|---|
date | Thu, 30 Oct 2003 05:40:58 +0000 |
parents | 446ff1d593b0 |
children | 932d306bf1dc |
comparison
equal
deleted
inserted
replaced
1584:3615999a7284 | 1585:6b224ca24033 |
---|---|
69 DSPContext dsp; | 69 DSPContext dsp; |
70 AVFrame frame; | 70 AVFrame frame; |
71 | 71 |
72 unsigned char *buf; | 72 unsigned char *buf; |
73 int size; | 73 int size; |
74 | |
75 unsigned char palette[PALETTE_COUNT * 4]; | |
76 | 74 |
77 hnode_t huff_nodes[256][HUF_TOKENS*2]; | 75 hnode_t huff_nodes[256][HUF_TOKENS*2]; |
78 int num_huff_nodes[256]; | 76 int num_huff_nodes[256]; |
79 | 77 |
80 } IdcinContext; | 78 } IdcinContext; |
216 static int idcin_decode_frame(AVCodecContext *avctx, | 214 static int idcin_decode_frame(AVCodecContext *avctx, |
217 void *data, int *data_size, | 215 void *data, int *data_size, |
218 uint8_t *buf, int buf_size) | 216 uint8_t *buf, int buf_size) |
219 { | 217 { |
220 IdcinContext *s = (IdcinContext *)avctx->priv_data; | 218 IdcinContext *s = (IdcinContext *)avctx->priv_data; |
221 AVPaletteControl *palette_control = | 219 AVPaletteControl *palette_control = avctx->palctrl; |
222 (AVPaletteControl *)avctx->extradata; | |
223 int i; | |
224 unsigned int *palette32; | |
225 int palette_index = 0; | |
226 unsigned char r, g, b; | |
227 | 220 |
228 s->buf = buf; | 221 s->buf = buf; |
229 s->size = buf_size; | 222 s->size = buf_size; |
230 | |
231 if (palette_control->palette_changed) { | |
232 palette32 = (unsigned int *)s->palette; | |
233 for (i = 0; i < PALETTE_COUNT; i++) { | |
234 r = palette_control->palette[palette_index++] * 1; | |
235 g = palette_control->palette[palette_index++] * 1; | |
236 b = palette_control->palette[palette_index++] * 1; | |
237 palette32[i] = (r << 16) | (g << 8) | (b); | |
238 } | |
239 palette_control->palette_changed = 0; | |
240 } | |
241 | 223 |
242 if (s->frame.data[0]) | 224 if (s->frame.data[0]) |
243 avctx->release_buffer(avctx, &s->frame); | 225 avctx->release_buffer(avctx, &s->frame); |
244 | 226 |
245 if (avctx->get_buffer(avctx, &s->frame)) { | 227 if (avctx->get_buffer(avctx, &s->frame)) { |
248 } | 230 } |
249 | 231 |
250 idcin_decode_vlcs(s); | 232 idcin_decode_vlcs(s); |
251 | 233 |
252 /* make the palette available on the way out */ | 234 /* make the palette available on the way out */ |
253 memcpy(s->frame.data[1], s->palette, PALETTE_COUNT * 4); | 235 memcpy(s->frame.data[1], palette_control->palette, PALETTE_COUNT * 4); |
236 /* If palette changed inform application*/ | |
237 if (palette_control->palette_changed) { | |
238 palette_control->palette_changed = 0; | |
239 s->frame.palette_has_changed = 1; | |
240 } | |
254 | 241 |
255 *data_size = sizeof(AVFrame); | 242 *data_size = sizeof(AVFrame); |
256 *(AVFrame*)data = s->frame; | 243 *(AVFrame*)data = s->frame; |
257 | 244 |
258 /* report that the buffer was completely consumed */ | 245 /* report that the buffer was completely consumed */ |