diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c index f0c746ace2..e9a3995705 100644 --- a/libavformat/asfdec.c +++ b/libavformat/asfdec.c @@ -1299,4 +1299,5 @@ AVInputFormat ff_asf_demuxer = { asf_read_close, asf_read_seek, asf_read_pts, + .flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH, }; diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 732756222e..aca246d95a 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -258,6 +258,8 @@ 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_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 */ typedef struct AVOutputFormat { const char *name; diff --git a/libavformat/utils.c b/libavformat/utils.c index 67aa76ad75..ad226016aa 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1713,10 +1713,12 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int f return 0; } - if(s->iformat->read_timestamp) + if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) return av_seek_frame_binary(s, stream_index, timestamp, flags); - else + else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) return av_seek_frame_generic(s, stream_index, timestamp, flags); + else + return -1; } int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)