From patchwork Wed Nov 18 16:52:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 23709 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 26047449CB7 for ; Wed, 18 Nov 2020 18:58:54 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E999168B5F8; Wed, 18 Nov 2020 18:58:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A4EE768807B for ; Wed, 18 Nov 2020 18:58:47 +0200 (EET) Received: by mail-qk1-f193.google.com with SMTP id d9so2436451qke.8 for ; Wed, 18 Nov 2020 08:58: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=gAvGsgZZ1dHhUV4EaGaw7fccXkxAdXEnmLCyLcUfy6I=; b=emSXSvDt7+An1UvWpPuq7qDw3Jl2Czb0Eu6xeTXIiL8dxm1pjzdKd+t/Kc8ngSEr6o SWlP7IwWk1NMgAcWuxL3bTv/47+OC6zhny0TT+PYws0S2OHhYfo0rzweGTA6s5c+n08A hy/KyQV/dBLVEAcPiHcPtfP6lWn/DP4S5yv2t/P2LrOQPCBaAovpgeCPxBUY+UVR2z7d sg8DvqZUwvaM0OB+o7YwhGFfo0sDOZs0fz98ljUHiATv89i34o3nqjik66i+drIFjtt4 aM63OiX6EF77jQUov9AEbm0Tc2cCFhol3veEZB8eOhK+mZ3VgrFqR4niqxj+0N2sZ/AA 0SHw== 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=gAvGsgZZ1dHhUV4EaGaw7fccXkxAdXEnmLCyLcUfy6I=; b=UQXsLhP0Lp++tukMTkS4Jq2HyEBNseS34bI3Ns7iIGEEc/CYXalWxQinDIDqD4OvOZ fnpu8YSYTm/IT9FlDBfjI/f48IWjiKC2w0DXoNACuCWZwk/rAYD/tr6pKz8meyWxpUDh /dAGijPwFI2dMIMdV8nmghkmXAtQSoEH/m53zpHYQozK+3PLeqZwZkCYxKYMkAsXw9hQ w06zp/GxCsevlGl5sMaaT6gNx+qKOCGjCl3MDlyM49fKBRnrLDgf7hs2gdKmt/6Z8QXK D9RFOwsaZy/U94fG4v4s8ujgEM3gRj3N2WFsWoTHI94pWEoS990Os12vAeKjw0kfNWEr KBuQ== X-Gm-Message-State: AOAM532WsZnZS9N7DvTmF+ffsnjOTBs5e+NLIgVQiIUpWVfck+rN6fuC e9/uCFG1LU4ekB52ExA44HZw/Z5ZZ0KdZw== X-Google-Smtp-Source: ABdhPJwyXdlc8LqbSnwABsxvbKb7CLPmXTl7gqe8/kElr/93B4ffSLkr2185wT23KUrpmb6w4MgVbA== X-Received: by 2002:a05:620a:228f:: with SMTP id o15mr5933818qkh.206.1605718401709; Wed, 18 Nov 2020 08:53:21 -0800 (PST) Received: from localhost.localdomain ([181.23.91.217]) by smtp.gmail.com with ESMTPSA id f14sm4863788qkk.89.2020.11.18.08.53.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Nov 2020 08:53:20 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Nov 2020 13:52:37 -0300 Message-Id: <20201118165247.4130-9-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 08/18] avformat: port AVFormatInternal->parse_queue 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/options.c | 5 ++++- libavformat/utils.c | 35 ++++++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index a0649956e8..749e387931 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -89,8 +89,7 @@ struct AVFormatInternal { /** * Packets split by the parser get queued here. */ - struct PacketListEntry *parse_queue; - struct PacketListEntry *parse_queue_end; + struct AVPacketList *parse_queue; /** * Remaining size available for raw_packet_buffer, in bytes. */ diff --git a/libavformat/options.c b/libavformat/options.c index ee7a533aa0..a400419917 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -220,10 +220,13 @@ AVFormatContext *avformat_alloc_context(void) av_free(ic); return NULL; } + internal->parse_queue = av_packet_list_alloc(); internal->packet_buffer = av_packet_list_alloc(); internal->raw_packet_buffer = av_packet_list_alloc(); - if (!internal->packet_buffer || + if (!internal->parse_queue || + !internal->packet_buffer || !internal->raw_packet_buffer) { + av_packet_list_free(&internal->parse_queue); av_packet_list_free(&internal->packet_buffer); av_packet_list_free(&internal->raw_packet_buffer); av_free(internal); diff --git a/libavformat/utils.c b/libavformat/utils.c index 02c0ead44b..59979fb469 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1013,14 +1013,16 @@ static PacketListEntry *get_next_pkt(AVFormatContext *s, AVStream *st, PacketLis { #if FF_API_PACKET_LIST struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; + struct PacketList *parse_queue = (struct PacketList *)s->internal->parse_queue; #else AVPacketList *packet_buffer = s->internal->packet_buffer; + AVPacketList *parse_queue = s->internal->parse_queue; #endif if (pktl->next) return pktl->next; if (pktl == packet_buffer->tail) - return s->internal->parse_queue; + return parse_queue->head; return NULL; } @@ -1102,12 +1104,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index, AVStream *st = s->streams[stream_index]; #if FF_API_PACKET_LIST struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; + struct PacketList *parse_queue = (struct PacketList *)s->internal->parse_queue; #else AVPacketList *packet_buffer = s->internal->packet_buffer; + AVPacketList *parse_queue = s->internal->parse_queue; #endif PacketListEntry *pktl = packet_buffer->head ? packet_buffer->head : - s->internal->parse_queue; + parse_queue->head; PacketListEntry *pktl_it; uint64_t shift; @@ -1160,12 +1164,14 @@ static void update_initial_durations(AVFormatContext *s, AVStream *st, { #if FF_API_PACKET_LIST struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; + struct PacketList *parse_queue = (struct PacketList *)s->internal->parse_queue; #else AVPacketList *packet_buffer = s->internal->packet_buffer; + AVPacketList *parse_queue = s->internal->parse_queue; #endif PacketListEntry *pktl = packet_buffer->head ? packet_buffer->head : - s->internal->parse_queue; + parse_queue->head; int64_t cur_dts = RELATIVE_TS_BASE; if (st->first_dts != AV_NOPTS_VALUE) { @@ -1193,7 +1199,7 @@ static void update_initial_durations(AVFormatContext *s, AVStream *st, } pktl = packet_buffer->head ? packet_buffer->head : - s->internal->parse_queue; + parse_queue->head; st->first_dts = cur_dts; } else if (st->cur_dts != RELATIVE_TS_BASE) return; @@ -1230,8 +1236,10 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, st->codecpar->codec_id != AV_CODEC_ID_HEVC; #if FF_API_PACKET_LIST struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer; + struct PacketList *parse_queue = (struct PacketList *)s->internal->parse_queue; #else AVPacketList *packet_buffer = s->internal->packet_buffer; + AVPacketList *parse_queue = s->internal->parse_queue; #endif if (s->flags & AVFMT_FLAG_NOFILLIN) @@ -1310,7 +1318,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, } } - if (pkt->duration > 0 && (packet_buffer->head || s->internal->parse_queue)) + if (pkt->duration > 0 && (packet_buffer->head || parse_queue->head)) update_initial_durations(s, st, pkt->stream_index, pkt->duration); /* Correct timestamps with byte offset if demuxers only have timestamps @@ -1511,8 +1519,7 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, 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, + ret = av_packet_list_put(s->internal->parse_queue, &out_pkt, NULL, 0); if (ret < 0) { av_packet_unref(&out_pkt); @@ -1540,8 +1547,13 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) { int ret, i, got_packet = 0; AVDictionary *metadata = NULL; +#if FF_API_PACKET_LIST + struct PacketList *parse_queue = (struct PacketList *)s->internal->parse_queue; +#else + AVPacketList *parse_queue = s->internal->parse_queue; +#endif - while (!got_packet && !s->internal->parse_queue) { + while (!got_packet && !parse_queue->head) { AVStream *st; /* read next packet */ @@ -1662,8 +1674,8 @@ FF_ENABLE_DEPRECATION_WARNINGS } } - if (!got_packet && s->internal->parse_queue) - ret = avpriv_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt); + if (!got_packet && parse_queue->head) + ret = av_packet_list_get(s->internal->parse_queue, pkt, 0); if (ret >= 0) { AVStream *st = s->streams[pkt->stream_index]; @@ -1843,7 +1855,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); + av_packet_list_flush(s->internal->parse_queue); av_packet_list_flush(s->internal->packet_buffer); av_packet_list_flush(s->internal->raw_packet_buffer); @@ -4472,6 +4484,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->parse_queue); av_packet_list_free(&s->internal->packet_buffer); av_packet_list_free(&s->internal->raw_packet_buffer); av_freep(&s->internal);