From patchwork Wed Nov 18 16:52:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 23712 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 28DF644A205 for ; Wed, 18 Nov 2020 18:59:12 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0C02468B662; Wed, 18 Nov 2020 18:59:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE3C968B5BA for ; Wed, 18 Nov 2020 18:59:05 +0200 (EET) Received: by mail-qk1-f182.google.com with SMTP id n132so2490912qke.1 for ; Wed, 18 Nov 2020 08:59:05 -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=q/2CgIKhnN9QMSwB0xugrQzinG9sKNr7DFDj593abdg=; b=u4s7h9tcXgLTd8a+mBSrJ2xi0SqJQmHO8cwYzJW3aIcIPQn0JyS0+GEdSduRmCE1fz +Cp+I3j6wga/jcDC9Va4SgruXHs1Tnjm5ZGiVpRiHRv6pzMiGfgJubMb4hVzX9L0AXVi zj24cWnDcOUJEQv5zfiMLwSi+yesUyDWjmCS+E/xYJiyFnk7syjN5gxWPIvdzGRJt8km Edkn4LoEHYsMANILteqUIxC068KcEvK6b8TPCwhhFIUyby+RTKpz7xgsGZf7ya0ryf6F qulXxnXvGiUhpfNPGhCi15EFQh70KZ5Q8yfMlf7GRWxr7/pOt7+b1LsA920u3FjnQYo3 hO9Q== 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=q/2CgIKhnN9QMSwB0xugrQzinG9sKNr7DFDj593abdg=; b=eN95HKidvFbHhLpipgvXrFtaXkrwEN/SXgyh8pedNinWMBJ7oAY14hMW4Fr6UfgYOO +mwmzeRUHWzwDFOEIKEDtgtUs9yxqONme/rC+lSnmbbBfB3IoXjyhRlXK9jrSIPWyX3P CSLwgyNFU0qQ/r29Y7BtyeNU86UAvfTxegXSswzzmxumo82UdaKXg19fIBD186YPYjjg mChwt4h9kj7ncDpOUyrw+vjwNwcIQq2qrOuZM5vNz5N96s9BwqH3ZIZCPhizFTS8GPjZ hUBnFHqOtzgz3AKPvRS4fJP/OycwsKM79R/PF/QGEW2rZayLeYfNTvnAFOFfe7SQge0j h7Yw== X-Gm-Message-State: AOAM5311nHxDtxTik8g2doFOm3WwSxed4fL07iYsmFqaTe6GTHubLvWt G43Gd4v/bCJItFIPXKojAC6eZRb200QO7Q== X-Google-Smtp-Source: ABdhPJwZxu/9gdMmOGdcjLkcPjxADXKKNu3E7pV0/44x2SHF76GBB4/DydVm/q8+8hiDigCxx9O5eg== X-Received: by 2002:a37:c82:: with SMTP id 124mr5522897qkm.360.1605718397812; Wed, 18 Nov 2020 08:53:17 -0800 (PST) Received: from localhost.localdomain ([181.23.91.217]) by smtp.gmail.com with ESMTPSA id f14sm4863788qkk.89.2020.11.18.08.53.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Nov 2020 08:53:17 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Nov 2020 13:52:35 -0300 Message-Id: <20201118165247.4130-7-jamrial@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201118165247.4130-1-jamrial@gmail.com> References: <20201118165247.4130-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/18] avformat: port AVFormatInternal->packet_buffer to the new packet list API 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 | 3 +- libavformat/mux.c | 53 +++++++++++++++++++----------- libavformat/mxfenc.c | 19 +++++++---- libavformat/options.c | 6 ++++ libavformat/utils.c | 74 ++++++++++++++++++++++++++++++------------ 5 files changed, 107 insertions(+), 48 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index d366bdc452..3182409dfb 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -74,8 +74,7 @@ struct AVFormatInternal { * not decoded, for example to get the codec parameters in MPEG * streams. */ - struct PacketListEntry *packet_buffer; - struct PacketListEntry *packet_buffer_end; + struct AVPacketList *packet_buffer; /* av_seek_frame() support */ int64_t data_offset; /**< offset of the first packet */ diff --git a/libavformat/mux.c b/libavformat/mux.c index cf52de5366..6991f81f9f 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -816,6 +816,11 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, PacketListEntry **next_point, *this_pktl; AVStream *st = s->streams[pkt->stream_index]; int chunked = s->max_chunk_size || s->max_chunk_duration; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif this_pktl = av_malloc(sizeof(PacketListEntry)); if (!this_pktl) { @@ -834,7 +839,7 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, if (st->internal->last_in_packet_buffer) { next_point = &(st->internal->last_in_packet_buffer->next); } else { - next_point = &s->internal->packet_buffer; + next_point = &packet_buffer->head; } if (chunked) { @@ -858,7 +863,7 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, if (chunked && !(pkt->flags & CHUNK_START)) goto next_non_null; - if (compare(s, &s->internal->packet_buffer_end->pkt, pkt)) { + if (compare(s, &packet_buffer->tail->pkt, pkt)) { while ( *next_point && ((chunked && !((*next_point)->pkt.flags&CHUNK_START)) || !compare(s, &(*next_point)->pkt, pkt))) @@ -866,12 +871,12 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, if (*next_point) goto next_non_null; } else { - next_point = &(s->internal->packet_buffer_end->next); + next_point = &(packet_buffer->tail->next); } } av_assert1(!*next_point); - s->internal->packet_buffer_end = this_pktl; + packet_buffer->tail = this_pktl; next_non_null: this_pktl->next = *next_point; @@ -920,6 +925,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, int noninterleaved_count = 0; int i, ret; int eof = flush; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif if (pkt) { if ((ret = ff_interleave_add_packet(s, pkt, interleave_compare_dts)) < 0) @@ -940,11 +950,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, flush = 1; if (s->max_interleave_delta > 0 && - s->internal->packet_buffer && + packet_buffer->head && !flush && s->internal->nb_interleaved_streams == stream_count+noninterleaved_count ) { - AVPacket *top_pkt = &s->internal->packet_buffer->pkt; + AVPacket *top_pkt = &packet_buffer->head->pkt; int64_t delta_dts = INT64_MIN; int64_t top_dts = av_rescale_q(top_pkt->dts, s->streams[top_pkt->stream_index]->time_base, @@ -972,11 +982,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, } } - if (s->internal->packet_buffer && + if (packet_buffer->head && eof && (s->flags & AVFMT_FLAG_SHORTEST) && s->internal->shortest_end == AV_NOPTS_VALUE) { - AVPacket *top_pkt = &s->internal->packet_buffer->pkt; + AVPacket *top_pkt = &packet_buffer->head->pkt; s->internal->shortest_end = av_rescale_q(top_pkt->dts, s->streams[top_pkt->stream_index]->time_base, @@ -984,8 +994,8 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, } if (s->internal->shortest_end != AV_NOPTS_VALUE) { - while (s->internal->packet_buffer) { - AVPacket *top_pkt = &s->internal->packet_buffer->pkt; + while (packet_buffer->head) { + AVPacket *top_pkt = &packet_buffer->head->pkt; AVStream *st; int64_t top_dts = av_rescale_q(top_pkt->dts, s->streams[top_pkt->stream_index]->time_base, @@ -994,12 +1004,12 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, if (s->internal->shortest_end + 1 >= top_dts) break; - pktl = s->internal->packet_buffer; + pktl = packet_buffer->head; st = s->streams[pktl->pkt.stream_index]; - s->internal->packet_buffer = pktl->next; - if (!s->internal->packet_buffer) - s->internal->packet_buffer_end = NULL; + packet_buffer->head = pktl->next; + if (!packet_buffer->head) + packet_buffer->tail = NULL; if (st->internal->last_in_packet_buffer == pktl) st->internal->last_in_packet_buffer = NULL; @@ -1012,13 +1022,13 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, if (stream_count && flush) { AVStream *st; - pktl = s->internal->packet_buffer; + pktl = packet_buffer->head; *out = pktl->pkt; st = s->streams[out->stream_index]; - s->internal->packet_buffer = pktl->next; - if (!s->internal->packet_buffer) - s->internal->packet_buffer_end = NULL; + packet_buffer->head = pktl->next; + if (!packet_buffer->head) + packet_buffer->tail = NULL; if (st->internal->last_in_packet_buffer == pktl) st->internal->last_in_packet_buffer = NULL; @@ -1033,7 +1043,12 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, int ff_interleaved_peek(AVFormatContext *s, int stream, AVPacket *pkt, int add_offset) { - PacketListEntry *pktl = s->internal->packet_buffer; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif + PacketListEntry *pktl = packet_buffer->head; while (pktl) { if (pktl->pkt.stream_index == stream) { *pkt = pktl->pkt; diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 8f2649c31f..55a53af5e8 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -3053,7 +3053,12 @@ static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket stream_count += !!s->streams[i]->internal->last_in_packet_buffer; if (stream_count && (s->nb_streams == stream_count || flush)) { - PacketListEntry *pktl = s->internal->packet_buffer; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif + PacketListEntry *pktl = packet_buffer->head; if (s->nb_streams != stream_count) { PacketListEntry *last = NULL; // find last packet in edit unit @@ -3077,20 +3082,20 @@ static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket if (last) last->next = NULL; else { - s->internal->packet_buffer = NULL; - s->internal->packet_buffer_end= NULL; + packet_buffer->head = NULL; + packet_buffer->tail= NULL; goto out; } - pktl = s->internal->packet_buffer; + pktl = packet_buffer->head; } *out = pktl->pkt; av_log(s, AV_LOG_TRACE, "out st:%d dts:%"PRId64"\n", (*out).stream_index, (*out).dts); - s->internal->packet_buffer = pktl->next; + packet_buffer->head = pktl->next; if(s->streams[pktl->pkt.stream_index]->internal->last_in_packet_buffer == pktl) s->streams[pktl->pkt.stream_index]->internal->last_in_packet_buffer= NULL; - if(!s->internal->packet_buffer) - s->internal->packet_buffer_end= NULL; + if(!packet_buffer->head) + packet_buffer->tail = NULL; av_freep(&pktl); return 1; } else { diff --git a/libavformat/options.c b/libavformat/options.c index 59e0389815..9fe1500cee 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -220,6 +220,12 @@ AVFormatContext *avformat_alloc_context(void) av_free(ic); return NULL; } + internal->packet_buffer = av_packet_list_alloc(); + if (!internal->packet_buffer) { + av_free(internal); + av_free(ic); + return NULL; + } avformat_get_context_defaults(ic); ic->internal = internal; ic->internal->offset = AV_NOPTS_VALUE; diff --git a/libavformat/utils.c b/libavformat/utils.c index 20bf723a55..88ce64496d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1009,9 +1009,15 @@ static int has_decode_delay_been_guessed(AVStream *st) static PacketListEntry *get_next_pkt(AVFormatContext *s, AVStream *st, PacketListEntry *pktl) { +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif + if (pktl->next) return pktl->next; - if (pktl == s->internal->packet_buffer_end) + if (pktl == packet_buffer->tail) return s->internal->parse_queue; return NULL; } @@ -1092,7 +1098,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index, int64_t dts, int64_t pts, AVPacket *pkt) { AVStream *st = s->streams[stream_index]; - PacketListEntry *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif + PacketListEntry *pktl = packet_buffer->head ? + packet_buffer->head : + s->internal->parse_queue; PacketListEntry *pktl_it; uint64_t shift; @@ -1143,7 +1156,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index, static void update_initial_durations(AVFormatContext *s, AVStream *st, int stream_index, int64_t duration) { - PacketListEntry *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif + PacketListEntry *pktl = packet_buffer->head ? + packet_buffer->head : + s->internal->parse_queue; int64_t cur_dts = RELATIVE_TS_BASE; if (st->first_dts != AV_NOPTS_VALUE) { @@ -1169,7 +1189,9 @@ static void update_initial_durations(AVFormatContext *s, AVStream *st, av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts)); return; } - pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue; + pktl = packet_buffer->head ? + packet_buffer->head : + s->internal->parse_queue; st->first_dts = cur_dts; } else if (st->cur_dts != RELATIVE_TS_BASE) return; @@ -1204,6 +1226,11 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, AVRational duration; int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 && st->codecpar->codec_id != AV_CODEC_ID_HEVC; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif if (s->flags & AVFMT_FLAG_NOFILLIN) return; @@ -1281,7 +1308,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, } } - if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue)) + if (pkt->duration > 0 && (packet_buffer->head || s->internal->parse_queue)) update_initial_durations(s, st, pkt->stream_index, pkt->duration); /* Correct timestamps with byte offset if demuxers only have timestamps @@ -1715,11 +1742,15 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) int eof = 0; int ret; AVStream *st; +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; +#else + AVPacketList *packet_buffer = s->internal->packet_buffer; +#endif if (!genpts) { - ret = s->internal->packet_buffer - ? avpriv_packet_list_get(&s->internal->packet_buffer, - &s->internal->packet_buffer_end, pkt) + ret = packet_buffer->head + ? av_packet_list_get(s->internal->packet_buffer, pkt, 0) : read_frame_internal(s, pkt); if (ret < 0) return ret; @@ -1727,7 +1758,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) } for (;;) { - PacketListEntry *pktl = s->internal->packet_buffer; + PacketListEntry *pktl = packet_buffer->head; if (pktl) { AVPacket *next_pkt = &pktl->pkt; @@ -1760,15 +1791,14 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) // 3. the packets for this stream at the end of the files had valid dts. next_pkt->pts = last_dts + next_pkt->duration; } - pktl = s->internal->packet_buffer; + pktl = packet_buffer->head; } /* read packet from packet buffer, if there is data */ st = s->streams[next_pkt->stream_index]; if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL && next_pkt->dts != AV_NOPTS_VALUE && !eof)) { - ret = avpriv_packet_list_get(&s->internal->packet_buffer, - &s->internal->packet_buffer_end, pkt); + ret = av_packet_list_get(s->internal->packet_buffer, pkt, 0); goto return_packet; } } @@ -1782,8 +1812,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) return ret; } - ret = avpriv_packet_list_put(&s->internal->packet_buffer, - &s->internal->packet_buffer_end, + ret = av_packet_list_put(s->internal->packet_buffer, pkt, NULL, 0); if (ret < 0) { av_packet_unref(pkt); @@ -1813,7 +1842,7 @@ static void flush_packet_queue(AVFormatContext *s) if (!s->internal) return; avpriv_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end); - avpriv_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end); + av_packet_list_flush(s->internal->packet_buffer); avpriv_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end); s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; @@ -3581,6 +3610,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) int64_t probesize = ic->probesize; int eof_reached = 0; int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams"); +#if FF_API_PACKET_LIST + struct PacketList *packet_buffer = (struct PacketList *)ic->internal->packet_buffer; +#else + AVPacketList *packet_buffer = ic->internal->packet_buffer; +#endif flush_codecs = probesize > 0; @@ -3784,13 +3818,12 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { - ret = avpriv_packet_list_put(&ic->internal->packet_buffer, - &ic->internal->packet_buffer_end, + ret = av_packet_list_put(ic->internal->packet_buffer, &pkt1, NULL, 0); if (ret < 0) goto unref_then_goto_end; - pkt = &ic->internal->packet_buffer_end->pkt; + pkt = &packet_buffer->tail->pkt; } else { pkt = &pkt1; } @@ -3933,8 +3966,8 @@ FF_ENABLE_DEPRECATION_WARNINGS // EOF already reached while reading the stream above. // So continue with reoordering DTS with whatever delay we have. - if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) { - update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer); + if (packet_buffer->head && !has_decode_delay_been_guessed(st)) { + update_dts_from_pts(ic, stream_index, packet_buffer->head); } } } @@ -4437,6 +4470,7 @@ void avformat_free_context(AVFormatContext *s) av_dict_free(&s->internal->id3v2_meta); av_freep(&s->streams); flush_packet_queue(s); + av_packet_list_free(&s->internal->packet_buffer); av_freep(&s->internal); av_freep(&s->url); av_free(s);