From patchwork Thu Feb 4 19:09:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25422 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 A503C4482EE for ; Thu, 4 Feb 2021 21:13:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BA5AC68A89C; Thu, 4 Feb 2021 21:11:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f181.google.com (mail-qk1-f181.google.com [209.85.222.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DA90568A880 for ; Thu, 4 Feb 2021 21:11:09 +0200 (EET) Received: by mail-qk1-f181.google.com with SMTP id a12so4419871qkh.10 for ; Thu, 04 Feb 2021 11:11:09 -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=3AfTQETeuLmE+9oYlJF2WIJAWJh/h+Sp3SbmyEg2X3c=; b=QxNfQwmJg06klnbZ3jlR2HBC/SxIkrfkWZcYUiFDsMtdsEoFowZXC1vg0HbjlM3vep Rtaw7P47f5hPoWz7odIjifJQQYjWeoB1QFm3CVHIMVTfhu3ejkpD2j9hpi3rf7FA9EgF PuPpMJcqzsPD76k8SWbZ+S30m2GzDB5vYcHRPlaThcnLZRp6TxYPV+f8W8VlZFz65YWE GQoPjIdZxNUtVnoFf07L2Q1HDFPkWx9VzB24o+1vTXbjR/bzwHEXh7VNMG+KPPBTL663 zyLwvKu7OcdPfGTb4Px5GERW3YkmctaJ2lV78wifdEly8G4cnRWuyaKM83S12qX7HZV2 n0mA== 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=3AfTQETeuLmE+9oYlJF2WIJAWJh/h+Sp3SbmyEg2X3c=; b=iv+wrtJDwUsqQC+3KtD2vQKzZj/LFBH9X0uwKmwKZUrAP5gMmOX4yVpGy4g2sbG48N P506IDpNxdSO7lV8e8Pc5wezKNclh+Uwi/d6Q+JiXCBAsaXP0kf+Du56X221pY7sNaoF bGzHkXw67H0JSc/JaetOM/C0oPNwwUvzVSNtFgZB1TMsJ1OoPZUmvoPqDy8mimTBI/WE OrUH7jNRrnEFLtNK06iYIh99oYzArLgSciibdzV9xo4mhkqmIRSL3qRyMFdxJfTAp+HK 7B4m4lWTNiIGtdfWoTkQ8PnhFOX901b8AVfaMQ7iFiuZseWooSDGDiWy0Zt46QmUQEQu 2eqw== X-Gm-Message-State: AOAM530F1V9vxT/t16USsx/iCLpAHp4cteHY3XCzzRfOkWytmnWULD7a b4FazR9bYFMEvJNG2eKdz9wyFUm3YdQ= X-Google-Smtp-Source: ABdhPJx2/eLaDiiC15wy0/6oJqCFh/R7M3BNS5rY0qVq8xiVnmfrF54PT84UcLR3Vtmp5pmtPby1jw== X-Received: by 2002:a37:63d4:: with SMTP id x203mr638833qkb.105.1612465868371; Thu, 04 Feb 2021 11:11:08 -0800 (PST) Received: from localhost.localdomain ([181.23.64.183]) by smtp.gmail.com with ESMTPSA id t14sm5889291qkt.50.2021.02.04.11.11.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 11:11:07 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Feb 2021 16:09:38 -0300 Message-Id: <20210204191005.48190-24-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210204191005.48190-1-jamrial@gmail.com> References: <20210204191005.48190-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 23/50] 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 | 44 ++++++++++++++++++++++-------------------- libavformat/options.c | 6 ++++++ libavformat/utils.c | 1 + 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index d0db331b96..69a7caff93 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -92,6 +92,11 @@ struct AVFormatInternal { */ struct AVPacketList *parse_queue; struct AVPacketList *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 84c56ac6ba..3600e74a50 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1052,7 +1052,9 @@ int ff_interleaved_peek(AVFormatContext *s, int stream, AVPacketList *pktl = s->internal->packet_buffer; while (pktl) { if (pktl->pkt.stream_index == stream) { - *pkt = pktl->pkt; + int ret = av_packet_ref(pkt, &pktl->pkt); + if (ret < 0) + return ret; if (add_offset) { AVStream *st = s->streams[pkt->stream_index]; int64_t offset = st->internal->mux_ts_offset; @@ -1208,7 +1210,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) { @@ -1229,6 +1231,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; @@ -1270,14 +1273,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; } @@ -1351,7 +1354,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) { @@ -1360,18 +1363,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); @@ -1379,17 +1381,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 fb3299503e..2587bedc05 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4445,6 +4445,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);