From patchwork Tue Dec 8 12:54:33 2020 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: 24427 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 0BCFD44AD4D for ; Tue, 8 Dec 2020 14:54:44 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D11C7689B19; Tue, 8 Dec 2020 14:54:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f67.google.com (mail-lf1-f67.google.com [209.85.167.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7902D688075 for ; Tue, 8 Dec 2020 14:54:37 +0200 (EET) Received: by mail-lf1-f67.google.com with SMTP id s30so22908640lfc.4 for ; Tue, 08 Dec 2020 04:54:37 -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=qlw23MkG7YxOCMF97JGrJhyc6bz3SXJ3jN3KzY9GwwQ=; b=EUcruDW8hshKlARBv0tyhEv5/GA69/+Q8sUegIEbQhPAxyWV3899aYJAVjGLJVsyfW SSfcEUzI35w8glg5Ilf3cNA9zwYm6Mp+Jm6msGx8zhI2yfbxvT+o7Ki8jOllGpRp6KPd PDHY/gMiocc2fz6CvI39ZMrCCfaGKY8GpX7N9pzV8OEBOY+8Pk2PZWexHuka9CBJRBoA B8YZSUUlorxPlkfHHr+Z7TKBSMJUDma3JpEnlr1oS3o0SyfRiGY/llTeDA8m0DKO011F EqP+g4GwkzvCeiTGACEhot1NpCLoc44IqiwQK60UcWuagsWUyTMbskSQo2gHSTfrCLRt pv6Q== 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=qlw23MkG7YxOCMF97JGrJhyc6bz3SXJ3jN3KzY9GwwQ=; b=m0a0Tef9Tq7IE4FvQLc7YMJvd1O40zXos6Rflkm2z/uHxcJBt53L6ghkC3qCDmciFE KbuNelOzNyP54At5MiMabXXqqL7tK+wIB89+9g/ZjnPphaf6Clijvkq2ByqwT2vSbHvy AXoy4qxUJVBpsjhKee6m3d7zL3lxznEHDSBWD+wQ0VrM5snsBap9iAijNhU0t4NGan15 KxefUwMzmUNGR3LLQ8ajSeu7Trg0Vk/PF/aTKNz+z15xH31FjiEs8bVAB78k0P3d3Mhz j/GdIVBSMIT0yfuUwNRTzF8M540zv3fMJKCAprjHrL4VD7ys1+IhXuJuQEP4XTawPrOJ yqpQ== X-Gm-Message-State: AOAM531mHkV6BEavnqAiJr48UmTRdShxspcziZBd2iGYt9Z3/OFr+LOD EEplZru8XbLbaqDA8qcQh8A8yFgm1Z6bgg== X-Google-Smtp-Source: ABdhPJzdOlWi9mNJuKmG6r35hJPIKJqZ1zLD8EbVQgfG1GPSiPUjY4AgZ47Fb/ak8swzKafWaHiACQ== X-Received: by 2002:ac2:598c:: with SMTP id w12mr2914521lfn.526.1607432076290; Tue, 08 Dec 2020 04:54:36 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id n10sm1198992ljg.139.2020.12.08.04.54.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Dec 2020 04:54:35 -0800 (PST) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Dec 2020 14:54:33 +0200 Message-Id: <20201208125433.40590-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/fifo: utilize a clone packet for muxing 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 This way the timestamp adjustments do not have to be manually undone in case of failure and need to recover/retry. Fixes an issue where the timestamp adjustment would be re-done over and over again when recovery by muxing the same AVPacket again is attempted. Would become visible if the fifo muxer's time base and the output muxer's time base do not match (by the value either becoming smaller and smaller, or larger and larger). Signed-off-by: Jan Ekström --- libavformat/fifo.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/libavformat/fifo.c b/libavformat/fifo.c index 17748e94ce..aa8bea6d5a 100644 --- a/libavformat/fifo.c +++ b/libavformat/fifo.c @@ -43,6 +43,8 @@ typedef struct FifoContext { int queue_size; AVThreadMessageQueue *queue; + AVPacket *out_pkt; + pthread_t writer_thread; /* Return value of last write_trailer_call */ @@ -181,6 +183,7 @@ static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt) AVFormatContext *avf = ctx->avf; FifoContext *fifo = avf->priv_data; AVFormatContext *avf2 = fifo->avf; + AVPacket *out_pkt = fifo->out_pkt; AVRational src_tb, dst_tb; int ret, s_idx; @@ -198,14 +201,34 @@ static int fifo_thread_write_packet(FifoThreadContext *ctx, AVPacket *pkt) } } - s_idx = pkt->stream_index; + // We will be muxing a packet, so clone it by utilizing references. + // This way we do not have to undo any of the tweaking for timestamps etc + // that we are doing in this function in case another attempt through + // recovery is required. + if ((ret = av_packet_ref(out_pkt, pkt)) < 0) { + av_log(avf, AV_LOG_ERROR, + "Error creating a new reference for output packet (%s)!\n", + av_err2str(ret)); + return ret; + } + + s_idx = out_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); - ret = av_write_frame(avf2, pkt); - if (ret >= 0) - av_packet_unref(pkt); + av_packet_rescale_ts(out_pkt, src_tb, dst_tb); + + ret = av_write_frame(avf2, out_pkt); + + // Always clear the output packet, as we have no more use for it. + av_packet_unref(out_pkt); + + if (ret < 0) + return ret; + + // We hit success, unref the actual source packet. + av_packet_unref(pkt); + return ret; } @@ -525,6 +548,11 @@ static int fifo_init(AVFormatContext *avf) return ret; } + if (!(fifo->out_pkt = av_packet_alloc())) { + av_log(avf, AV_LOG_ERROR, "Failed to allocate output packet!\n"); + return AVERROR(ENOMEM); + } + ret = fifo_mux_init(avf, oformat, avf->url); if (ret < 0) return ret; @@ -650,6 +678,7 @@ static void fifo_deinit(AVFormatContext *avf) av_thread_message_queue_free(&fifo->queue); if (fifo->overflow_flag_lock_initialized) pthread_mutex_destroy(&fifo->overflow_flag_lock); + av_packet_free(&fifo->out_pkt); } #define OFFSET(x) offsetof(FifoContext, x)