summaryrefslogtreecommitdiff
path: root/libavformat/flvdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/flvdec.c')
-rw-r--r--libavformat/flvdec.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index 94159be3c4..e7ec0b107f 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -135,7 +135,7 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
char str_val[256];
int64_t *times = NULL;
int64_t *filepositions = NULL;
- int ret = 0;
+ int ret = AVERROR(ENOSYS);
int64_t initial_pos = avio_tell(ioc);
while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
@@ -173,6 +173,12 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
num_val = av_int2dbl(avio_rb64(ioc));
current_array[i] = num_val;
}
+ if (times && filepositions) {
+ // All done, exiting at a position allowing amf_parse_object
+ // to finish parsing the object
+ ret = 0;
+ break;
+ }
}
if (timeslen == fileposlen)
@@ -184,7 +190,10 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
finish:
av_freep(&times);
av_freep(&filepositions);
- avio_seek(ioc, initial_pos, SEEK_SET);
+ // If we got unexpected data, but successfully reset back to
+ // the start pos, the caller can continue parsing
+ if (ret < 0 && avio_seek(ioc, initial_pos, SEEK_SET) > 0)
+ return 0;
return ret;
}