Commit b6b1de81 authored by michaelni's avatar michaelni

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


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@2126 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 4d76d1c4
...@@ -2699,10 +2699,10 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2699,10 +2699,10 @@ static int vp3_decode_frame(AVCodecContext *avctx,
debug_vp3(", keyframe\n"); debug_vp3(", keyframe\n");
/* skip the other 2 header bytes for now */ /* skip the other 2 header bytes for now */
skip_bits(&gb, 16); skip_bits(&gb, 16);
if (s->last_frame.data[0] == s->golden_frame.data[0]) { if (s->last_frame.data[0] == s->golden_frame.data[0]) {
if (s->golden_frame.data[0]) if (s->golden_frame.data[0])
avctx->release_buffer(avctx, &s->golden_frame); avctx->release_buffer(avctx, &s->golden_frame);
s->last_frame= s->golden_frame; /* ensure that we catch any access to this released frame */
} else { } else {
if (s->golden_frame.data[0]) if (s->golden_frame.data[0])
avctx->release_buffer(avctx, &s->golden_frame); avctx->release_buffer(avctx, &s->golden_frame);
...@@ -2710,7 +2710,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2710,7 +2710,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
avctx->release_buffer(avctx, &s->last_frame); 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) { if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
printf("vp3: get_buffer() failed\n"); printf("vp3: get_buffer() failed\n");
return -1; return -1;
...@@ -2728,7 +2728,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2728,7 +2728,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
debug_vp3("\n"); debug_vp3("\n");
/* allocate a new current frame */ /* allocate a new current frame */
s->current_frame.reference = 0; s->current_frame.reference = 3;
if(avctx->get_buffer(avctx, &s->current_frame) < 0) { if(avctx->get_buffer(avctx, &s->current_frame) < 0) {
printf("vp3: get_buffer() failed\n"); printf("vp3: get_buffer() failed\n");
return -1; return -1;
...@@ -2789,6 +2789,7 @@ if (!s->keyframe) { ...@@ -2789,6 +2789,7 @@ if (!s->keyframe) {
/* shuffle frames (last = current) */ /* shuffle frames (last = current) */
memcpy(&s->last_frame, &s->current_frame, sizeof(AVFrame)); 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; return buf_size;
} }
...@@ -2808,7 +2809,7 @@ static int vp3_decode_end(AVCodecContext *avctx) ...@@ -2808,7 +2809,7 @@ static int vp3_decode_end(AVCodecContext *avctx)
av_free(s->macroblock_coding); av_free(s->macroblock_coding);
/* release all frames */ /* 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); avctx->release_buffer(avctx, &s->golden_frame);
if (s->last_frame.data[0]) if (s->last_frame.data[0])
avctx->release_buffer(avctx, &s->last_frame); avctx->release_buffer(avctx, &s->last_frame);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment