From patchwork Mon Oct 10 18:51:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: George-Cristian Jiglau X-Patchwork-Id: 38680 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp505368pzb; Mon, 10 Oct 2022 11:53:31 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5ZGnD7XRsKrjWXMxFT30BXFVNEmYVFrh4+NDfLt/QWbFgdm3C8Jw9aXjp5msoVt8V76fbf X-Received: by 2002:aa7:cb87:0:b0:43b:e650:6036 with SMTP id r7-20020aa7cb87000000b0043be6506036mr19155081edt.350.1665428010920; Mon, 10 Oct 2022 11:53:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665428010; cv=none; d=google.com; s=arc-20160816; b=QabuuP406K7cc4UrdW7xuE/H5dhB02CtaXvH4qPNKMxyLZVKpk1q07iDC4ABNC7w/y p4qhOqH5icSVl/WUVADeq/arsyvAOsAOo7aMGBWqMpaEGXTK7U7Glfg6HQJXeIQIcRQk 5Ip4sqN3s+BpESII0auJa4RQ36QGx86LDubtris+ka+c+nJ9ptY+bSGaXppk5erhPcEu Q6sPHu21UvrbaAGuvhy52Gwp72tLmgq74vIZAe6pkaJzG6CbkB6CWSPTYSGjrPW0I04e Mit4rv/+qAFVXR38OCLCnSKKCJi9aC2Xt3tN16ebmBUk+CtX+Cy+1qyViby4Elwu+ZH1 kSOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:dkim-signature :from:delivered-to; bh=aI1GSGEYZ5GiiAnbvsjGukexLNDHX8CZFpD/pcxhtn4=; b=adfj2L9uuUPP6ZACdbsdInJDgaxEw3tQnpf+MsY0h9d/YmrzWD9NUx/rqAP7QS/Cmr BKFqCBSqbo/HpdOWcnnbmFQEh7xrPBVU8dVuB1IL2Bi8Bm+ssoPgLGo5z9naIUSdCmLU jwDcmYMqAgYztJ9LUDTpTLU0P5SNpYfuBoRUuvT3CfEK9F+r7fORrKSJnsOthcles6CK eOseC5JPRqfp/PWHiVgUxxics5xq/78sIifUphSwDlWrPPvI6s9GoQo5k1qouDo5qhfp 0+l7VZDKII7ixqalaW2Cu5AkqQj8N1fTXaROTaN1TXBZbCvCBPzb/bE2l1C0J3FUFyxN XIFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sx.gl header.s=mail header.b=i1qVildG; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sx.gl Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id xg14-20020a170907320e00b0078d930212c0si9704687ejb.347.2022.10.10.11.53.27; Mon, 10 Oct 2022 11:53:30 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sx.gl header.s=mail header.b=i1qVildG; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sx.gl Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6210268BD1B; Mon, 10 Oct 2022 21:53:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.sx.gl (unknown [86.127.212.246]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5E223680195 for ; Mon, 10 Oct 2022 21:53:18 +0300 (EEST) From: George-Cristian Jiglau DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sx.gl; s=mail; t=1665427996; bh=y70yDZzPaBaCtGgU+66szy2b/HGI0He87Ku0V02VLgw=; h=From:To:Subject:Date; b=i1qVildGX5BLqrg+76sYI2sL+kXbSWSHVI4FCqHPCJIKyKgPy3Yo2giUL9uA19sD5 MQEkVLzkB3obqMPpICfroZKLSeA06L07esrDcsVS1e8dCj4f7BrksDT0LfCMHVufN0 BFM6Q632NXreqYMvfevOIQTF+ZAT+wC0gw+iasjA= To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Oct 2022 21:51:57 +0300 Message-Id: <20221010185157.2222064-1-george@sx.gl> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4] avformat/segment: add -strftime_mkdir 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: u35uWFNuV7aD This enables automatically creating directories for strftime-formatted segment names. Signed-off-by: George-Cristian Jiglau --- doc/muxers.texi | 4 ++++ libavformat/segment.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/doc/muxers.texi b/doc/muxers.texi index 4edbb22b00..5695bc66ae 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -2445,6 +2445,10 @@ segments to write. If this is selected, the output segment name must contain a @code{strftime} function template. Default value is @code{0}. +@item strftime_mkdir @var{1|0} +Used together with -strftime, it will create all subdirectories of the +expanded segment name. Default value is @code{0}. + @item break_non_keyframes @var{1|0} If enabled, allow segments to start on frames other than keyframes. This improves behavior on some players when the time between keyframes is diff --git a/libavformat/segment.c b/libavformat/segment.c index c904e20708..13c18f24ca 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -94,6 +94,7 @@ typedef struct SegmentContext { AVIOContext *list_pb; ///< list file put-byte context int64_t time; ///< segment duration int use_strftime; ///< flag to expand filename with strftime + int use_strftime_mkdir; ///< flag to mkdir dirname in strftime filename int increment_tc; ///< flag to increment timecode if found char *times_str; ///< segment times specification string @@ -203,6 +204,19 @@ static int set_segment_filename(AVFormatContext *s) av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n"); return AVERROR(EINVAL); } + if (seg->use_strftime_mkdir) { + const char *dir; + char *fn_copy = av_strdup(buf); + if (!fn_copy) + return AVERROR(ENOMEM); + dir = av_dirname(fn_copy); + if (ff_mkdir_p(dir) == -1 && errno != EEXIST) { + av_log(oc, AV_LOG_ERROR, "Could not create directory %s with strftime_mkdir\n", dir); + av_freep(&fn_copy); + return AVERROR(errno); + } + av_freep(&fn_copy); + } } else if (av_get_frame_filename(buf, sizeof(buf), s->url, seg->segment_idx) < 0) { av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->url); @@ -1038,6 +1052,7 @@ static const AVOption options[] = { { "segment_start_number", "set the sequence number of the first segment", OFFSET(segment_idx), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, { "segment_wrap_number", "set the number of wrap before the first segment", OFFSET(segment_idx_wrap_nb), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, { "strftime", "set filename expansion with strftime at segment creation", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, + { "strftime_mkdir", "create directory components in strftime-generated filename", OFFSET(use_strftime_mkdir), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, { "increment_tc", "increment timecode between each segment", OFFSET(increment_tc), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, { "break_non_keyframes", "allow breaking segments on non-keyframes", OFFSET(break_non_keyframes), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },