diff --git a/doc/APIchanges b/doc/APIchanges
index dac87ee6062d4739468a95f475455d43e3adead6..18105c55ba0ff5f32c5b5e2358743bb17d38782e 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,10 @@ libavutil:     2011-04-18
 
 API changes, most recent first:
 
+2012-05-xx - xxxxxxx - lavf 54.3.0
+  Add AVFMT_TS_NONSTRICT format flag to indicate that a muxer supports
+  non-increasing monotone timestamps.
+
 2012-05-15 - lavfi 2.17.0
   Add support for audio filters
   ac71230/a2cd9be - add video/audio buffer sink in a new installed
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 33e9098ff355d44c7ad0ced1e0d78f74c45063d9..040e35eb923b8fe185fa0b777e9489f26dff29d7 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -351,6 +351,9 @@ typedef struct AVProbeData {
 #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
 #define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
 #define AVFMT_ALLOW_FLUSH  0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */
+#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly
+                                        increasing timestamps, but they must
+                                        still be monotonic */
 
 /**
  * @addtogroup lavf_encoding
@@ -373,7 +376,8 @@ typedef struct AVOutputFormat {
     /**
      * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE,
      * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
-     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH
+     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH,
+     * AVFMT_TS_NONSTRICT
      */
     int flags;
 
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index 19169adbc5028073da6d1d41d54f6b50a67f12fb..3a51aaabb04f9e21eff4a366d000f95ef98fe116 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -488,5 +488,6 @@ AVOutputFormat ff_flv_muxer = {
     .codec_tag      = (const AVCodecTag* const []){
         flv_video_codec_ids, flv_audio_codec_ids, 0
     },
-    .flags          = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
+    .flags          = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
+                      AVFMT_TS_NONSTRICT,
 };
diff --git a/libavformat/framecrcenc.c b/libavformat/framecrcenc.c
index d1148f9190f31bd02d5d515f843fdc2706a2d6bf..36dfd297c682e5604d29bb2c1c11567eade4e385 100644
--- a/libavformat/framecrcenc.c
+++ b/libavformat/framecrcenc.c
@@ -43,5 +43,5 @@ AVOutputFormat ff_framecrc_muxer = {
     .video_codec       = CODEC_ID_RAWVIDEO,
     .write_header      = ff_framehash_write_header,
     .write_packet      = framecrc_write_packet,
-    .flags             = AVFMT_VARIABLE_FPS,
+    .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
 };
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 9334b52d6ddd643a6a4e5393a8cfc8deb8cb84e0..61a91d7117a809ba0e93f542c2c859b00108794a 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -1305,7 +1305,8 @@ AVOutputFormat ff_matroska_muxer = {
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_packet,
     .write_trailer     = mkv_write_trailer,
-    .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
+    .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
+                         AVFMT_TS_NONSTRICT,
     .codec_tag         = (const AVCodecTag* const []){
          ff_codec_bmp_tags, ff_codec_wav_tags, 0
     },
@@ -1326,7 +1327,8 @@ AVOutputFormat ff_webm_muxer = {
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_packet,
     .write_trailer     = mkv_write_trailer,
-    .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
+    .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
+                         AVFMT_TS_NONSTRICT,
 };
 #endif
 
@@ -1346,7 +1348,7 @@ AVOutputFormat ff_matroska_audio_muxer = {
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_packet,
     .write_trailer     = mkv_write_trailer,
-    .flags             = AVFMT_GLOBALHEADER,
+    .flags             = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
     .codec_tag         = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
 };
 #endif
diff --git a/libavformat/md5enc.c b/libavformat/md5enc.c
index 3fd54506b3277c18d86fe5d9a3fa5d1e39190df7..4e8db3cbe0d6f3a39bf51b013464f408b76f2fa6 100644
--- a/libavformat/md5enc.c
+++ b/libavformat/md5enc.c
@@ -106,6 +106,6 @@ AVOutputFormat ff_framemd5_muxer = {
     .video_codec       = CODEC_ID_RAWVIDEO,
     .write_header      = ff_framehash_write_header,
     .write_packet      = framemd5_write_packet,
-    .flags             = AVFMT_VARIABLE_FPS,
+    .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
 };
 #endif
diff --git a/libavformat/smjpegenc.c b/libavformat/smjpegenc.c
index 45ba20b64326dee11505a48d75d40a502a5fa894..e27b89584561f99d44d27ee6fdf9bcfd9e0b5f05 100644
--- a/libavformat/smjpegenc.c
+++ b/libavformat/smjpegenc.c
@@ -144,6 +144,6 @@ AVOutputFormat ff_smjpeg_muxer = {
     .write_header   = smjpeg_write_header,
     .write_packet   = smjpeg_write_packet,
     .write_trailer  = smjpeg_write_trailer,
-    .flags          = AVFMT_GLOBALHEADER,
+    .flags          = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
     .codec_tag      = (const AVCodecTag *const []){ ff_codec_smjpeg_video_tags, ff_codec_smjpeg_audio_tags, 0 },
 };
diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c
index 82ec7ff9bc3fcc83accc60714b7918380af31459..fb0fdc5426f697013daa82f6186c20d38acc1d5e 100644
--- a/libavformat/swfenc.c
+++ b/libavformat/swfenc.c
@@ -513,6 +513,7 @@ AVOutputFormat ff_swf_muxer = {
     .write_header      = swf_write_header,
     .write_packet      = swf_write_packet,
     .write_trailer     = swf_write_trailer,
+    .flags             = AVFMT_TS_NONSTRICT,
 };
 #endif
 #if CONFIG_AVM2_MUXER
@@ -526,5 +527,6 @@ AVOutputFormat ff_avm2_muxer = {
     .write_header      = swf_write_header,
     .write_packet      = swf_write_packet,
     .write_trailer     = swf_write_trailer,
+    .flags             = AVFMT_TS_NONSTRICT,
 };
 #endif
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e8430b23fa7337e3c88a42a78c776815b7bf88b2..438752174e5c08798dcb878a875662d1d9330d8e 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2962,7 +2962,9 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
         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,
                "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
                st->index, st->cur_dts, pkt->dts);
diff --git a/libavformat/version.h b/libavformat/version.h
index 91ddfd27e87513b623e38f99bd998c6d64e83d13..7bd0b8e5f55ddb9c670ee27d8a57caa17bed3fc3 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -30,7 +30,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 54
-#define LIBAVFORMAT_VERSION_MINOR  2
+#define LIBAVFORMAT_VERSION_MINOR  3
 #define LIBAVFORMAT_VERSION_MICRO  0
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
diff --git a/libavformat/wav.c b/libavformat/wav.c
index 85849c1e75ae94b6eb4124efb3be75b354b14be3..c01121f9dbd9d3a01dedd15d6126cf71b85facfb 100644
--- a/libavformat/wav.c
+++ b/libavformat/wav.c
@@ -216,6 +216,7 @@ AVOutputFormat ff_wav_muxer = {
     .write_header      = wav_write_header,
     .write_packet      = wav_write_packet,
     .write_trailer     = wav_write_trailer,
+    .flags             = AVFMT_TS_NONSTRICT,
     .codec_tag         = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
     .priv_class        = &wav_muxer_class,
 };