Mercurial > libavcodec.hg
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 = { |