diff options
author | Eric Hameleers <alien@slackware.com> | 2011-05-12 20:26:37 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2011-05-12 20:26:37 +0000 |
commit | 8e69e76a6e15fe7196f7dc1c360c35666e175e50 (patch) | |
tree | c25b356f963254a97ad2878c4f38a0607237c514 /ffmpeg | |
parent | 11763e7696662712042dbe24daf4cac354c924fc (diff) | |
download | asb-8e69e76a6e15fe7196f7dc1c360c35666e175e50.tar.gz asb-8e69e76a6e15fe7196f7dc1c360c35666e175e50.tar.xz |
Initial revision
Diffstat (limited to 'ffmpeg')
-rw-r--r-- | ffmpeg/build/ffmpeg-0.6.3_x86_64_asm.patch | 163 | ||||
-rw-r--r-- | ffmpeg/build/ffmpeg-HEAD-VP8_param_mapping.diff | 283 |
2 files changed, 446 insertions, 0 deletions
diff --git a/ffmpeg/build/ffmpeg-0.6.3_x86_64_asm.patch b/ffmpeg/build/ffmpeg-0.6.3_x86_64_asm.patch new file mode 100644 index 00000000..bd95a095 --- /dev/null +++ b/ffmpeg/build/ffmpeg-0.6.3_x86_64_asm.patch @@ -0,0 +1,163 @@ +diff -uar ffmpeg-0.6.3.orig/libavcodec/fft.h ffmpeg-0.6.3/libavcodec/fft.h +--- ffmpeg-0.6.3.orig/libavcodec/fft.h 2011-04-26 13:22:13.000000000 +0200 ++++ ffmpeg-0.6.3/libavcodec/fft.h 2011-05-12 22:24:54.762025330 +0200 +@@ -62,12 +62,16 @@ + #define SINETABLE_CONST + #endif + ++#ifndef _ATTR_HIDDEN ++#define _ATTR_HIDDEN __attribute__((visibility("hidden"))) ++#endif ++ + #define COSTABLE(size) \ +- COSTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_cos_##size)[size/2] ++ COSTABLE_CONST DECLARE_ALIGNED(16, FFTSample, _ATTR_HIDDEN ff_cos_##size)[size/2] + #define SINTABLE(size) \ +- SINTABLE_CONST DECLARE_ALIGNED(16, FFTSample, ff_sin_##size)[size/2] ++ SINTABLE_CONST DECLARE_ALIGNED(16, FFTSample, _ATTR_HIDDEN ff_sin_##size)[size/2] + #define SINETABLE(size) \ +- SINETABLE_CONST DECLARE_ALIGNED(16, float, ff_sine_##size)[size] ++ SINETABLE_CONST DECLARE_ALIGNED(16, float, _ATTR_HIDDEN ff_sine_##size)[size] + extern COSTABLE(16); + extern COSTABLE(32); + extern COSTABLE(64); +diff -uar ffmpeg-0.6.3.orig/libavcodec/x86/dsputil_mmx.h ffmpeg-0.6.3/libavcodec/x86/dsputil_mmx.h +--- ffmpeg-0.6.3.orig/libavcodec/x86/dsputil_mmx.h 2011-04-26 13:22:13.000000000 +0200 ++++ ffmpeg-0.6.3/libavcodec/x86/dsputil_mmx.h 2011-05-12 22:24:54.762025330 +0200 +@@ -25,39 +25,43 @@ + #include <stdint.h> + #include "libavcodec/dsputil.h" + ++#ifndef _ATTR_HIDDEN ++#define _ATTR_HIDDEN __attribute__((visibility("hidden"))) ++#endif ++ + typedef struct { uint64_t a, b; } xmm_reg; + +-extern const uint64_t ff_bone; +-extern const uint64_t ff_wtwo; ++extern const uint64_t _ATTR_HIDDEN ff_bone; ++extern const uint64_t _ATTR_HIDDEN ff_wtwo; + +-extern const uint64_t ff_pdw_80000000[2]; ++extern const uint64_t _ATTR_HIDDEN ff_pdw_80000000[2]; + +-extern const uint64_t ff_pw_3; +-extern const uint64_t ff_pw_4; +-extern const xmm_reg ff_pw_5; +-extern const xmm_reg ff_pw_8; +-extern const uint64_t ff_pw_15; +-extern const xmm_reg ff_pw_16; +-extern const uint64_t ff_pw_20; +-extern const xmm_reg ff_pw_28; +-extern const xmm_reg ff_pw_32; +-extern const uint64_t ff_pw_42; +-extern const xmm_reg ff_pw_64; +-extern const uint64_t ff_pw_96; +-extern const uint64_t ff_pw_128; +-extern const uint64_t ff_pw_255; +- +-extern const uint64_t ff_pb_1; +-extern const uint64_t ff_pb_3; +-extern const uint64_t ff_pb_7; +-extern const uint64_t ff_pb_1F; +-extern const uint64_t ff_pb_3F; +-extern const uint64_t ff_pb_81; +-extern const uint64_t ff_pb_A1; +-extern const uint64_t ff_pb_FC; ++extern const uint64_t _ATTR_HIDDEN ff_pw_3; ++extern const uint64_t _ATTR_HIDDEN ff_pw_4; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_5; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_8; ++extern const uint64_t _ATTR_HIDDEN ff_pw_15; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_16; ++extern const uint64_t _ATTR_HIDDEN ff_pw_20; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_28; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_32; ++extern const uint64_t _ATTR_HIDDEN ff_pw_42; ++extern const xmm_reg _ATTR_HIDDEN ff_pw_64; ++extern const uint64_t _ATTR_HIDDEN ff_pw_96; ++extern const uint64_t _ATTR_HIDDEN ff_pw_128; ++extern const uint64_t _ATTR_HIDDEN ff_pw_255; ++ ++extern const uint64_t _ATTR_HIDDEN ff_pb_1; ++extern const uint64_t _ATTR_HIDDEN ff_pb_3; ++extern const uint64_t _ATTR_HIDDEN ff_pb_7; ++extern const uint64_t _ATTR_HIDDEN ff_pb_1F; ++extern const uint64_t _ATTR_HIDDEN ff_pb_3F; ++extern const uint64_t _ATTR_HIDDEN ff_pb_81; ++extern const uint64_t _ATTR_HIDDEN ff_pb_A1; ++extern const uint64_t _ATTR_HIDDEN ff_pb_FC; + +-extern const double ff_pd_1[2]; +-extern const double ff_pd_2[2]; ++extern const double _ATTR_HIDDEN ff_pd_1[2]; ++extern const double _ATTR_HIDDEN ff_pd_2[2]; + + #define LOAD4(stride,in,a,b,c,d)\ + "movq 0*"#stride"+"#in", "#a"\n\t"\ +diff -uar ffmpeg-0.6.3.orig/libavcodec/x86/vc1dsp_mmx.c ffmpeg-0.6.3/libavcodec/x86/vc1dsp_mmx.c +--- ffmpeg-0.6.3.orig/libavcodec/x86/vc1dsp_mmx.c 2011-04-26 13:22:13.000000000 +0200 ++++ ffmpeg-0.6.3/libavcodec/x86/vc1dsp_mmx.c 2011-05-12 22:24:54.770168155 +0200 +@@ -73,7 +73,11 @@ + "movq %%mm"#R1", "#OFF"(%1) \n\t" \ + "add %2, %0 \n\t" + +-DECLARE_ALIGNED(16, const uint64_t, ff_pw_9) = 0x0009000900090009ULL; ++#ifndef _ATTR_HIDDEN ++#define _ATTR_HIDDEN __attribute__((visibility("hidden"))) ++#endif ++ ++DECLARE_ALIGNED(16, const uint64_t, _ATTR_HIDDEN ff_pw_9) = 0x0009000900090009ULL; + + /** Sacrifying mm6 allows to pipeline loads from src */ + static void vc1_put_ver_16b_shift2_mmx(int16_t *dst, +diff -uar ffmpeg-0.6.3.orig/libswscale/swscale.c ffmpeg-0.6.3/libswscale/swscale.c +--- ffmpeg-0.6.3.orig/libswscale/swscale.c 2011-04-26 13:22:13.000000000 +0200 ++++ ffmpeg-0.6.3/libswscale/swscale.c 2011-05-12 22:24:54.771084275 +0200 +@@ -127,6 +127,10 @@ + write special BGR->BGR scaler + */ + ++#ifndef _ATTR_HIDDEN ++#define _ATTR_HIDDEN __attribute__((visibility("hidden"))) ++#endif ++ + #if ARCH_X86 + DECLARE_ASM_CONST(8, uint64_t, bF8)= 0xF8F8F8F8F8F8F8F8LL; + DECLARE_ASM_CONST(8, uint64_t, bFC)= 0xFCFCFCFCFCFCFCFCLL; +@@ -152,22 +156,22 @@ + DECLARE_ASM_CONST(8, uint64_t, g15Mask)= 0x03E003E003E003E0LL; + DECLARE_ASM_CONST(8, uint64_t, r15Mask)= 0x7C007C007C007C00LL; + +-DECLARE_ALIGNED(8, const uint64_t, ff_M24A) = 0x00FF0000FF0000FFLL; +-DECLARE_ALIGNED(8, const uint64_t, ff_M24B) = 0xFF0000FF0000FF00LL; +-DECLARE_ALIGNED(8, const uint64_t, ff_M24C) = 0x0000FF0000FF0000LL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_M24A) = 0x00FF0000FF0000FFLL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_M24B) = 0xFF0000FF0000FF00LL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_M24C) = 0x0000FF0000FF0000LL; + + #ifdef FAST_BGR2YV12 +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YCoeff) = 0x000000210041000DULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UCoeff) = 0x0000FFEEFFDC0038ULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2VCoeff) = 0x00000038FFD2FFF8ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2YCoeff) = 0x000000210041000DULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2UCoeff) = 0x0000FFEEFFDC0038ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2VCoeff) = 0x00000038FFD2FFF8ULL; + #else +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YCoeff) = 0x000020E540830C8BULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UCoeff) = 0x0000ED0FDAC23831ULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2VCoeff) = 0x00003831D0E6F6EAULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2YCoeff) = 0x000020E540830C8BULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2UCoeff) = 0x0000ED0FDAC23831ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2VCoeff) = 0x00003831D0E6F6EAULL; + #endif /* FAST_BGR2YV12 */ +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YOffset) = 0x1010101010101010ULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UVOffset) = 0x8080808080808080ULL; +-DECLARE_ALIGNED(8, const uint64_t, ff_w1111) = 0x0001000100010001ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2YOffset) = 0x1010101010101010ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_bgr2UVOffset) = 0x8080808080808080ULL; ++DECLARE_ALIGNED(8, const uint64_t, _ATTR_HIDDEN ff_w1111) = 0x0001000100010001ULL; + + DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toY1Coeff) = 0x0C88000040870C88ULL; + DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toY2Coeff) = 0x20DE4087000020DEULL; diff --git a/ffmpeg/build/ffmpeg-HEAD-VP8_param_mapping.diff b/ffmpeg/build/ffmpeg-HEAD-VP8_param_mapping.diff new file mode 100644 index 00000000..aeb1f712 --- /dev/null +++ b/ffmpeg/build/ffmpeg-HEAD-VP8_param_mapping.diff @@ -0,0 +1,283 @@ +diff --git a/ffpresets/libvpx-1080p.ffpreset b/ffpresets/libvpx-1080p.ffpreset +new file mode 100644 +index 0000000..19ec3ff +--- /dev/null ++++ b/ffpresets/libvpx-1080p.ffpreset +@@ -0,0 +1,18 @@ ++vcodec=libvpx ++g=120 ++rc_lookahead=16 ++quality=good ++speed=0 ++profile=1 ++qmax=51 ++qmin=11 ++slices=4 ++vb=2M ++ ++#ignored unless using -pass 2 ++maxrate=24M ++minrate=100k ++vp8flags=+altref ++arnr_max_frames=7 ++arnr_strength=5 ++arnr_type=3 +diff --git a/ffpresets/libvpx-1080p50_60.ffpreset b/ffpresets/libvpx-1080p50_60.ffpreset +new file mode 100644 +index 0000000..9cff038 +--- /dev/null ++++ b/ffpresets/libvpx-1080p50_60.ffpreset +@@ -0,0 +1,18 @@ ++vcodec=libvpx ++g=120 ++rc_lookahead=25 ++quality=good ++speed=0 ++profile=1 ++qmax=51 ++qmin=11 ++slices=4 ++vb=2M ++ ++#ignored unless using -pass 2 ++maxrate=24M ++minrate=100k ++vp8flags=+altref ++arnr_max_frames=7 ++arnr_strength=5 ++arnr_type=3 +diff --git a/ffpresets/libvpx-360p.ffpreset b/ffpresets/libvpx-360p.ffpreset +new file mode 100644 +index 0000000..d72c66d +--- /dev/null ++++ b/ffpresets/libvpx-360p.ffpreset +@@ -0,0 +1,17 @@ ++vcodec=libvpx ++g=120 ++rc_lookahead=16 ++quality=good ++speed=0 ++profile=0 ++qmax=63 ++qmin=0 ++vb=768k ++ ++#ignored unless using -pass 2 ++maxrate=1.5M ++minrate=40k ++vp8flags=+altref ++arnr_max_frames=7 ++arnr_strength=5 ++arnr_type=3 +diff --git a/ffpresets/libvpx-720p.ffpreset b/ffpresets/libvpx-720p.ffpreset +new file mode 100644 +index 0000000..3414539 +--- /dev/null ++++ b/ffpresets/libvpx-720p.ffpreset +@@ -0,0 +1,18 @@ ++vcodec=libvpx ++g=120 ++rc_lookahead=16 ++quality=good ++speed=0 ++profile=0 ++qmax=51 ++qmin=11 ++slices=4 ++vb=2M ++ ++#ignored unless using -pass 2 ++maxrate=24M ++minrate=100k ++vp8flags=+altref ++arnr_max_frames=7 ++arnr_strength=5 ++arnr_type=3 +diff --git a/ffpresets/libvpx-720p50_60.ffpreset b/ffpresets/libvpx-720p50_60.ffpreset +new file mode 100644 +index 0000000..a0a4321 +--- /dev/null ++++ b/ffpresets/libvpx-720p50_60.ffpreset +@@ -0,0 +1,18 @@ ++vcodec=libvpx ++g=120 ++rc_lookahead=25 ++quality=good ++speed=0 ++profile=0 ++qmax=51 ++qmin=11 ++slices=4 ++vb=2M ++ ++#ignored unless using -pass 2 ++maxrate=24M ++minrate=100k ++vp8flags=+altref ++arnr_max_frames=7 ++arnr_strength=5 ++arnr_type=3 +diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c +index 1cdac74..2130312 100644 +--- a/libavcodec/libvpxenc.c ++++ b/libavcodec/libvpxenc.c +@@ -30,6 +30,7 @@ + + #include "avcodec.h" + #include "libavutil/base64.h" ++#include "libavutil/opt.h" + + /** + * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h. +@@ -50,10 +51,45 @@ typedef struct VP8EncoderContext { + struct vpx_codec_ctx encoder; + struct vpx_image rawimg; + struct vpx_fixed_buf twopass_stats; +- unsigned long deadline; //i.e., RT/GOOD/BEST ++ int deadline; //i.e., RT/GOOD/BEST + struct FrameListData *coded_frame_list; ++ ++ int cpuused; ++ ++ /** ++ * VP8 specific flags, see VP8F_* below. ++ */ ++ int flags; ++#define VP8F_ERROR_RESILIENT 0x00000001 ///< Enable measures appropriate for streaming over lossy links ++#define VP8F_AUTO_ALT_REF 0x00000002 ///< Enable automatic alternate reference frame generation ++ ++ int arnr_max_frames; ++ int arnr_strength; ++ int arnr_type; + } VP8Context; + ++#define V AV_OPT_FLAG_VIDEO_PARAM ++#define E AV_OPT_FLAG_ENCODING_PARAM ++ ++static const AVOption options[]={ ++{"speed", "", offsetof(VP8Context, cpuused), FF_OPT_TYPE_INT, 3, -16, 16, V|E}, ++{"quality", "", offsetof(VP8Context, deadline), FF_OPT_TYPE_INT, VPX_DL_GOOD_QUALITY, INT_MIN, INT_MAX, V|E, "quality"}, ++{"best", NULL, 0, FF_OPT_TYPE_CONST, VPX_DL_BEST_QUALITY, INT_MIN, INT_MAX, V|E, "quality"}, ++{"good", NULL, 0, FF_OPT_TYPE_CONST, VPX_DL_GOOD_QUALITY, INT_MIN, INT_MAX, V|E, "quality"}, ++{"realtime", NULL, 0, FF_OPT_TYPE_CONST, VPX_DL_REALTIME, INT_MIN, INT_MAX, V|E, "quality"}, ++{"vp8flags", "", offsetof(VP8Context, flags), FF_OPT_TYPE_FLAGS, 0, 0, UINT_MAX, V|E, "flags"}, ++{"error_resilient", "enable error resilience", 0, FF_OPT_TYPE_CONST, VP8F_ERROR_RESILIENT, INT_MIN, INT_MAX, V|E, "flags"}, ++{"altref", "enable use of alternate reference frames (VP8/2-pass only)", 0, FF_OPT_TYPE_CONST, VP8F_AUTO_ALT_REF, INT_MIN, INT_MAX, V|E, "flags"}, ++{"arnr_max_frames", "altref noise reduction max frame count", offsetof(VP8Context, arnr_max_frames), FF_OPT_TYPE_INT, 0, 0, 15, V|E}, ++{"arnr_strength", "altref noise reduction filter strength", offsetof(VP8Context, arnr_strength), FF_OPT_TYPE_INT, 3, 0, 6, V|E}, ++{"arnr_type", "altref noise reduction filter type", offsetof(VP8Context, arnr_type), FF_OPT_TYPE_INT, 3, 1, 3, V|E}, ++{NULL} ++}; ++static const AVClass class = { "libvpx", av_default_item_name, options, LIBAVUTIL_VERSION_INT }; ++ ++#undef V ++#undef E ++ + /** String mappings for enum vp8e_enc_control_id */ + static const char *ctlidstr[] = { + [VP8E_UPD_ENTROPY] = "VP8E_UPD_ENTROPY", +@@ -205,7 +241,6 @@ static av_cold int vp8_init(AVCodecContext *avctx) + { + VP8Context *ctx = avctx->priv_data; + const struct vpx_codec_iface *iface = &vpx_codec_vp8_cx_algo; +- int cpuused = 3; + struct vpx_codec_enc_cfg enccfg; + int res; + +@@ -224,6 +259,7 @@ static av_cold int vp8_init(AVCodecContext *avctx) + enccfg.g_timebase.num = avctx->time_base.num; + enccfg.g_timebase.den = avctx->time_base.den; + enccfg.g_threads = avctx->thread_count; ++ enccfg.g_lag_in_frames= FFMIN(avctx->rc_lookahead, 25); //0-25, avoids init failure + + if (avctx->flags & CODEC_FLAG_PASS1) + enccfg.g_pass = VPX_RC_FIRST_PASS; +@@ -259,6 +295,7 @@ static av_cold int vp8_init(AVCodecContext *avctx) + enccfg.rc_buf_initial_sz = + avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate; + enccfg.rc_buf_optimal_sz = enccfg.rc_buf_sz * 5 / 6; ++ enccfg.rc_undershoot_pct = round(avctx->rc_buffer_aggressivity * 100); + + //_enc_init() will balk if kf_min_dist differs from max w/VPX_KF_AUTO + if (avctx->keyint_min == avctx->gop_size) +@@ -294,13 +331,14 @@ static av_cold int vp8_init(AVCodecContext *avctx) + enccfg.rc_twopass_stats_in = ctx->twopass_stats; + } + +- ctx->deadline = VPX_DL_GOOD_QUALITY; + /* 0-3: For non-zero values the encoder increasingly optimizes for reduced + complexity playback on low powered devices at the expense of encode + quality. */ + if (avctx->profile != FF_PROFILE_UNKNOWN) + enccfg.g_profile = avctx->profile; + ++ enccfg.g_error_resilient = ctx->flags & VP8F_ERROR_RESILIENT; ++ + dump_enc_cfg(avctx, &enccfg); + /* Construct Encoder Context */ + res = vpx_codec_enc_init(&ctx->encoder, iface, &enccfg, 0); +@@ -311,11 +349,17 @@ static av_cold int vp8_init(AVCodecContext *avctx) + + //codec control failures are currently treated only as warnings + av_log(avctx, AV_LOG_DEBUG, "vpx_codec_control\n"); +- codecctl_int(avctx, VP8E_SET_CPUUSED, cpuused); ++ codecctl_int(avctx, VP8E_SET_CPUUSED, ctx->cpuused); + codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, avctx->noise_reduction); + codecctl_int(avctx, VP8E_SET_TOKEN_PARTITIONS, av_log2(avctx->slices)); + codecctl_int(avctx, VP8E_SET_STATIC_THRESHOLD, avctx->mb_threshold); + codecctl_int(avctx, VP8E_SET_CQ_LEVEL, (int)avctx->crf); ++ codecctl_int(avctx, VP8E_SET_ENABLEAUTOALTREF, !!(ctx->flags & VP8F_AUTO_ALT_REF)); ++ codecctl_int(avctx, VP8E_SET_ARNR_MAXFRAMES, ctx->arnr_max_frames); ++ codecctl_int(avctx, VP8E_SET_ARNR_STRENGTH, ctx->arnr_strength); ++ codecctl_int(avctx, VP8E_SET_ARNR_TYPE, ctx->arnr_type); ++ ++ av_log(avctx, AV_LOG_DEBUG, "Using deadline: %d\n", ctx->deadline); + + //provide dummy value to initialize wrapper, values will be updated each _encode() + vpx_img_wrap(&ctx->rawimg, VPX_IMG_FMT_I420, avctx->width, avctx->height, 1, +@@ -511,4 +555,5 @@ AVCodec ff_libvpx_encoder = { + CODEC_CAP_DELAY, + .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"), ++ .priv_class= &class, + }; +diff --git a/libavformat/avformat.h b/libavformat/avformat.h +index 767356a..17418bc 100644 +--- a/libavformat/avformat.h ++++ b/libavformat/avformat.h +@@ -258,6 +258,9 @@ typedef struct AVFormatParameters { + #define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ + #define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ + #define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ ++#define AVFMT_TS_NONSTRICT 0x2000 /**< Format does not require strictly ++ increasing timestamps, but they must ++ still be monotonic */ + + typedef struct AVOutputFormat { + const char *name; +diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c +index 5e4552a..2c846c8 100644 +--- a/libavformat/matroskaenc.c ++++ b/libavformat/matroskaenc.c +@@ -1199,7 +1199,7 @@ AVOutputFormat ff_webm_muxer = { + mkv_write_header, + mkv_write_packet, + mkv_write_trailer, +- .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, ++ .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT, + }; + #endif + +diff --git a/libavformat/utils.c b/libavformat/utils.c +index e7ce911..bc9d38f 100644 +--- a/libavformat/utils.c ++++ b/libavformat/utils.c +@@ -2901,7 +2901,7 @@ 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); |