# HG changeset patch # User michaelni # Date 1061309928 0 # Node ID e69f99ade5b0f0af9900ad599d21ec2cf1b6b8f6 # Parent 321fd44a1e3e3f78aeb72dccbcf2d6d2f465c787 fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0) fix some assert in utils.c (no bug but its saver if the released pointers are NULL) fix double release_buffer() at the end diff -r 321fd44a1e3e -r e69f99ade5b0 vp3.c --- a/vp3.c Mon Aug 18 09:20:02 2003 +0000 +++ b/vp3.c Tue Aug 19 16:18:48 2003 +0000 @@ -2699,10 +2699,10 @@ debug_vp3(", keyframe\n"); /* skip the other 2 header bytes for now */ skip_bits(&gb, 16); - if (s->last_frame.data[0] == s->golden_frame.data[0]) { if (s->golden_frame.data[0]) avctx->release_buffer(avctx, &s->golden_frame); + s->last_frame= s->golden_frame; /* ensure that we catch any access to this released frame */ } else { if (s->golden_frame.data[0]) avctx->release_buffer(avctx, &s->golden_frame); @@ -2710,7 +2710,7 @@ avctx->release_buffer(avctx, &s->last_frame); } - s->golden_frame.reference = 0; + s->golden_frame.reference = 3; if(avctx->get_buffer(avctx, &s->golden_frame) < 0) { printf("vp3: get_buffer() failed\n"); return -1; @@ -2728,7 +2728,7 @@ debug_vp3("\n"); /* allocate a new current frame */ - s->current_frame.reference = 0; + s->current_frame.reference = 3; if(avctx->get_buffer(avctx, &s->current_frame) < 0) { printf("vp3: get_buffer() failed\n"); return -1; @@ -2789,6 +2789,7 @@ /* shuffle frames (last = current) */ memcpy(&s->last_frame, &s->current_frame, sizeof(AVFrame)); + s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */ return buf_size; } @@ -2806,9 +2807,9 @@ av_free(s->superblock_macroblocks); av_free(s->macroblock_fragments); av_free(s->macroblock_coding); - + /* release all frames */ - if (s->golden_frame.data[0]) + if (s->golden_frame.data[0] && s->golden_frame.data[0] != s->last_frame.data[0]) avctx->release_buffer(avctx, &s->golden_frame); if (s->last_frame.data[0]) avctx->release_buffer(avctx, &s->last_frame);