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

Roger Pack rogerdpack2 at gmail.com
Sat Nov 19 01:07:52 EET 2016


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.
-roger-
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-allow-t-in-filepattern-based-on-patch-from-Yuval-Ada.patch
Type: application/octet-stream
Size: 9589 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161118/07e26436/attachment.obj>


More information about the ffmpeg-devel mailing list