177
175
s->frame.data[2][iv[0]] = codebook->v;
180
s->frame.data[0][iy[0] + 2] = codebook->y0;
181
s->frame.data[0][iy[0] + 3] = codebook->y0;
182
s->frame.data[0][iy[1] + 2] = codebook->y0;
183
s->frame.data[0][iy[1] + 3] = codebook->y0;
178
s->frame.data[0][iy[0] + 2] = codebook->y1;
179
s->frame.data[0][iy[0] + 3] = codebook->y1;
180
s->frame.data[0][iy[1] + 2] = codebook->y1;
181
s->frame.data[0][iy[1] + 3] = codebook->y1;
184
182
if (!s->palette_video) {
185
183
s->frame.data[1][iu[0] + 1] = codebook->u;
186
184
s->frame.data[2][iv[0] + 1] = codebook->v;
189
s->frame.data[0][iy[2] + 0] = codebook->y0;
190
s->frame.data[0][iy[2] + 1] = codebook->y0;
191
s->frame.data[0][iy[3] + 0] = codebook->y0;
192
s->frame.data[0][iy[3] + 1] = codebook->y0;
187
s->frame.data[0][iy[2] + 0] = codebook->y2;
188
s->frame.data[0][iy[2] + 1] = codebook->y2;
189
s->frame.data[0][iy[3] + 0] = codebook->y2;
190
s->frame.data[0][iy[3] + 1] = codebook->y2;
193
191
if (!s->palette_video) {
194
192
s->frame.data[1][iu[1]] = codebook->u;
195
193
s->frame.data[2][iv[1]] = codebook->v;
198
s->frame.data[0][iy[2] + 2] = codebook->y0;
199
s->frame.data[0][iy[2] + 3] = codebook->y0;
200
s->frame.data[0][iy[3] + 2] = codebook->y0;
201
s->frame.data[0][iy[3] + 3] = codebook->y0;
196
s->frame.data[0][iy[2] + 2] = codebook->y3;
197
s->frame.data[0][iy[2] + 3] = codebook->y3;
198
s->frame.data[0][iy[3] + 2] = codebook->y3;
199
s->frame.data[0][iy[3] + 3] = codebook->y3;
202
200
if (!s->palette_video) {
203
201
s->frame.data[1][iu[1] + 1] = codebook->u;
204
202
s->frame.data[2][iv[1] + 1] = codebook->v;
315
316
uint8_t *eod = (s->data + s->size);
316
317
int i, result, strip_size, frame_flags, num_strips;
319
int encoded_buf_size;
320
/* if true, Cinepak data is from a Sega FILM/CPK file */
321
int sega_film_data = 0;
319
323
if (s->size < 10)
322
326
frame_flags = s->data[0];
323
327
num_strips = BE_16 (&s->data[8]);
328
encoded_buf_size = BE_16 (&s->data[2]);
329
if (encoded_buf_size != s->size)
326
336
if (num_strips > MAX_STRIPS)
327
337
num_strips = MAX_STRIPS;
361
371
static int cinepak_decode_init(AVCodecContext *avctx)
363
373
CinepakContext *s = (CinepakContext *)avctx->priv_data;
366
unsigned char r, g, b;
367
unsigned char *raw_palette;
368
unsigned int *palette32;
371
375
s->avctx = avctx;
372
376
s->width = (avctx->width + 3) & ~3;
373
377
s->height = (avctx->height + 3) & ~3;
375
// check for paletted data
376
s->palette_video = 0;
379
avctx->pix_fmt = PIX_FMT_YUV420P;
379
// check for paletted data
380
if ((avctx->palctrl == NULL) || (avctx->bits_per_sample == 40)) {
381
s->palette_video = 0;
382
avctx->pix_fmt = PIX_FMT_YUV420P;
384
s->palette_video = 1;
385
avctx->pix_fmt = PIX_FMT_PAL8;
380
388
avctx->has_b_frames = 0;
381
389
dsputil_init(&s->dsp, avctx);
405
413
cinepak_decode(s);
415
if (s->palette_video) {
416
memcpy (s->frame.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
417
if (avctx->palctrl->palette_changed) {
418
s->frame.palette_has_changed = 1;
419
avctx->palctrl->palette_changed = 0;
421
s->frame.palette_has_changed = 0;
407
424
*data_size = sizeof(AVFrame);
408
425
*(AVFrame*)data = s->frame;