Browse Source

avcodec/vp8: vp8_find_free_buffer

Signed-off-by: Peter Ross <pross@xvid.org>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.3
Peter Ross Michael Niedermayer 12 years ago
parent
commit
7d4c0220f1
1 changed files with 25 additions and 15 deletions
  1. +25
    -15
      libavcodec/vp8.c

+ 25
- 15
libavcodec/vp8.c View File

@@ -110,6 +110,30 @@ static void vp8_decode_flush(AVCodecContext *avctx)
vp8_decode_flush_impl(avctx, 0); 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) static int update_dimensions(VP8Context *s, int width, int height)
{ {
AVCodecContext *avctx = s->avctx; 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]) &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2])
vp8_release_frame(s, &s->frames[i]); 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 // 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 // that the values we have on a random interframe are complete junk if we didn't


Loading…
Cancel
Save