diff options
author | David Conrad <lessen42@gmail.com> | 2010-03-09 03:29:12 +0300 |
---|---|---|
committer | David Conrad <lessen42@gmail.com> | 2010-03-09 03:29:12 +0300 |
commit | 739b5090af69aae5dc1417e4ed61dd7e1af050d1 (patch) | |
tree | bde1f1f4475d02b77721b3f4ac511560b00c33ca /libavcodec/vp3.c | |
parent | 01f9640b21f159cc8a9d292ce8a70feb7dbc2ea7 (diff) |
vp3: Simplify buffer management
Originally committed as revision 22357 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp3.c')
-rw-r--r-- | libavcodec/vp3.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 78cae0f21e..4e81246bf4 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -1809,6 +1809,12 @@ static int vp3_decode_frame(AVCodecContext *avctx, if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe) 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->theora) { @@ -1827,35 +1833,10 @@ static int vp3_decode_frame(AVCodecContext *avctx, av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); 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 { - /* allocate a new current frame */ - s->current_frame.reference = 3; if (!s->golden_frame.data[0]) { av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n"); - return -1; - } - if(avctx->get_buffer(avctx, &s->current_frame) < 0) { - av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n"); + avctx->release_buffer(avctx, &s->current_frame); return -1; } } @@ -1915,6 +1896,13 @@ static int vp3_decode_frame(AVCodecContext *avctx, /* shuffle frames (last = current) */ 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 */ return buf_size; |