[FFmpeg-devel] [PATCH 1/2] img2: added support for %t output pattern

James Almer jamrial at gmail.com
Sat Dec 3 04:20:20 EET 2016


On 12/2/2016 10:06 PM, Roger Pack wrote:
> On 11/25/16, Roger Pack <rogerdpack2 at gmail.com> wrote:
>> 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...
> 
> ping2...

I said that if it's technically the same as the previously committed
code then it should be good to go since it's already reviewed.

Do you have write access, or should i push this?



More information about the ffmpeg-devel mailing list