From patchwork Sun Mar 11 07:48:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 7900 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp383442jad; Sat, 10 Mar 2018 23:48:55 -0800 (PST) X-Google-Smtp-Source: AG47ELtcmEDjjm638u3T/W9bf1mRfAQo0PRDfac4vp/qNMbTgg6y18YMWh77rjHVc3c41qolNxRN X-Received: by 10.223.160.110 with SMTP id l43mr1027214wrl.264.1520754535219; Sat, 10 Mar 2018 23:48:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520754535; cv=none; d=google.com; s=arc-20160816; b=aMP2y+x/FEQR1+xHzwMG4EzHj+39XgVZdDqctXJhOMUFRUQR+30XhTbMhsMADbd5PA 99fXQkPrA8Pg5D1l1qfRH1TvrOwezCgaIjjdm1J++6Sei8KqnvyDzpOEfMwuFqvpTWiJ KQDSwEArhCVrnqWirrrn5LQhuOBuzh51p78YjCB5WiPRPt+hnTeCkHAFe8vEVxbQMUh2 2ZDq4VeGv0Gy7JqM91npPOaq55kSCdk4Ic/tXTBpGgsZARervHi20TOzo1xUPUHtRnmQ 2IjBVtK98hIsWBO6XHz7MEwUOVg+qICIbi/LwXJ2pqQ10PRr0lCRCz//LfDkR0TNN7Zs vESw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=2GovmU0dzPKwoMcxKhu9+tzragMOUxDGkF/Ak8oBHYU=; b=XQdVNNhgxOnPAu5xzPkaF+aNxEqRpebA2DkUIFRk6GU3F/Mzowc61XGU1M7phroXRy tzdJU98zFFBgcHCdbBjCXyIKNN8IChqycIiruP7xrutSekkAM/0roW67PEqc8F7Rc6im /lNVQA0q2wY2CbAN8JYU2S3qUKFr9JVo84j6Njb/UDwGmaWngrJ7sdfM2ubfV1eDdgVC alTcWC2JeCFcsWYGpNhFqWKvkxVZ7myRlzWwmOjp53732cb0iMUxdNhS+mzvYtJhguXs m1eWiL/Ho4ZVswCClO7cTpuZaBgfad+OaT5gEYwKr3JO2U7KK/Jmdpuqsz11w2g7a09m phYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.com header.s=20150623 header.b=SKvNd02j; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 73si1560392wmb.192.2018.03.10.23.48.54; Sat, 10 Mar 2018 23:48:55 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.com header.s=20150623 header.b=SKvNd02j; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6E94E68A1EE; Sun, 11 Mar 2018 09:48:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f181.google.com (mail-pf0-f181.google.com [209.85.192.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B7DAA68A109 for ; Sun, 11 Mar 2018 09:48:36 +0200 (EET) Received: by mail-pf0-f181.google.com with SMTP id j2so3037806pff.10 for ; Sat, 10 Mar 2018 23:48:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tmm1-net.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=1SFFJyMB89uiL9e+KQ+8qqxBRoIaKYCrq8dViQPRSPM=; b=SKvNd02j7K7g7gI828VsO1LyDqOpljxQfR1vwxvzL0NQHlXww/OAEyGHBWfCtydeos Ue70rzsJgFWNIja3DfprhYiWSCLTDFu9DSmg9STpOBTQY7oBFBVyHJeBl0rfARAR5WuW djT8Of4XtVUbbHZBkyG3pkN0uqwyiJqpPIrV0sexEieaWBXOKn6r0DUadSstpU+4PqWL fAWZk9Nj3MC1zjQX4XP0IHHIQEXgOojdfEkExC1EKRR8mtFHZ70nlULPPbb8sTQA01w8 JSlpUxTvCndP0nVohkIpm8bJeqLjEk+scaPKr7nfllhE01/tJ0uZIuQ0iGKR78qRpf2h apYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=1SFFJyMB89uiL9e+KQ+8qqxBRoIaKYCrq8dViQPRSPM=; b=VoiL9yxjJ0I1Lua29+TqxWFuw4BDWwM1IUsO6NoQYBU3eOt1poRCuPX+bmVkvzpd2Y Ae+CIZMZS7Z6Uhix4nI8ieLL0C/g1f9s2HQT1ig6gFGXNelkb27Vy1P4RJHv/TOHHb7e v7awmJWFpuzA/AJ6165qJKgDM/4L5DS5bayNwa3vpOQ7O69pLy2mWYuyFwJW5TTeqG+x ei2boiAcCUkqzgdQuc5a6Q+BZfebLEZwXMJ0jJaq34i2aFuHeWy5Q3G847oX7+VzZBJ7 71Ik0Jur4fRn7zDEPQ5HvgS8ouDtaAhQM78eZwraviSBLENRGEbu4U3P1xrXeMCNm2CJ /fFA== X-Gm-Message-State: AElRT7FYmJ+Wp5Dv3ehBD4P+KmjCMlEAZLQEUjR+fjVJR9AomR1zr4e7 JDKhS7aRUjvkRCJaXCCz5oyQzSYf X-Received: by 10.101.82.70 with SMTP id q6mr3361448pgp.67.1520754524326; Sat, 10 Mar 2018 23:48:44 -0800 (PST) Received: from localhost.localdomain (c-69-181-54-242.hsd1.ca.comcast.net. [69.181.54.242]) by smtp.gmail.com with ESMTPSA id 68sm10547070pfx.130.2018.03.10.23.48.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Mar 2018 23:48:43 -0800 (PST) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Sat, 10 Mar 2018 23:48:37 -0800 Message-Id: <20180311074837.55368-1-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.14.3 (Apple Git-98) Subject: [FFmpeg-devel] [PATCH] avcodec/mediacodecdec: add debug logging around hw buffer lifecycle X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: matthieu.bouron@gmail.com, Aman Gupta MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta 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;