On date Friday 2016-01-29 12:18:02 +0100, Martin Vignali encoded: > Ping > > ---------- Forwarded message ---------- > From: Martin Vignali <martin.vign...@gmail.com> > Date: 2015-10-03 15:49 GMT+02:00 > Subject: libavformat/segment : add option to increment timecode > To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> > > > Hello, > > in attach a patch, who add an option to increment timecode using segment. > > To test : > > ffmpeg -i src.mov -timecode 10:00:00:00 -vcodec copy -f segment > -segment_time 2 -reset_timestamps 1 -increment_tc 1 target_%03d.mov > > the second file have timecode 10:00:02:00 (after the patch) > instead of 10:00:00:00 (before the patch) > > > This patch is useful for two kind of uses : > - splitting a file, but keeping timecode of each part > - have a continuous timecode when recording a stream using segment. > > > Comments welcome. > > Martin
> From e53698b08211a818e1fe924a532e142bbb64fc87 Mon Sep 17 00:00:00 2001 > From: Martin Vignali <martin.vign...@gmail.com> > Date: Sat, 3 Oct 2015 15:39:41 +0200 > Subject: [PATCH] add increment timecode option using segment. > > --- > libavformat/segment.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) Please add docs in doc/muxers.texi. > diff --git a/libavformat/segment.c b/libavformat/segment.c > index 36417f2..f3e1ab3 100644 > --- a/libavformat/segment.c > +++ b/libavformat/segment.c > @@ -40,6 +40,7 @@ > #include "libavutil/parseutils.h" > #include "libavutil/mathematics.h" > #include "libavutil/time.h" > +#include "libavutil/timecode.h" > #include "libavutil/time_internal.h" > #include "libavutil/timestamp.h" > > @@ -92,6 +93,7 @@ typedef struct SegmentContext { > char *time_str; ///< segment duration specification string > int64_t time; ///< segment duration > int use_strftime; ///< flag to expand filename with strftime > + int increment_tc; ///< flag for increment timecode if found nit: flag to increment ... > > char *times_str; ///< segment times specification string > int64_t *times; ///< list of segment interval specification > @@ -221,6 +223,30 @@ static int segment_start(AVFormatContext *s, int > write_header) > SegmentContext *seg = s->priv_data; > AVFormatContext *oc = seg->avf; > int err = 0; > + AVTimecode tc; > + AVRational rate; > + > + if (seg->increment_tc){ style nit: if (...)_{ here and below > + AVDictionaryEntry * tcr = av_dict_get(s->metadata, "timecode", NULL, > 0); > + if (tcr){ > + if (s->nb_streams > 0){ > + rate = s->streams[0]->avg_frame_rate;//Get fps from first > stream this looks a bit arbitrary, why the first stream? > + err = av_timecode_init_from_string(&tc, rate, tcr->value, s); > + if (err < 0) > + return err; > + tc.start += (int)(seg->time / 1000000.) * > av_q2d(rate);//second count * fps You're losing precision here. Consider using the rescaling utilities in libavutil/mathematics.h or something like (seg->time * rate.num) / (rate.den * 1000000). [...] -- FFmpeg = Frightening & Faithful Mythic Programmable Elastic Gadget _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel