Mercurial > libavcodec.hg
comparison vp56.c @ 4595:340c876320eb libavcodec
Use pointers to avoid copying AVFrame.
This ensure get_buffer() won't be confused with an AVFrame pointer
which looks like it wasn't released.
author | aurel |
---|---|
date | Sun, 25 Feb 2007 15:33:38 +0000 |
parents | a96d905dcbaa |
children | 4992cbff45c6 |
comparison
equal
deleted
inserted
replaced
4594:a96d905dcbaa | 4595:340c876320eb |
---|---|
324 | 324 |
325 static void vp56_mc(vp56_context_t *s, int b, uint8_t *src, | 325 static void vp56_mc(vp56_context_t *s, int b, uint8_t *src, |
326 int stride, int x, int y) | 326 int stride, int x, int y) |
327 { | 327 { |
328 int plane = vp56_b6to3[b]; | 328 int plane = vp56_b6to3[b]; |
329 uint8_t *dst= s->frames[VP56_FRAME_CURRENT].data[plane]+s->block_offset[b]; | 329 uint8_t *dst=s->framep[VP56_FRAME_CURRENT]->data[plane]+s->block_offset[b]; |
330 uint8_t *src_block; | 330 uint8_t *src_block; |
331 int src_offset; | 331 int src_offset; |
332 int overlap_offset = 0; | 332 int overlap_offset = 0; |
333 int mask = s->vp56_coord_div[b] - 1; | 333 int mask = s->vp56_coord_div[b] - 1; |
334 int deblock_filtering = s->deblock_filtering; | 334 int deblock_filtering = s->deblock_filtering; |
335 int dx; | 335 int dx; |
336 int dy; | 336 int dy; |
337 | 337 |
338 if (s->avctx->skip_loop_filter >= AVDISCARD_ALL || | 338 if (s->avctx->skip_loop_filter >= AVDISCARD_ALL || |
339 (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY | 339 (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY |
340 && !s->frames[VP56_FRAME_CURRENT].key_frame)) | 340 && !s->framep[VP56_FRAME_CURRENT]->key_frame)) |
341 deblock_filtering = 0; | 341 deblock_filtering = 0; |
342 | 342 |
343 dx = s->mv[b].x / s->vp56_coord_div[b]; | 343 dx = s->mv[b].x / s->vp56_coord_div[b]; |
344 dy = s->mv[b].y / s->vp56_coord_div[b]; | 344 dy = s->mv[b].y / s->vp56_coord_div[b]; |
345 | 345 |
398 AVFrame *frame_current, *frame_ref; | 398 AVFrame *frame_current, *frame_ref; |
399 vp56_mb_t mb_type; | 399 vp56_mb_t mb_type; |
400 vp56_frame_t ref_frame; | 400 vp56_frame_t ref_frame; |
401 int b, plan, off; | 401 int b, plan, off; |
402 | 402 |
403 if (s->frames[VP56_FRAME_CURRENT].key_frame) | 403 if (s->framep[VP56_FRAME_CURRENT]->key_frame) |
404 mb_type = VP56_MB_INTRA; | 404 mb_type = VP56_MB_INTRA; |
405 else | 405 else |
406 mb_type = vp56_decode_mv(s, row, col); | 406 mb_type = vp56_decode_mv(s, row, col); |
407 ref_frame = vp56_reference_frame[mb_type]; | 407 ref_frame = vp56_reference_frame[mb_type]; |
408 | 408 |
410 | 410 |
411 s->parse_coeff(s); | 411 s->parse_coeff(s); |
412 | 412 |
413 vp56_add_predictors_dc(s, ref_frame); | 413 vp56_add_predictors_dc(s, ref_frame); |
414 | 414 |
415 frame_current = &s->frames[VP56_FRAME_CURRENT]; | 415 frame_current = s->framep[VP56_FRAME_CURRENT]; |
416 frame_ref = &s->frames[ref_frame]; | 416 frame_ref = s->framep[ref_frame]; |
417 | 417 |
418 switch (mb_type) { | 418 switch (mb_type) { |
419 case VP56_MB_INTRA: | 419 case VP56_MB_INTRA: |
420 for (b=0; b<6; b++) { | 420 for (b=0; b<6; b++) { |
421 plan = vp56_b6to3[b]; | 421 plan = vp56_b6to3[b]; |
457 } | 457 } |
458 } | 458 } |
459 | 459 |
460 static int vp56_size_changed(AVCodecContext *avctx, vp56_context_t *s) | 460 static int vp56_size_changed(AVCodecContext *avctx, vp56_context_t *s) |
461 { | 461 { |
462 int stride = s->frames[VP56_FRAME_CURRENT].linesize[0]; | 462 int stride = s->framep[VP56_FRAME_CURRENT]->linesize[0]; |
463 int i; | 463 int i; |
464 | 464 |
465 s->plane_width[0] = s->avctx->coded_width; | 465 s->plane_width[0] = s->avctx->coded_width; |
466 s->plane_width[1] = s->plane_width[2] = s->avctx->coded_width/2; | 466 s->plane_width[1] = s->plane_width[2] = s->avctx->coded_width/2; |
467 s->plane_height[0] = s->avctx->coded_height; | 467 s->plane_height[0] = s->avctx->coded_height; |
468 s->plane_height[1] = s->plane_height[2] = s->avctx->coded_height/2; | 468 s->plane_height[1] = s->plane_height[2] = s->avctx->coded_height/2; |
469 | 469 |
470 for (i=0; i<3; i++) | 470 for (i=0; i<3; i++) |
471 s->stride[i] = s->flip * s->frames[VP56_FRAME_CURRENT].linesize[i]; | 471 s->stride[i] = s->flip * s->framep[VP56_FRAME_CURRENT]->linesize[i]; |
472 | 472 |
473 s->mb_width = (s->avctx->coded_width+15) / 16; | 473 s->mb_width = (s->avctx->coded_width+15) / 16; |
474 s->mb_height = (s->avctx->coded_height+15) / 16; | 474 s->mb_height = (s->avctx->coded_height+15) / 16; |
475 | 475 |
476 if (s->mb_width > 1000 || s->mb_height > 1000) { | 476 if (s->mb_width > 1000 || s->mb_height > 1000) { |
493 | 493 |
494 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | 494 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
495 uint8_t *buf, int buf_size) | 495 uint8_t *buf, int buf_size) |
496 { | 496 { |
497 vp56_context_t *s = avctx->priv_data; | 497 vp56_context_t *s = avctx->priv_data; |
498 AVFrame *const p = &s->frames[VP56_FRAME_CURRENT]; | 498 AVFrame *const p = s->framep[VP56_FRAME_CURRENT]; |
499 AVFrame *picture = data; | 499 AVFrame *picture = data; |
500 int mb_row, mb_col, mb_row_flip, mb_offset = 0; | 500 int mb_row, mb_col, mb_row_flip, mb_offset = 0; |
501 int block, y, uv, stride_y, stride_uv; | 501 int block, y, uv, stride_y, stride_uv; |
502 int golden_frame = 0; | 502 int golden_frame = 0; |
503 int res; | 503 int res; |
592 s->block_offset[uv] += 8; | 592 s->block_offset[uv] += 8; |
593 } | 593 } |
594 } | 594 } |
595 } | 595 } |
596 | 596 |
597 if (s->frames[VP56_FRAME_PREVIOUS].data[0] | 597 if (s->framep[VP56_FRAME_PREVIOUS] == s->framep[VP56_FRAME_GOLDEN]) |
598 && (s->frames[VP56_FRAME_PREVIOUS].data[0] | 598 FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS], |
599 != s->frames[VP56_FRAME_GOLDEN].data[0])) { | 599 s->framep[VP56_FRAME_UNUSED]); |
600 avctx->release_buffer(avctx, &s->frames[VP56_FRAME_PREVIOUS]); | 600 else if (s->framep[VP56_FRAME_PREVIOUS]->data[0]) |
601 } | 601 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]); |
602 if (p->key_frame || golden_frame) { | 602 if (p->key_frame || golden_frame) { |
603 if (s->frames[VP56_FRAME_GOLDEN].data[0]) | 603 if (s->framep[VP56_FRAME_GOLDEN]->data[0]) |
604 avctx->release_buffer(avctx, &s->frames[VP56_FRAME_GOLDEN]); | 604 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]); |
605 s->frames[VP56_FRAME_GOLDEN] = *p; | 605 s->framep[VP56_FRAME_GOLDEN] = p; |
606 } | 606 } |
607 s->frames[VP56_FRAME_PREVIOUS] = *p; | 607 FFSWAP(AVFrame *, s->framep[VP56_FRAME_CURRENT], |
608 s->framep[VP56_FRAME_PREVIOUS]); | |
608 | 609 |
609 *picture = *p; | 610 *picture = *p; |
610 *data_size = sizeof(AVPicture); | 611 *data_size = sizeof(AVPicture); |
611 | 612 |
612 s->frames[VP56_FRAME_CURRENT].data[0] = NULL; | |
613 return buf_size; | 613 return buf_size; |
614 } | 614 } |
615 | 615 |
616 void vp56_init(vp56_context_t *s, AVCodecContext *avctx, int flip) | 616 void vp56_init(vp56_context_t *s, AVCodecContext *avctx, int flip) |
617 { | 617 { |
626 ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct); | 626 ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct); |
627 | 627 |
628 avcodec_set_dimensions(s->avctx, 0, 0); | 628 avcodec_set_dimensions(s->avctx, 0, 0); |
629 | 629 |
630 for (i=0; i<3; i++) | 630 for (i=0; i<3; i++) |
631 s->frames[i].data[0] = NULL; | 631 s->framep[i] = &s->frames[i]; |
632 s->framep[VP56_FRAME_UNUSED] = s->framep[VP56_FRAME_GOLDEN]; | |
632 s->edge_emu_buffer_alloc = NULL; | 633 s->edge_emu_buffer_alloc = NULL; |
633 | 634 |
634 s->above_blocks = NULL; | 635 s->above_blocks = NULL; |
635 s->macroblocks = NULL; | 636 s->macroblocks = NULL; |
636 s->quantizer = -1; | 637 s->quantizer = -1; |
654 vp56_context_t *s = avctx->priv_data; | 655 vp56_context_t *s = avctx->priv_data; |
655 | 656 |
656 av_free(s->above_blocks); | 657 av_free(s->above_blocks); |
657 av_free(s->macroblocks); | 658 av_free(s->macroblocks); |
658 av_free(s->edge_emu_buffer_alloc); | 659 av_free(s->edge_emu_buffer_alloc); |
659 if (s->frames[VP56_FRAME_GOLDEN].data[0] | 660 if (s->framep[VP56_FRAME_GOLDEN]->data[0] |
660 && (s->frames[VP56_FRAME_PREVIOUS].data[0] | 661 && (s->framep[VP56_FRAME_PREVIOUS] != s->framep[VP56_FRAME_GOLDEN])) |
661 != s->frames[VP56_FRAME_GOLDEN].data[0])) | 662 avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]); |
662 avctx->release_buffer(avctx, &s->frames[VP56_FRAME_GOLDEN]); | 663 if (s->framep[VP56_FRAME_PREVIOUS]->data[0]) |
663 if (s->frames[VP56_FRAME_PREVIOUS].data[0]) | 664 avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]); |
664 avctx->release_buffer(avctx, &s->frames[VP56_FRAME_PREVIOUS]); | |
665 return 0; | 665 return 0; |
666 } | 666 } |