From patchwork Fri Mar 5 16:33:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 26128 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 446BC44B9E2 for ; Fri, 5 Mar 2021 18:35:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 280A168ABB1; Fri, 5 Mar 2021 18:35:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f172.google.com (mail-qk1-f172.google.com [209.85.222.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B7ED468AB03 for ; Fri, 5 Mar 2021 18:35:42 +0200 (EET) Received: by mail-qk1-f172.google.com with SMTP id b130so2518144qkc.10 for ; Fri, 05 Mar 2021 08:35:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=zd8/pBoG+2zGiu6X51FFJU0cTU2gFOOoJ3Ztbtt2Csc=; b=uqAqrQ3r0kkLwR8D9i1/Q0/F89XasDt+USifKIoEZz8ZhgQLNWvDjnUeDV0/zFHMzr t7rIpgkR3LX7jMi0dHLXsFOYdQgAC1oTEjIrrZLU0YMx9rMpLO9Wf9BEyhlNGLb2wUsI IIl4M0eWR2T1WWMFbQSPklPY7KUitp9o6t1ejnehF/A7wwAUvggeK10Jettkm0wLij3W PZrB7owahxQY9plbL1cgpqyCq6oPj8jpxm4wZLIgf/ct4VXDr57yy/F/3tBi3bz+0c3O HI72WJf9rv/EAH4iYW7oPf/5fnY5AggVIKJWLlEnTUkbO3fCh1z3J+Xs61cTbWseGmzg T3eQ== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=zd8/pBoG+2zGiu6X51FFJU0cTU2gFOOoJ3Ztbtt2Csc=; b=Kwv6hqqJBNGofdD7hQtvfb37ZiqQbVg/qQSNmbG/pcNOCfPDklAWcvyJzjwVXUkV8L rfKyd5Z6C5W8Nxneh+OOt+zWiLu8DYx+g8JY0JfAsaRorGqOssPWQnLqqh1vvqerQS1D 0Vg8ZKzMv/ZrlwjntkdTcjxjLR7J5zPb7t19xGnDeN7frS/M8YMAYTZPTqB58OOpNgeb m+74zT3F+LEl1nRFH57zHQwYWZk1uo/VF7+LrhpDQcgo3dkhSXIg1cOZYEouRwYygmvL 6fbdu4Em691MMWKSd2SOBMtID0X88qdnQ5uKTXsh5A00dcmwSQPl0/nlkfgzc9uISH41 CAHQ== X-Gm-Message-State: AOAM531xUfaSs495FCz1wP954DT8joZRy4ReTMhw+1oTJ7IqyPQD25jM 1lxwYI4r8KCiGe2QvAsgoN41UFH75FZv2w== X-Google-Smtp-Source: ABdhPJxtSrjMLdpJVwk29TTTAOira3VWxmMX6cghrYbbmhOGEQ+GG/IV++8hLlL8dLBGQraR/KB+hQ== X-Received: by 2002:a37:a785:: with SMTP id q127mr9499950qke.425.1614962141263; Fri, 05 Mar 2021 08:35:41 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id b10sm2168494qtt.23.2021.03.05.08.35.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Mar 2021 08:35:40 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 5 Mar 2021 13:33:03 -0300 Message-Id: <20210305163339.63164-13-jamrial@gmail.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305163339.63164-1-jamrial@gmail.com> References: <20210305163339.63164-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/48] avformat/mux: use av_packet_alloc() to allocate packets 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- libavformat/internal.h | 5 +++++ libavformat/mux.c | 40 ++++++++++++++++++++-------------------- libavformat/options.c | 6 ++++++ libavformat/utils.c | 1 + 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index e913d958fc..02ff2fd77a 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -92,6 +92,11 @@ struct AVFormatInternal { */ struct PacketList *parse_queue; struct PacketList *parse_queue_end; + + /** + * Used to hold temporary packets. + */ + AVPacket *pkt; /** * Remaining size available for raw_packet_buffer, in bytes. */ diff --git a/libavformat/mux.c b/libavformat/mux.c index 440113b149..e98b86a81e 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1211,7 +1211,7 @@ static int write_packets_common(AVFormatContext *s, AVPacket *pkt, int interleav int av_write_frame(AVFormatContext *s, AVPacket *in) { - AVPacket local_pkt, *pkt = &local_pkt; + AVPacket *pkt = s->internal->pkt; int ret; if (!in) { @@ -1232,6 +1232,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *in) * The following avoids copying in's data unnecessarily. * Copying side data is unavoidable as a bitstream filter * may change it, e.g. free it on errors. */ + av_packet_unref(pkt); pkt->buf = NULL; pkt->data = in->data; pkt->size = in->size; @@ -1273,14 +1274,14 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) int av_write_trailer(AVFormatContext *s) { int i, ret1, ret = 0; - AVPacket pkt = {0}; - av_init_packet(&pkt); + AVPacket *pkt = s->internal->pkt; + av_packet_unref(pkt); for (i = 0; i < s->nb_streams; i++) { if (s->streams[i]->internal->bsfc) { - ret1 = write_packets_from_bsfs(s, s->streams[i], &pkt, 1/*interleaved*/); + ret1 = write_packets_from_bsfs(s, s->streams[i], pkt, 1/*interleaved*/); if (ret1 < 0) - av_packet_unref(&pkt); + av_packet_unref(pkt); if (ret >= 0) ret = ret1; } @@ -1354,7 +1355,7 @@ static void uncoded_frame_free(void *unused, uint8_t *data) static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index, AVFrame *frame, int interleaved) { - AVPacket pkt, *pktp; + AVPacket *pkt = s->internal->pkt; av_assert0(s->oformat); if (!s->oformat->write_uncoded_frame) { @@ -1363,18 +1364,17 @@ static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index, } if (!frame) { - pktp = NULL; + pkt = NULL; } else { size_t bufsize = sizeof(frame) + AV_INPUT_BUFFER_PADDING_SIZE; AVFrame **framep = av_mallocz(bufsize); if (!framep) goto fail; - pktp = &pkt; - av_init_packet(&pkt); - pkt.buf = av_buffer_create((void *)framep, bufsize, + av_packet_unref(pkt); + pkt->buf = av_buffer_create((void *)framep, bufsize, uncoded_frame_free, NULL, 0); - if (!pkt.buf) { + if (!pkt->buf) { av_free(framep); fail: av_frame_free(&frame); @@ -1382,17 +1382,17 @@ static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index, } *framep = frame; - pkt.data = (void *)framep; - pkt.size = sizeof(frame); - pkt.pts = - pkt.dts = frame->pts; - pkt.duration = frame->pkt_duration; - pkt.stream_index = stream_index; - pkt.flags |= AV_PKT_FLAG_UNCODED_FRAME; + pkt->data = (void *)framep; + pkt->size = sizeof(frame); + pkt->pts = + pkt->dts = frame->pts; + pkt->duration = frame->pkt_duration; + pkt->stream_index = stream_index; + pkt->flags |= AV_PKT_FLAG_UNCODED_FRAME; } - return interleaved ? av_interleaved_write_frame(s, pktp) : - av_write_frame(s, pktp); + return interleaved ? av_interleaved_write_frame(s, pkt) : + av_write_frame(s, pkt); } int av_write_uncoded_frame(AVFormatContext *s, int stream_index, diff --git a/libavformat/options.c b/libavformat/options.c index 59e0389815..8d7c4fe4cb 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -220,6 +220,12 @@ AVFormatContext *avformat_alloc_context(void) av_free(ic); return NULL; } + internal->pkt = av_packet_alloc(); + if (!internal->pkt) { + av_free(internal); + av_free(ic); + return NULL; + } avformat_get_context_defaults(ic); ic->internal = internal; ic->internal->offset = AV_NOPTS_VALUE; diff --git a/libavformat/utils.c b/libavformat/utils.c index 73b1a9b52c..192ef51f47 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4451,6 +4451,7 @@ void avformat_free_context(AVFormatContext *s) av_freep(&s->chapters); av_dict_free(&s->metadata); av_dict_free(&s->internal->id3v2_meta); + av_packet_free(&s->internal->pkt); av_freep(&s->streams); flush_packet_queue(s); av_freep(&s->internal);