From patchwork Thu Feb 4 07:52:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 25381 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 1794744AE30 for ; Thu, 4 Feb 2021 09:59:25 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DE37C680892; Thu, 4 Feb 2021 09:59:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EE0A3689818 for ; Thu, 4 Feb 2021 09:59:17 +0200 (EET) Received: by mail-lj1-f171.google.com with SMTP id t8so2257872ljk.10 for ; Wed, 03 Feb 2021 23:59:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZHtPxioE2IEpBlB2KbjbW3VS0PvCcUHmqUs/qrcDvY8=; b=S3w+YJ4HGQh1P4niqo7aE5nl9ph37IvZNBIbtdQoea0zBWjiK7X35GNHVzwHO8rwmc oW1o2i3P3+FfANbncwPdRagawyt6brSB12LU0DAAGJ2ZFkwE1gvdURIAk216oP6GfxuU 6PYjDxilmQSmAXWOH57EG6+2vS+EFM44gM6E8QsRR0OaM180LusbXLj4NvyQ0rcvrlIN 1yFKI5HHoSkKLlPd2w8THnwdC20EFLk06kiL65HPWVotgywgvKGb9fcgRuRx/DazQ0p3 EZ/QLW11KA26DD5wGFXzBIoQlpc3uwsb9qStbaVqBC2n+UloX3hjN7+pLr5fYwox6QV2 F3Yg== 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:mime-version :content-transfer-encoding; bh=ZHtPxioE2IEpBlB2KbjbW3VS0PvCcUHmqUs/qrcDvY8=; b=nR966XjCrJ3in/OkMVWfwZqFQ8tiYkHJ2dD+aj28vJwDvgpT/soWVBxEgUZA6XW8zx euB6q+DIZfJX6UsLPCxIQ3nmCEMV64Kz+hQvNxjQqEI5KgghbknmBrWXUUdIo9ZbG3Be Cz5iVHYj63T7sZ0uY2Q92L3/yX0PGDHlgRPhoejkxvlkU0meYk1i7Uz15dQ2Qx1hKwsc AZQqa+lbNFBmGBA0cBYkCfYT9xBGjSak+dzgSFjF9K0gCmGDGrkwh7wryK1bFU2EYoHT OJad6pt3P561Bxqn9mBWY2uqvxEk9ehd7lz5Kyy5VkwWaOlLwGExaLQn9G87Hbga/DyE w8ww== X-Gm-Message-State: AOAM530j1da3t9mYLuC8oQbe5sxmUM7RpX9CwWifms2pNrJDp+o2TgQJ kjmEFY9MoiIXKejabHtfSHbM/+PnUn8= X-Google-Smtp-Source: ABdhPJx/0JHsoFEYHoTX8o0OuBEFuV9ziC3H2mVftStWn/IZlns1RoofeLSQX6MNNImUo06GXcISZQ== X-Received: by 2002:ac2:515c:: with SMTP id q28mr4121491lfd.390.1612425157075; Wed, 03 Feb 2021 23:52:37 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id 193sm558553ljf.99.2021.02.03.23.52.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Feb 2021 23:52:36 -0800 (PST) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Feb 2021 09:52:33 +0200 Message-Id: <20210204075233.67642-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avformat/fifo: only rescale written packet timestamps once 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" From: Jan Ekström Flag the message as having been adjusted by setting an unsigned integer field to nonzero, and by only applying the timestamp adjustment if it is zero. This way the original values do not have to be reverted back in case of failure. Fixes an issue where the timestamp adjustment would be re-done over and over again in case of output requiring a recovery attempt. Signed-off-by: Jan Ekström --- libavformat/fifo.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/libavformat/fifo.c b/libavformat/fifo.c index 17748e94ce..633cf4d7c3 100644 --- a/libavformat/fifo.c +++ b/libavformat/fifo.c @@ -117,6 +117,7 @@ typedef enum FifoMessageType { typedef struct FifoMessage { FifoMessageType type; AVPacket pkt; + unsigned int packet_ts_adjusted; } FifoMessage; static int fifo_thread_write_header(FifoThreadContext *ctx) @@ -176,13 +177,13 @@ static int64_t next_duration(AVFormatContext *avf, AVPacket *pkt, int64_t *last_ return duration; } -static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt) +static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt, + unsigned int *packet_ts_adjusted) { AVFormatContext *avf = ctx->avf; FifoContext *fifo = avf->priv_data; AVFormatContext *avf2 = fifo->avf; - AVRational src_tb, dst_tb; - int ret, s_idx; + int ret; if (fifo->timeshift && pkt->dts != AV_NOPTS_VALUE) atomic_fetch_sub_explicit(&fifo->queue_duration, next_duration(avf, pkt, &ctx->last_received_dts), memory_order_relaxed); @@ -198,10 +199,14 @@ static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt) } } - s_idx = pkt->stream_index; - src_tb = avf->streams[s_idx]->time_base; - dst_tb = avf2->streams[s_idx]->time_base; - av_packet_rescale_ts(pkt, src_tb, dst_tb); + if (!*packet_ts_adjusted) { + int s_idx = pkt->stream_index; + AVRational src_tb = avf->streams[s_idx]->time_base; + AVRational dst_tb = avf2->streams[s_idx]->time_base; + + av_packet_rescale_ts(pkt, src_tb, dst_tb); + *packet_ts_adjusted = 1; + } ret = av_write_frame(avf2, pkt); if (ret >= 0) @@ -243,7 +248,8 @@ static int fifo_thread_dispatch_message(FifoThreadContext *ctx, FifoMessage *msg av_assert0(ret >= 0); return ret; case FIFO_WRITE_PACKET: - return fifo_thread_write_packet(ctx, &msg->pkt); + return fifo_thread_write_packet(ctx, &msg->pkt, + &msg->packet_ts_adjusted); case FIFO_FLUSH_OUTPUT: return fifo_thread_flush_output(ctx); }