From patchwork Mon Feb 1 22:44:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25329 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 D625944BD9A for ; Tue, 2 Feb 2021 00:44:53 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B4223689FFE; Tue, 2 Feb 2021 00:44:53 +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 68711689E91 for ; Tue, 2 Feb 2021 00:44:47 +0200 (EET) Received: by mail-qk1-f172.google.com with SMTP id u20so18069815qku.7 for ; Mon, 01 Feb 2021 14:44:47 -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=HTWfG3d+PIIX123xFO4a1MEhH9Q3lfqV/ty3pr3tVY4=; b=ZEuuFeHjC4IwKq3jcYfv7biBwhXwCYG5GHe0eNf3zTGlAW8SQzvTAqRY99fKVxobUy ay9OB3xbY6QwhVCFtPEvWmqdHzFZtv5+cUUZhVpsYQDvHa3adrCHECcdfrJ6KrwlV6sV yB71tu0bKmaOSVXqZTUleepQ2qAXoxPDhdd5KNb7+1JfJFftuN6MgvBwwo1jomK6np/T 2pzSYRI/mELXhNLXYNKI4P0M7XpWscX1cGuOAosGEAaMfnR/9bUmUJVCv+4w263M67KF rL10xzJ0FJqXG0zuaPAHC/w1Db6mxt7P/jTkIRfULKg1b/mgDppkbp94K+o6ii+d3PQ5 4t4w== 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=HTWfG3d+PIIX123xFO4a1MEhH9Q3lfqV/ty3pr3tVY4=; b=VrE/wxsgmTwC6GgPtuq9L9EnBAPwFbH39YZqjw1D1Fn92VLtPWOsX1EddBAO7yr8Bd NwjwMG6IT08X0+utEMx5vcKoTo9HEK3600zo740plCvMbAmuGagbHqd1jpyw+LVCGSJb MuLWZBhriZP579vNJtYegu54wuJReEHHULCPvV9Z/ih2OIuGV43BIJZxIrvqHEIdSeOi JJ7mLfCeY/w8X/tTofBoThLxqw8XYauUTI9XN+jnKkD/+k8ZGfX7jjI/EjIE0evWqVJU iSbAH/1aCt6gOuB3hZU1MGqCOnjJXw7E2+3u3xMZOQekCT3PJBrr9iyF/CJS8NoHqNBW eL/w== X-Gm-Message-State: AOAM530qJTylWIP5/SmAEyUHtTNyVoRBYOUuR3pnyeCg4kziiXCZd7wW 0R/aaz7DLmYQzpw3Vpq/LgDmEUIgPlkUaw== X-Google-Smtp-Source: ABdhPJyiwzT6qLY1DrE7RDThFMDjG0a4Cecy/nhEPjrWoJaPzzdV9Ic2bkl7holw47G0lOZezWqcfg== X-Received: by 2002:a37:62c8:: with SMTP id w191mr18837345qkb.47.1612219485604; Mon, 01 Feb 2021 14:44:45 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:45 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:12 -0300 Message-Id: <20210201224421.1395-2-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/10] 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 f45b1cd6b4..2fe1afa8e3 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..ce9724e834 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1208,7 +1208,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 +1229,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 +1271,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 +1352,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 +1361,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 +1379,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..2de2db8f09 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -222,6 +222,12 @@ AVFormatContext *avformat_alloc_context(void) } avformat_get_context_defaults(ic); ic->internal = internal; + ic->internal->pkt = av_packet_alloc(); + if (!ic->internal->pkt) { + av_free(ic->internal); + av_free(ic); + return NULL; + } ic->internal->offset = AV_NOPTS_VALUE; ic->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; ic->internal->shortest_end = 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); From patchwork Mon Feb 1 22:44:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25330 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 021E844BD9A for ; Tue, 2 Feb 2021 00:44:56 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD32968A26E; Tue, 2 Feb 2021 00:44:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A84F5689FF0 for ; Tue, 2 Feb 2021 00:44:48 +0200 (EET) Received: by mail-qt1-f180.google.com with SMTP id h16so12505277qth.11 for ; Mon, 01 Feb 2021 14:44:48 -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=8MZsacAOkR6RduSNJlvx46dfwCse5K34KFTDano+qmI=; b=CsJ9cnJwnpiqmtxUFvZ5gqFs3rsNme+xQtb9u26MGZy+F8yTMn1w7U6tV4EOYI+p2a 6v4QX+amT221QE0lS1hbkN0Id5jLferrrvk89K6VwNEQJrxD6b/jAmJgzJTb70z3ggUl YzDFnZrAbnv9psnGWjfpt4wgNwsx2Mvb7A0pSXFdOpEdJrmInMJzTWDk7Gj3/X5SqR9I geN0SEw3ycCfwuhu8K9+7LKioJmX88T8NWTqZxCbGbLAzluLjNAqkiev/cUCKn5OdxNn 9f4vzZ0f9jGPdqEUo41ib08HLnnCr+7cfwEmLndh9FGF6T/+tXe6htoouuu0fKE9QLS0 qpcQ== 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=8MZsacAOkR6RduSNJlvx46dfwCse5K34KFTDano+qmI=; b=DwXlFAnxafZ7cGfaMZczMBtE7+qTKblnjOhQad57kX2OU4HNCRvqC7Ujjx0US9xNsK dZwDaG/k3XIp54u7LtTN4SwOIXqf/Ee1MpmIbSNjp4nzXgSbyeqnsW9vpG0DJwRZR3UE uLORs6OxxONurRWFwwUjOqm84OJZYzjV2n69CgSbt0+TAvxoSpItGfPjzgzfAenenSv5 x1zEyobET36UXsOgHXjSOqU9vWOEhQnFHJIaiELfUZw0mUVM9QTpD2+0cvpm0oUdjyTQ 0qRgildx/nSQwedA5qRFee7fqC3dKUWL4GTtj+Dau8HBxH4NTBKfaNpEM1LNcsTh5+4W BNgQ== X-Gm-Message-State: AOAM533DC4vTnqPVSnD7TtekVvBJAYO4R2pmLpJVnUIdSuMA6eqbE/we jdYOtBRnBOv4wi1YCa2/uu8g+OgAB04mgw== X-Google-Smtp-Source: ABdhPJxCDcRVFmWftKvOVq0Cy2fBX//b17AUHMk8hqiDcwddhGgS4MlyVwiACa74goFtpVpoPLyawg== X-Received: by 2002:ac8:1c92:: with SMTP id f18mr17217146qtl.234.1612219487026; Mon, 01 Feb 2021 14:44:47 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:46 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:13 -0300 Message-Id: <20210201224421.1395-3-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/10] avformat/movenc: 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/movenc.c | 101 ++++++++++++++++++++++++--------------- libavformat/movenc.h | 2 + libavformat/movenchint.c | 19 ++++---- libavformat/mux.c | 4 +- 4 files changed, 77 insertions(+), 49 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 372c04295d..254677a331 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -365,7 +365,7 @@ static int mov_write_ac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *trac } struct eac3_info { - AVPacket pkt; + AVPacket *pkt; uint8_t ec3_done; uint8_t num_blocks; @@ -407,6 +407,9 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track) return AVERROR(ENOMEM); info = track->eac3_priv; + if (!info->pkt && !(info->pkt = av_packet_alloc())) + return AVERROR(ENOMEM); + if (avpriv_ac3_parse_header(&hdr, pkt->data, pkt->size) < 0) { /* drop the packets until we see a good one */ if (!track->entry) { @@ -511,20 +514,20 @@ concatenate: } if (!info->num_blocks) { - ret = av_packet_ref(&info->pkt, pkt); + ret = av_packet_ref(info->pkt, pkt); if (!ret) info->num_blocks = num_blocks; goto end; } else { - if ((ret = av_grow_packet(&info->pkt, pkt->size)) < 0) + if ((ret = av_grow_packet(info->pkt, pkt->size)) < 0) goto end; - memcpy(info->pkt.data + info->pkt.size - pkt->size, pkt->data, pkt->size); + memcpy(info->pkt->data + info->pkt->size - pkt->size, pkt->data, pkt->size); info->num_blocks += num_blocks; - info->pkt.duration += pkt->duration; + info->pkt->duration += pkt->duration; if (info->num_blocks != 6) goto end; av_packet_unref(pkt); - av_packet_move_ref(pkt, &info->pkt); + av_packet_move_ref(pkt, info->pkt); info->num_blocks = 0; } ret = pkt->size; @@ -5303,16 +5306,17 @@ static int mov_flush_fragment(AVFormatContext *s, int force) for (i = 0; i < s->nb_streams; i++) { MOVTrack *track = &mov->tracks[i]; if (!track->end_reliable) { - AVPacket pkt; - if (!ff_interleaved_peek(s, i, &pkt, 1)) { + AVPacket *pkt = mov->pkt; + if (!ff_interleaved_peek(s, i, pkt, 1)) { if (track->dts_shift != AV_NOPTS_VALUE) - pkt.dts += track->dts_shift; - track->track_duration = pkt.dts - track->start_dts; - if (pkt.pts != AV_NOPTS_VALUE) - track->end_pts = pkt.pts; + pkt->dts += track->dts_shift; + track->track_duration = pkt->dts - track->start_dts; + if (pkt->pts != AV_NOPTS_VALUE) + track->end_pts = pkt->pts; else - track->end_pts = pkt.dts; + track->end_pts = pkt->dts; } + av_packet_unref(pkt); } } @@ -5965,20 +5969,20 @@ static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt) static int mov_write_subtitle_end_packet(AVFormatContext *s, int stream_index, int64_t dts) { - AVPacket end; + MOVMuxContext *mov = s->priv_data; + AVPacket *end = mov->pkt; uint8_t data[2] = {0}; int ret; - av_init_packet(&end); - end.size = sizeof(data); - end.data = data; - end.pts = dts; - end.dts = dts; - end.duration = 0; - end.stream_index = stream_index; + end->size = sizeof(data); + end->data = data; + end->pts = dts; + end->dts = dts; + end->duration = 0; + end->stream_index = stream_index; - ret = mov_write_single_packet(s, &end); - av_packet_unref(&end); + ret = mov_write_single_packet(s, end); + av_packet_unref(end); return ret; } @@ -6091,7 +6095,7 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) MOVMuxContext *mov = s->priv_data; MOVTrack *track = &mov->tracks[tracknum]; - AVPacket pkt = { .stream_index = tracknum, .flags = AV_PKT_FLAG_KEY }; + AVPacket *pkt = mov->pkt; int i, len; track->mode = mov->mode; @@ -6153,13 +6157,16 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) } #endif + pkt->stream_index = tracknum; + pkt->flags = AV_PKT_FLAG_KEY; + for (i = 0; i < s->nb_chapters; i++) { AVChapter *c = s->chapters[i]; AVDictionaryEntry *t; int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,MOV_TIMESCALE}); - pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,MOV_TIMESCALE}); - pkt.duration = end - pkt.dts; + pkt->pts = pkt->dts = av_rescale_q(c->start, c->time_base, (AVRational){1,MOV_TIMESCALE}); + pkt->duration = end - pkt->dts; if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { static const char encd[12] = { @@ -6167,18 +6174,22 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) 'e', 'n', 'c', 'd', 0x00, 0x00, 0x01, 0x00 }; len = strlen(t->value); - pkt.size = len + 2 + 12; - pkt.data = av_malloc(pkt.size); - if (!pkt.data) + pkt->size = len + 2 + 12; + pkt->data = av_malloc(pkt->size); + if (!pkt->data) { + av_packet_unref(pkt); return AVERROR(ENOMEM); - AV_WB16(pkt.data, len); - memcpy(pkt.data + 2, t->value, len); - memcpy(pkt.data + len + 2, encd, sizeof(encd)); - ff_mov_write_packet(s, &pkt); - av_freep(&pkt.data); + } + AV_WB16(pkt->data, len); + memcpy(pkt->data + 2, t->value, len); + memcpy(pkt->data + len + 2, encd, sizeof(encd)); + ff_mov_write_packet(s, pkt); + av_freep(&pkt->data); } } + av_packet_unref(mov->pkt); + return 0; } @@ -6198,9 +6209,9 @@ static int mov_create_timecode_track(AVFormatContext *s, int index, int src_inde MOVTrack *track = &mov->tracks[index]; AVStream *src_st = s->streams[src_index]; uint8_t data[4]; - AVPacket pkt = { .data = data, .stream_index = index, - .flags = AV_PKT_FLAG_KEY, .size = 4 }; + AVPacket *pkt = mov->pkt; AVRational rate = find_fps(s, src_st); + int ret; /* tmcd track based on video stream */ track->mode = mov->mode; @@ -6222,8 +6233,14 @@ static int mov_create_timecode_track(AVFormatContext *s, int index, int src_inde track->st->avg_frame_rate = av_inv_q(rate); /* the tmcd track just contains one packet with the frame number */ - AV_WB32(pkt.data, tc.start); - return ff_mov_write_packet(s, &pkt); + pkt->data = data; + pkt->stream_index = index; + pkt->flags = AV_PKT_FLAG_KEY; + pkt->size = 4; + AV_WB32(pkt->data, tc.start); + ret = ff_mov_write_packet(s, pkt); + av_packet_unref(pkt); + return ret; } /* @@ -6284,6 +6301,8 @@ static void mov_free(AVFormatContext *s) MOVMuxContext *mov = s->priv_data; int i; + av_packet_free(&mov->pkt); + if (!mov->tracks) return; @@ -6302,7 +6321,7 @@ static void mov_free(AVFormatContext *s) if (mov->tracks[i].eac3_priv) { struct eac3_info *info = mov->tracks[i].eac3_priv; - av_packet_unref(&info->pkt); + av_packet_free(&info->pkt); av_freep(&mov->tracks[i].eac3_priv); } if (mov->tracks[i].vos_len) @@ -6531,6 +6550,10 @@ static int mov_init(AVFormatContext *s) mov->nb_streams += mov->nb_meta_tmcd; } + mov->pkt = av_packet_alloc(); + if (!mov->pkt) + return AVERROR(ENOMEM); + // Reserve an extra stream for chapters for the case where chapters // are written in the trailer mov->tracks = av_mallocz_array((mov->nb_streams + 1), sizeof(*mov->tracks)); diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 997b2d61c0..f27edb667b 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -215,6 +215,8 @@ typedef struct MOVMuxContext { int per_stream_grouping; AVFormatContext *fc; + AVPacket *pkt; + int use_editlist; float gamma; diff --git a/libavformat/movenchint.c b/libavformat/movenchint.c index 964026ec71..47276091f3 100644 --- a/libavformat/movenchint.c +++ b/libavformat/movenchint.c @@ -408,7 +408,7 @@ int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, uint8_t *buf = NULL; int size; AVIOContext *hintbuf = NULL; - AVPacket hint_pkt; + AVPacket *hint_pkt = mov->pkt; int ret = 0, count; if (!rtp_ctx) @@ -437,21 +437,22 @@ int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, /* Open a buffer for writing the hint */ if ((ret = avio_open_dyn_buf(&hintbuf)) < 0) goto done; - av_init_packet(&hint_pkt); - count = write_hint_packets(hintbuf, buf, size, trk, &hint_pkt.dts); + av_packet_unref(hint_pkt); + count = write_hint_packets(hintbuf, buf, size, trk, &hint_pkt->dts); av_freep(&buf); /* Write the hint data into the hint track */ - hint_pkt.size = size = avio_close_dyn_buf(hintbuf, &buf); - hint_pkt.data = buf; - hint_pkt.pts = hint_pkt.dts; - hint_pkt.stream_index = track_index; + hint_pkt->size = size = avio_close_dyn_buf(hintbuf, &buf); + hint_pkt->data = buf; + hint_pkt->pts = hint_pkt->dts; + hint_pkt->stream_index = track_index; if (pkt->flags & AV_PKT_FLAG_KEY) - hint_pkt.flags |= AV_PKT_FLAG_KEY; + hint_pkt->flags |= AV_PKT_FLAG_KEY; if (count > 0) - ff_mov_write_packet(s, &hint_pkt); + ff_mov_write_packet(s, hint_pkt); done: av_free(buf); + av_packet_unref(hint_pkt); sample_queue_retain(&trk->sample_queue); return ret; } diff --git a/libavformat/mux.c b/libavformat/mux.c index ce9724e834..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; From patchwork Mon Feb 1 22:44:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25331 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 14BAD44BD9A for ; Tue, 2 Feb 2021 00:44:57 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 00EFE68A3A3; Tue, 2 Feb 2021 00:44:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f176.google.com (mail-qk1-f176.google.com [209.85.222.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3CE85680297 for ; Tue, 2 Feb 2021 00:44:50 +0200 (EET) Received: by mail-qk1-f176.google.com with SMTP id l27so18058689qki.9 for ; Mon, 01 Feb 2021 14:44:50 -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=Da6MsID/Ggg05vRYQUO8kFVBh9IHwWApwsSHc4saTr0=; b=lVgQKQiLsB3FAyFF75jWeX1EuGrGgkT7PR/QWdZ+h6xnNYAzjpY8No3nN/ERARSN67 oLR3h20K6kBeD19pgj8hlmStv+FfQ2PJRaplqGYvhMjHszaJ6d8yClKz5W0vnQd19PTq SoR0dfzc+UD7kl2fPI6msO0JZaTtTPtntjAh8gzJ6bjaS+7mSqdnSex5qYlMoSO/7Ewz V7vMkPfWSZ2DF5U98cCVNWRW7gEu7lqyw/ZczKRmrl668hKgcv6yEZgXNi4S/eMsKKEY 6Ot6BRe979t70cNsteRMl7osDvazumIxxbzS/IGdY1JmA5d/a5t3DMXkbCIwpDuZCUfu Xr/w== 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=Da6MsID/Ggg05vRYQUO8kFVBh9IHwWApwsSHc4saTr0=; b=eoEPA/eKy1F33rg4Mahu454q7uvWv9JFSclv+nI5mloOZHnPdy+ipvL+MYRXQCj+3o 0eaD6gvqu95UyJrgAmHrdKea1wUTKowAk47Ka72rVlw0mGtyJDC+Etn17uy5uJ4yIpCd ELCXNWE9DsJpCRzzvIsvovz2W/At731RBaWtXeTcidC5Su5CLtey411AaO/DA0TNeRjV KvfWaDE7CTOXud6Ln6gcpu14gKLEVOq9Upq7vn3aFQmYLrJNdYyYtQsjdg/Fem+azn/7 0TgLJwcQyyqhRtWDcUhXgb1qjodGCfi+EJNKXcL8wbYUDitLTkDLpMG6Tj0eiNHjFSF2 BhVQ== X-Gm-Message-State: AOAM530opKjJ+VkqjBjNABVnZ4FAaLQxc4JyknE2LZ+lEI4oxBZNJoBQ xI2ZM55sDnjmyA8XSmr1wAJR57+fn2q3Lg== X-Google-Smtp-Source: ABdhPJzAgcTUjwTE9IPELU7ssWRFcPgShFRi+kCKG7Txraw01qTh3lYBpYc483orqvov8plz6qiZHA== X-Received: by 2002:a37:5c3:: with SMTP id 186mr18423202qkf.32.1612219488482; Mon, 01 Feb 2021 14:44:48 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:47 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:14 -0300 Message-Id: <20210201224421.1395-4-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/10] avformat/utils: 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 --- av_get_packet() and av_read_frame() were allowed to be called with uninitialized packets in stack, so to keep supporting that we need to leave the calls to av_init_packet() in place during the deprecation period. libavformat/internal.h | 1 + libavformat/options.c | 13 +++-- libavformat/utils.c | 105 +++++++++++++++++++++++------------------ 3 files changed, 68 insertions(+), 51 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index 2fe1afa8e3..ff8b657343 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -90,6 +90,7 @@ struct AVFormatInternal { /** * Packets split by the parser get queued here. */ + AVPacket *parse_pkt; struct AVPacketList *parse_queue; struct AVPacketList *parse_queue_end; diff --git a/libavformat/options.c b/libavformat/options.c index 2de2db8f09..07403b533e 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -220,14 +220,17 @@ AVFormatContext *avformat_alloc_context(void) av_free(ic); return NULL; } - avformat_get_context_defaults(ic); - ic->internal = internal; - ic->internal->pkt = av_packet_alloc(); - if (!ic->internal->pkt) { - av_free(ic->internal); + internal->pkt = av_packet_alloc(); + internal->parse_pkt = av_packet_alloc(); + if (!internal->pkt || !internal->parse_pkt) { + av_packet_free(&internal->pkt); + av_packet_free(&internal->parse_pkt); + av_free(internal); av_free(ic); return NULL; } + avformat_get_context_defaults(ic); + ic->internal = internal; ic->internal->offset = AV_NOPTS_VALUE; ic->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; ic->internal->shortest_end = AV_NOPTS_VALUE; diff --git a/libavformat/utils.c b/libavformat/utils.c index 2587bedc05..8cd5d0760f 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -309,9 +309,15 @@ static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size) int av_get_packet(AVIOContext *s, AVPacket *pkt, int size) { +#if FF_API_INIT_PACKET +FF_DISABLE_DEPRECATION_WARNINGS av_init_packet(pkt); pkt->data = NULL; pkt->size = 0; +FF_ENABLE_DEPRECATION_WARNINGS +#else + av_packet_unref(pkt); +#endif pkt->pos = avio_tell(s); return append_packet_chunked(s, pkt, size); @@ -799,9 +805,7 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) int ret, i, err; AVStream *st; - pkt->data = NULL; - pkt->size = 0; - av_init_packet(pkt); + av_packet_unref(pkt); for (;;) { AVPacketList *pktl = s->internal->raw_packet_buffer; @@ -1401,14 +1405,14 @@ FF_ENABLE_DEPRECATION_WARNINGS static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index, int flush) { - AVPacket out_pkt; + AVPacket *out_pkt = s->internal->parse_pkt; AVStream *st = s->streams[stream_index]; uint8_t *data = pkt->data; int size = pkt->size; int ret = 0, got_output = flush; if (size || flush) { - av_init_packet(&out_pkt); + av_packet_unref(out_pkt); } else if (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) { // preserve 0-size sync packets compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE); @@ -1420,7 +1424,7 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int64_t next_dts = pkt->dts; len = av_parser_parse2(st->parser, st->internal->avctx, - &out_pkt.data, &out_pkt.size, data, size, + &out_pkt->data, &out_pkt->size, data, size, pkt->pts, pkt->dts, pkt->pos); pkt->pts = pkt->dts = AV_NOPTS_VALUE; @@ -1429,39 +1433,39 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, data += len; size -= len; - got_output = !!out_pkt.size; + got_output = !!out_pkt->size; - if (!out_pkt.size) + 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 + 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 st->parser->flags * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */ - out_pkt.buf = av_buffer_ref(pkt->buf); - if (!out_pkt.buf) { + 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); + 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; + out_pkt->side_data = pkt->side_data; + out_pkt->side_data_elems = pkt->side_data_elems; pkt->side_data = NULL; pkt->side_data_elems = 0; } /* set the duration */ - out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0; + out_pkt->duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0; if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { if (st->internal->avctx->sample_rate > 0) { - out_pkt.duration = + out_pkt->duration = av_rescale_q_rnd(st->parser->duration, (AVRational) { 1, st->internal->avctx->sample_rate }, st->time_base, @@ -1469,30 +1473,30 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, } } - out_pkt.stream_index = st->index; - out_pkt.pts = st->parser->pts; - out_pkt.dts = st->parser->dts; - out_pkt.pos = st->parser->pos; - out_pkt.flags |= pkt->flags & AV_PKT_FLAG_DISCARD; + out_pkt->stream_index = st->index; + out_pkt->pts = st->parser->pts; + out_pkt->dts = st->parser->dts; + out_pkt->pos = st->parser->pos; + out_pkt->flags |= pkt->flags & AV_PKT_FLAG_DISCARD; if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) - out_pkt.pos = st->parser->frame_offset; + out_pkt->pos = st->parser->frame_offset; if (st->parser->key_frame == 1 || (st->parser->key_frame == -1 && st->parser->pict_type == AV_PICTURE_TYPE_I)) - out_pkt.flags |= AV_PKT_FLAG_KEY; + out_pkt->flags |= AV_PKT_FLAG_KEY; if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY)) - out_pkt.flags |= AV_PKT_FLAG_KEY; + out_pkt->flags |= AV_PKT_FLAG_KEY; - compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts); + compute_pkt_fields(s, st, st->parser, out_pkt, next_dts, next_pts); ret = avpriv_packet_list_put(&s->internal->parse_queue, &s->internal->parse_queue_end, - &out_pkt, NULL, 0); + out_pkt, NULL, 0); if (ret < 0) { - av_packet_unref(&out_pkt); + av_packet_unref(out_pkt); goto fail; } } @@ -1722,6 +1726,13 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) int ret; AVStream *st; +#if FF_API_INIT_PACKET +FF_DISABLE_DEPRECATION_WARNINGS + pkt->data = NULL; + pkt->size = 0; + av_init_packet(pkt); +FF_ENABLE_DEPRECATION_WARNINGS +#endif if (!genpts) { ret = s->internal->packet_buffer ? avpriv_packet_list_get(&s->internal->packet_buffer, @@ -2368,7 +2379,7 @@ static int seek_frame_generic(AVFormatContext *s, int stream_index, return -1; if (index < 0 || index == st->internal->nb_index_entries - 1) { - AVPacket pkt; + AVPacket *pkt = s->internal->pkt; int nonkey = 0; if (st->internal->nb_index_entries) { @@ -2381,25 +2392,26 @@ static int seek_frame_generic(AVFormatContext *s, int stream_index, if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0) return ret; } + av_packet_unref(pkt); for (;;) { int read_status; do { - read_status = av_read_frame(s, &pkt); + read_status = av_read_frame(s, pkt); } while (read_status == AVERROR(EAGAIN)); if (read_status < 0) break; - if (stream_index == pkt.stream_index && pkt.dts > timestamp) { - if (pkt.flags & AV_PKT_FLAG_KEY) { - av_packet_unref(&pkt); + if (stream_index == pkt->stream_index && pkt->dts > timestamp) { + if (pkt->flags & AV_PKT_FLAG_KEY) { + av_packet_unref(pkt); break; } if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) { av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey); - av_packet_unref(&pkt); + av_packet_unref(pkt); break; } } - av_packet_unref(&pkt); + av_packet_unref(pkt); } index = av_index_search_timestamp(st, timestamp, flags); } @@ -2747,7 +2759,7 @@ static void estimate_timings_from_bit_rate(AVFormatContext *ic) /* only usable for MPEG-PS streams */ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset) { - AVPacket pkt1, *pkt = &pkt1; + AVPacket *pkt = ic->internal->pkt; AVStream *st; int num, den, read_size, i, ret; int found_duration = 0; @@ -3576,7 +3588,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) int64_t read_size; AVStream *st; AVCodecContext *avctx; - AVPacket pkt1; + AVPacket *pkt1 = ic->internal->pkt; int64_t old_offset = avio_tell(ic->pb); // new streams might appear, no options for those int orig_nb_streams = ic->nb_streams; @@ -3779,7 +3791,7 @@ FF_ENABLE_DEPRECATION_WARNINGS /* NOTE: A new stream can be added there if no header in file * (AVFMTCTX_NOHEADER). */ - ret = read_frame_internal(ic, &pkt1); + ret = read_frame_internal(ic, pkt1); if (ret == AVERROR(EAGAIN)) continue; @@ -3792,13 +3804,13 @@ FF_ENABLE_DEPRECATION_WARNINGS if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { ret = avpriv_packet_list_put(&ic->internal->packet_buffer, &ic->internal->packet_buffer_end, - &pkt1, NULL, 0); + pkt1, NULL, 0); if (ret < 0) goto unref_then_goto_end; pkt = &ic->internal->packet_buffer_end->pkt; } else { - pkt = &pkt1; + pkt = pkt1; } st = ic->streams[pkt->stream_index]; @@ -3878,7 +3890,7 @@ FF_ENABLE_DEPRECATION_WARNINGS limit, t, pkt->stream_index); if (ic->flags & AVFMT_FLAG_NOBUFFER) - av_packet_unref(&pkt1); + av_packet_unref(pkt1); break; } if (pkt->duration) { @@ -3915,7 +3927,7 @@ FF_ENABLE_DEPRECATION_WARNINGS (options && i < orig_nb_streams) ? &options[i] : NULL); if (ic->flags & AVFMT_FLAG_NOBUFFER) - av_packet_unref(&pkt1); + av_packet_unref(pkt1); st->codec_info_nb_frames++; count++; @@ -3948,9 +3960,9 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (flush_codecs) { - AVPacket empty_pkt = { 0 }; + AVPacket *empty_pkt = ic->internal->pkt; int err = 0; - av_init_packet(&empty_pkt); + av_packet_unref(empty_pkt); for (i = 0; i < ic->nb_streams; i++) { @@ -3959,7 +3971,7 @@ FF_ENABLE_DEPRECATION_WARNINGS /* flush the decoders */ if (st->internal->info->found_decoder == 1) { do { - err = try_decode_frame(ic, st, &empty_pkt, + err = try_decode_frame(ic, st, empty_pkt, (options && i < orig_nb_streams) ? &options[i] : NULL); } while (err > 0 && !has_codec_parameters(st, NULL)); @@ -4182,7 +4194,7 @@ find_stream_info_err: return ret; unref_then_goto_end: - av_packet_unref(&pkt1); + av_packet_unref(pkt1); goto find_stream_info_err; } @@ -4446,6 +4458,7 @@ void avformat_free_context(AVFormatContext *s) av_dict_free(&s->metadata); av_dict_free(&s->internal->id3v2_meta); av_packet_free(&s->internal->pkt); + av_packet_free(&s->internal->parse_pkt); av_freep(&s->streams); flush_packet_queue(s); av_freep(&s->internal); From patchwork Mon Feb 1 22:44:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25336 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 D6011448D78 for ; Tue, 2 Feb 2021 00:50:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BE82868A3A3; Tue, 2 Feb 2021 00:50:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B629E68A33F for ; Tue, 2 Feb 2021 00:50:43 +0200 (EET) Received: by mail-pj1-f53.google.com with SMTP id g15so618698pjd.2 for ; Mon, 01 Feb 2021 14:50:43 -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=QYq+7aUrBF0jBI52dITVhapBFeajgNqAvogUm+vXv2k=; b=Bn1F3g30Gti0ClM2H2Hh3jcfFU7Xj0xqJqasDGAb4KVBrAwzm28axRF8+2SSjzAS+s 8OGGmWHO9OimzCix/a4ogbF//teLFkEAx/WqxKXAI2rRIcOPdIMgCsVGeg3DpbsHU/gw nGHYpQ9OzHrJdXgsSCTbkD/7t2KAa78y83+loXF5VlEPk/vLzn4Xsp4Xj7r0xIOPDLwA PhZY+eRe82Cnl+HnsbrzTtkwuzzLnNPteKAuBWea2JDuwwQgTy9Ipf5zhJADh1pNwxhV aOVpghyDQJsZgwjmCrqRo8Hjzauqq/r6+m66vyLyqHn8CiH2XfoudQc12hExR5bpZOFp hMjQ== 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=QYq+7aUrBF0jBI52dITVhapBFeajgNqAvogUm+vXv2k=; b=f5egeopObmS7SK8QKIZK+HrVavvlEKbR/CeuEiykr0X94/XSVWfk/OO4OLU3OXVsdF kjJivA84+CGZewza4VwlPA22uw5dNekqFw2UWp1fwebigQPAxpmZNDIPuEMQ99oRXM0a cs36HbVQoXhTiyFKOag1b02RrNgg8TqM9nagcigvo5VpZWk1ncWqhUmPBHeMboD45Fou 2Q4jkYSnZYxirewwfl5Fvpk/gAb7rlC9cQKh9ke//cEMKVg8Yy4vWYYyLsebsb13QDnW FJzOcwTnaGEck4nU+cTAiu7fe0U7qWYPLS4Yvcdr578AxlZcEIxai8qFO2xaxtV1kKzK sbXw== X-Gm-Message-State: AOAM531nEY6Yd5A+HqhsSkq6aNYMhhz7QwGkQoWXWUpJf2ukOU58Hh6l 6mpOxPV3qDDmynL/cMs1wzIsuSh0bWAumw== X-Google-Smtp-Source: ABdhPJyE2i9Fpe6q1ZpaAjlTL5zJ6ShxTH7V2pBCeX0+NrQMvn4NS+Rz2b7XBl/HIRTdRV4PSwwZIg== X-Received: by 2002:ad4:5bc8:: with SMTP id t8mr17841640qvt.36.1612219489968; Mon, 01 Feb 2021 14:44:49 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:49 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:15 -0300 Message-Id: <20210201224421.1395-5-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/10] doc/examples/demuxing_decoding: 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 --- doc/examples/demuxing_decoding.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/doc/examples/demuxing_decoding.c b/doc/examples/demuxing_decoding.c index 803e35d25c..db5e0cb951 100644 --- a/doc/examples/demuxing_decoding.c +++ b/doc/examples/demuxing_decoding.c @@ -51,7 +51,7 @@ static int video_dst_bufsize; static int video_stream_idx = -1, audio_stream_idx = -1; static AVFrame *frame = NULL; -static AVPacket pkt; +static AVPacket *pkt = NULL; static int video_frame_count = 0; static int audio_frame_count = 0; @@ -303,10 +303,12 @@ int main (int argc, char **argv) goto end; } - /* initialize packet, set data to NULL, let the demuxer fill it */ - av_init_packet(&pkt); - pkt.data = NULL; - pkt.size = 0; + pkt = av_packet_alloc(); + if (!pkt) { + fprintf(stderr, "Could not allocate packet\n"); + ret = AVERROR(ENOMEM); + goto end; + } if (video_stream) printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename); @@ -314,14 +316,14 @@ int main (int argc, char **argv) printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename); /* read frames from the file */ - while (av_read_frame(fmt_ctx, &pkt) >= 0) { + while (av_read_frame(fmt_ctx, pkt) >= 0) { // check if the packet belongs to a stream we are interested in, otherwise // skip it - if (pkt.stream_index == video_stream_idx) - ret = decode_packet(video_dec_ctx, &pkt); - else if (pkt.stream_index == audio_stream_idx) - ret = decode_packet(audio_dec_ctx, &pkt); - av_packet_unref(&pkt); + if (pkt->stream_index == video_stream_idx) + ret = decode_packet(video_dec_ctx, pkt); + else if (pkt->stream_index == audio_stream_idx) + ret = decode_packet(audio_dec_ctx, pkt); + av_packet_unref(pkt); if (ret < 0) break; } @@ -372,6 +374,7 @@ end: fclose(video_dst_file); if (audio_dst_file) fclose(audio_dst_file); + av_packet_free(&pkt); av_frame_free(&frame); av_free(video_dst_data[0]); From patchwork Mon Feb 1 22:44:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25338 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 B0552449C7A for ; Tue, 2 Feb 2021 00:53:06 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 86F7868A107; Tue, 2 Feb 2021 00:53:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f44.google.com (mail-qv1-f44.google.com [209.85.219.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 47A1A6881F5 for ; Tue, 2 Feb 2021 00:52:59 +0200 (EET) Received: by mail-qv1-f44.google.com with SMTP id r13so4627984qvm.11 for ; Mon, 01 Feb 2021 14:52:59 -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=HKqjN7udDOvYrvw/gaJz7t3eFIoKZMPvBICYq36AWvM=; b=rh2foSQUG8mG/fQ3F53ZGZUSKs3zW54DJf6MyiLUQ6D8PbbdSH/SfYxd2ZThrB1QuL lTF0/RDYXqkBZOkXizWkh5F/v8ojInKSqQuTs8+kYL48xY8mW27e0C0rkm44gziwfrhv GWdpgk/oDxQH2j3GrPGy+r/BDY4Q1fP4SKVSU6kVAPfK9W4iUqDqRBj5rW8qsK2Cf9Kg uHcPTqfK94U8bY5KIXOyA4xtjgstyIeZlHxJzF93wcQ3WYrZp5Wv2RWmroaZcLrh2m5D xLcvbEYxTlDtlTuTBWPr3/mXWdms0ZskmRvnJSk9MAOqY6YnXo0NIVtcPuNJKdYACum0 ip3g== 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=HKqjN7udDOvYrvw/gaJz7t3eFIoKZMPvBICYq36AWvM=; b=Oyq5fNLYuTYV1KBDBr+8wzlFvlah9B3SkmQ03GfMQXKX1T4+Eff1YgAbBseBKb+lQi cfNjgq6SUBRHJX6JE3Eoj131iDOLyCV7ByXebSGSrmYHNZCK8fzh/gEm1mSlcNSBx/p+ iBaDMibzLGF7uQvdn6VBvNPkF5si/Mtuha3vYKpyPwf4WSJgW9L3XvaJoVyhS4EagSUp pxJBHKwlHfE+pb9lrXi9YVlA+jYwxEPGtChqeqYPFHdXm2yPkfiVoTGqZwSSjkOzExQR qj8CVy60OCYmmmkv6tPXqv9WEiRfpcE8HonQLqlaLJXXNxlthk5RjFx3pjILV0RSCa+b WdQA== X-Gm-Message-State: AOAM530KY8eiUxSpvzEAQMcxutpZhIy4PE5LEBuvCrF8FEynPtn2tWpw AxK4pW1uiwJQs3uKJHm3fKPQpSYaZkIbFw== X-Google-Smtp-Source: ABdhPJxTsWMpWlLbfY7oQFlwTtRbSy2pTh/c7wYz24TGXh68fWiqm9OjULMcacJFVmaxFDV7MT2J8A== X-Received: by 2002:a05:6214:21a5:: with SMTP id t5mr17360414qvc.20.1612219491451; Mon, 01 Feb 2021 14:44:51 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.50 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:50 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:16 -0300 Message-Id: <20210201224421.1395-6-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/10] doc/examples/transcode_aac: 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 --- doc/examples/transcode_aac.c | 46 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/doc/examples/transcode_aac.c b/doc/examples/transcode_aac.c index e0c76f5b35..73786ab59b 100644 --- a/doc/examples/transcode_aac.c +++ b/doc/examples/transcode_aac.c @@ -245,14 +245,16 @@ cleanup: /** * Initialize one data packet for reading or writing. - * @param packet Packet to be initialized + * @param[out] packet Packet to be initialized + * @return Error code (0 if successful) */ -static void init_packet(AVPacket *packet) +static int init_packet(AVPacket **packet) { - av_init_packet(packet); - /* Set the packet data and size so that it is recognized as being empty. */ - packet->data = NULL; - packet->size = 0; + if (!(*packet = av_packet_alloc())) { + fprintf(stderr, "Could not allocate packet\n"); + return AVERROR(ENOMEM); + } + return 0; } /** @@ -371,28 +373,31 @@ static int decode_audio_frame(AVFrame *frame, int *data_present, int *finished) { /* Packet used for temporary storage. */ - AVPacket input_packet; + AVPacket *input_packet; int error; - init_packet(&input_packet); + + error = init_packet(&input_packet); + if (error < 0) + return error; /* Read one audio frame from the input file into a temporary packet. */ - if ((error = av_read_frame(input_format_context, &input_packet)) < 0) { + if ((error = av_read_frame(input_format_context, input_packet)) < 0) { /* If we are at the end of the file, flush the decoder below. */ if (error == AVERROR_EOF) *finished = 1; else { fprintf(stderr, "Could not read frame (error '%s')\n", av_err2str(error)); - return error; + goto cleanup; } } /* Send the audio frame stored in the temporary packet to the decoder. * The input audio stream decoder is used to do this. */ - if ((error = avcodec_send_packet(input_codec_context, &input_packet)) < 0) { + if ((error = avcodec_send_packet(input_codec_context, input_packet)) < 0) { fprintf(stderr, "Could not send packet for decoding (error '%s')\n", av_err2str(error)); - return error; + goto cleanup; } /* Receive one frame from the decoder. */ @@ -418,7 +423,7 @@ static int decode_audio_frame(AVFrame *frame, } cleanup: - av_packet_unref(&input_packet); + av_packet_free(&input_packet); return error; } @@ -661,9 +666,12 @@ static int encode_audio_frame(AVFrame *frame, int *data_present) { /* Packet used for temporary storage. */ - AVPacket output_packet; + AVPacket *output_packet; int error; - init_packet(&output_packet); + + error = init_packet(&output_packet); + if (error < 0) + return error; /* Set a timestamp based on the sample rate for the container. */ if (frame) { @@ -681,11 +689,11 @@ static int encode_audio_frame(AVFrame *frame, } else if (error < 0) { fprintf(stderr, "Could not send packet for encoding (error '%s')\n", av_err2str(error)); - return error; + goto cleanup; } /* Receive one encoded frame from the encoder. */ - error = avcodec_receive_packet(output_codec_context, &output_packet); + error = avcodec_receive_packet(output_codec_context, output_packet); /* If the encoder asks for more data to be able to provide an * encoded frame, return indicating that no data is present. */ if (error == AVERROR(EAGAIN)) { @@ -706,14 +714,14 @@ static int encode_audio_frame(AVFrame *frame, /* Write one audio frame from the temporary packet to the output file. */ if (*data_present && - (error = av_write_frame(output_format_context, &output_packet)) < 0) { + (error = av_write_frame(output_format_context, output_packet)) < 0) { fprintf(stderr, "Could not write frame (error '%s')\n", av_err2str(error)); goto cleanup; } cleanup: - av_packet_unref(&output_packet); + av_packet_free(&output_packet); return error; } From patchwork Mon Feb 1 22:44:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25332 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 0FBD044BD9A for ; Tue, 2 Feb 2021 00:45:01 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E58A868A588; Tue, 2 Feb 2021 00:45:00 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f179.google.com (mail-qk1-f179.google.com [209.85.222.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5B2C368A328 for ; Tue, 2 Feb 2021 00:44:54 +0200 (EET) Received: by mail-qk1-f179.google.com with SMTP id r77so18034657qka.12 for ; Mon, 01 Feb 2021 14:44:54 -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=9aljdYkb+Y3yTM3ooLhRosreB0W3nf0TBwCQ0LbT4kE=; b=uhvFvRDZjygPY7Rcz+Gyqc4r2VPMAR3i06gmRwh7Xf1dRbkfirXn+iJhCsKYdbeQ1x ANhyYjmHBCgHx05T4Of9IX5ACRwCS9SkvdgsOy85Jx/hIoR2JoQOnUUarQokVfwb3mUu 7TxnrxGf5Vjl6ngZ9ruTIrSomhZ8BaCxesJMmnCshcc3e3evcCl0+NFOmxovn3z+N4j2 CPAwUJ7DaLJLtQNCkyp87H0aX2neVKO6/ij20vDdR5ilV7qYNr0u59/yCG73b4iYBlt3 d04quJDHBaeQtWgvNlplJxeyscQ474S1XoCpKmdcbm7gXxxp2kxb7t66V9T172XzR0CR 0PjA== 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=9aljdYkb+Y3yTM3ooLhRosreB0W3nf0TBwCQ0LbT4kE=; b=o1iKvHe2QW1RorGSP580SZyltV5XZgJGxKjCwfQyUQIYymqo5cZPfJjrYeijV8KgQO QOTkqRNJenP3M1YDC17LB4tKGaS00UCsCuZMS5EtJ1frtgwD49xt+R6ZuWqIYk4fep2g gDmDjsfXyoA6/YRr5kIlDiRJGb2jcyBeCEd+QntMxWZ8Jdr4D6zeyzYRozdwZ2clbqGo 3C7G5wgxJAlUJswXZxQg/Tk8MOVr7PehufZUCPiNO3mCczZZ22ERMIUaLdhUceN74S8O QFTJSxPfKBTAntiXNvKxYHrEjW6KrFrSD2DaRpxHazq+Micgp7U7DrV7HKkvOnv83Jq7 kLwg== X-Gm-Message-State: AOAM531lsmgR7Mw3aGvRBihCHYb/rNowYmH3RJ/HrF1o8wqz0knqPSmB OfJc30qPIVgcYkEO+aFUgj2uuLqrWS6+IA== X-Google-Smtp-Source: ABdhPJx0eORXav7zCJr5WiOdb/kPH1zZ+6STq0nhvXyoDAzPK6bT054y4p9y4yvvIhW6m0cYrHg42g== X-Received: by 2002:a37:63d4:: with SMTP id x203mr18089106qkb.105.1612219492868; Mon, 01 Feb 2021 14:44:52 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:52 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:17 -0300 Message-Id: <20210201224421.1395-7-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/10] doc/examples/transcoding: 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 --- doc/examples/transcoding.c | 48 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/doc/examples/transcoding.c b/doc/examples/transcoding.c index 5aff08c135..6ca3089330 100644 --- a/doc/examples/transcoding.c +++ b/doc/examples/transcoding.c @@ -42,6 +42,7 @@ typedef struct FilteringContext { AVFilterContext *buffersrc_ctx; AVFilterGraph *filter_graph; + AVPacket *enc_pkt; AVFrame *filtered_frame; } FilteringContext; static FilteringContext *filter_ctx; @@ -407,6 +408,10 @@ static int init_filters(void) if (ret) return ret; + filter_ctx[i].enc_pkt = av_packet_alloc(); + if (!filter_ctx[i].enc_pkt) + return AVERROR(ENOMEM); + filter_ctx[i].filtered_frame = av_frame_alloc(); if (!filter_ctx[i].filtered_frame) return AVERROR(ENOMEM); @@ -414,17 +419,17 @@ static int init_filters(void) return 0; } -static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index) +static int encode_write_frame(unsigned int stream_index, int flush) { StreamContext *stream = &stream_ctx[stream_index]; + FilteringContext *filter = &filter_ctx[stream_index]; + AVFrame *filt_frame = flush ? NULL : filter->filtered_frame; + AVPacket *enc_pkt = filter->enc_pkt; int ret; - AVPacket enc_pkt; av_log(NULL, AV_LOG_INFO, "Encoding frame\n"); /* encode filtered frame */ - enc_pkt.data = NULL; - enc_pkt.size = 0; - av_init_packet(&enc_pkt); + av_packet_unref(enc_pkt); ret = avcodec_send_frame(stream->enc_ctx, filt_frame); @@ -432,20 +437,20 @@ static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index) return ret; while (ret >= 0) { - ret = avcodec_receive_packet(stream->enc_ctx, &enc_pkt); + ret = avcodec_receive_packet(stream->enc_ctx, enc_pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) return 0; /* prepare packet for muxing */ - enc_pkt.stream_index = stream_index; - av_packet_rescale_ts(&enc_pkt, + enc_pkt->stream_index = stream_index; + av_packet_rescale_ts(enc_pkt, stream->enc_ctx->time_base, ofmt_ctx->streams[stream_index]->time_base); av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n"); /* mux encoded frame */ - ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt); + ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt); } return ret; @@ -481,7 +486,7 @@ static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index) } filter->filtered_frame->pict_type = AV_PICTURE_TYPE_NONE; - ret = encode_write_frame(filter->filtered_frame, stream_index); + ret = encode_write_frame(stream_index, 0); av_frame_unref(filter->filtered_frame); if (ret < 0) break; @@ -497,13 +502,13 @@ static int flush_encoder(unsigned int stream_index) return 0; av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index); - return encode_write_frame(NULL, stream_index); + return encode_write_frame(stream_index, 1); } int main(int argc, char **argv) { int ret; - AVPacket packet = { .data = NULL, .size = 0 }; + AVPacket *packet = NULL; unsigned int stream_index; unsigned int i; @@ -518,12 +523,14 @@ int main(int argc, char **argv) goto end; if ((ret = init_filters()) < 0) goto end; + if (!(packet = av_packet_alloc())) + goto end; /* read all packets */ while (1) { - if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0) + if ((ret = av_read_frame(ifmt_ctx, packet)) < 0) break; - stream_index = packet.stream_index; + stream_index = packet->stream_index; av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n", stream_index); @@ -532,10 +539,10 @@ int main(int argc, char **argv) av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n"); - av_packet_rescale_ts(&packet, + av_packet_rescale_ts(packet, ifmt_ctx->streams[stream_index]->time_base, stream->dec_ctx->time_base); - ret = avcodec_send_packet(stream->dec_ctx, &packet); + ret = avcodec_send_packet(stream->dec_ctx, packet); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Decoding failed\n"); break; @@ -555,15 +562,15 @@ int main(int argc, char **argv) } } else { /* remux this frame without reencoding */ - av_packet_rescale_ts(&packet, + av_packet_rescale_ts(packet, ifmt_ctx->streams[stream_index]->time_base, ofmt_ctx->streams[stream_index]->time_base); - ret = av_interleaved_write_frame(ofmt_ctx, &packet); + ret = av_interleaved_write_frame(ofmt_ctx, packet); if (ret < 0) goto end; } - av_packet_unref(&packet); + av_packet_unref(packet); } /* flush filters and encoders */ @@ -587,13 +594,14 @@ int main(int argc, char **argv) av_write_trailer(ofmt_ctx); end: - av_packet_unref(&packet); + av_packet_free(&packet); for (i = 0; i < ifmt_ctx->nb_streams; i++) { avcodec_free_context(&stream_ctx[i].dec_ctx); if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && stream_ctx[i].enc_ctx) avcodec_free_context(&stream_ctx[i].enc_ctx); if (filter_ctx && filter_ctx[i].filter_graph) { avfilter_graph_free(&filter_ctx[i].filter_graph); + av_packet_free(&filter_ctx[i].enc_pkt); av_frame_free(&filter_ctx[i].filtered_frame); } From patchwork Mon Feb 1 22:44:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25334 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 08B4B44BD9A for ; Tue, 2 Feb 2021 00:45:02 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E774568A700; Tue, 2 Feb 2021 00:45:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f42.google.com (mail-qv1-f42.google.com [209.85.219.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA26D68A328 for ; Tue, 2 Feb 2021 00:44:55 +0200 (EET) Received: by mail-qv1-f42.google.com with SMTP id l14so9032639qvp.2 for ; Mon, 01 Feb 2021 14:44:55 -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=xH0bWBeFCt3b9DeWvbU+1Q3FuUMluDQhDe8ndxho89w=; b=bfFTPzg9y1MVKpvKSgGDKF66TrC7YaZk/zr6j7R0vuB+g0Zt8MXNAKUbB4fjEfa/Si ZtHMhWVAuVrpldP+EHm5fJbMcTHYv4Pm5MeBbHJHaCMKYGMmXxIel17qbPYNtlJcx+jJ ACZFWk2SL1QV17t3uD1Vdq9HucCbMi3XV8lO8ejFmej7UlP90XJ1iaLnARgmS6T9FAf9 jcKMc7iq+dWDGK2B2qqzam7TiwB/ua86pJLFLyGJMeCgc/9UV3u6sw89dgNleKjW8Vb8 0vvcb9pMT8GNrlvhT/JdBKtHG9UCtrajqUgeTPxukIw/klUC6/D7RwJUemAhFX1WHIYQ 1Vsw== 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=xH0bWBeFCt3b9DeWvbU+1Q3FuUMluDQhDe8ndxho89w=; b=lRV+tY4CHGxxk6oRhlRWtw4KNcu/oy49O4EkEyj6RYf6QY3FKedsNU/VyYBYHDJ8tY 8TP1VDnUts+4vkE+55A6qTk6fRq/+WQmStslTXjtDj+HTfcOEFe7pLwogO56XSc9Rdgv Udyj1UMUhsm/LKpxbwe6cAP4CYpiZJ/PiTfLfivp5ZeoEL+v4BzNlgO9McpAdxadzNn0 eshi0uK96Y5io2SkQFG/0xFTkZmkeIMyTpIIqn9UvdM3eUcZW6kCEmBJxGEtmug+8VBW jDcrZ+U1Y4JSlyVtSTnn4hWzOT4znqKGJiBJ24kmOp1vixg8uRomlPWnfvy9gLTo4N2e 0Urw== X-Gm-Message-State: AOAM531RwmwrmMwR/tJxlvmUj+Ac+Ov4Rqrj+kaGUJvOp+xBfMWy2edh OY8lMWMLsRv0OwuTXJgHF7zzDQrinO9GVQ== X-Google-Smtp-Source: ABdhPJw8t1HECgqvSbd500WMtOzfth2MVlSVm+BT/oaB0c4TA46bVj/cPxN/GWJiCDrBiPJTnjb1qQ== X-Received: by 2002:a0c:cb82:: with SMTP id p2mr17279572qvk.54.1612219494282; Mon, 01 Feb 2021 14:44:54 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:53 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:18 -0300 Message-Id: <20210201224421.1395-8-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/10] fftools/ffprobe: 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 --- fftools/ffprobe.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 3453aa09ff..68fecd61e5 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -2465,14 +2465,12 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile, const ReadInterval *interval, int64_t *cur_ts) { AVFormatContext *fmt_ctx = ifile->fmt_ctx; - AVPacket pkt; + AVPacket *pkt = NULL; AVFrame *frame = NULL; int ret = 0, i = 0, frame_count = 0; int64_t start = -INT64_MAX, end = interval->end; int has_start = 0, has_end = interval->has_end && !interval->end_is_offset; - av_init_packet(&pkt); - av_log(NULL, AV_LOG_VERBOSE, "Processing read interval "); log_read_interval(interval, NULL, AV_LOG_VERBOSE); @@ -2505,18 +2503,23 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile, ret = AVERROR(ENOMEM); goto end; } - while (!av_read_frame(fmt_ctx, &pkt)) { + pkt = av_packet_alloc(); + if (!pkt) { + ret = AVERROR(ENOMEM); + goto end; + } + while (!av_read_frame(fmt_ctx, pkt)) { if (fmt_ctx->nb_streams > nb_streams) { REALLOCZ_ARRAY_STREAM(nb_streams_frames, nb_streams, fmt_ctx->nb_streams); REALLOCZ_ARRAY_STREAM(nb_streams_packets, nb_streams, fmt_ctx->nb_streams); REALLOCZ_ARRAY_STREAM(selected_streams, nb_streams, fmt_ctx->nb_streams); nb_streams = fmt_ctx->nb_streams; } - if (selected_streams[pkt.stream_index]) { - AVRational tb = ifile->streams[pkt.stream_index].st->time_base; + if (selected_streams[pkt->stream_index]) { + AVRational tb = ifile->streams[pkt->stream_index].st->time_base; - if (pkt.pts != AV_NOPTS_VALUE) - *cur_ts = av_rescale_q(pkt.pts, tb, AV_TIME_BASE_Q); + if (pkt->pts != AV_NOPTS_VALUE) + *cur_ts = av_rescale_q(pkt->pts, tb, AV_TIME_BASE_Q); if (!has_start && *cur_ts != AV_NOPTS_VALUE) { start = *cur_ts; @@ -2538,26 +2541,27 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile, frame_count++; if (do_read_packets) { if (do_show_packets) - show_packet(w, ifile, &pkt, i++); - nb_streams_packets[pkt.stream_index]++; + show_packet(w, ifile, pkt, i++); + nb_streams_packets[pkt->stream_index]++; } if (do_read_frames) { int packet_new = 1; - while (process_frame(w, ifile, frame, &pkt, &packet_new) > 0); + while (process_frame(w, ifile, frame, pkt, &packet_new) > 0); } } - av_packet_unref(&pkt); + av_packet_unref(pkt); } - av_packet_unref(&pkt); + av_packet_unref(pkt); //Flush remaining frames that are cached in the decoder for (i = 0; i < fmt_ctx->nb_streams; i++) { - pkt.stream_index = i; + pkt->stream_index = i; if (do_read_frames) - while (process_frame(w, ifile, frame, &pkt, &(int){1}) > 0); + while (process_frame(w, ifile, frame, pkt, &(int){1}) > 0); } end: av_frame_free(&frame); + av_packet_free(&pkt); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Could not read packets in interval "); log_read_interval(interval, NULL, AV_LOG_ERROR); From patchwork Mon Feb 1 22:44:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25337 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 4E81C448D78 for ; Tue, 2 Feb 2021 00:51:02 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2D68968A56E; Tue, 2 Feb 2021 00:51:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f47.google.com (mail-qv1-f47.google.com [209.85.219.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3462668A588 for ; Tue, 2 Feb 2021 00:50:55 +0200 (EET) Received: by mail-qv1-f47.google.com with SMTP id ew18so9035194qvb.4 for ; Mon, 01 Feb 2021 14:50:55 -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=9BAFrb/ZKECqikIvN3Vv/OMQKErnAEJxfOBlFrnouWI=; b=YOj2PM9V0i927gsp2RVX9BSpFyY1KfEqT89spyRuC77xToP3xgRtekMy9O8nNpgR18 zIDRPEglIqve2oIGs+FsNiI36H1epug8WGfvttQrjxBI+jzLMqAaPWa3UYNrLWUjNwrL FrLMFYmh50kIZGR9nCz6luFtip1+HhFWcZ8faS03Fdchf1YB6wiJUsWGjUWd5jCURoKT 4IajosecOjNLFswOtx908R1DODJVJQ4+smc5FaUYSlPWoiHOdcMhHGISbjP/AdPtDO9y D5kK7ZDaA4pjWbDC11hLytAHYEC0qT3oDX/t2Z0eoUUumvyNoOAMVPo7kQSFyCCh0ZE/ wlGw== 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=9BAFrb/ZKECqikIvN3Vv/OMQKErnAEJxfOBlFrnouWI=; b=uL1a+Q50fbgS5U0DZpjvPDzqxpY8fQL2FOYq1fBr68l8kzp46t7OyOdO6YNJzTQxal Ws/qhHUdC4v//czkLQsPQJPdN1BiVA6m9ARJmeV27qpjZIfLGNMXPRNPJkXrEMLXUqiR cgtt9rnRApyFjJ5KpcBWsqCBCFvIrla0HtVy0Bnsz69h7OcYb+8oe3P+93XRGHeOI59/ 8NDZfbuh40fY/AoiOFFHPGnKkUNDpgubymZ51jaj5HmYKAMFOwFdw3IrzSyxMjWm4zCX XZ+KTHzF6K4cH8Qn6JlT7MJW8T1Bx8B1OBBhMJxVhOD0j88At4XXCpZiiXV/VWJLEGuU J5Ag== X-Gm-Message-State: AOAM530QeNHEASdFXabty198AUGJc0jHvMAUDuO/RLvAeQqEuOSh3Ouz MajlDgkBtZqATkpbZlByOs3U9nQqC9aRvQ== X-Google-Smtp-Source: ABdhPJx0z4gPJyE4v0j+uWU56fO8TcZwz0aVu1cn02mdznLrZ6VDPYIvQQn8tLDiC0Nj3R4bhZVvgg== X-Received: by 2002:a05:6214:1464:: with SMTP id c4mr17353908qvy.41.1612219495827; Mon, 01 Feb 2021 14:44:55 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:55 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:19 -0300 Message-Id: <20210201224421.1395-9-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/10] fftools/ffmpeg: 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 --- fftools/ffmpeg.c | 318 +++++++++++++++++++++++-------------------- fftools/ffmpeg.h | 4 + fftools/ffmpeg_opt.c | 5 +- 3 files changed, 177 insertions(+), 150 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index d7c833be63..2667f226b4 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -592,6 +592,7 @@ static void ffmpeg_cleanup(int ret) av_frame_free(&ost->filtered_frame); av_frame_free(&ost->last_frame); + av_packet_free(&ost->pkt); av_dict_free(&ost->encoder_opts); av_freep(&ost->forced_keyframes); @@ -610,9 +611,9 @@ static void ffmpeg_cleanup(int ret) if (ost->muxing_queue) { while (av_fifo_size(ost->muxing_queue)) { - AVPacket pkt; + AVPacket *pkt; av_fifo_generic_read(ost->muxing_queue, &pkt, sizeof(pkt), NULL); - av_packet_unref(&pkt); + av_packet_free(&pkt); } av_fifo_freep(&ost->muxing_queue); } @@ -624,6 +625,7 @@ static void ffmpeg_cleanup(int ret) #endif for (i = 0; i < nb_input_files; i++) { avformat_close_input(&input_files[i]->ctx); + av_packet_free(&input_files[i]->pkt); av_freep(&input_files[i]); } for (i = 0; i < nb_input_streams; i++) { @@ -631,6 +633,7 @@ static void ffmpeg_cleanup(int ret) av_frame_free(&ist->decoded_frame); av_frame_free(&ist->filter_frame); + av_packet_free(&ist->pkt); av_dict_free(&ist->decoder_opts); avsubtitle_free(&ist->prev_sub.subtitle); av_frame_free(&ist->sub2video.frame); @@ -746,7 +749,7 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u } if (!of->header_written) { - AVPacket tmp_pkt = {0}; + AVPacket *tmp_pkt; /* the muxer is not initialized yet, buffer the packet */ if (!av_fifo_space(ost->muxing_queue)) { unsigned int are_we_over_size = @@ -769,8 +772,11 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u ret = av_packet_make_refcounted(pkt); if (ret < 0) exit_program(1); - av_packet_move_ref(&tmp_pkt, pkt); - ost->muxing_queue_data_size += tmp_pkt.size; + tmp_pkt = av_packet_alloc(); + if (!tmp_pkt) + exit_program(1); + av_packet_move_ref(tmp_pkt, pkt); + ost->muxing_queue_data_size += tmp_pkt->size; av_fifo_generic_write(ost->muxing_queue, &tmp_pkt, sizeof(tmp_pkt), NULL); return; } @@ -999,13 +1005,9 @@ static void do_audio_out(OutputFile *of, OutputStream *ost, AVFrame *frame) { AVCodecContext *enc = ost->enc_ctx; - AVPacket pkt; + AVPacket *pkt = ost->pkt; int ret; - av_init_packet(&pkt); - pkt.data = NULL; - pkt.size = 0; - adjust_frame_pts_to_encoder_tb(of, ost, frame); if (!check_recording_time(ost)) @@ -1017,7 +1019,6 @@ static void do_audio_out(OutputFile *of, OutputStream *ost, ost->samples_encoded += frame->nb_samples; ost->frames_encoded++; - av_assert0(pkt.size || !pkt.data); update_benchmark(NULL); if (debug_ts) { av_log(NULL, AV_LOG_INFO, "encoder <- type:audio " @@ -1031,7 +1032,8 @@ static void do_audio_out(OutputFile *of, OutputStream *ost, goto error; while (1) { - ret = avcodec_receive_packet(enc, &pkt); + av_packet_unref(pkt); + ret = avcodec_receive_packet(enc, pkt); if (ret == AVERROR(EAGAIN)) break; if (ret < 0) @@ -1039,16 +1041,16 @@ static void do_audio_out(OutputFile *of, OutputStream *ost, update_benchmark("encode_audio %d.%d", ost->file_index, ost->index); - av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); + av_packet_rescale_ts(pkt, enc->time_base, ost->mux_timebase); if (debug_ts) { av_log(NULL, AV_LOG_INFO, "encoder -> type:audio " "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", - av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &enc->time_base), - av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base)); + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &enc->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &enc->time_base)); } - output_packet(of, &pkt, ost, 0); + output_packet(of, pkt, ost, 0); } return; @@ -1064,7 +1066,7 @@ static void do_subtitle_out(OutputFile *of, int subtitle_out_max_size = 1024 * 1024; int subtitle_out_size, nb, i; AVCodecContext *enc; - AVPacket pkt; + AVPacket *pkt = ost->pkt; int64_t pts; if (sub->pts == AV_NOPTS_VALUE) { @@ -1122,21 +1124,21 @@ static void do_subtitle_out(OutputFile *of, exit_program(1); } - av_init_packet(&pkt); - pkt.data = subtitle_out; - pkt.size = subtitle_out_size; - pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->mux_timebase); - pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); + av_packet_unref(pkt); + pkt->data = subtitle_out; + pkt->size = subtitle_out_size; + pkt->pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->mux_timebase); + pkt->duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) { /* XXX: the pts correction is handled here. Maybe handling it in the codec would be better */ if (i == 0) - pkt.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); + pkt->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); else - pkt.pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); + pkt->pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); } - pkt.dts = pkt.pts; - output_packet(of, &pkt, ost, 0); + pkt->dts = pkt->pts; + output_packet(of, pkt, ost, 0); } } @@ -1145,7 +1147,7 @@ static void do_video_out(OutputFile *of, AVFrame *next_picture) { int ret, format_video_sync; - AVPacket pkt; + AVPacket *pkt = ost->pkt; AVCodecContext *enc = ost->enc_ctx; AVRational frame_rate; int nb_frames, nb0_frames, i; @@ -1291,9 +1293,6 @@ static void do_video_out(OutputFile *of, AVFrame *in_picture; int forced_keyframe = 0; double pts_time; - av_init_packet(&pkt); - pkt.data = NULL; - pkt.size = 0; if (i < nb0_frames && ost->last_frame) { in_picture = ost->last_frame; @@ -1372,7 +1371,8 @@ static void do_video_out(OutputFile *of, av_frame_remove_side_data(in_picture, AV_FRAME_DATA_A53_CC); while (1) { - ret = avcodec_receive_packet(enc, &pkt); + av_packet_unref(pkt); + ret = avcodec_receive_packet(enc, pkt); update_benchmark("encode_video %d.%d", ost->file_index, ost->index); if (ret == AVERROR(EAGAIN)) break; @@ -1382,24 +1382,24 @@ static void do_video_out(OutputFile *of, if (debug_ts) { av_log(NULL, AV_LOG_INFO, "encoder -> type:video " "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", - av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &enc->time_base), - av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base)); + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &enc->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &enc->time_base)); } - if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & AV_CODEC_CAP_DELAY)) - pkt.pts = ost->sync_opts; + if (pkt->pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & AV_CODEC_CAP_DELAY)) + pkt->pts = ost->sync_opts; - av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); + av_packet_rescale_ts(pkt, enc->time_base, ost->mux_timebase); if (debug_ts) { av_log(NULL, AV_LOG_INFO, "encoder -> type:video " "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", - av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->mux_timebase), - av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->mux_timebase)); + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ost->mux_timebase), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ost->mux_timebase)); } - frame_size = pkt.size; - output_packet(of, &pkt, ost, 0); + frame_size = pkt->size; + output_packet(of, pkt, ost, 0); /* if two pass, output log */ if (ost->logfile && enc->stats_out) { @@ -1528,6 +1528,9 @@ static int reap_filters(int flush) if (av_buffersink_get_type(filter) == AVMEDIA_TYPE_AUDIO) init_output_stream_wrapper(ost, NULL, 1); + if (!ost->pkt && !(ost->pkt = av_packet_alloc())) { + return AVERROR(ENOMEM); + } if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) { return AVERROR(ENOMEM); } @@ -1968,7 +1971,7 @@ static void flush_encoders(void) for (;;) { const char *desc = NULL; - AVPacket pkt; + AVPacket *pkt = ost->pkt; int pkt_size; switch (enc->codec_type) { @@ -1982,13 +1985,10 @@ static void flush_encoders(void) av_assert0(0); } - av_init_packet(&pkt); - pkt.data = NULL; - pkt.size = 0; - update_benchmark(NULL); - while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) { + av_packet_unref(pkt); + while ((ret = avcodec_receive_packet(enc, pkt)) == AVERROR(EAGAIN)) { ret = avcodec_send_frame(enc, NULL); if (ret < 0) { av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n", @@ -2009,16 +2009,16 @@ static void flush_encoders(void) fprintf(ost->logfile, "%s", enc->stats_out); } if (ret == AVERROR_EOF) { - output_packet(of, &pkt, ost, 1); + output_packet(of, pkt, ost, 1); break; } if (ost->finished & MUXER_FINISHED) { - av_packet_unref(&pkt); + av_packet_unref(pkt); continue; } - av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); - pkt_size = pkt.size; - output_packet(of, &pkt, ost, 0); + av_packet_rescale_ts(pkt, enc->time_base, ost->mux_timebase); + pkt_size = pkt->size; + output_packet(of, pkt, ost, 0); if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) { do_video_stats(ost, pkt_size); } @@ -2052,14 +2052,12 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p InputFile *f = input_files [ist->file_index]; int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time; int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase); - AVPacket opkt; + AVPacket *opkt = ost->pkt; + av_packet_unref(opkt); // EOF: flush output bitstream filters. if (!pkt) { - av_init_packet(&opkt); - opkt.data = NULL; - opkt.size = 0; - output_packet(of, &opkt, ost, 1); + output_packet(of, opkt, ost, 1); return; } @@ -2097,30 +2095,30 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) ost->sync_opts++; - if (av_packet_ref(&opkt, pkt) < 0) + if (av_packet_ref(opkt, pkt) < 0) exit_program(1); if (pkt->pts != AV_NOPTS_VALUE) - opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time; + opkt->pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time; if (pkt->dts == AV_NOPTS_VALUE) { - opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase); + opkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase); } else if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { int duration = av_get_audio_frame_duration(ist->dec_ctx, pkt->size); if(!duration) duration = ist->dec_ctx->frame_size; - opkt.dts = av_rescale_delta(ist->st->time_base, pkt->dts, + opkt->dts = av_rescale_delta(ist->st->time_base, pkt->dts, (AVRational){1, ist->dec_ctx->sample_rate}, duration, &ist->filter_in_rescale_delta_last, ost->mux_timebase); /* dts will be set immediately afterwards to what pts is now */ - opkt.pts = opkt.dts - ost_tb_start_time; + opkt->pts = opkt->dts - ost_tb_start_time; } else - opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase); - opkt.dts -= ost_tb_start_time; + opkt->dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase); + opkt->dts -= ost_tb_start_time; - opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->mux_timebase); + opkt->duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->mux_timebase); - output_packet(of, &opkt, ost, 0); + output_packet(of, opkt, ost, 0); } int guess_input_channel_layout(InputStream *ist) @@ -2395,7 +2393,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ int i, ret = 0, err = 0; int64_t best_effort_timestamp; int64_t dts = AV_NOPTS_VALUE; - AVPacket avpkt; // With fate-indeo3-2, we're getting 0-sized packets before EOF for some // reason. This seems like a semi-critical bug. Don't trigger EOF, and @@ -2411,8 +2408,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ if (ist->dts != AV_NOPTS_VALUE) dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base); if (pkt) { - avpkt = *pkt; - avpkt.dts = dts; // ffmpeg.c probably shouldn't do this + pkt->dts = dts; // ffmpeg.c probably shouldn't do this } // The old code used to set dts on the drain packet, which does not work @@ -2426,7 +2422,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ } update_benchmark(NULL); - ret = decode(ist->dec_ctx, decoded_frame, got_output, pkt ? &avpkt : NULL); + ret = decode(ist->dec_ctx, decoded_frame, got_output, pkt); update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index); if (ret < 0) *decode_failed = 1; @@ -2585,6 +2581,8 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output, for (i = 0; i < nb_output_streams; i++) { OutputStream *ost = output_streams[i]; + if (!ost->pkt && !(ost->pkt = av_packet_alloc())) + exit_program(1); if (!check_output_constraints(ist, ost) || !ost->encoding_needed || ost->enc->type != AVMEDIA_TYPE_SUBTITLE) continue; @@ -2620,7 +2618,12 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo int repeating = 0; int eof_reached = 0; - AVPacket avpkt; + AVPacket *avpkt; + + if (!ist->pkt && !(ist->pkt = av_packet_alloc())) + return AVERROR(ENOMEM); + avpkt = ist->pkt; + if (!ist->saw_first_ts) { ist->dts = ist->st->avg_frame_rate.num ? - ist->dec_ctx->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0; ist->pts = 0; @@ -2636,13 +2639,11 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo if (ist->next_pts == AV_NOPTS_VALUE) ist->next_pts = ist->pts; - if (!pkt) { - /* EOF handling */ - av_init_packet(&avpkt); - avpkt.data = NULL; - avpkt.size = 0; - } else { - avpkt = *pkt; + if (pkt) { + av_packet_unref(avpkt); + ret = av_packet_ref(avpkt, pkt); + if (ret < 0) + return ret; } if (pkt && pkt->dts != AV_NOPTS_VALUE) { @@ -2663,11 +2664,12 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo switch (ist->dec_ctx->codec_type) { case AVMEDIA_TYPE_AUDIO: - ret = decode_audio (ist, repeating ? NULL : &avpkt, &got_output, + ret = decode_audio (ist, repeating ? NULL : avpkt, &got_output, &decode_failed); + av_packet_unref(avpkt); break; case AVMEDIA_TYPE_VIDEO: - ret = decode_video (ist, repeating ? NULL : &avpkt, &got_output, &duration_pts, !pkt, + ret = decode_video (ist, repeating ? NULL : avpkt, &got_output, &duration_pts, !pkt, &decode_failed); if (!repeating || !pkt || got_output) { if (pkt && pkt->duration) { @@ -2692,13 +2694,15 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo ist->next_pts += duration_dts; } } + av_packet_unref(avpkt); break; case AVMEDIA_TYPE_SUBTITLE: if (repeating) break; - ret = transcode_subtitles(ist, &avpkt, &got_output, &decode_failed); + ret = transcode_subtitles(ist, avpkt, &got_output, &decode_failed); if (!pkt && ret >= 0) ret = AVERROR_EOF; + av_packet_unref(avpkt); break; default: return -1; @@ -2787,6 +2791,8 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo for (i = 0; i < nb_output_streams; i++) { OutputStream *ost = output_streams[i]; + if (!ost->pkt && !(ost->pkt = av_packet_alloc())) + exit_program(1); if (!check_output_constraints(ist, ost) || ost->encoding_needed) continue; @@ -3055,10 +3061,11 @@ static int check_init_output_file(OutputFile *of, int file_index) ost->mux_timebase = ost->st->time_base; while (av_fifo_size(ost->muxing_queue)) { - AVPacket pkt; + AVPacket *pkt; av_fifo_generic_read(ost->muxing_queue, &pkt, sizeof(pkt), NULL); - ost->muxing_queue_data_size -= pkt.size; - write_packet(of, &pkt, ost, 1); + ost->muxing_queue_data_size -= pkt->size; + write_packet(of, pkt, ost, 1); + av_packet_free(&pkt); } } @@ -4078,12 +4085,12 @@ static int check_keyboard_interaction(int64_t cur_time) static void *input_thread(void *arg) { InputFile *f = arg; + AVPacket *pkt = f->pkt, *queue_pkt; unsigned flags = f->non_blocking ? AV_THREAD_MESSAGE_NONBLOCK : 0; int ret = 0; while (1) { - AVPacket pkt; - ret = av_read_frame(f->ctx, &pkt); + ret = av_read_frame(f->ctx, pkt); if (ret == AVERROR(EAGAIN)) { av_usleep(10000); @@ -4093,10 +4100,17 @@ static void *input_thread(void *arg) av_thread_message_queue_set_err_recv(f->in_thread_queue, ret); break; } - ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags); + queue_pkt = av_packet_alloc(); + if (!queue_pkt) { + av_packet_unref(pkt); + av_thread_message_queue_set_err_recv(f->in_thread_queue, AVERROR(ENOMEM)); + break; + } + av_packet_move_ref(queue_pkt, pkt); + ret = av_thread_message_queue_send(f->in_thread_queue, &queue_pkt, flags); if (flags && ret == AVERROR(EAGAIN)) { flags = 0; - ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags); + ret = av_thread_message_queue_send(f->in_thread_queue, &queue_pkt, flags); av_log(f->ctx, AV_LOG_WARNING, "Thread message queue blocking; consider raising the " "thread_queue_size option (current value: %d)\n", @@ -4107,7 +4121,7 @@ static void *input_thread(void *arg) av_log(f->ctx, AV_LOG_ERROR, "Unable to send packet to main thread: %s\n", av_err2str(ret)); - av_packet_unref(&pkt); + av_packet_free(&queue_pkt); av_thread_message_queue_set_err_recv(f->in_thread_queue, ret); break; } @@ -4119,13 +4133,13 @@ static void *input_thread(void *arg) static void free_input_thread(int i) { InputFile *f = input_files[i]; - AVPacket pkt; + AVPacket *pkt; if (!f || !f->in_thread_queue) return; av_thread_message_queue_set_err_send(f->in_thread_queue, AVERROR_EOF); while (av_thread_message_queue_recv(f->in_thread_queue, &pkt, 0) >= 0) - av_packet_unref(&pkt); + av_packet_free(&pkt); pthread_join(f->thread, NULL); f->joined = 1; @@ -4154,7 +4168,7 @@ static int init_input_thread(int i) strcmp(f->ctx->iformat->name, "lavfi")) f->non_blocking = 1; ret = av_thread_message_queue_alloc(&f->in_thread_queue, - f->thread_queue_size, sizeof(AVPacket)); + f->thread_queue_size, sizeof(f->pkt)); if (ret < 0) return ret; @@ -4179,7 +4193,7 @@ static int init_input_threads(void) return 0; } -static int get_input_packet_mt(InputFile *f, AVPacket *pkt) +static int get_input_packet_mt(InputFile *f, AVPacket **pkt) { return av_thread_message_queue_recv(f->in_thread_queue, pkt, f->non_blocking ? @@ -4187,7 +4201,7 @@ static int get_input_packet_mt(InputFile *f, AVPacket *pkt) } #endif -static int get_input_packet(InputFile *f, AVPacket *pkt) +static int get_input_packet(InputFile *f, AVPacket **pkt) { if (f->rate_emu) { int i; @@ -4204,7 +4218,8 @@ static int get_input_packet(InputFile *f, AVPacket *pkt) if (f->thread_queue_size) return get_input_packet_mt(f, pkt); #endif - return av_read_frame(f->ctx, pkt); + *pkt = f->pkt; + return av_read_frame(f->ctx, *pkt); } static int got_eagain(void) @@ -4316,7 +4331,7 @@ static int process_input(int file_index) InputFile *ifile = input_files[file_index]; AVFormatContext *is; InputStream *ist; - AVPacket pkt; + AVPacket *pkt; int ret, thread_ret, i, j; int64_t duration; int64_t pkt_dts; @@ -4391,27 +4406,27 @@ static int process_input(int file_index) reset_eagain(); if (do_pkt_dump) { - av_pkt_dump_log2(NULL, AV_LOG_INFO, &pkt, do_hex_dump, - is->streams[pkt.stream_index]); + av_pkt_dump_log2(NULL, AV_LOG_INFO, pkt, do_hex_dump, + is->streams[pkt->stream_index]); } /* the following test is needed in case new streams appear dynamically in stream : we ignore them */ - if (pkt.stream_index >= ifile->nb_streams) { - report_new_stream(file_index, &pkt); + if (pkt->stream_index >= ifile->nb_streams) { + report_new_stream(file_index, pkt); goto discard_packet; } - ist = input_streams[ifile->ist_index + pkt.stream_index]; + ist = input_streams[ifile->ist_index + pkt->stream_index]; - ist->data_size += pkt.size; + ist->data_size += pkt->size; ist->nb_packets++; if (ist->discard) goto discard_packet; - if (pkt.flags & AV_PKT_FLAG_CORRUPT) { + if (pkt->flags & AV_PKT_FLAG_CORRUPT) { av_log(NULL, exit_on_error ? AV_LOG_FATAL : AV_LOG_WARNING, - "%s: corrupt input packet in stream %d\n", is->url, pkt.stream_index); + "%s: corrupt input packet in stream %d\n", is->url, pkt->stream_index); if (exit_on_error) exit_program(1); } @@ -4419,11 +4434,11 @@ static int process_input(int file_index) if (debug_ts) { av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s " "next_dts:%s next_dts_time:%s next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%s off_time:%s\n", - ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->dec_ctx->codec_type), + ifile->ist_index + pkt->stream_index, av_get_media_type_string(ist->dec_ctx->codec_type), av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q), av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q), - av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base), - av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base), + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ist->st->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ist->st->time_base), av_ts2str(input_files[ist->file_index]->ts_offset), av_ts2timestr(input_files[ist->file_index]->ts_offset, &AV_TIME_BASE_Q)); } @@ -4453,12 +4468,12 @@ static int process_input(int file_index) stime2= stime + (1ULL<st->pts_wrap_bits); ist->wrap_correction_done = 1; - if(stime2 > stime && pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { - pkt.dts -= 1ULL<st->pts_wrap_bits; + if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt->dts -= 1ULL<st->pts_wrap_bits; ist->wrap_correction_done = 0; } - if(stime2 > stime && pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { - pkt.pts -= 1ULL<st->pts_wrap_bits; + if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt->pts -= 1ULL<st->pts_wrap_bits; ist->wrap_correction_done = 0; } } @@ -4472,10 +4487,10 @@ static int process_input(int file_index) if (src_sd->type == AV_PKT_DATA_DISPLAYMATRIX) continue; - if (av_packet_get_side_data(&pkt, src_sd->type, NULL)) + if (av_packet_get_side_data(pkt, src_sd->type, NULL)) continue; - dst_data = av_packet_new_side_data(&pkt, src_sd->type, src_sd->size); + dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size); if (!dst_data) exit_program(1); @@ -4483,17 +4498,17 @@ static int process_input(int file_index) } } - if (pkt.dts != AV_NOPTS_VALUE) - pkt.dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt.pts != AV_NOPTS_VALUE) - pkt.pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt.pts != AV_NOPTS_VALUE) - pkt.pts *= ist->ts_scale; - if (pkt.dts != AV_NOPTS_VALUE) - pkt.dts *= ist->ts_scale; + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts *= ist->ts_scale; + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts *= ist->ts_scale; - pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); + pkt_dts = av_rescale_q_rnd(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO || ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) && pkt_dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts @@ -4505,27 +4520,27 @@ static int process_input(int file_index) av_log(NULL, AV_LOG_DEBUG, "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, ifile->ts_offset); - pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt.pts != AV_NOPTS_VALUE) - pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + pkt->dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); } } duration = av_rescale_q(ifile->duration, ifile->time_base, ist->st->time_base); - if (pkt.pts != AV_NOPTS_VALUE) { - pkt.pts += duration; - ist->max_pts = FFMAX(pkt.pts, ist->max_pts); - ist->min_pts = FFMIN(pkt.pts, ist->min_pts); + if (pkt->pts != AV_NOPTS_VALUE) { + pkt->pts += duration; + ist->max_pts = FFMAX(pkt->pts, ist->max_pts); + ist->min_pts = FFMIN(pkt->pts, ist->min_pts); } - if (pkt.dts != AV_NOPTS_VALUE) - pkt.dts += duration; + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += duration; - pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); + pkt_dts = av_rescale_q_rnd(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); if (copy_ts && pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && (is->iformat->flags & AVFMT_TS_DISCONT) && ist->st->pts_wrap_bits < 60) { - int64_t wrap_dts = av_rescale_q_rnd(pkt.dts + (1LL<st->pts_wrap_bits), + int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<st->pts_wrap_bits), ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); if (FFABS(wrap_dts - ist->next_dts) < FFABS(pkt_dts - ist->next_dts)/10) @@ -4548,46 +4563,51 @@ static int process_input(int file_index) ist->file_index, ist->st->index, ist->st->id, av_get_media_type_string(ist->dec_ctx->codec_type), delta, ifile->ts_offset); - pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt.pts != AV_NOPTS_VALUE) - pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + pkt->dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); } } else { if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE || delta > 1LL*dts_error_threshold*AV_TIME_BASE) { - av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index); - pkt.dts = AV_NOPTS_VALUE; + av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt->dts, ist->next_dts, pkt->stream_index); + pkt->dts = AV_NOPTS_VALUE; } - if (pkt.pts != AV_NOPTS_VALUE){ - int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q); + if (pkt->pts != AV_NOPTS_VALUE){ + int64_t pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q); delta = pkt_pts - ist->next_dts; if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE || delta > 1LL*dts_error_threshold*AV_TIME_BASE) { - av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index); - pkt.pts = AV_NOPTS_VALUE; + av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt->pts, ist->next_dts, pkt->stream_index); + pkt->pts = AV_NOPTS_VALUE; } } } } - if (pkt.dts != AV_NOPTS_VALUE) - ifile->last_ts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q); + if (pkt->dts != AV_NOPTS_VALUE) + ifile->last_ts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q); if (debug_ts) { av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%s off_time:%s\n", - ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->dec_ctx->codec_type), - av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base), - av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base), + ifile->ist_index + pkt->stream_index, av_get_media_type_string(ist->dec_ctx->codec_type), + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ist->st->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ist->st->time_base), av_ts2str(input_files[ist->file_index]->ts_offset), av_ts2timestr(input_files[ist->file_index]->ts_offset, &AV_TIME_BASE_Q)); } - sub2video_heartbeat(ist, pkt.pts); + sub2video_heartbeat(ist, pkt->pts); - process_input_packet(ist, &pkt, 0); + process_input_packet(ist, pkt, 0); discard_packet: - av_packet_unref(&pkt); +#if HAVE_THREADS + if (ifile->thread_queue_size) + av_packet_free(&pkt); + else +#endif + av_packet_unref(pkt); return 0; } diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 8046e75026..913955cda1 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -308,6 +308,7 @@ typedef struct InputStream { AVCodec *dec; AVFrame *decoded_frame; AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ + AVPacket *pkt; int64_t start; /* time when read started */ /* predicted dts of the next packet read for this stream or (when there are @@ -416,6 +417,8 @@ typedef struct InputFile { int rate_emu; int accurate_seek; + AVPacket *pkt; + #if HAVE_THREADS AVThreadMessageQueue *in_thread_queue; pthread_t thread; /* thread reading from this file */ @@ -472,6 +475,7 @@ typedef struct OutputStream { int64_t max_frames; AVFrame *filtered_frame; AVFrame *last_frame; + AVPacket *pkt; int last_dropped; int last_nb0_frames[3]; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index bf2eb26246..cedd0b36d6 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1279,6 +1279,9 @@ static int open_input_file(OptionsContext *o, const char *filename) f->loop = o->loop; f->duration = 0; f->time_base = (AVRational){ 1, 1 }; + f->pkt = av_packet_alloc(); + if (!f->pkt) + exit_program(1); #if HAVE_THREADS f->thread_queue_size = o->thread_queue_size; #endif @@ -1570,7 +1573,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->max_muxing_queue_size = 128; MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st); - ost->max_muxing_queue_size *= sizeof(AVPacket); + ost->max_muxing_queue_size *= sizeof(ost->pkt); ost->muxing_queue_data_size = 0; From patchwork Mon Feb 1 22:44:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25339 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 CA1F44498F0 for ; Tue, 2 Feb 2021 01:12:15 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ABE1868A2B9; Tue, 2 Feb 2021 01:12:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f53.google.com (mail-qv1-f53.google.com [209.85.219.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E2107689E7D for ; Tue, 2 Feb 2021 01:12:08 +0200 (EET) Received: by mail-qv1-f53.google.com with SMTP id r13so4651259qvm.11 for ; Mon, 01 Feb 2021 15:12:08 -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=pzMjqiSoX2aKsvE5XolFzgfQaYuYtxywDh7L87J45/Q=; b=MGxmUgTtgQbKew2Sem4LcRs+IW/cwFyYt+3+3KGW1rxVN93UzfBlkq3LjmT8J2zG6a pFhXBl9Z3Yn68H4nLQ1hNby6YYS7+rROT9+Cr100l2LNyODSRAwK4NJ+Quykk4pfOwBV EJOp07aiIdW81lKvaZkf8raCs4x7w0JlPLK0ikKLczhfBDTJeaXb62w3aGt2YOKHlqz7 FxBMAi7ovQAVuIMW2Dbv0MCqX63Zht9bWJs2JLtlNxJWja1KsDXKvCZ8aQeeySn4M6x1 ch3cw5NMyuINoJFiva49ghAf3Y0j2qH/cAgWOZSuhZIjbkQ1/EbvOyA0fkof75atp0Dx cpUQ== 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=pzMjqiSoX2aKsvE5XolFzgfQaYuYtxywDh7L87J45/Q=; b=BGSYOM3Qio3JRqvsAjCIHl4DEPc6auuyAwVKyqVJNUmfDGeaViEpemS/fL3bNjINu8 X+mOVs7xhc3wmjRDGjT1Li9eqoqKXHWnD0SrZDvMh7tm3xxYp/af5bH8X382iCjxVW7O Y1ey+dpsIcAFQzZZc1JW9WXmOQim9gVyTD2ifxTWMVnNm/Cm79EEwVGbXa7uP5BIm0Ti wqsXOrYuB9glvvNAS0uunWVC7y8BA5DT5k7EzHkPDrU52r7duwUHfTrmhsqHKBHmw1X+ zqy0UukoJgZI71huKH2E/duX/jL+c+cQvL2hjDedN8NCYuD/+RfTWjuWbFvJNkyM3uui 5ZCA== X-Gm-Message-State: AOAM532MP2T1QBqKHukT/ieIF9MH2Av5h/viQicvePt+tOrp276ZWwqQ bHPu6AHtEPapHe/IdeJuq5HletOEU92xug== X-Google-Smtp-Source: ABdhPJwmTjZcNRCKdOfJnsGQ/62+5LzIO8QW6lYC1PPMxuM6RUDfJ040n5iOXcJiKplQL2o651xMbg== X-Received: by 2002:ad4:56e8:: with SMTP id cr8mr17410204qvb.6.1612219497393; Mon, 01 Feb 2021 14:44:57 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:56 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:20 -0300 Message-Id: <20210201224421.1395-10-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/10] fftools/ffplay: 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 --- fftools/ffplay.c | 222 ++++++++++++++++++++++++++++------------------- 1 file changed, 135 insertions(+), 87 deletions(-) diff --git a/fftools/ffplay.c b/fftools/ffplay.c index 9ff0425163..ef954772ed 100644 --- a/fftools/ffplay.c +++ b/fftools/ffplay.c @@ -36,6 +36,7 @@ #include "libavutil/pixdesc.h" #include "libavutil/imgutils.h" #include "libavutil/dict.h" +#include "libavutil/fifo.h" #include "libavutil/parseutils.h" #include "libavutil/samplefmt.h" #include "libavutil/avassert.h" @@ -111,13 +112,12 @@ const int program_birth_year = 2003; static unsigned sws_flags = SWS_BICUBIC; typedef struct MyAVPacketList { - AVPacket pkt; - struct MyAVPacketList *next; + AVPacket *pkt; int serial; } MyAVPacketList; typedef struct PacketQueue { - MyAVPacketList *first_pkt, *last_pkt; + AVFifoBuffer *pkt_list; int nb_packets; int size; int64_t duration; @@ -187,7 +187,7 @@ enum { }; typedef struct Decoder { - AVPacket pkt; + AVPacket *pkt; PacketQueue *queue; AVCodecContext *avctx; int pkt_serial; @@ -361,7 +361,7 @@ static int filter_nbthreads = 0; static int is_full_screen; static int64_t audio_callback_time; -static AVPacket flush_pkt; +static AVPacket *flush_pkt; #define FF_QUIT_EVENT (SDL_USEREVENT + 2) @@ -427,28 +427,25 @@ int64_t get_valid_channel_layout(int64_t channel_layout, int channels) static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt) { - MyAVPacketList *pkt1; + MyAVPacketList pkt1; if (q->abort_request) return -1; - pkt1 = av_malloc(sizeof(MyAVPacketList)); - if (!pkt1) - return -1; - pkt1->pkt = *pkt; - pkt1->next = NULL; - if (pkt == &flush_pkt) + if (av_fifo_space(q->pkt_list) < sizeof(pkt1)) { + if (av_fifo_grow(q->pkt_list, sizeof(pkt1)) < 0) + return -1; + } + + if (pkt->data == flush_pkt->data) q->serial++; - pkt1->serial = q->serial; + pkt1.pkt = pkt; + pkt1.serial = q->serial; - if (!q->last_pkt) - q->first_pkt = pkt1; - else - q->last_pkt->next = pkt1; - q->last_pkt = pkt1; + av_fifo_generic_write(q->pkt_list, &pkt1, sizeof(pkt1), NULL); q->nb_packets++; - q->size += pkt1->pkt.size + sizeof(*pkt1); - q->duration += pkt1->pkt.duration; + q->size += pkt1.pkt->size + sizeof(pkt1); + q->duration += pkt1.pkt->duration; /* XXX: should duplicate packet data in DV case */ SDL_CondSignal(q->cond); return 0; @@ -456,32 +453,51 @@ static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt) static int packet_queue_put(PacketQueue *q, AVPacket *pkt) { + AVPacket *pkt1; int ret; + pkt1 = av_packet_clone(pkt); + if (!pkt1) + return -1; + if (pkt == flush_pkt) + pkt1->data = flush_pkt->data; SDL_LockMutex(q->mutex); - ret = packet_queue_put_private(q, pkt); + ret = packet_queue_put_private(q, pkt1); SDL_UnlockMutex(q->mutex); - - if (pkt != &flush_pkt && ret < 0) - av_packet_unref(pkt); + if (ret < 0) { + av_packet_free(&pkt1); + if (pkt != flush_pkt) + av_packet_unref(pkt); + } return ret; } static int packet_queue_put_nullpacket(PacketQueue *q, int stream_index) { - AVPacket pkt1, *pkt = &pkt1; - av_init_packet(pkt); - pkt->data = NULL; - pkt->size = 0; + AVPacket *pkt; + int ret; + + pkt = av_packet_alloc(); + if (!pkt) + return -1; pkt->stream_index = stream_index; - return packet_queue_put(q, pkt); + SDL_LockMutex(q->mutex); + ret = packet_queue_put_private(q, pkt); + SDL_UnlockMutex(q->mutex); + if (ret < 0) + av_packet_free(&pkt); + + return ret; } /* packet queue handling */ static int packet_queue_init(PacketQueue *q) { memset(q, 0, sizeof(PacketQueue)); + q->pkt_list = av_fifo_alloc(sizeof(MyAVPacketList)); + if (!q->pkt_list) + return AVERROR(ENOMEM); q->mutex = SDL_CreateMutex(); if (!q->mutex) { av_log(NULL, AV_LOG_FATAL, "SDL_CreateMutex(): %s\n", SDL_GetError()); @@ -498,16 +514,13 @@ static int packet_queue_init(PacketQueue *q) static void packet_queue_flush(PacketQueue *q) { - MyAVPacketList *pkt, *pkt1; + MyAVPacketList pkt1; SDL_LockMutex(q->mutex); - for (pkt = q->first_pkt; pkt; pkt = pkt1) { - pkt1 = pkt->next; - av_packet_unref(&pkt->pkt); - av_freep(&pkt); + while (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) { + av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL); + av_packet_free(&pkt1.pkt); } - q->last_pkt = NULL; - q->first_pkt = NULL; q->nb_packets = 0; q->size = 0; q->duration = 0; @@ -517,6 +530,7 @@ static void packet_queue_flush(PacketQueue *q) static void packet_queue_destroy(PacketQueue *q) { packet_queue_flush(q); + av_fifo_freep(&q->pkt_list); SDL_DestroyMutex(q->mutex); SDL_DestroyCond(q->cond); } @@ -532,18 +546,29 @@ static void packet_queue_abort(PacketQueue *q) SDL_UnlockMutex(q->mutex); } -static void packet_queue_start(PacketQueue *q) +static int packet_queue_start(PacketQueue *q) { + AVPacket *pkt; + int ret; + + pkt = av_packet_alloc(); + if (!pkt) + return -1; + pkt->data = flush_pkt->data; SDL_LockMutex(q->mutex); q->abort_request = 0; - packet_queue_put_private(q, &flush_pkt); + ret = packet_queue_put_private(q, pkt); SDL_UnlockMutex(q->mutex); + if (ret < 0) + av_packet_free(&pkt); + + return ret; } /* return < 0 if aborted, 0 if no packet and > 0 if packet. */ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *serial) { - MyAVPacketList *pkt1; + MyAVPacketList pkt1; int ret; SDL_LockMutex(q->mutex); @@ -554,18 +579,15 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria break; } - pkt1 = q->first_pkt; - if (pkt1) { - q->first_pkt = pkt1->next; - if (!q->first_pkt) - q->last_pkt = NULL; + if (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) { + av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL); q->nb_packets--; - q->size -= pkt1->pkt.size + sizeof(*pkt1); - q->duration -= pkt1->pkt.duration; - *pkt = pkt1->pkt; + q->size -= pkt1.pkt->size + sizeof(pkt1); + q->duration -= pkt1.pkt->duration; + av_packet_move_ref(pkt, pkt1.pkt); if (serial) - *serial = pkt1->serial; - av_free(pkt1); + *serial = pkt1.serial; + av_packet_free(&pkt1.pkt); ret = 1; break; } else if (!block) { @@ -579,21 +601,23 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria return ret; } -static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) { +static int decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) { memset(d, 0, sizeof(Decoder)); + d->pkt = av_packet_alloc(); + if (!d->pkt) + return AVERROR(ENOMEM); d->avctx = avctx; d->queue = queue; d->empty_queue_cond = empty_queue_cond; d->start_pts = AV_NOPTS_VALUE; d->pkt_serial = -1; + return 0; } -static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) { +static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVPacket *pkt, AVSubtitle *sub) { int ret = AVERROR(EAGAIN); for (;;) { - AVPacket pkt; - if (d->queue->serial == d->pkt_serial) { do { if (d->queue->abort_request) @@ -639,18 +663,18 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) { if (d->queue->nb_packets == 0) SDL_CondSignal(d->empty_queue_cond); if (d->packet_pending) { - av_packet_move_ref(&pkt, &d->pkt); + av_packet_move_ref(pkt, d->pkt); d->packet_pending = 0; } else { - if (packet_queue_get(d->queue, &pkt, 1, &d->pkt_serial) < 0) + if (packet_queue_get(d->queue, pkt, 1, &d->pkt_serial) < 0) return -1; } if (d->queue->serial == d->pkt_serial) break; - av_packet_unref(&pkt); + av_packet_unref(pkt); } while (1); - if (pkt.data == flush_pkt.data) { + if (pkt->data == flush_pkt->data) { avcodec_flush_buffers(d->avctx); d->finished = 0; d->next_pts = d->start_pts; @@ -658,30 +682,30 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) { } else { if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) { int got_frame = 0; - ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, &pkt); + ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, pkt); if (ret < 0) { ret = AVERROR(EAGAIN); } else { - if (got_frame && !pkt.data) { + if (got_frame && !pkt->data) { d->packet_pending = 1; - av_packet_move_ref(&d->pkt, &pkt); + av_packet_move_ref(d->pkt, pkt); } - ret = got_frame ? 0 : (pkt.data ? AVERROR(EAGAIN) : AVERROR_EOF); + ret = got_frame ? 0 : (pkt->data ? AVERROR(EAGAIN) : AVERROR_EOF); } } else { - if (avcodec_send_packet(d->avctx, &pkt) == AVERROR(EAGAIN)) { + if (avcodec_send_packet(d->avctx, pkt) == AVERROR(EAGAIN)) { av_log(d->avctx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n"); d->packet_pending = 1; - av_packet_move_ref(&d->pkt, &pkt); + av_packet_move_ref(d->pkt, pkt); } } - av_packet_unref(&pkt); + av_packet_unref(pkt); } } } static void decoder_destroy(Decoder *d) { - av_packet_unref(&d->pkt); + av_packet_free(&d->pkt); avcodec_free_context(&d->avctx); } @@ -1775,11 +1799,11 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, double return 0; } -static int get_video_frame(VideoState *is, AVFrame *frame) +static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt) { int got_picture; - if ((got_picture = decoder_decode_frame(&is->viddec, frame, NULL)) < 0) + if ((got_picture = decoder_decode_frame(&is->viddec, frame, pkt, NULL)) < 0) return -1; if (got_picture) { @@ -2038,6 +2062,7 @@ static int audio_thread(void *arg) { VideoState *is = arg; AVFrame *frame = av_frame_alloc(); + AVPacket *pkt = av_packet_alloc(); Frame *af; #if CONFIG_AVFILTER int last_serial = -1; @@ -2048,11 +2073,14 @@ static int audio_thread(void *arg) AVRational tb; int ret = 0; - if (!frame) + if (!frame || !pkt) { + av_frame_free(&frame); + av_packet_free(&pkt); return AVERROR(ENOMEM); + } do { - if ((got_frame = decoder_decode_frame(&is->auddec, frame, NULL)) < 0) + if ((got_frame = decoder_decode_frame(&is->auddec, frame, pkt, NULL)) < 0) goto the_end; if (got_frame) { @@ -2118,6 +2146,7 @@ static int audio_thread(void *arg) avfilter_graph_free(&is->agraph); #endif av_frame_free(&frame); + av_packet_free(&pkt); return ret; } @@ -2136,6 +2165,7 @@ static int video_thread(void *arg) { VideoState *is = arg; AVFrame *frame = av_frame_alloc(); + AVPacket *pkt = av_packet_alloc(); double pts; double duration; int ret; @@ -2152,11 +2182,11 @@ static int video_thread(void *arg) int last_vfilter_idx = 0; #endif - if (!frame) + if (!frame || !pkt) return AVERROR(ENOMEM); for (;;) { - ret = get_video_frame(is, frame); + ret = get_video_frame(is, frame, pkt); if (ret < 0) goto the_end; if (!ret) @@ -2236,21 +2266,26 @@ static int video_thread(void *arg) avfilter_graph_free(&graph); #endif av_frame_free(&frame); + av_packet_free(&pkt); return 0; } static int subtitle_thread(void *arg) { VideoState *is = arg; + AVPacket *pkt = av_packet_alloc(); Frame *sp; int got_subtitle; double pts; + if (!pkt) + return AVERROR(ENOMEM); + for (;;) { if (!(sp = frame_queue_peek_writable(&is->subpq))) - return 0; + goto end; - if ((got_subtitle = decoder_decode_frame(&is->subdec, NULL, &sp->sub)) < 0) + if ((got_subtitle = decoder_decode_frame(&is->subdec, NULL, pkt, &sp->sub)) < 0) break; pts = 0; @@ -2270,6 +2305,8 @@ static int subtitle_thread(void *arg) avsubtitle_free(&sp->sub); } } +end: + av_packet_free(&pkt); return 0; } @@ -2685,7 +2722,8 @@ static int stream_component_open(VideoState *is, int stream_index) is->audio_stream = stream_index; is->audio_st = ic->streams[stream_index]; - decoder_init(&is->auddec, avctx, &is->audioq, is->continue_read_thread); + if ((ret = decoder_init(&is->auddec, avctx, &is->audioq, is->continue_read_thread)) < 0) + goto fail; if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek) { is->auddec.start_pts = is->audio_st->start_time; is->auddec.start_pts_tb = is->audio_st->time_base; @@ -2698,7 +2736,8 @@ static int stream_component_open(VideoState *is, int stream_index) is->video_stream = stream_index; is->video_st = ic->streams[stream_index]; - decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread); + if ((ret = decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread)) < 0) + goto fail; if ((ret = decoder_start(&is->viddec, video_thread, "video_decoder", is)) < 0) goto out; is->queue_attachments_req = 1; @@ -2707,7 +2746,8 @@ static int stream_component_open(VideoState *is, int stream_index) is->subtitle_stream = stream_index; is->subtitle_st = ic->streams[stream_index]; - decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread); + if ((ret = decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread)) < 0) + goto fail; if ((ret = decoder_start(&is->subdec, subtitle_thread, "subtitle_decoder", is)) < 0) goto out; break; @@ -2760,7 +2800,7 @@ static int read_thread(void *arg) AVFormatContext *ic = NULL; int err, i, ret; int st_index[AVMEDIA_TYPE_NB]; - AVPacket pkt1, *pkt = &pkt1; + AVPacket *pkt = NULL; int64_t stream_start_time; int pkt_in_play_range = 0; AVDictionaryEntry *t; @@ -2777,6 +2817,12 @@ static int read_thread(void *arg) memset(st_index, -1, sizeof(st_index)); is->eof = 0; + pkt = av_packet_alloc(); + if (!pkt) { + av_log(NULL, AV_LOG_FATAL, "Could not allocate packet.\n"); + ret = AVERROR(ENOMEM); + goto fail; + } ic = avformat_alloc_context(); if (!ic) { av_log(NULL, AV_LOG_FATAL, "Could not allocate context.\n"); @@ -2962,15 +3008,15 @@ static int read_thread(void *arg) } else { if (is->audio_stream >= 0) { packet_queue_flush(&is->audioq); - packet_queue_put(&is->audioq, &flush_pkt); + packet_queue_put(&is->audioq, flush_pkt); } if (is->subtitle_stream >= 0) { packet_queue_flush(&is->subtitleq); - packet_queue_put(&is->subtitleq, &flush_pkt); + packet_queue_put(&is->subtitleq, flush_pkt); } if (is->video_stream >= 0) { packet_queue_flush(&is->videoq); - packet_queue_put(&is->videoq, &flush_pkt); + packet_queue_put(&is->videoq, flush_pkt); } if (is->seek_flags & AVSEEK_FLAG_BYTE) { set_clock(&is->extclk, NAN, 0); @@ -2986,10 +3032,7 @@ static int read_thread(void *arg) } if (is->queue_attachments_req) { if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) { - AVPacket copy; - if ((ret = av_packet_ref(©, &is->video_st->attached_pic)) < 0) - goto fail; - packet_queue_put(&is->videoq, ©); + packet_queue_put(&is->videoq, &is->video_st->attached_pic); packet_queue_put_nullpacket(&is->videoq, is->video_stream); } is->queue_attachments_req = 0; @@ -3066,6 +3109,7 @@ static int read_thread(void *arg) if (ic && !is->ic) avformat_close_input(&ic); + av_packet_free(&pkt); if (ret != 0) { SDL_Event event; @@ -3738,9 +3782,6 @@ int main(int argc, char **argv) SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); SDL_EventState(SDL_USEREVENT, SDL_IGNORE); - av_init_packet(&flush_pkt); - flush_pkt.data = (uint8_t *)&flush_pkt; - if (!display_disable) { int flags = SDL_WINDOW_HIDDEN; if (alwaysontop) @@ -3772,6 +3813,13 @@ int main(int argc, char **argv) } } + flush_pkt = av_packet_alloc(); + if (!flush_pkt) { + av_log(NULL, AV_LOG_FATAL, "Failed to allocate packet\n"); + do_exit(NULL); + } + flush_pkt->data = (uint8_t *)flush_pkt; + is = stream_open(input_filename, file_iformat); if (!is) { av_log(NULL, AV_LOG_FATAL, "Failed to initialize VideoState!\n"); From patchwork Mon Feb 1 22:44:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25335 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 AA34C448D78 for ; Tue, 2 Feb 2021 00:50:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7F3EE689D3A; Tue, 2 Feb 2021 00:50:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 73B64689D16 for ; Tue, 2 Feb 2021 00:50:27 +0200 (EET) Received: by mail-pf1-f179.google.com with SMTP id e19so12690797pfh.6 for ; Mon, 01 Feb 2021 14:50:27 -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=fATUaLklzIkw85NtI7zJsq5wtbGrdtute5PmYRwnAcM=; b=XXm2rHyCddtUdWzg6ko1Em+ZigCPfVFcY5PPyh4DyhXWmIMJepFAw7vjhGZ+LhrODA cL/lFPZoLyvvxrSnyV+gbBrhORXaQR4i9sYsFBhnj7Ww4RV4ZiYeszsxYz4MGdtN6Vz0 YTU84pNu32iJUy+6C1bgExD0ygO+ojWlTWQ5aHZB8JrEovp3/ecLwfMkaelWzOQLaO8h bB1Zh+vyctpRHRWsTLF5X1AEfCdzTheJoFroSII9RNbtBjlLz1PAFG3YisutC3uCIF8H x718ZcySuHalih/CpkRZF3TTYm40v+KTIwWltSVJ3pLXpru2HIng9CEM/VPI7kb/x6+0 gpWg== 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=fATUaLklzIkw85NtI7zJsq5wtbGrdtute5PmYRwnAcM=; b=hAHzzieVTAn/TyEGvA35TxHtq1nLzF+XAqMR7I3o04Uz4bV8QGajFTxVoE8QqTXnJn ttXvcxgUS0Gusj4C9kyiqSi+oWjzKPI3JtN5LvHiMBGywzL64fsaxdZDj/KdkHdkc1yv sNYocm/havun7tzdy21590FFTJuiueQQ9NOKyfc9OcSnoSRnEkb3LdxUyxBv74lPRAI3 ncxEGXzayQeQj4mp6ZKXIFXIxJ1NMHtrrJPgp/34YtkD1oFYC6/aGkBRNz33hD1OdGQP FA/j4emJUiA8IV8MSl28Pa5MpEIhqdGqjqK9q/P/N2heW6jdJAJPbAv4K7bm8hIjyJ+P 50Aw== X-Gm-Message-State: AOAM530f0tHKZUyshfKcjHFkOWE++s0B15L4XYXoVEY6V4RnvCmAH+BR BSrm9TxFs6JksQOYmzQLj+KGl8AecgnHpw== X-Google-Smtp-Source: ABdhPJxRH0pnOXjL0SNTYWOW0RBP0bw5u/5O0pu4HwzhtCOUjx3hOlyUs1imIJRydLuXG7an8LwmnA== X-Received: by 2002:a0c:e109:: with SMTP id w9mr17124455qvk.57.1612219498953; Mon, 01 Feb 2021 14:44:58 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id e1sm15812720qkd.135.2021.02.01.14.44.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Feb 2021 14:44:58 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Feb 2021 19:44:21 -0300 Message-Id: <20210201224421.1395-11-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210201224421.1395-1-jamrial@gmail.com> References: <20210201224421.1395-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/10] avcodec/packet: deprecate av_init_packet() 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" Once removed, sizeof(AVPacket) will stop being a part of the public ABI. Signed-off-by: James Almer --- libavcodec/avpacket.c | 23 +++++++++++++++-------- libavcodec/packet.h | 23 +++++++++++++++++++---- libavcodec/version.h | 3 +++ libavformat/avformat.h | 4 ++++ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index e4ba403cf6..ae0cbfb9f9 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -32,6 +32,7 @@ #include "packet.h" #include "packet_internal.h" +#if FF_API_INIT_PACKET void av_init_packet(AVPacket *pkt) { pkt->pts = AV_NOPTS_VALUE; @@ -49,6 +50,16 @@ FF_ENABLE_DEPRECATION_WARNINGS pkt->side_data = NULL; pkt->side_data_elems = 0; } +#endif + +static void get_packet_defaults(AVPacket *pkt) +{ + memset(pkt, 0, sizeof(*pkt)); + + pkt->pts = AV_NOPTS_VALUE; + pkt->dts = AV_NOPTS_VALUE; + pkt->pos = -1; +} AVPacket *av_packet_alloc(void) { @@ -56,7 +67,7 @@ AVPacket *av_packet_alloc(void) if (!pkt) return pkt; - av_init_packet(pkt); + get_packet_defaults(pkt); return pkt; } @@ -92,7 +103,7 @@ int av_new_packet(AVPacket *pkt, int size) if (ret < 0) return ret; - av_init_packet(pkt); + get_packet_defaults(pkt); pkt->buf = buf; pkt->data = buf->data; pkt->size = size; @@ -607,9 +618,7 @@ void av_packet_unref(AVPacket *pkt) { av_packet_free_side_data(pkt); av_buffer_unref(&pkt->buf); - av_init_packet(pkt); - pkt->data = NULL; - pkt->size = 0; + get_packet_defaults(pkt); } int av_packet_ref(AVPacket *dst, const AVPacket *src) @@ -664,9 +673,7 @@ AVPacket *av_packet_clone(const AVPacket *src) void av_packet_move_ref(AVPacket *dst, AVPacket *src) { *dst = *src; - av_init_packet(src); - src->data = NULL; - src->size = 0; + get_packet_defaults(src); } int av_packet_make_refcounted(AVPacket *pkt) diff --git a/libavcodec/packet.h b/libavcodec/packet.h index b9d4c9c2c8..c442b6a6eb 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -319,10 +319,6 @@ typedef struct AVPacketSideData { * packets, with no compressed data, containing only side data * (e.g. to update some stream parameters at the end of encoding). * - * AVPacket is one of the few structs in FFmpeg, whose size is a part of public - * ABI. Thus it may be allocated on stack and no new fields can be added to it - * without libavcodec and libavformat major bump. - * * The semantics of data ownership depends on the buf field. * If it is set, the packet data is dynamically allocated and is * valid indefinitely until a call to av_packet_unref() reduces the @@ -334,6 +330,12 @@ typedef struct AVPacketSideData { * The side data is always allocated with av_malloc(), copied by * av_packet_ref() and freed by av_packet_unref(). * + * sizeof(AVPacket) being a part of the public ABI is deprecated. once + * av_init_packet() is removed, new packets will only be able to be allocated + * with av_packet_alloc(), and new fields may be added to the end of the struct + * with a minor bump. + * + * @see av_packet_alloc * @see av_packet_ref * @see av_packet_unref */ @@ -394,7 +396,11 @@ typedef struct AVPacket { } AVPacket; typedef struct AVPacketList { +#if FF_API_INIT_PACKET AVPacket pkt; +#else + AVPacket *pkt; +#endif struct AVPacketList *next; } AVPacketList; @@ -460,6 +466,7 @@ AVPacket *av_packet_clone(const AVPacket *src); */ void av_packet_free(AVPacket **pkt); +#if FF_API_INIT_PACKET /** * Initialize optional fields of a packet with default values. * @@ -467,8 +474,16 @@ void av_packet_free(AVPacket **pkt); * initialized separately. * * @param pkt packet + * + * @see av_packet_alloc + * @see av_packet_unref + * + * @deprecated This function is deprecated. Once it's removed, + sizeof(AVPacket) will not be a part of the ABI anymore. */ +attribute_deprecated void av_init_packet(AVPacket *pkt); +#endif /** * Allocate the payload of a packet and initialize its fields with diff --git a/libavcodec/version.h b/libavcodec/version.h index 1e1bedfce6..af8487a4c1 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -153,5 +153,8 @@ #ifndef FF_API_DEBUG_MV #define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 60) #endif +#ifndef FF_API_INIT_PACKET +#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 60) +#endif #endif /* AVCODEC_VERSION_H */ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 523cf34d55..d2d31e1deb 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -950,7 +950,11 @@ typedef struct AVStream { * decoding: set by libavformat, must not be modified by the caller. * encoding: unused */ +#if FF_API_INIT_PACKET AVPacket attached_pic; +#else + AVPacket *attached_pic; +#endif /** * An array of side data that applies to the whole stream (i.e. the