[FFmpeg-devel] [PATCH 1/2] img2: added support for %t output pattern
Roger Pack
rogerdpack2 at gmail.com
Fri Nov 25 20:45:11 EET 2016
On 11/18/16, Roger Pack <rogerdpack2 at gmail.com> wrote:
> On 11/15/16, James Almer <jamrial at gmail.com> wrote:
>> On 11/10/2016 4:26 PM, Roger Pack wrote:
>>> On 11/1/16, James Almer <jamrial at gmail.com> wrote:
>>>> > On 11/1/2016 6:43 PM, James Almer wrote:
>>>>> >> On 10/25/2016 9:38 PM, Roger Pack wrote:
>>>>>> >>> From e8cac5c7de18766ce0f8f286f7dc140b82129df2 Mon Sep 17 00:00:00
>>>>>> >>> 2001
>>>>>> >>> From: rogerdpack <rogerpack2005 at gmail.com>
>>>>>> >>> Date: Tue, 25 Oct 2016 18:33:12 -0600
>>>>>> >>> Subject: [PATCH 1/2] img2 encoder: allow %t in filename, based on
>>>>>> >>> patch
>>>>>> >>> from
>>>>>> >>> Yuval Adam
>>>>>> >>>
>>>>>> >>> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
>>>>>> >>> ---
>>>>>> >>> doc/muxers.texi | 13 +++++++++++++
>>>>>> >>> libavformat/avformat.h | 3 ++-
>>>>>> >>> libavformat/hlsenc.c | 6 +++---
>>>>>> >>> libavformat/img2enc.c | 6 ++++--
>>>>>> >>> libavformat/utils.c | 42
>>>>>> >>> ++++++++++++++++++++++++++++++++++++++----
>>>>>> >>> 5 files changed, 60 insertions(+), 10 deletions(-)
>>>>>> >>>
>>>>>> >>> diff --git a/doc/muxers.texi b/doc/muxers.texi
>>>>>> >>> index 0d856db..0c3a198 100644
>>>>>> >>> --- a/doc/muxers.texi
>>>>>> >>> +++ b/doc/muxers.texi
>>>>>> >>> @@ -619,6 +619,12 @@ If the pattern contains "%d" or
>>>>>> >>> "%0 at var{N}d",
>>>>>> >>> the
>>>>>> >>> first filename of
>>>>>> >>> the file list specified will contain the number 1, all the
>>>>>> >>> following
>>>>>> >>> numbers will be sequential.
>>>>>> >>>
>>>>>> >>> +If the pattern contains "%t", the frame's timestamps will be
>>>>>> >>> inserted
>>>>>> >>> +in the filename like "00.00.00.000" for hours, minutes, seconds,
>>>>>> >>> +and milliseconds.
>>>>>> >>> +
>>>>>> >>> +The "%t" and "%d" patterns may be used simultaneously.
>>>>>> >>> +
>>>>>> >>> The pattern may contain a suffix which is used to automatically
>>>>>> >>> determine the format of the image files to write.
>>>>>> >>>
>>>>>> >>> @@ -664,6 +670,13 @@ can be used:
>>>>>> >>> ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1
>>>>>> >>> "%Y-%m-%d_%H-%M-%S.jpg"
>>>>>> >>> @end example
>>>>>> >>>
>>>>>> >>> +The following example uses the timestamp parameter to generate
>>>>>> >>> one
>>>>>> >>> +image file per video frame from the input, and name it including
>>>>>> >>> its
>>>>>> >>> original
>>>>>> >>> +timestamp.
>>>>>> >>> + at example
>>>>>> >>> +ffmpeg -i in.avi -vsync vfr -copyts img-%t.jpg
>>>>>> >>> + at end example
>>>>>> >>> +
>>>>>> >>> @subsection Options
>>>>>> >>>
>>>>>> >>> @table @option
>>>>>> >>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>>>>>> >>> index f9f4d72..7f39698 100644
>>>>>> >>> --- a/libavformat/avformat.h
>>>>>> >>> +++ b/libavformat/avformat.h
>>>>>> >>> @@ -2780,10 +2780,11 @@ void av_dump_format(AVFormatContext *ic,
>>>>>> >>> * @param path numbered sequence string
>>>>>> >>> * @param number frame number
>>>>>> >>> * @param flags AV_FRAME_FILENAME_FLAGS_*
>>>>>> >>> + * @param ts frame timestamp in AV_TIME_BASE fractional seconds.
>>>>>> >>> * @return 0 if OK, -1 on format error
>>>>>> >>> */
>>>>>> >>> int av_get_frame_filename2(char *buf, int buf_size,
>>>>>> >>> - const char *path, int number, int
>>>>>> >>> flags);
>>>>>> >>> + const char *path, int number, int
>>>>>> >>> flags,
>>>>>> >>> int64_t ts);
>>>>> >>
>>>>> >> Uhh, what? did you just break API modifying a public function?
>>>>> >>
>>>> >
>>>> > For the record, this was reverted.
>>>> >
>>>> > Shouldn't be hard to solve, i think. Just add a new
>>>> > ff_get_frame_filename()
>>>> > function to internal.h with this new signature, at least for now and
>>>> > for
>>>> > this
>>>> > feature, to avoid adding a third public function doing the same thing
>>>> > unless
>>>> > absolutely necessary.
>>> OK see attached. Wasn't sure if I should duplicate docs or not, feel
>>> free to modify.
>>> Cheers!
>>> -roger-
>>>
>>>
>>> 0001-img2-encoder-allow-t-in-filepattern-based-on-patch-f.patch
>>>
>>>
>>> From 8287f1ca543f764e9e88659ee5a07873860d607d Mon Sep 17 00:00:00 2001
>>> From: rogerdpack <rogerpack2005 at gmail.com>
>>> Date: Thu, 10 Nov 2016 12:24:49 -0700
>>> Subject: [PATCH] img2 encoder: allow %t in filepattern, based on patch
>>> from
>>> Yuval Adam
>>>
>>> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
>>> ---
>>> doc/muxers.texi | 13 +++++++++++++
>>> libavformat/img2enc.c | 8 +++++---
>>> libavformat/internal.h | 18 ++++++++++++++++++
>>> libavformat/utils.c | 45
>>> ++++++++++++++++++++++++++++++++++++++++++---
>>> 4 files changed, 78 insertions(+), 6 deletions(-)
>>
>> No hlsenc.c?
>
> Yeah, good idea, moved them all to use the ff_get_frame_filename3 now
> just so people would realize the extra parameter is available.
>
>>>
>>> diff --git a/doc/muxers.texi b/doc/muxers.texi
>>> index 806182a..670fcca 100644
>>> --- a/doc/muxers.texi
>>> +++ b/doc/muxers.texi
>>> @@ -622,6 +622,12 @@ If the pattern contains "%d" or "%0 at var{N}d", the
>>> first filename of
>>> the file list specified will contain the number 1, all the following
>>> numbers will be sequential.
>>>
>>> +If the pattern contains "%t", the frame's timestamps will be inserted
>>> +in the filename like "00.00.00.000" for hours, minutes, seconds,
>>> +and milliseconds.
>>> +
>>> +The "%t" and "%d" patterns may be used simultaneously.
>>> +
>>> The pattern may contain a suffix which is used to automatically
>>> determine the format of the image files to write.
>>>
>>> @@ -667,6 +673,13 @@ can be used:
>>> ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1
>>> "%Y-%m-%d_%H-%M-%S.jpg"
>>> @end example
>>>
>>> +The following example uses the timestamp parameter to generate one
>>> +image file per video frame from the input, and name it including its
>>> original
>>> +timestamp.
>>> + at example
>>> +ffmpeg -i in.avi -vsync vfr -copyts img-%t.jpg
>>> + at end example
>>> +
>>> @subsection Options
>>>
>>> @table @option
>>> diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
>>> index 1297b1a..651739e 100644
>>> --- a/libavformat/img2enc.c
>>> +++ b/libavformat/img2enc.c
>>> @@ -80,10 +80,12 @@ static int write_packet(AVFormatContext *s, AVPacket
>>> *pkt)
>>> VideoMuxData *img = s->priv_data;
>>> AVIOContext *pb[4];
>>> char filename[1024];
>>> - AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
>>> + AVStream *stream = s->streams[ pkt->stream_index ];
>>> + AVCodecParameters *par = stream->codecpar;
>>> const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(par->format);
>>> int i;
>>> int nb_renames = 0;
>>> + int64_t ts = av_rescale_q(pkt->pts, stream->time_base,
>>> AV_TIME_BASE_Q);
>>>
>>> if (!img->is_pipe) {
>>> if (img->update) {
>>> @@ -97,9 +99,9 @@ static int write_packet(AVFormatContext *s, AVPacket
>>> *pkt)
>>> av_log(s, AV_LOG_ERROR, "Could not get frame filename
>>> with strftime\n");
>>> return AVERROR(EINVAL);
>>> }
>>> - } else if (av_get_frame_filename2(filename, sizeof(filename),
>>> img->path,
>>> + } else if (av_get_frame_filename3(filename, sizeof(filename),
>>> img->path,
>>> img->img_number,
>>> -
>>> AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0 &&
>>> +
>>> AV_FRAME_FILENAME_FLAGS_MULTIPLE, ts) < 0 &&
>>> img->img_number > 1) {
>>> av_log(s, AV_LOG_ERROR,
>>> "Could not get frame filename number %d from pattern
>>> '%s' (either set updatefirst or use a pattern like %%03d within the
>>> filename pattern)\n",
>>> diff --git a/libavformat/internal.h b/libavformat/internal.h
>>> index da64c64..d7174c5 100644
>>> --- a/libavformat/internal.h
>>> +++ b/libavformat/internal.h
>>> @@ -356,6 +356,24 @@ void ff_reduce_index(AVFormatContext *s, int
>>> stream_index);
>>> enum AVCodecID ff_guess_image2_codec(const char *filename);
>>>
>>> /**
>>> + * Return in 'buf' the path with '%d' replaced by a number.
>>> + *
>>> + * Also handles the '%0nd' format where 'n' is the total number
>>> + * of digits and '%%'.
>>> + * Also handles the '%t' format where 't' is the timestamp.
>>> + *
>>> + * @param buf destination buffer
>>> + * @param buf_size destination buffer size
>>> + * @param path numbered sequence string
>>> + * @param number frame number
>>> + * @param flags AV_FRAME_FILENAME_FLAGS_*
>>> + * @param ts frame timestamp in AV_TIME_BASE fractional seconds.
>>> + * @return 0 if OK, -1 on format error
>>> + */
>>> +int av_get_frame_filename3(char *buf, int buf_size,
>>
>> Since it's internal it needs to have an ff_ prefix, not av_.
>
> OK hopefully fixed with the attached, thanks.
Ping...
Happy holidays!
-roger-
More information about the ffmpeg-devel
mailing list