From patchwork Fri Mar 19 05:58:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26465 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B4D5E449D11 for ; Fri, 19 Mar 2021 07:59:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8CC3368A636; Fri, 19 Mar 2021 07:59:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E456668A57A for ; Fri, 19 Mar 2021 07:59:38 +0200 (EET) Received: by mail-ej1-f51.google.com with SMTP id r12so7745171ejr.5 for ; Thu, 18 Mar 2021 22:59:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=Y4NwX9rPT1XmAENjao9nMylyOHaNQvploksWqqrmnZc=; b=ILA2r0zNGEk6O+moim0eCmeLU+VUCJz/Muge5Ut31Zl/pt5zDk80+PPp+k2Rr0ntAZ sn6+TUHpL69UOK0VFQKsF2TfxnC0jrGF4CC5ZG6ric9WWVLhQ26UP2TZT0U/I7Ifsjfb dDbv/wOEdxl4+tOVxgXo0dJY19vwrX5K0tDgJB1LhXfxB9kJ9GyiR7JhRa6gcbm7HKvc vEGPo4nI1/QZT0cpRi9fHgTNahV1uUvR2ZPt9GfkY+eMyufHVhWrv+m51heR76Zlh4xt pAukWiqqJg+JYohZcYGLzj/2AxViWODdpLPTIY3/hhdPDsCq+WEUS83w4YHezPmtgj/5 YMag== 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:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=Y4NwX9rPT1XmAENjao9nMylyOHaNQvploksWqqrmnZc=; b=JPy1ZsdfAtkViW65UWN2/x7AnHrdm9FYSg3/BYEgmVKyBG3kGpudGal+5sinkjJxen AV45TMpsx9tLg9FjSNGXfYv4mRsx7D0iuZuH5ZgHOIV5EuJh452C62ZKPJTnGXA1DchN bH0fo59z0zWBW6a5QLMzTcu+aFpawxfRkZW8U9zJmKDyabWh4KKftsB27RoOIkkk2iwv 681tx/gxRgNg4youv0bCa3WDMEK3oUK93p8UjDIYWWVD/XjfpkN+ClaE0LQ10r7piTmF q2XsH5otaa6/kdUDNFYHf5HPPmur3qaU73g2HiJ8eP0/V8W6nOYRG40tVYGqzEPyi87o Q4lQ== X-Gm-Message-State: AOAM531H3k2agPPRHqNJXv8gItAhfgw0+xxrAMts359q9X4v7KZqaXbI JFdXst798bHLoEEFIqICksbpbWtWdpjGBw== X-Google-Smtp-Source: ABdhPJxqNaYqmusbzARXRgsBHsRu0SedvU0WfIxow/uE7TpKQ5OO1RWht8a4HpzN2YJQaNIEZS3Azg== X-Received: by 2002:a17:906:c301:: with SMTP id s1mr2417325ejz.382.1616133578281; Thu, 18 Mar 2021 22:59:38 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc08960.dynamic.kabel-deutschland.de. [188.192.137.96]) by smtp.gmail.com with ESMTPSA id x17sm3109344ejd.68.2021.03.18.22.59.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Mar 2021 22:59:37 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Mar 2021 06:58:49 +0100 Message-Id: <20210319055904.2264501-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210319055904.2264501-1-andreas.rheinhardt@gmail.com> References: <20210319055904.2264501-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/18] avformat/utils: Don't allocate separate packet for extract_extradata 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" One can simply reuse AVFormatInternal.parse_pkt instead. Signed-off-by: Andreas Rheinhardt --- libavformat/internal.h | 12 ++++++++++-- libavformat/utils.c | 29 ++++++++++------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index 3c6b2921c1..a810d51bba 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -90,9 +90,18 @@ struct AVFormatInternal { /** * Packets split by the parser get queued here. */ - AVPacket *parse_pkt; struct PacketList *parse_queue; struct PacketList *parse_queue_end; + /** + * The generic code uses this as a temporary packet + * to parse packets; it may also be used for other means + * for short periods that are guaranteed not to overlap + * with calls to av_read_frame() (or ff_read_packet()) + * or with each other. + * Every user has to ensure that this packet is blank + * after using it. + */ + AVPacket *parse_pkt; /** * Used to hold temporary packets. @@ -190,7 +199,6 @@ struct AVStreamInternal { * supported) */ struct { AVBSFContext *bsf; - AVPacket *pkt; int inited; } extract_extradata; diff --git a/libavformat/utils.c b/libavformat/utils.c index 0c167d0cb9..3542e40afd 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3498,13 +3498,9 @@ static int extract_extradata_init(AVStream *st) if (!ret) goto finish; - sti->extract_extradata.pkt = av_packet_alloc(); - if (!sti->extract_extradata.pkt) - return AVERROR(ENOMEM); - ret = av_bsf_alloc(f, &sti->extract_extradata.bsf); if (ret < 0) - goto fail; + return ret; ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in, st->codecpar); @@ -3523,14 +3519,12 @@ finish: return 0; fail: av_bsf_free(&sti->extract_extradata.bsf); - av_packet_free(&sti->extract_extradata.pkt); return ret; } -static int extract_extradata(AVStream *st, const AVPacket *pkt) +static int extract_extradata(AVStream *st, AVPacket *tmp, const AVPacket *pkt) { AVStreamInternal *sti = st->internal; - AVPacket *pkt_ref; int ret; if (!sti->extract_extradata.inited) { @@ -3542,27 +3536,26 @@ static int extract_extradata(AVStream *st, const AVPacket *pkt) if (sti->extract_extradata.inited && !sti->extract_extradata.bsf) return 0; - pkt_ref = sti->extract_extradata.pkt; - ret = av_packet_ref(pkt_ref, pkt); + ret = av_packet_ref(tmp, pkt); if (ret < 0) return ret; - ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref); + ret = av_bsf_send_packet(sti->extract_extradata.bsf, tmp); if (ret < 0) { - av_packet_unref(pkt_ref); + av_packet_unref(tmp); return ret; } while (ret >= 0 && !sti->avctx->extradata) { - ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref); + ret = av_bsf_receive_packet(sti->extract_extradata.bsf, tmp); if (ret < 0) { if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) return ret; continue; } - for (int i = 0; i < pkt_ref->side_data_elems; i++) { - AVPacketSideData *side_data = &pkt_ref->side_data[i]; + for (int i = 0; i < tmp->side_data_elems; i++) { + AVPacketSideData *side_data = &tmp->side_data[i]; if (side_data->type == AV_PKT_DATA_NEW_EXTRADATA) { sti->avctx->extradata = side_data->data; sti->avctx->extradata_size = side_data->size; @@ -3571,7 +3564,7 @@ static int extract_extradata(AVStream *st, const AVPacket *pkt) break; } } - av_packet_unref(pkt_ref); + av_packet_unref(tmp); } return 0; @@ -3923,7 +3916,7 @@ FF_ENABLE_DEPRECATION_WARNINGS st->internal->info->frame_delay_evidence = 1; } if (!st->internal->avctx->extradata) { - ret = extract_extradata(st, pkt); + ret = extract_extradata(st, ic->internal->parse_pkt, pkt); if (ret < 0) goto unref_then_goto_end; } @@ -4189,7 +4182,6 @@ find_stream_info_err: avcodec_close(ic->streams[i]->internal->avctx); av_freep(&ic->streams[i]->internal->info); av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf); - av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt); } if (ic->pb) av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n", @@ -4391,7 +4383,6 @@ static void free_stream(AVStream **pst) av_freep(&st->internal->probe_data.buf); av_bsf_free(&st->internal->extract_extradata.bsf); - av_packet_free(&st->internal->extract_extradata.pkt); if (st->internal->info) av_freep(&st->internal->info->duration_error);