From patchwork Sun Dec 17 22:41:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dr Alan Barclay X-Patchwork-Id: 6843 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp2027536jah; Sun, 17 Dec 2017 14:41:55 -0800 (PST) X-Google-Smtp-Source: ACJfBotO2PeKb8N8/mQ+ql/YY9KC7kwtx9Hn6XxTBkyOr98UYJ/pRxu/yi5LfixSBNofbxPMz7gU X-Received: by 10.223.133.4 with SMTP id 4mr16557686wrh.65.1513550515427; Sun, 17 Dec 2017 14:41:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513550515; cv=none; d=google.com; s=arc-20160816; b=hSIxlZOi19bhH6sWGHWozO1ZL8DnRCTPnFUTsG9mwTwsJktyTlc9LbbpuEXeYU2f5A KmFWkHSnYSRhu+LpxMRit29h9xphqsg/3NFF6+SX6V/2cza4GyF0c2oiORCGdnYzAUeM ythnldVrY9QQjIf1jTfxzt5IOdR5kuROA8lyqo1NTXhZIc4KrM9CI+9fRPBe3+VHKRb/ t4rNQkvrq/UoHaeLPGc56brAxi663ISOg9dlaPTdFUJrYIIoI6SH/Z+voGKWOFmg2boe nZGNVpNzibc1dt/NzMfQ0RA4uS6TMuCmKfXxk8HHwD1A+XLazjnviIp0aegLRynDsqbI 0bGg== 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 :content-language:mime-version:user-agent:date:message-id:from:to :delivered-to:arc-authentication-results; bh=iIy1WEW5bFXeNivonZsQb2HX8AmGSBCnLctLH6ilHN0=; b=MYZyTklEiBLrj5LXmwZ3E3Dm0hQaKsznWoAJlGaE6z2IsFKxb6fp+JRcs61c2vvH2V O6DRTVHKKej3HcCLJjx1mMZIEB+Ja80ZgSMDGjRPg1KO6WYz0AQCGh7veXrv0X3coUUq CXi1ftttQ74U63dtR3iF7bdN8+oDE05sME12u3OFrC8CM/yBHK3StCCmfACAVS+O2zVS TRQ7U4g0K11B/Vm4zAbRMCxyTPFBBXxQFzj93m1nJpgMvJHhicgG9sXKFxSb8A3hfCs8 h8UBOcUSZY6+SQnS0FIttct9Q8/DT2/gG8tayDmm4wp2acWu4UtLb/ENiViZcywpYgHK dofg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h30si236040wrb.551.2017.12.17.14.41.55; Sun, 17 Dec 2017 14:41:55 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4D12F689B83; Mon, 18 Dec 2017 00:41:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.130]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4745E6808FC for ; Mon, 18 Dec 2017 00:41:38 +0200 (EET) Received: from [192.168.1.14] ([79.67.18.62]) by mrelayeu.kundenserver.de (mreue003 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MPt2M-1eLjYH35bW-004yzd for ; Sun, 17 Dec 2017 23:41:48 +0100 To: ffmpeg-devel@ffmpeg.org From: Dr Alan Barclay Message-ID: Date: Sun, 17 Dec 2017 22:41:36 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 Content-Language: en-US X-Provags-ID: V03:K0:8W8FXTbLdF5ddMvf0Jsnh4+Y60Fv/Q5fv9ZuAxJfwzclk6BNpGi x4fIRCP8WAtrn5zBqj1dpV/wDpvwvcPEXslrmRpKdbAv+B8cwrfVgB+gQ0SFBaaldP8zpqO MJtqU4eVxZjO90jiH/pgPUQS/PAr3yyKPEVxxE+yk4BsyQ2ND9tIn5GfQG1AidmA1erKZnQ 4bmnLRzbHjaRqKr5m4ewg== X-UI-Out-Filterresults: notjunk:1; V01:K0:/PDH0bouFhE=:TJV/zvUeZcL+9J0c+qUFyF D/Alfe/YJR7j024pI3UfTfORjayh+O1h5MLkKFEY7LOGAhQUAJQBR9dsNFR5l5anB5uGrtx+J umaejssiTILudBrcyAquFqqDlZQsMhyOseUtI4Zfr9S6KhVj3H1JBtlpVcFhVFzf46XURYktr /nFrSd53p0SVakYqTM23DH1YpVddBLb7tAw1u2E2cNwM3Ee4BHY+B7vRKLR4WAxIgp4B61c5D 3lRgb6LbqCFdvSohD7x3jKo1/tBbEyxZViqO2Gb7oCFjGn+nI65nBY4zjGgYd+cBzC49AahXu K8mSH8lNByFq5Yvq0fu0EzYVLMg3kor5UFQk4/wglKXTjz2S9JbKTgqJQ4IkjLwMuWV+4tlj9 ZFbBH6BM24K6WnrmRsyBH5/qJpGpnnYPc4B9v0tZiRtvDzJY/8YbA53WjqA5rddCZ6JnzivhX jxf+GnuB4jtI13xNZQLtdXoVAy26/+4Js4r15EBJhRGRQwCyT7W507bS64ZB0vnZFfc8+dS8Y wfXdF2vqcA5FsB4Xvl0j2cZGifZQIsH7745vExJgydjRyl2As29Z4oqZJUH4JXPgFQrIZ4KoU +sR7KvUwHr0+v7MfdbLqL4tN9U/jeyikUe78+Oz0MO1aS1bnhjTi3iCe7Lat5Mb6LUnSiuGUx ImD9nYCMh6wzXVZ6oYkTZU+dn9BH+qU93QtMTtvdI5tuOhFDtebEWuBNYf3Cg4Ej4Y88O+F/M wlFoUbaO/oB74dQ6xTrmfjCRKX98s+2Kmbtbdvwmr9KTpKYbycgcCTy28jg= Subject: [FFmpeg-devel] [PATCH] Adding mkdir option for img2enc 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" Hi All, Please would someone with an interest in img2enc take a look at my minor feature addition and consider committing it to the main line for me. Example: ffmpeg -i ~/trailer.mp4 -strftime 1 -mkdir 1 %Y/%m/%d/out_%H-%M-%S.jpg Without the new mkdir option, this command will fail if the directory hierarchy for the jpg files does not already exist, which can be difficult to predict for time-stamped directories. This patch adds a mkdir option to img2enc which invites it to make whatever directory hierarchy is necessary for each output file. When used in conjunction with the strftime then the jpg files will be located in a newly created (time-stamped) directory as processing progresses. My typical usage scenario is capturing a long-running live video feed (perhaps time-lapsed) and storing the resulting images in a time-stamped directory hierarchy fashion, rather than as a numbered sequence of files in a single directory. If you look at the code you will see that only a half dozen lines of code were required in img2enc. The function for creating directories already existed in hlsenc.c but I've moved into utils.c as I presumed that was a more generic location for it. All comments appreciated. Thanks ad Regards, Alan. From 666ba7be8878a401c1e7fedd6dd7f56c9e049e14 Mon Sep 17 00:00:00 2001 From: "Dr. Alan Barclay" Date: Sun, 17 Dec 2017 19:24:44 +0000 Subject: [PATCH] Adding mkdir option for img2enc. --- libavformat/avformat.h | 7 +++++++ libavformat/hlsenc.c | 33 --------------------------------- libavformat/img2enc.c | 8 ++++++++ libavformat/utils.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 4f2798a871..8e76fb3349 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -2990,6 +2990,13 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, AVRational av_stream_get_codec_timebase(const AVStream *st); /** + * Make the specified directory. + * + * @param path path for directory + */ +int mkdir_p(const char *path); + +/** * @} */ diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index dd09739651..8523916d98 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -205,39 +205,6 @@ typedef struct HLSContext { int http_persistent; } HLSContext; -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 is_http_proto(char *filename) { const char *proto = avio_find_protocol_name(filename); return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0; diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c index b680676bff..d037719ca1 100644 --- a/libavformat/img2enc.c +++ b/libavformat/img2enc.c @@ -42,6 +42,7 @@ typedef struct VideoMuxData { char target[4][1024]; int update; int use_strftime; + int use_mkdir; int frame_pts; const char *muxer; int use_rename; @@ -114,6 +115,12 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) img->img_number, img->path); return AVERROR(EINVAL); } + if (img->use_mkdir) { + char *temp_filename = av_strdup(filename); + const char *temp_path = av_dirname(temp_filename); + mkdir_p(temp_path); + av_free(temp_filename); + } for (i = 0; i < 4; i++) { snprintf(img->tmp[i], sizeof(img->tmp[i]), "%s.tmp", filename); av_strlcpy(img->target[i], filename, sizeof(img->target[i])); @@ -212,6 +219,7 @@ static const AVOption muxoptions[] = { { "update", "continuously overwrite one file", OFFSET(update), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC }, { "start_number", "set first number in the sequence", OFFSET(img_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC }, { "strftime", "use strftime for filename", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC }, + { "mkdir", "make sub-dirs as required", OFFSET(use_mkdir), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC }, { "frame_pts", "use current frame pts for filename", OFFSET(frame_pts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC }, { "atomic_writing", "write files atomically (using temporary files and renames)", OFFSET(use_rename), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC }, { NULL }, diff --git a/libavformat/utils.c b/libavformat/utils.c index 84e49208b8..3f32cc9e18 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -5606,3 +5606,36 @@ FF_ENABLE_DEPRECATION_WARNINGS return st->internal->avctx->time_base; #endif } + +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; +} -- 2.11.0