From patchwork Fri Dec 15 07:05:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Bin X-Patchwork-Id: 6788 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp136713jah; Thu, 14 Dec 2017 23:06:12 -0800 (PST) X-Google-Smtp-Source: ACJfBoucc5bI18ZnYam7u/bCefij2v2OEU574zc18ZHaOairkmxrCOwVEcjQFLcbNorDLl0XBdMA X-Received: by 10.223.188.81 with SMTP id a17mr8825683wrh.146.1513321572882; Thu, 14 Dec 2017 23:06:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513321572; cv=none; d=google.com; s=arc-20160816; b=oNqrGobYMpDXzzD9UAatU5DNVovF0cQLY5KwmR1Kn0htbKT4uEShxPQKFEWHEJUCd0 7UqXulkS4EmxDM2rhn5veBzVCmPpux2y6Ha9YoOBerELThkij6g84SRCU0OICQi9SEhW 50Lpu6/VEuW1RWlL+0h369my8hvPLMGmgyksO9rMsQAZWKN0z1182JMsgXHelk5CauOZ 8H4O5EQJuh0CdJInku6s0mAm3iuXoYhqdns0GQd5EmA04dtpBSzcSmRqyIa4Kq26yRh2 g1synt885hr+4xA+Ws9N4QUNbytoC7J+Z/LkTSEG2TUY/tvhamaLX7TmXhdTqfrnOjXF PIwQ== 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=uF3mfK1bMd/WJoiICIrQFaqyS8UTJY/znqmYxCY+4So=; b=z06Leyup4LT0xbvTfi1194Qej9/7wd5RwgQ9cLkFpETHr434UI+3MOgIr2ScA5GDv1 t40OBuGXgJ3MQLvtpbS2yws9fLxztF0fU/LZdy2LZoeB3KjlaxFazdmXo2o1JH0+cIbr GZNqUQm7DqjjNcTe9o5TBEGkGgTjjApn4kPmGutAz7p7nIFKQ5tG7w4qN+VRQ7FqQNb9 TeexqEprw4uDyQldjAqqqeCa8O3Y7Kfwx5px6mpDjWq1oLa8ct2yGaqNEwOtasD7alIU amLr0Fe4cGuxG3fr2cL6atJjo7y/KJrWysXA/gTSrFB+SXD24Vr2e33E1TXDnUKWaWsC HolQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eIouwrB5; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h1si4247832wmd.243.2017.12.14.23.06.12; Thu, 14 Dec 2017 23:06:12 -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=@gmail.com header.s=20161025 header.b=eIouwrB5; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C06F06898CA; Fri, 15 Dec 2017 09:06:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f52.google.com (mail-pg0-f52.google.com [74.125.83.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5BBB86802CA for ; Fri, 15 Dec 2017 09:05:56 +0200 (EET) Received: by mail-pg0-f52.google.com with SMTP id f12so5224580pgo.5 for ; Thu, 14 Dec 2017 23:06:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=bfkpQ/9pFxV2oJgjyFK5MmBl/PFMiSu4+yLXPEPJHzY=; b=eIouwrB51o31bX/DMsj3+duhTdnKVxAjQ/qMf/OLj1T+RUK9PspQvES2NSiuXbARkZ AgbVbvmaOfKjEfBT5z6zVqbDBeMjYSIc5qutDD77f6PsCzhZ6y8/j2F5uTUAtfQJsBTI Y/CBsdKLZckb/6Q54TkJi0dCezz4grr9urXkchWl3GepDGS7Mgjtof6/N+BrjZNA7FiP qPv8oSepryxfLc+JSTKVkQwVly4e3gaenPunL6ktKNBSkTl56OseTZHSyHhB4YnMkESF HHWOiUGJ8TkqdmC5MvlqD7IZpf9oycxgxOxoh4S7letAGt/ByjwEgwBxo3nxy8O7wa1n O5AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=bfkpQ/9pFxV2oJgjyFK5MmBl/PFMiSu4+yLXPEPJHzY=; b=JAGrgCNxW0uES1lJNHI4Z18CHwBnzTJ8kzxJT2u7SDcfGx5S8v4c+Yos1FeGgTOKdx sGq3F208TcFqZWAnhCiRFqEWPcTCiKLmmYQ5Cy100Si9J3GDEFWbhpMkG3TRljROWJYM Uuf8bOmewC8TsaVq5TT6ekVUSliHbFXFEWRvaXMgm2mAc44l+cPysMgt7/QLxwfHCwN7 LbOCq7+DguekDuSX5NHlRVFWi3bOxaXod8CrI6FrmFP22kfujdbFpMc8td9gGhWcJVMp YOCWuG7RbIcjnGNBEcVQ0IkKq04TdmYTFw1VY9JVqzRf1AZjIDiIs4OlAVsIpLYIha7o H/sg== X-Gm-Message-State: AKGB3mI028WnORL36qpeWzoRVLAiCI8Ho/ufTdoly/yTCkq3uaPu7Rr/ l61nPWVEvGZ6zNV1bTRgn+rS X-Received: by 10.84.239.1 with SMTP id w1mr4910469plk.368.1513321563742; Thu, 14 Dec 2017 23:06:03 -0800 (PST) Received: from localhost.localdomain ([188.166.166.98]) by smtp.gmail.com with ESMTPSA id t1sm9765159pgs.13.2017.12.14.23.06.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Dec 2017 23:06:03 -0800 (PST) From: wbsecg1@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 15 Dec 2017 15:05:50 +0800 Message-Id: <20171215070550.34806-1-wbsecg1@gmail.com> X-Mailer: git-send-email 2.15.1 Subject: [FFmpeg-devel] [PATCH 13/14] mmal: add option copy_frame to support retrieving sw frames w/o copy 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: wang-bin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: wang-bin mmal buffer->data is already in host memory. AFAIK decoders implemented in omx must be configured to output frames to either memory or something directly used by renderer, for example mediacodec surface, mmal buffer and omxil eglimage. test result: big buck bunny 1080p fps increases from about 100 to 110 if copy_frame is turned off --- libavcodec/mmaldec.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index c1cfb09283..9cd6c6558f 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -69,6 +69,7 @@ typedef struct MMALDecodeContext { AVClass *av_class; int extra_buffers; int extra_decoder_buffers; + int copy_frame; MMAL_COMPONENT_T *decoder; MMAL_QUEUE_T *queue_decoded_frames; @@ -139,7 +140,6 @@ static int ffmmal_set_ref(AVFrame *frame, FFPoolRef *pool, atomic_fetch_add_explicit(&ref->pool->refcount, 1, memory_order_relaxed); mmal_buffer_header_acquire(buffer); - frame->format = AV_PIX_FMT_MMAL; frame->data[3] = (uint8_t *)ref->buffer; return 0; } @@ -650,20 +650,34 @@ static int ffmal_copy_frame(AVCodecContext *avctx, AVFrame *frame, if ((ret = ffmmal_set_ref(frame, ctx->pool_out, buffer)) < 0) goto done; + frame->format = AV_PIX_FMT_MMAL; } else { int w = FFALIGN(avctx->width, 32); int h = FFALIGN(avctx->height, 16); uint8_t *src[4]; int linesize[4]; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) - goto done; + if (ctx->copy_frame) { + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) + goto done; - av_image_fill_arrays(src, linesize, - buffer->data + buffer->type->video.offset[0], - avctx->pix_fmt, w, h, 1); - av_image_copy(frame->data, frame->linesize, src, linesize, - avctx->pix_fmt, avctx->width, avctx->height); + av_image_fill_arrays(src, linesize, + buffer->data + buffer->type->video.offset[0], + avctx->pix_fmt, w, h, 1); + av_image_copy(frame->data, frame->linesize, src, linesize, + avctx->pix_fmt, avctx->width, avctx->height); + } else { + if ((ret = ff_decode_frame_props(avctx, frame)) < 0) + goto done; + /* buffer->type->video.offset/pitch[i]; is always 0 */ + av_image_fill_arrays(src, linesize, + buffer->data + buffer->type->video.offset[0], + avctx->pix_fmt, w, h, 1); + if ((ret = ffmmal_set_ref(frame, ctx->pool_out, buffer)) < 0) + goto done; + memcpy(frame->data, src, sizeof(src)); + memcpy(frame->linesize, linesize, sizeof(linesize)); + } } frame->pts = buffer->pts == MMAL_TIME_UNKNOWN ? AV_NOPTS_VALUE : buffer->pts; @@ -842,6 +856,7 @@ AVHWAccel ff_wmv3_mmal_hwaccel = { static const AVOption options[]={ {"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, {"extra_decoder_buffers", "extra MMAL internal buffered frames", offsetof(MMALDecodeContext, extra_decoder_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, + {"copy_frame", "copy deocded data to avframe", offsetof(MMALDecodeContext, copy_frame), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 256, 0}, {NULL} };