mirror of https://git.ffmpeg.org/ffmpeg.git
flvdec: Allow parsing keyframes metadata without seeking in most cases
Stop the avio input at a point where amf_parse_object can continue parsing the end of the object seamlessly, when all data is available. If unsupported data is encountered within the keyframes object, try seeking to the start of the keyframes object - if the seek back was successful, the caller can continue parsing the rest of the AMF data. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
f3e3f28e80
commit
578d6861a7
|
@ -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(×);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue