aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorPeter Ross <pross@xvid.org>2014-02-14 22:58:55 +1100
committerMichael Niedermayer <michaelni@gmx.at>2014-03-25 13:11:38 +0100
commit7d4c0220f18af97857f9f65cb36e2aaa0200220b (patch)
tree947732a1547350911b639b6a4532a0892459533d /libavcodec
parenta81ee2651fafd4412d0f8df159a3a11f6365ba70 (diff)
downloadffmpeg-7d4c0220f18af97857f9f65cb36e2aaa0200220b.tar.gz
avcodec/vp8: vp8_find_free_buffer
Signed-off-by: Peter Ross <pross@xvid.org> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/vp8.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 296eb98202..f13228670d 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -110,6 +110,30 @@ static void vp8_decode_flush(AVCodecContext *avctx)
vp8_decode_flush_impl(avctx, 0);
}
+static VP8Frame * vp8_find_free_buffer(VP8Context *s)
+{
+ VP8Frame *frame = NULL;
+ int i;
+
+ // find a free buffer
+ for (i = 0; i < 5; i++)
+ if (&s->frames[i] != s->framep[VP56_FRAME_CURRENT] &&
+ &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
+ &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
+ &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) {
+ frame = &s->frames[i];
+ break;
+ }
+ if (i == 5) {
+ av_log(s->avctx, AV_LOG_FATAL, "Ran out of free frames!\n");
+ abort();
+ }
+ if (frame->tf.f->data[0])
+ vp8_release_frame(s, frame);
+
+ return frame;
+}
+
static int update_dimensions(VP8Context *s, int width, int height)
{
AVCodecContext *avctx = s->avctx;
@@ -1866,21 +1890,7 @@ int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
&s->frames[i] != s->framep[VP56_FRAME_GOLDEN2])
vp8_release_frame(s, &s->frames[i]);
- // find a free buffer
- for (i = 0; i < 5; i++)
- if (&s->frames[i] != prev_frame &&
- &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] &&
- &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] &&
- &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) {
- curframe = s->framep[VP56_FRAME_CURRENT] = &s->frames[i];
- break;
- }
- if (i == 5) {
- av_log(avctx, AV_LOG_FATAL, "Ran out of free frames!\n");
- abort();
- }
- if (curframe->tf.f->data[0])
- vp8_release_frame(s, curframe);
+ curframe = s->framep[VP56_FRAME_CURRENT] = vp8_find_free_buffer(s);
// Given that arithmetic probabilities are updated every frame, it's quite likely
// that the values we have on a random interframe are complete junk if we didn't