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 }