mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/vp8: vp8_find_free_buffer
Signed-off-by: Peter Ross <pross@xvid.org> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
a81ee2651f
commit
7d4c0220f1
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user