avformat/mux: set avoid_negative_ts based on flags if not overridden by user or muxer
ffmpeg | branch: master | Michael Niedermayer <michaelni@gmx.at> | Fri Apr 26 11:52:51 2013 +0200| [eba33396f007dc373678adea6c1a4b1a50373263] | committer: Michael Niedermayer avformat/mux: set avoid_negative_ts based on flags if not overridden by user or muxer This changes the default to avoid negative timestamps. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=eba33396f007dc3736...
libavformat/avformat.h | 5 ++++- libavformat/mux.c | 7 ++++++ tests/ref/lavf/ts | 2 +- tests/ref/lavf/wtv | 2 +- tests/ref/seek/lavf-ts | 54 +++++++++++++++++++++++------------------------ tests/ref/seek/lavf-wtv | 44 +++++++++++++++++++------------------- 6 files changed, 62 insertions(+), 52 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index d26964a..c8f4912 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -370,7 +370,10 @@ typedef struct AVProbeData { timestamps. If not set the timestamp will be shifted in av_write_frame and av_interleaved_write_frame so they - start from 0. */ + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ #define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ diff --git a/libavformat/mux.c b/libavformat/mux.c index 4781a3e..eba4ec3 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -398,6 +398,13 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) if ((ret = init_pts(s)) < 0) return ret; + if (s->avoid_negative_ts < 0) { + if (s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS)) { + s->avoid_negative_ts = 0; + } else + s->avoid_negative_ts = 1; + } + return 0; } diff --git a/tests/ref/lavf/ts b/tests/ref/lavf/ts index 0cab3dd..d795c27 100644 --- a/tests/ref/lavf/ts +++ b/tests/ref/lavf/ts @@ -1,3 +1,3 @@ -4531d0f4a80d5a2ee2b08a8d4ba3b442 *./tests/data/lavf/lavf.ts +04ba219e6f56f7b0fa4a47765323d204 *./tests/data/lavf/lavf.ts 407020 ./tests/data/lavf/lavf.ts ./tests/data/lavf/lavf.ts CRC=0xcc2dc628 diff --git a/tests/ref/lavf/wtv b/tests/ref/lavf/wtv index 8f2c2ac..f54f862 100644 --- a/tests/ref/lavf/wtv +++ b/tests/ref/lavf/wtv @@ -1,3 +1,3 @@ -345516d3a03fd239c62e5e7257c9f4a2 *./tests/data/lavf/lavf.wtv +237211f6aa3df9da2dfe0f7d5b8ba85c *./tests/data/lavf/lavf.wtv 413696 ./tests/data/lavf/lavf.wtv ./tests/data/lavf/lavf.wtv CRC=0xcc2dc628 diff --git a/tests/ref/seek/lavf-ts b/tests/ref/seek/lavf-ts index 407ba59..e57651e 100644 --- a/tests/ref/seek/lavf-ts +++ b/tests/ref/seek/lavf-ts @@ -1,53 +1,53 @@ -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:0 dts: 1.880000 pts: 1.920000 pos: 216388 size: 17440 +ret: 0 st: 0 flags:1 dts: 1.880000 pts: 1.920000 pos: 189692 size: 24786 ret: 0 st: 0 flags:0 ts: 0.788333 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:1 ts:-0.317500 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 1 flags:0 ts: 2.576667 -ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404576 size: 209 +ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size: 209 ret: 0 st: 1 flags:1 ts: 1.470833 -ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159988 size: 208 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:0 ts: 2.153333 -ret: 0 st: 0 flags:0 dts: 2.160000 pts: 2.200000 pos: 325992 size: 12692 +ret: 0 st: 1 flags:1 dts: 1.794811 pts: 1.794811 pos: 322608 size: 209 ret: 0 st: 0 flags:1 ts: 1.047500 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 1 flags:0 ts:-0.058333 -ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159988 size: 208 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st: 1 flags:1 ts: 2.835833 -ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404576 size: 209 +ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size: 209 ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 0 flags:0 dts: 1.760000 pts: 1.800000 pos: 162996 size: 12135 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:0 ts:-0.481667 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:1 ts: 2.412500 -ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404576 size: 209 +ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size: 209 ret: 0 st: 1 flags:0 ts: 1.306667 -ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159988 size: 208 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st: 1 flags:1 ts: 0.200844 -ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159988 size: 208 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 251356 size: 13449 +ret: 0 st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 235000 size: 15019 ret: 0 st: 0 flags:0 ts: 0.883344 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 0 flags:1 ts:-0.222489 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st: 1 flags:0 ts: 2.671678 -ret: 0 st: 1 flags:1 dts: 2.120522 pts: 2.120522 pos: 404576 size: 209 +ret: 0 st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size: 209 ret: 0 st: 1 flags:1 ts: 1.565844 -ret: 0 st: 1 flags:1 dts: 1.389089 pts: 1.389089 pos: 159988 size: 208 +ret: 0 st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size: 208 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos: 564 size: 24801 +ret: 0 st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos: 564 size: 24801 diff --git a/tests/ref/seek/lavf-wtv b/tests/ref/seek/lavf-wtv index 67def8a..71703c5 100644 --- a/tests/ref/seek/lavf-wtv +++ b/tests/ref/seek/lavf-wtv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st: 0 flags:0 ts: 0.788334 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st: 0 flags:1 ts:-0.317499 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret:-1 st: 1 flags:0 ts: 2.576668 ret: 0 st: 1 flags:1 ts: 1.470835 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret:-1 st: 0 flags:0 ts: 2.153336 ret: 0 st: 0 flags:1 ts: 1.047503 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st: 1 flags:0 ts:-0.058330 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st: 1 flags:1 ts: 2.835837 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st: 0 flags:0 ts:-0.481662 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st: 0 flags:1 ts: 2.412505 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret:-1 st: 1 flags:0 ts: 1.306672 ret: 0 st: 1 flags:1 ts: 0.200839 -ret: 0 st: 1 flags:1 dts: 0.224195 pts: 0.224195 pos: 112904 size: 209 +ret: 0 st: 1 flags:1 dts: 0.211950 pts: 0.211950 pos: 99352 size: 209 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st: 0 flags:0 ts: 0.883340 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st: 0 flags:1 ts:-0.222493 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret:-1 st: 1 flags:0 ts: 2.671674 ret: 0 st: 1 flags:1 ts: 1.565841 -ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209 +ret: 0 st: 1 flags:1 dts: 0.734399 pts: 0.734399 pos: 294744 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208 +ret: 0 st: 1 flags:1 dts: 0.029093 pts: 0.029093 pos: 26344 size: 208
Le septidi 7 floréal, an CCXXI, Michael Niedermayer a écrit :
ffmpeg | branch: master | Michael Niedermayer <michaelni@gmx.at> | Fri Apr 26 11:52:51 2013 +0200| [eba33396f007dc373678adea6c1a4b1a50373263] | committer: Michael Niedermayer
avformat/mux: set avoid_negative_ts based on flags if not overridden by user or muxer
This changes the default to avoid negative timestamps.
I suggest we consider reverting that: the files produced by the actual avoid_negative_ts code, which seem to come from the fork, look bogus. For example: ./ffmpeg_g -lavfi testsrc=d=1 -c libx264 -preset veryfast -crf 20 \ -avoid_negative_ts 1 -y /tmp/testout.mkv produces this: packet|stream_index=0|pts_time=0.080000|dts_time=N/A packet|stream_index=0|pts_time=0.240000|dts_time=N/A packet|stream_index=0|pts_time=0.160000|dts_time=0.080000 packet|stream_index=0|pts_time=0.120000|dts_time=0.120000 packet|stream_index=0|pts_time=0.200000|dts_time=0.160000 packet|stream_index=0|pts_time=0.400000|dts_time=0.200000 and this: format|start_time=0.000000|duration=1.080000 The start_time and duration seems clearly wrong. It can be compared to the result of producing raw H.264 and muxing with mkvmerge: packet|stream_index=0|pts_time=0.000000|dts_time=N/A packet|stream_index=0|pts_time=0.160000|dts_time=N/A packet|stream_index=0|pts_time=0.080000|dts_time=0.000000 packet|stream_index=0|pts_time=0.040000|dts_time=0.040000 packet|stream_index=0|pts_time=0.120000|dts_time=0.080000 packet|stream_index=0|pts_time=0.320000|dts_time=0.120000 ... format|start_time=0.000000|duration=1.000000 Using "-avoid_negative_ts 0" produces the same result as mkvmerge. Regards, -- Nicolas George
On Wed, Oct 16, 2013 at 04:07:41PM +0200, Nicolas George wrote:
Le septidi 7 floréal, an CCXXI, Michael Niedermayer a écrit :
ffmpeg | branch: master | Michael Niedermayer <michaelni@gmx.at> | Fri Apr 26 11:52:51 2013 +0200| [eba33396f007dc373678adea6c1a4b1a50373263] | committer: Michael Niedermayer
avformat/mux: set avoid_negative_ts based on flags if not overridden by user or muxer
This changes the default to avoid negative timestamps.
I suggest we consider reverting that: the files produced by the actual avoid_negative_ts code, which seem to come from the fork, look bogus.
the original code was from me: the current code is a combination of both implementations features and bugfixes (in theory at least) commit 3ba0dab76ac32f0c9f50c916a73bc64e43c1fdf9 Author: Michael Niedermayer <michaelni@gmx.at> Date: Wed Sep 26 15:55:16 2012 +0200 lavf: Add support offset timestamps on muxing. This allows avoiding negative timestamps. Signed-off-by: Michael Niedermayer <michaelni@gmx.at> ---- commit c2cb01d418dd18e1cf997c038d37378d773121be Author: Luca Barbato <lu_zero@gentoo.org> Date: Wed Apr 3 14:11:10 2013 +0200 lavf: introduce AVFMT_TS_NEGATIVE Most formats do not support negative timestamps, shift them to avoid unexpected behaviour and a number of bad crashes. CC:libav-stable@libav.org Signed-off-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
For example:
./ffmpeg_g -lavfi testsrc=d=1 -c libx264 -preset veryfast -crf 20 \ -avoid_negative_ts 1 -y /tmp/testout.mkv
produces this:
packet|stream_index=0|pts_time=0.080000|dts_time=N/A packet|stream_index=0|pts_time=0.240000|dts_time=N/A packet|stream_index=0|pts_time=0.160000|dts_time=0.080000 packet|stream_index=0|pts_time=0.120000|dts_time=0.120000 packet|stream_index=0|pts_time=0.200000|dts_time=0.160000 packet|stream_index=0|pts_time=0.400000|dts_time=0.200000
and this:
format|start_time=0.000000|duration=1.080000
The start_time and duration seems clearly wrong.
id guess thats because of libavformat/matroskadec.c: st->start_time = 0; does matroska require the start time to be 0 ? if not then the line above looks suspect, OTOH, if it does need the first pts to be 0 then it actually does need timestamps to be shifted to achive that theres no gurantee that the muxer input starts with pts=0 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Awnsering whenever a program halts or runs forever is On a turing machine, in general impossible (turings halting problem). On any real computer, always possible as a real computer has a finite number of states N, and will either halt in less than N cycles or never halt.
participants (3)
-
git@videolan.org -
Michael Niedermayer -
Nicolas George