[FFmpeg-devel] [PATCH] avcodec/mediacodecdec: add debug logging around hw buffer lifecycle

Aman Gupta aman at tmm1.net
Mon Mar 12 10:26:02 EET 2018


On Sat, Mar 10, 2018 at 11:48 PM, Aman Gupta <ffmpeg at tmm1.net> wrote:

> From: Aman Gupta <aman at tmm1.net>
>
> Some Android devices are very finicky about how quicky output buffers
> are returned back to the decoder, especially when they are associated
> with a Surface.
>
> This commit adds a new counter that keeps track of exactly how many hw
> output buffers are being retained by the user, along with DEBUG level
> logging that makes it easy to track the lifecycle of these buffers.
> ---
>  libavcodec/mediacodec.c           |  7 ++++---
>  libavcodec/mediacodecdec_common.c | 11 +++++++++++
>  libavcodec/mediacodecdec_common.h |  1 +
>  3 files changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/libavcodec/mediacodec.c b/libavcodec/mediacodec.c
> index 3ddd303c97..25491a01ec 100644
> --- a/libavcodec/mediacodec.c
> +++ b/libavcodec/mediacodec.c
> @@ -92,9 +92,10 @@ int av_mediacodec_release_buffer(AVMediaCodecBuffer
> *buffer, int render)
>      int released = atomic_fetch_add(&buffer->released, 1);
>
>      if (!released && (ctx->delay_flush || buffer->serial ==
> atomic_load(&ctx->serial))) {
> -        av_log(ctx->avctx, AV_LOG_TRACE,
> -               "Releasing output buffer %zd ts=%"PRId64" render=%d\n",
> -               buffer->index, buffer->pts, render);
> +        atomic_fetch_sub(&ctx->hw_buffers, 1);
> +        av_log(ctx->avctx, AV_LOG_DEBUG,
> +               "Releasing output buffer %zd (%p) ts=%"PRId64" with
> render=%d [%d pending]\n",
> +               buffer->index, buffer, buffer->pts, render,
> atomic_load(&ctx->hw_buffers));
>          return ff_AMediaCodec_releaseOutputBuffer(ctx->codec,
> buffer->index, render);
>      }
>
> diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_
> common.c
> index 5064809cf6..f699609186 100644
> --- a/libavcodec/mediacodecdec_common.c
> +++ b/libavcodec/mediacodecdec_common.c
> @@ -179,6 +179,10 @@ static void mediacodec_buffer_release(void *opaque,
> uint8_t *data)
>      int released = atomic_load(&buffer->released);
>
>      if (!released && (ctx->delay_flush || buffer->serial ==
> atomic_load(&ctx->serial))) {
> +        atomic_fetch_sub(&ctx->hw_buffers, 1);
> +        av_log(ctx->avctx, AV_LOG_DEBUG,
> +               "Releasing output buffer %zd (%p) ts=%"PRId64" on free()
> [%d pending]\n",
> +               buffer->index, buffer, buffer->pts,
> atomic_load(&ctx->hw_buffers));
>          ff_AMediaCodec_releaseOutputBuffer(ctx->codec, buffer->index, 0);
>      }
>
> @@ -246,6 +250,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
>
>      frame->data[3] = (uint8_t *)buffer;
>
> +    atomic_fetch_add(&s->hw_buffers, 1);
> +    av_log(avctx, AV_LOG_DEBUG,
> +            "Wrapping output buffer %zd (%p) ts=%"PRId64" [%d pending]\n",
> +            buffer->index, buffer, buffer->pts,
> atomic_load(&s->hw_buffers));
> +
>      return 0;
>  fail:
>      av_freep(buffer);
> @@ -429,6 +438,7 @@ static int mediacodec_dec_flush_codec(AVCodecContext
> *avctx, MediaCodecDecContex
>      s->flushing = 0;
>      s->eos = 0;
>      atomic_fetch_add(&s->serial, 1);
> +    atomic_init(&s->hw_buffers, 0);
>
>      status = ff_AMediaCodec_flush(codec);
>      if (status < 0) {
> @@ -454,6 +464,7 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx,
> MediaCodecDecContext *s,
>
>      s->avctx = avctx;
>      atomic_init(&s->refcount, 1);
> +    atomic_init(&s->hw_buffers, 0);
>      atomic_init(&s->serial, 1);
>
>      pix_fmt = ff_get_format(avctx, pix_fmts);
> diff --git a/libavcodec/mediacodecdec_common.h b/libavcodec/mediacodecdec_
> common.h
> index 3fd2412a65..8bfc67942d 100644
> --- a/libavcodec/mediacodecdec_common.h
> +++ b/libavcodec/mediacodecdec_common.h
> @@ -38,6 +38,7 @@ typedef struct MediaCodecDecContext {
>
>      AVCodecContext *avctx;
>      atomic_int refcount;
> +    atomic_int hw_buffers;
>
>      char *codec_name;
>

Applied to master with s/hw_buffers/hw_buffer_count/g


>
> --
> 2.14.3 (Apple Git-98)
>
>


More information about the ffmpeg-devel mailing list