Commit 936312d1 authored by Aman Gupta's avatar Aman Gupta

avcodec/mediacodecdec: add debug logging around hw buffer lifecycle

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.
Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
Signed-off-by: 's avatarMatthieu Bouron <matthieu.bouron@gmail.com>
parent 939440ad
......@@ -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_buffer_count, 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_buffer_count));
return ff_AMediaCodec_releaseOutputBuffer(ctx->codec, buffer->index, render);
}
......
......@@ -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_buffer_count, 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_buffer_count));
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_buffer_count, 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_buffer_count));
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_buffer_count, 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_buffer_count, 0);
atomic_init(&s->serial, 1);
pix_fmt = ff_get_format(avctx, pix_fmts);
......
......@@ -38,6 +38,7 @@ typedef struct MediaCodecDecContext {
AVCodecContext *avctx;
atomic_int refcount;
atomic_int hw_buffer_count;
char *codec_name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment