Commit 8cb7ffa1 authored by conrad's avatar conrad

vp3: Simplify buffer management

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@22357 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent c51dce95
...@@ -1809,6 +1809,12 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1809,6 +1809,12 @@ static int vp3_decode_frame(AVCodecContext *avctx,
if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe) if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe)
return buf_size; return buf_size;
s->current_frame.reference = 3;
if (avctx->get_buffer(avctx, &s->current_frame) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
if (s->keyframe) { if (s->keyframe) {
if (!s->theora) if (!s->theora)
{ {
...@@ -1827,35 +1833,10 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1827,35 +1833,10 @@ static int vp3_decode_frame(AVCodecContext *avctx,
av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n");
skip_bits(&gb, 2); /* reserved? */ skip_bits(&gb, 2); /* reserved? */
} }
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);
if (s->last_frame.data[0])
avctx->release_buffer(avctx, &s->last_frame);
}
s->golden_frame.reference = 3;
if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
return -1;
}
/* golden frame is also the current frame */
s->current_frame= s->golden_frame;
} else { } else {
/* allocate a new current frame */
s->current_frame.reference = 3;
if (!s->golden_frame.data[0]) { if (!s->golden_frame.data[0]) {
av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n"); av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n");
return -1; avctx->release_buffer(avctx, &s->current_frame);
}
if(avctx->get_buffer(avctx, &s->current_frame) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
return -1; return -1;
} }
} }
...@@ -1915,6 +1896,13 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1915,6 +1896,13 @@ static int vp3_decode_frame(AVCodecContext *avctx,
/* shuffle frames (last = current) */ /* shuffle frames (last = current) */
s->last_frame= s->current_frame; s->last_frame= s->current_frame;
if (s->keyframe) {
if (s->golden_frame.data[0])
avctx->release_buffer(avctx, &s->golden_frame);
s->golden_frame = s->current_frame;
}
s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */ s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */
return buf_size; return buf_size;
......
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