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);
|
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
|
curframe = s->framep[VP56_FRAME_CURRENT] = vp8_find_free_buffer(s);
|
||||||
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);
|
|
||||||
|
|
||||||
// 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…
Reference in New Issue
Block a user