comparison cinepak.c @ 2009:b13a25ac9f0c libavcodec

buffer hints, use reget_buffer, removed copy from previous frame
author rtognimp
date Fri, 07 May 2004 21:34:33 +0000
parents 39ad6cd5d4a6
children 9e0b49e1c7ff
comparison
equal deleted inserted replaced
2008:fc54b7be8448 2009:b13a25ac9f0c
55 typedef struct CinepakContext { 55 typedef struct CinepakContext {
56 56
57 AVCodecContext *avctx; 57 AVCodecContext *avctx;
58 DSPContext dsp; 58 DSPContext dsp;
59 AVFrame frame; 59 AVFrame frame;
60 AVFrame prev_frame;
61 60
62 unsigned char *data; 61 unsigned char *data;
63 int size; 62 int size;
64 63
65 int width, height; 64 int width, height;
123 int chunk_id, int size, uint8_t *data) 122 int chunk_id, int size, uint8_t *data)
124 { 123 {
125 uint8_t *eod = (data + size); 124 uint8_t *eod = (data + size);
126 uint32_t flag, mask; 125 uint32_t flag, mask;
127 cvid_codebook_t *codebook; 126 cvid_codebook_t *codebook;
128 unsigned int i, j, x, y; 127 unsigned int x, y;
129 uint32_t iy[4]; 128 uint32_t iy[4];
130 uint32_t iu[2]; 129 uint32_t iu[2];
131 uint32_t iv[2]; 130 uint32_t iv[2];
132 131
133 flag = 0; 132 flag = 0;
248 s->frame.data[1][iu[1] + 1] = codebook->u; 247 s->frame.data[1][iu[1] + 1] = codebook->u;
249 s->frame.data[2][iv[1] + 1] = codebook->v; 248 s->frame.data[2][iv[1] + 1] = codebook->v;
250 } 249 }
251 250
252 } 251 }
253 } else {
254 /* copy from the previous frame */
255 for (i = 0; i < 4; i++) {
256 for (j = 0; j < 4; j++) {
257 s->frame.data[0][iy[i] + j] =
258 s->prev_frame.data[0][iy[i] + j];
259 }
260 }
261 for (i = 0; i < 2; i++) {
262 for (j = 0; j < 2; j++) {
263 s->frame.data[1][iu[i] + j] =
264 s->prev_frame.data[1][iu[i] + j];
265 s->frame.data[2][iv[i] + j] =
266 s->prev_frame.data[2][iv[i] + j];
267 }
268 }
269 } 252 }
270 253
271 iy[0] += 4; iy[1] += 4; 254 iy[0] += 4; iy[1] += 4;
272 iy[2] += 4; iy[3] += 4; 255 iy[2] += 4; iy[3] += 4;
273 iu[0] += 2; iu[1] += 2; 256 iu[0] += 2; iu[1] += 2;
395 378
396 avctx->pix_fmt = PIX_FMT_YUV420P; 379 avctx->pix_fmt = PIX_FMT_YUV420P;
397 avctx->has_b_frames = 0; 380 avctx->has_b_frames = 0;
398 dsputil_init(&s->dsp, avctx); 381 dsputil_init(&s->dsp, avctx);
399 382
400 s->frame.data[0] = s->prev_frame.data[0] = NULL; 383 s->frame.data[0] = NULL;
401 384
402 return 0; 385 return 0;
403 } 386 }
404 387
405 static int cinepak_decode_frame(AVCodecContext *avctx, 388 static int cinepak_decode_frame(AVCodecContext *avctx,
409 CinepakContext *s = (CinepakContext *)avctx->priv_data; 392 CinepakContext *s = (CinepakContext *)avctx->priv_data;
410 393
411 s->data = buf; 394 s->data = buf;
412 s->size = buf_size; 395 s->size = buf_size;
413 396
414 if (avctx->get_buffer(avctx, &s->frame)) { 397 s->frame.reference = 1;
415 av_log(avctx, AV_LOG_ERROR, " Cinepak: get_buffer() failed\n"); 398 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
399 FF_BUFFER_HINTS_REUSABLE;
400 if (avctx->reget_buffer(avctx, &s->frame)) {
401 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
416 return -1; 402 return -1;
417 } 403 }
418 404
419 cinepak_decode(s); 405 cinepak_decode(s);
420 406
421 if (s->prev_frame.data[0])
422 avctx->release_buffer(avctx, &s->prev_frame);
423
424 /* shuffle frames */
425 s->prev_frame = s->frame;
426
427 *data_size = sizeof(AVFrame); 407 *data_size = sizeof(AVFrame);
428 *(AVFrame*)data = s->frame; 408 *(AVFrame*)data = s->frame;
429 409
430 /* report that the buffer was completely consumed */ 410 /* report that the buffer was completely consumed */
431 return buf_size; 411 return buf_size;
433 413
434 static int cinepak_decode_end(AVCodecContext *avctx) 414 static int cinepak_decode_end(AVCodecContext *avctx)
435 { 415 {
436 CinepakContext *s = (CinepakContext *)avctx->priv_data; 416 CinepakContext *s = (CinepakContext *)avctx->priv_data;
437 417
438 if (s->prev_frame.data[0]) 418 if (s->frame.data[0])
439 avctx->release_buffer(avctx, &s->prev_frame); 419 avctx->release_buffer(avctx, &s->frame);
440 420
441 return 0; 421 return 0;
442 } 422 }
443 423
444 AVCodec cinepak_decoder = { 424 AVCodec cinepak_decoder = {