From patchwork Mon Feb 8 22:21:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25517 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 3AC6A448FD0 for ; Tue, 9 Feb 2021 00:22:00 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1990568818C; Tue, 9 Feb 2021 00:22:00 +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 7C6376880DA for ; Tue, 9 Feb 2021 00:21:52 +0200 (EET) Received: by mail-qv1-f47.google.com with SMTP id ew18so7778595qvb.4 for ; Mon, 08 Feb 2021 14:21:52 -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=aAFdZ5DpGiKgSk9O6YSCdywelu5IuT4tYn3pG3h05C0=; b=IqrfqtzBdyq+symfhRmz2ApzZ585GLa4xtwmesqxLnncNjdS3yCHAPKUH0jjTraimJ lMCvupjiTe+x2/yZC8EUkY6FLpBjgJyOqU2YGvq5TGByFUDYGkWZDpcxzRsFv526BfhI WlBMJTB8QGjfPWNV7yW3oZc2B2SuTseeyW6TIWGHX7SrmspoCacoH/9FA0YKmXOba32s DhauDICICY2Sosk5FrwyB4e7oemFCmfbsy771UweHjlcJhmKsLp5JIRGiHdyuc7TmTdC I+m33b2TRV1i2Zavle1rZgPhfWSi4WS2bmeguHYS3+1nSB55PxVCa03R+0Vm3fnHU9GC 8BxA== 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=aAFdZ5DpGiKgSk9O6YSCdywelu5IuT4tYn3pG3h05C0=; b=pQsebqtCfMA2lcJolxFfF8kEI31vRA9FKR8DO7SwkfDHkL9MuM+m2Kv+s9q3Tm4rmc eNa8KqfUyvSohDM7TtuIJd2U3Jil1X4eekQJvxhpX2C6K8UStNjkAxrheY9Abclz+iGC 8Pi/y98Ge0C+lGsCMTykcgPXcw2wk0OvKeg7XuJIYw7ndzLvy5sFZ+t9BOxD1fNMANnn EHenKl38iyVYSeO4vVG4DTDfU8WjW1EG066verER7qVpOM0jk2lgdYQgOd3flwoctB8E 1qJY7FvX69NfqQYZDryejmP3j9PUV23HkjRQOAz5jC9EQMx45hVbbG632Un7c7YOXLke kDJw== X-Gm-Message-State: AOAM533TRWH6oCcGaeIW/QQutEwDOGmS81i4LBY4tP1YNvfliQA1+Q5U Z+m/56T38/4ci7yg3lQQ+BdcVgXLVxo= X-Google-Smtp-Source: ABdhPJwgwjSt7xPRvQKWyan0DyB6TPrqD6vV5hYrbnxY2Kfi2LTWyypHh97SFV/zZMqI4/kX/UkKkg== X-Received: by 2002:a05:6214:38a:: with SMTP id l10mr18729101qvy.4.1612822911066; Mon, 08 Feb 2021 14:21:51 -0800 (PST) Received: from localhost.localdomain ([181.23.72.162]) by smtp.gmail.com with ESMTPSA id l30sm14600809qtv.54.2021.02.08.14.21.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 14:21:50 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 19:21:29 -0300 Message-Id: <20210208222129.4695-2-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210208222129.4695-1-jamrial@gmail.com> References: <20210208222129.4695-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/mux: return a pointer to the packet in ff_interleaved_peek() 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" And make it const, so the caller doesn't attempt to change it. ff_get_muxer_ts_offset() should be used to get the muxer timestamp offset. Signed-off-by: James Almer --- Went with Andreas' idea, but splitting off the muxer ts offset part of the process, so ff_interleaved_peek() doesn't need to use an extra output argument for it. libavformat/internal.h | 8 ++------ libavformat/movenc.c | 17 ++++++++++------- libavformat/mux.c | 20 +++----------------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index 33ece6b172..0ffdc87b6a 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -865,14 +865,10 @@ int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf /** * Find the next packet in the interleaving queue for the given stream. - * The pkt parameter is filled in with the queued packet, including - * references to the data (which the caller is not allowed to keep or - * modify). * - * @return 0 if a packet was found, a negative value if no packet was found + * @return a pointer to a packet if one was found, NULL otherwise. */ -int ff_interleaved_peek(AVFormatContext *s, int stream, - AVPacket *pkt, int add_offset); +const AVPacket *ff_interleaved_peek(AVFormatContext *s, int stream); int ff_get_muxer_ts_offset(AVFormatContext *s, int stream_index, int64_t *offset); diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 372c04295d..db9b6122e6 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -5303,15 +5303,18 @@ 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)) { + const AVPacket *pkt = ff_interleaved_peek(s, i); + if (pkt) { + int64_t offset, dts = pkt->dts, pts = pkt->pts; + ff_get_muxer_ts_offset(s, i, &offset); + dts += offset; 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; + dts += track->dts_shift; + track->track_duration = dts - track->start_dts; + if (pts != AV_NOPTS_VALUE) + track->end_pts = pts + offset; else - track->end_pts = pkt.dts; + track->end_pts = dts; } } } diff --git a/libavformat/mux.c b/libavformat/mux.c index ae46844c66..062ba8d789 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1062,30 +1062,16 @@ int ff_get_muxer_ts_offset(AVFormatContext *s, int stream_index, int64_t *offset return 0; } -int ff_interleaved_peek(AVFormatContext *s, int stream, - AVPacket *pkt, int add_offset) +const AVPacket *ff_interleaved_peek(AVFormatContext *s, int stream) { AVPacketList *pktl = s->internal->packet_buffer; while (pktl) { if (pktl->pkt.stream_index == stream) { - *pkt = pktl->pkt; - if (add_offset) { - AVStream *st = s->streams[pkt->stream_index]; - int64_t offset = st->internal->mux_ts_offset; - - if (s->output_ts_offset) - offset += av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, st->time_base); - - if (pkt->dts != AV_NOPTS_VALUE) - pkt->dts += offset; - if (pkt->pts != AV_NOPTS_VALUE) - pkt->pts += offset; - } - return 0; + return &pktl->pkt; } pktl = pktl->next; } - return AVERROR(ENOENT); + return NULL; } /**