From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 1773B4EA52 for ; Fri, 13 Jun 2025 05:54:58 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 2FF6268C719; Fri, 13 Jun 2025 08:54:47 +0300 (EEST) Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 000E868C687 for ; Fri, 13 Jun 2025 08:54:40 +0300 (EEST) Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-22c33677183so15333695ad.2 for ; Thu, 12 Jun 2025 22:54:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749794079; x=1750398879; darn=ffmpeg.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:from:to:cc:subject:date :message-id:reply-to; bh=qGigThUZD7ivUAEc1/wki+Yx11WtoLoUd5V4lSlOsLM=; b=BeC92KaTt6jHPS2/2HMPByZuxYqrm7TnOl2AsePzltLu2TarDwlsKOHIe+ah59xrQ9 31kR2eILUn9fGKGes0g1Kp5Q9QXQKwD46FxLClM43+CKZYCyXzhyEUtt25Pi7cvGfmEn zXZP9+psLqQ9WFPzTZyj4Rm0Yqphjuft8C8/P92XZf9pW44guoxH8B9mePMG+FQu1LIi q2BdcCQVZWsRH+nBt+2fXmU+z4yTukihiLks69eKL+LBotnouuBdywxF5NzFNTw1mXTG OLg+A4p8lkUWJzp975Ys557qTj6vSardfWohxbtE3bRxOSaDJCqdpLlCym3Sl5/BaSzO PE3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749794079; x=1750398879; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=qGigThUZD7ivUAEc1/wki+Yx11WtoLoUd5V4lSlOsLM=; b=ctDlL8J0QMCXmkT1rtL2WZDF3CWRsp4zdLJriQihOVooRa6EoggiVMq/+sumCvu42z i3K8srw6XyPYWK3lj0BjHuobu6qFxIJJXuKGMu/kYgjb59DJiSxvwDejqUv+45dxL6OB +pE4+r+HudYFKi11DawVlMVZ299eZ2kcdhS0qC8GblMd8/Qo7dXVtpXmEY0whiSXkezJ mrub+7XzDIGTgqm/ArY9q3tgY0qOK9MFItpeJm50z6u9HaqPjv9Bdi8j7XGS7HhnBjnL rd8bpwpBWLaq1+A1Qt8ER+8AZp8DUHneficuABw1fCa4tmWSNcRcUPSzGroOsRGNeXeq at6A== X-Gm-Message-State: AOJu0YwcVvEJeHWroPCdFUWQPEIMTYzc2gqnfobbuHd6XUkBd7Vh7/0U yB1Q00+JXWvnSsfXGQthOW9d4GEe8ngX90KILoLpXLhRVVFh2glUXhehxEyeLg== X-Gm-Gg: ASbGncs3atqptlCrMlGvZ6z8glbPaYaX3CJlmB6u2m905rlXpHg8gPBfcYN872LHVJ1 hFy0PEzPigjKbGmrqn2nJk0MEkqLwTaKj0J+AIHzjXAxw12Zb+QhoxMLIbrD0zu1cWBpE0380VS MG8awzzPwTyl9o/+skSceEAcgdBJXYnzJhCgK2PovRdGVysRe11y/QRdt+zihwXrJRiXzOPUIEf oWkveGWYwKT1eX0eQH0fHMZi2Xv0QiG3QTXj9i10YSC91rEX7t4S3yE9XAjycV+Fn2UUkEHgENp Vy7Ok5WDdXhN6Uq4NdRS+IzgMPky+R03EtvLChHzqGFHEHAoKGuPY5/BIb7aFhjXwV38SPo7bqu b54G2 X-Google-Smtp-Source: AGHT+IG8miuhGhnGo3DYnrt/DnORlU2FVC5n5xPtbS5vljvQM78J33Vn9fx/cvn0QMh5Lo79scz8mw== X-Received: by 2002:a17:903:110e:b0:235:6f7:b916 with SMTP id d9443c01a7336-2365da065fbmr25871355ad.32.1749794079003; Thu, 12 Jun 2025 22:54:39 -0700 (PDT) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2365decaf71sm6691485ad.217.2025.06.12.22.54.38 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jun 2025 22:54:38 -0700 (PDT) From: softworkz X-Google-Original-From: softworkz Message-Id: <0132f3f9332b2ee0c53cb8fbc34ad3e956d8b9b2.1749794066.git.ffmpegagent@gmail.com> In-Reply-To: References: Date: Fri, 13 Jun 2025 05:54:17 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 01/10] avformat/segment: Add segment_write_temp option X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: softworkz Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: softworkz Allows to write segments as temp files (.tmp) which are renamed on completion. Signed-off-by: softworkz --- libavformat/segment.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/libavformat/segment.c b/libavformat/segment.c index 65323ec678..04e973a198 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -121,6 +121,7 @@ typedef struct SegmentContext { int break_non_keyframes; int write_empty; + int segment_write_temp; ///< write segments as temp files and rename on completion int use_rename; char temp_list_filename[1024]; @@ -226,6 +227,15 @@ static int set_segment_filename(AVFormatContext *s) seg->entry_prefix ? seg->entry_prefix : "", av_basename(oc->url)); + // Write segment as a temp file and rename on completion + if(seg->segment_write_temp) { + av_strlcatf(buf, sizeof(buf), ".tmp"); + char *temp_name = av_strdup(buf); + if (!temp_name) + return AVERROR(ENOMEM); + ff_format_set_url(oc, temp_name); + } + return 0; } @@ -372,7 +382,7 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last) SegmentListEntry *entry = av_mallocz(sizeof(*entry)); if (!entry) { ret = AVERROR(ENOMEM); - goto end; + goto fail; } /* append new element */ @@ -393,7 +403,7 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last) } if ((ret = segment_list_open(s)) < 0) - goto end; + goto fail; for (entry = seg->segment_list_entries; entry; entry = entry->next) segment_list_print_entry(seg->list_pb, seg->list_type, entry, s); if (seg->list_type == LIST_TYPE_M3U8 && is_last) @@ -450,7 +460,20 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last) } } -end: + ff_format_io_close(oc, &oc->pb); + + // Now rename the .tmp file to its actual name. + if (seg->segment_write_temp) { + char *final_filename = av_strndup(oc->url, strlen(oc->url) - 4); + if (!final_filename) + return AVERROR(ENOMEM); + ret = ff_rename(oc->url, final_filename, s); + av_free(final_filename); + } + + return ret; + +fail: ff_format_io_close(oc, &oc->pb); return ret; @@ -1075,6 +1098,7 @@ static const AVOption options[] = { { "reset_timestamps", "reset timestamps at the beginning of each segment", OFFSET(reset_timestamps), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E }, { "initial_offset", "set initial timestamp offset", OFFSET(initial_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, -INT64_MAX, INT64_MAX, E }, { "write_empty_segments", "allow writing empty 'filler' segments", OFFSET(write_empty), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E }, + { "segment_write_temp", "write segments as temp files (.tmp) and rename on completion", OFFSET(segment_write_temp), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E }, { NULL }, }; -- ffmpeg-codebot _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".