summaryrefslogtreecommitdiff
path: root/libavformat/concatdec.c
diff options
context:
space:
mode:
authorraymondzheng1412@gmail.com <raymondzheng1412@gmail.com>2016-09-23 11:48:40 +0800
committerNicolas George <george@nsup.org>2016-09-28 20:31:22 +0200
commit2366efce3cd5be7c6aeafa24ae9a3f550b4518c6 (patch)
tree49ed860da51e5a94e111fd5dccadfe652f6d2079 /libavformat/concatdec.c
parent13dd5edb88c9ecfc1d01899f5b36453051e02d98 (diff)
avformat/concatdec: don't call open_file when seek position within a file
Diffstat (limited to 'libavformat/concatdec.c')
-rw-r--r--libavformat/concatdec.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index b3a430e5a0..5cc239a1b6 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -689,7 +689,7 @@ static int try_seek(AVFormatContext *avf, int stream,
}
static int real_seek(AVFormatContext *avf, int stream,
- int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
+ int64_t min_ts, int64_t ts, int64_t max_ts, int flags, AVFormatContext *cur_avf)
{
ConcatContext *cat = avf->priv_data;
int ret, left, right;
@@ -711,13 +711,19 @@ static int real_seek(AVFormatContext *avf, int stream,
left = mid;
}
- if ((ret = open_file(avf, left)) < 0)
- return ret;
+ if (cat->cur_file != &cat->files[left]) {
+ if ((ret = open_file(avf, left)) < 0)
+ return ret;
+ } else {
+ cat->avf = cur_avf;
+ }
ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
if (ret < 0 &&
left < cat->nb_files - 1 &&
cat->files[left + 1].start_time < max_ts) {
+ if (cat->cur_file == &cat->files[left])
+ cat->avf = NULL;
if ((ret = open_file(avf, left + 1)) < 0)
return ret;
ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
@@ -738,13 +744,17 @@ static int concat_seek(AVFormatContext *avf, int stream,
if (flags & (AVSEEK_FLAG_BYTE | AVSEEK_FLAG_FRAME))
return AVERROR(ENOSYS);
cat->avf = NULL;
- if ((ret = real_seek(avf, stream, min_ts, ts, max_ts, flags)) < 0) {
- if (cat->avf)
- avformat_close_input(&cat->avf);
+ if ((ret = real_seek(avf, stream, min_ts, ts, max_ts, flags, cur_avf_saved)) < 0) {
+ if (cat->cur_file != cur_file_saved) {
+ if (cat->avf)
+ avformat_close_input(&cat->avf);
+ }
cat->avf = cur_avf_saved;
cat->cur_file = cur_file_saved;
} else {
- avformat_close_input(&cur_avf_saved);
+ if (cat->cur_file != cur_file_saved) {
+ avformat_close_input(&cur_avf_saved);
+ }
cat->eof = 0;
}
return ret;