From patchwork Thu Nov 30 23:07:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Dutton X-Patchwork-Id: 6482 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp466442jah; Thu, 30 Nov 2017 15:14:21 -0800 (PST) X-Google-Smtp-Source: AGs4zMaTt6Aqe1rjX11qilrnjdLsAHBOuciuiXOBUc6icWJcw/pT4bi04073dtvQu/Ph9l3KwS32 X-Received: by 10.223.190.9 with SMTP id n9mr3622454wrh.46.1512083661713; Thu, 30 Nov 2017 15:14:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512083661; cv=none; d=google.com; s=arc-20160816; b=Bf0AuHg76M2OK2ba42A6Atp0v1wOT5iwm6DoqxafqRuv5pWPIqBX4yKIRFC6CXzH5K lE/poWG7rSWyarDxQHa+FW4gT60w+BNjsZjE3z/tZKbD14NbWJY8y1rWvdtk/1ogT4+G 99728vm/hVORdg97wuylBrxbFjFAObbF+vrZGMkqN/1KjvGRPYlZjM1tHty+Ac+6TNaB BNWghMT1o/JU9RE3BfjuS7qSaKFQ+V60kA/czZLK/uHUBqya+i+JyjK6al5ouZDsUv0N 5Ufy1kcrFmZhcPOFHFQOaupkb7CAXwiY8KY2EePHVVRlwIs1aVbU4eW+nGIn/GZz8H5d sO7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:to :message-id:date:from:mime-version:dkim-signature:delivered-to :arc-authentication-results; bh=VRk67huio1/n5vV/3g493K/uEwlybl63TrafOg58fHQ=; b=ZLU95MUmcUEBfntYo+gfNxNLiS5qxtPxZ4Yfx5xd38R31wTyNMPXow+gncw6jNskq1 q/7IKNiSdmfZGcHDb4/XUw0PmZSDoaqSR6so25+NnpUGwjB3wMzhXvPURBsFZqWzm7Pk 4t8ihFoI5tDZASZyjy1HgIEO7WuNTadBiEhwthuOpB75vGEWhprFUMs5YsFwj0LyWLjV 35O7hAat51RwhVK3gO/75Esm6YH74ANe4QAHkX3lFqdC5uL1QGfG+/UfuhXxK6yGRA1q NxTxbCowUaLKY4Hz4PY0ZlvRbM6RCBQgoir6xYPPl7vbz7amS5WNJ2NYjqwKKNBEtdG0 yjqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=K/QEaFQn; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id k48si4030834wrc.358.2017.11.30.15.14.20; Thu, 30 Nov 2017 15:14:21 -0800 (PST) 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=@gmail.com header.s=20161025 header.b=K/QEaFQn; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A69B68A39E; Fri, 1 Dec 2017 01:14:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi0-f41.google.com (mail-oi0-f41.google.com [209.85.218.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 43AFE68A02A for ; Fri, 1 Dec 2017 01:14:10 +0200 (EET) Received: by mail-oi0-f41.google.com with SMTP id s9so6012461oie.5 for ; Thu, 30 Nov 2017 15:14:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=3L+ho/wJpJnw2Eteu97krT7JuVQ2GIjKlS2pXOvgV1Q=; b=K/QEaFQnpj+sO33TQ9yFfJhXpiyYGa+hMLWlQ7PGMqcGg1NokFkOsY/m6IfTxxknax w1gfZid/o18XyKgSwu68Dw14/FrMy0MApg64lhvcXscM4tyujirS6CqWd+A6LPx+x+c1 4JcLpr/CkRblvCzT4JUtytArz0vTBPMPGz0PDYp/UeqhZh1ZbZLlP2WoOzfvkqnBSuKG akQ6D1YAXDLaxikerHQxRrXA027fZeBz8/7b46FRBkSp/Nm4iQtX4eA8fKVk2KyQC6Nl GRDrwB2o8WH+o3QBD6GczWak+cI9Ex1JFViVfG/XXRXNxx3zcq63zSTIinNstpLyMEzl 0R+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=3L+ho/wJpJnw2Eteu97krT7JuVQ2GIjKlS2pXOvgV1Q=; b=dQEpj0jT4E1m46y15JyDloC0Y2ZqAKRrcGzrKkmk5Qzbu/H7IQnxbPaJ3+mlUZk6RI V3pJPKniQnVBb9iIiegfESAR038A0D8Y0kdHu8dRJtA2ezwgGFr3vLFfjvJMxXWRg10y Mncfzmev/JRhDl6eCpkhGYYQD+vH0zWFNUAJtq7FJq3+xNvxSENI0FOklo/eqpc7iA64 /lydlD9jAtVfu95Y7TvsiSlTFSVVtUTCRHC3d+Q/NgKvoesoj4dzDRje03eomCZN9wTi u1N3DY4va9Swu1fR728R4uMIAfTBE98LSWee7BaCXgxcqMC7IOzgrScRiwK8PsRU2BRY QjDQ== X-Gm-Message-State: AJaThX7GT0dFVKd4+IGtrQcC+9kbqKxqUcmjkb1DPkasBCLiChnQOypo pN01Qcgw9pm5Mq05Q9vNDe0NZbpLndmufasy3AEPHNJh X-Received: by 10.202.75.130 with SMTP id y124mr6062150oia.91.1512083263665; Thu, 30 Nov 2017 15:07:43 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.81.204 with HTTP; Thu, 30 Nov 2017 15:07:03 -0800 (PST) From: James Courtier-Dutton Date: Thu, 30 Nov 2017 23:07:03 +0000 Message-ID: To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH] libavformat/segment: strftime date sub-directories 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 b6a6f6d577e562c09c7cc1fc0befd2d73a9c0f32 Mon Sep 17 00:00:00 2001 From: James Courtier-Dutton Date: Thu, 30 Nov 2017 22:56:04 +0000 Subject: [PATCH] libavformat/segment: strftime date sub-directories Automatically create sub-directories if needed based on date. E.g. ffmpeg ... -timelimit 2147483647 -f segment -strftime 1 -segment_time 10 "%Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv" --- libavformat/segment.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/libavformat/segment.c b/libavformat/segment.c index 81d3f1d..f8484bf 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -186,6 +186,39 @@ static int segment_mux_init(AVFormatContext *s) return 0; } +static int mkdir_p(const char *path) { + int ret = 0; + char *temp = av_strdup(path); + char *pos = temp; + char tmp_ch = '\0'; + + if (!path || !temp) { + return -1; + } + + if (!strncmp(temp, "/", 1) || !strncmp(temp, "\\", 1)) { + pos++; + } else if (!strncmp(temp, "./", 2) || !strncmp(temp, ".\\", 2)) { + pos += 2; + } + + for ( ; *pos != '\0'; ++pos) { + if (*pos == '/' || *pos == '\\') { + tmp_ch = *pos; + *pos = '\0'; + ret = mkdir(temp, 0755); + *pos = tmp_ch; + } + } + + if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) { + ret = mkdir(temp, 0755); + } + + av_free(temp); + return ret; +} + static int set_segment_filename(AVFormatContext *s) { SegmentContext *seg = s->priv_data; @@ -198,12 +231,27 @@ static int set_segment_filename(AVFormatContext *s) if (seg->use_strftime) { time_t now0; struct tm *tm, tmpbuf; + const char *dir; + char *fn_copy; time(&now0); tm = localtime_r(&now0, &tmpbuf); if (!strftime(oc->filename, sizeof(oc->filename), s->filename, tm)) { av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n"); return AVERROR(EINVAL); } + /* Automatically create directories if needed */ + /* E.g. %Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv */ + fn_copy = av_strdup(oc->filename); + if (!fn_copy) { + return AVERROR(ENOMEM); + } + dir = av_dirname(fn_copy); + if (mkdir_p(dir) == -1 && errno != EEXIST) { + av_log(oc, AV_LOG_ERROR, "Could not create directory %s with use_localtime_mkdir\n", dir); + av_free(fn_copy); + return AVERROR(errno); + } + av_free(fn_copy); } else if (av_get_frame_filename(oc->filename, sizeof(oc->filename), s->filename, seg->segment_idx) < 0) { av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->filename); -- 2.7.4