summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-04-24 21:29:35 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-04-24 21:48:36 +0200
commit8a68697dc66234d0a5fc50b4d67a94921c9893d1 (patch)
tree6bb656289d89c3a6653e5316c4846bb7236a3966 /libavformat
parente4253b1a4f5e296dfb41620c02e08650609e6819 (diff)
Add flag to force demuxers to sort more strictly by dts.
This enables non interleaved AVI mode for example. Players that are picky on strict interleaving can set this. Patches to only switch to non intereaved AVI mode when the index is not strictly correctly interleaved are welcome. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avformat.h1
-rw-r--r--libavformat/avidec.c2
-rw-r--r--libavformat/options.c1
3 files changed, 3 insertions, 1 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 767356a439..2f41f7263b 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -726,6 +726,7 @@ typedef struct AVFormatContext {
#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container
#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled
#define AVFMT_FLAG_RTP_HINT 0x0040 ///< Add RTP hinting to the output file
+#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
int loop_input;
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 9d657e0db6..77d068658f 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -726,7 +726,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
if(!avi->index_loaded && pb->seekable)
avi_load_index(s);
avi->index_loaded = 1;
- avi->non_interleaved |= guess_ni_flag(s);
+ avi->non_interleaved |= guess_ni_flag(s) | (s->flags & AVFMT_FLAG_SORT_DTS);
for(i=0; i<s->nb_streams; i++){
AVStream *st = s->streams[i];
if(st->nb_index_entries)
diff --git a/libavformat/options.c b/libavformat/options.c
index 214c62f9a7..0a87f2b12c 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -50,6 +50,7 @@ static const AVOption options[]={
{"noparse", "disable AVParsers, this needs nofillin too", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_NOPARSE, INT_MIN, INT_MAX, D, "fflags"},
{"igndts", "ignore dts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNDTS, INT_MIN, INT_MAX, D, "fflags"},
{"rtphint", "add rtp hinting", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_RTP_HINT, INT_MIN, INT_MAX, E, "fflags"},
+{"sortdts", "try to interleave outputted packets by dts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_SORT_DTS, INT_MIN, INT_MAX, D, "fflags"},
{"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 5*AV_TIME_BASE, 0, INT_MAX, D},
{"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
{"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, 1<<20, 0, INT_MAX, D},