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 */