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

Roger Pack rogerdpack2 at gmail.com
Mon Dec 5 16:06:35 EET 2016


On 12/2/16, James Almer <jamrial at gmail.com> wrote:
> 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?

I don't so please push it.
Thanks!
-roger-


More information about the ffmpeg-devel mailing list