[FFmpeg-devel] [PATCH 5/6] avcodec/vp8: vp8_find_free_buffer
Ronald S. Bultje
rsbultje at gmail.com
Thu Feb 6 15:23:20 CET 2014
Hi,
On Thu, Feb 6, 2014 at 8:20 AM, Peter Ross <pross at xvid.org> wrote:
> Signed-off-by: Peter Ross <pross at xvid.org>
> ---
> libavcodec/vp8.c | 40 +++++++++++++++++++++++++---------------
> 1 file changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
> index 312090a..8aa1320 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
> --
> 1.8.3.2
>
lgtm.
Ronald
More information about the ffmpeg-devel
mailing list