Browse Source

muxers: Add a flag to mark muxers that allow (non strict) monotone timestamps.

James Zern 13 years ago
parent
commit
094aa84b03
3 changed files with 5 additions and 2 deletions
  1. 3 0
      libavformat/avformat.h
  2. 1 1
      libavformat/matroskaenc.c
  3. 1 1
      libavformat/utils.c

+ 3 - 0
libavformat/avformat.h

@@ -262,6 +262,9 @@ typedef struct AVFormatParameters {
 #define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
 #define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
 #define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fallback to binary search via read_timestamp */
 #define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fallback to binary search via read_timestamp */
 #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
 #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
+#define AVFMT_TS_NONSTRICT  0x8000 /**< Format does not require strictly
+                                          increasing timestamps, but they must
+                                          still be monotonic */
 
 
 typedef struct AVOutputFormat {
 typedef struct AVOutputFormat {
     const char *name;
     const char *name;

+ 1 - 1
libavformat/matroskaenc.c

@@ -1220,7 +1220,7 @@ AVOutputFormat ff_webm_muxer = {
     mkv_write_header,
     mkv_write_header,
     mkv_write_packet,
     mkv_write_packet,
     mkv_write_trailer,
     mkv_write_trailer,
-    .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
+    .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
 };
 };
 #endif
 #endif
 
 

+ 1 - 1
libavformat/utils.c

@@ -2993,7 +2993,7 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
         pkt->dts= st->pts_buffer[0];
         pkt->dts= st->pts_buffer[0];
     }
     }
 
 
-    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
+    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
         av_log(s, AV_LOG_ERROR,
         av_log(s, AV_LOG_ERROR,
                "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
                "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
                st->index, st->cur_dts, pkt->dts);
                st->index, st->cur_dts, pkt->dts);