From patchwork Thu Apr 12 18:34:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8427 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp2220708jad; Thu, 12 Apr 2018 11:41:40 -0700 (PDT) X-Google-Smtp-Source: AIpwx49KznEB98HChvYAPbM/FjrDCXoXGWDd9EUrw9afHDwiR6nphN25Gv0f+mbDxyL31s57AGsS X-Received: by 10.28.51.7 with SMTP id z7mr1437797wmz.153.1523558500608; Thu, 12 Apr 2018 11:41:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523558500; cv=none; d=google.com; s=arc-20160816; b=PcFuw9IXgLk5IvwfZw0qRE51e5OqZ7wcsFV2uyYFYq6KraXJowORnqEaqWxq537cQ5 cZp/QSSUEarFg4zPg3+3nGZRHqzpGKI5n5YqiknQYLK3mDybwyMWg8QlQj5T6k8EDE8m Swlrm3CThzQb5mIpKYuEmDMDgJ30xKeawDnG4KV8E3s1OU4pIz9kcyft6E+2zw2BwDvT je15fHfOU6CZzBYdQRon1KrEeFUmGJYeKjCcVsnmqCujxGNUnWUiX/TT71nNBYpjRghK izjFHV3riTHPkHjYApnMfJxEpKHzOwcVqUAqh9vXG1Z4hMFd+LisQy68Nn7Ms/jsOBg+ 6ddA== 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: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=U7OU1jA3iwcutiiP5sCJiQGt5Dmr0ewioD1chixu2+Y=; b=t3vceAgsiV//YSSynN7TrdTA5ypEZeCq4+Hle2u/miT/CrOJQsQgLBiEFf9WlxL/BK p5gJWJW492Aic3UPkWo4pWwUQVlNru+8q57Hs/BQniiKJXoUYogsVTc+iHUPtLz5jz/1 ipGR3bLEARsrOgYhnkUg4zTQnIJB+9PD8UnZdsOGCmi3FUxGaukao7QBRqdnXtupInbw BFx5iQj1t9fq1XyZd+PHwJmZPdvCUC0DYZPCZHZNdJzNbb4cWw4ZUlqudRJ5QX+cKAm8 yZ0JxQSvVMUt4y7GPKc0IO8Ee3UM5wEiIos+5ax4QKPD88W7+925JPfHkG/LGXTjJsVb pQmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=M28jj0hq; 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=QUARANTINE 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 o128si34490wmo.59.2018.04.12.11.41.39; Thu, 12 Apr 2018 11:41:40 -0700 (PDT) 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=M28jj0hq; 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=QUARANTINE 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 72ABB689A03; Thu, 12 Apr 2018 21:41:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yb0-f195.google.com (mail-yb0-f195.google.com [209.85.213.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 94E0F680656 for ; Thu, 12 Apr 2018 21:41:07 +0300 (EEST) Received: by mail-yb0-f195.google.com with SMTP id c1-v6so2329185ybm.2 for ; Thu, 12 Apr 2018 11:41:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=J2Kq7HpOINc9RsgOGEQ6I0bqS8eBmXBlL5VErkhVQjg=; b=M28jj0hqXzQ8jNm5M1fOmy4tiSSCobfnafyj1oaR+pLrI2CgbwOFyi/DwpQ1nFGwp/ qoMKCaB57JTTLY6JgQmhU/OeL30p1wYsLHjDDwdSICbdTFua7iK440c5oKBWrfMM52UA bLtHAFmAa2f5vtSD5AmFCrTPfy2jNtqBXoTweiKleiYefl70iF0BDGfqK4pbFxnalZwF gNA1HT9jr3uwv5eN6d+E5jkF+jhhpUTiMIY7CGnAEL9zz62I80QLmBHYTv/Q0XhuvTnZ MMnu/U5Lte5PpNJk6hTCGBjh6vbpt71cV50cYk126y8T+lj0xsbadIDKI7teX1/GaIrX SYlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=J2Kq7HpOINc9RsgOGEQ6I0bqS8eBmXBlL5VErkhVQjg=; b=TWy0iqDbIySMVzBlxj23CPwap23fabj6aa47dh7xsrzG59tzfKIiV4930eXBhwyqXq Wx+emeuJftjZ9y30pdk44NqFn0tjx137IZTBAdIXH2/b7UIiwLCfpe8Thddt8bzOdm4G ogy+AKNJxm6sQf0BNxH2m9JgtSL8w3/v0EjcIOCEMfYXnHDDMvyXRl8l27feAM9yn/Sq QfrwutA2Gsu5slejVXY09+ckOTAfrmta9Y39nzKDDhGl3upErWaAcxCSMrNf5z8kJty/ i7wJAM1yTiFPwaEyVpaE0CQav+xLLv70pCHJOEQVJEo4KJS+yqsmzynpQvLPIOzWsmXE jXgA== X-Gm-Message-State: ALQs6tBnvw8dzkqzjlNSqnwNKRdHy86CsEYaNwrjaElF/MWu8HOUqYWK iZ1CFKrSyeXlXgnXuTumyJBzkA== X-Received: by 2002:a25:414c:: with SMTP id o73-v6mr1238769yba.112.1523558083258; Thu, 12 Apr 2018 11:34:43 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id a19sm1560188qtj.74.2018.04.12.11.34.42 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Apr 2018 11:34:42 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Apr 2018 15:34:29 -0300 Message-Id: <20180412183429.7368-1-jamrial@gmail.com> X-Mailer: git-send-email 2.16.2 Subject: [FFmpeg-devel] [PATCH] avformat/utils: use the existing packet reference when parsing complete frames 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If the parser returns full frames, then the output pointer retured by av_parser_parse2() is guaranteed to point to data contained in the input packet's buffer. Create a new reference to said buffer in that case, to avoid unnecessary data copy when queueing the packet later in the function. Signed-off-by: James Almer --- libavformat/utils.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 3e482a3bbc..8ad2ef4d70 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1471,6 +1471,22 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index) if (!out_pkt.size) continue; + if (pkt->buf && out_pkt.data == pkt->data) { + /* reference pkt->buf only when out_pkt.data is guaranteed to point + * to data in it and not in the parser's internal buffer. */ + /* XXX: Ensure this is the case with all parsers when the muxer sets + * PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */ + out_pkt.buf = av_buffer_ref(pkt->buf); + if (!out_pkt.buf) { + ret = AVERROR(ENOMEM); + goto fail; + } + } else { + ret = av_packet_make_refcounted(&out_pkt); + if (ret < 0) + goto fail; + } + if (pkt->side_data) { out_pkt.side_data = pkt->side_data; out_pkt.side_data_elems = pkt->side_data_elems; @@ -1511,10 +1527,11 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index) ret = ff_packet_list_put(&s->internal->parse_queue, &s->internal->parse_queue_end, - &out_pkt, FF_PACKETLIST_FLAG_REF_PACKET); - av_packet_unref(&out_pkt); - if (ret < 0) + &out_pkt, 0); + if (ret < 0) { + av_packet_unref(&out_pkt); goto fail; + } } /* end of the stream => close and free the parser */