diff options
author | Xinzheng Zhang <zhangxzheng@gmail.com> | 2016-07-27 12:21:25 +0800 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-08-01 17:29:14 +0200 |
commit | b4922daeadd22fd4fe825747ab2acc9574daf99d (patch) | |
tree | 5f4dcdd9cc08c5c672df22fc33f821d9b87e5ed4 /libavformat | |
parent | 88e3e6b94305839ca101e8bf2c4dd96700166c2f (diff) | |
download | ffmpeg-b4922daeadd22fd4fe825747ab2acc9574daf99d.tar.gz |
avformat/flvdec: parse keyframe before a\v stream was created add_keyframes_index() when stream created or keyframe parsed
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit ad14aab3b4f88cdb6c2a3f8877c578e5a8042f1d)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/flvdec.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 633cad0f88..0afeba58ba 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -128,6 +128,7 @@ static void add_keyframes_index(AVFormatContext *s) static AVStream *create_stream(AVFormatContext *s, int codec_type) { + FLVContext *flv = s->priv_data; AVStream *st = avformat_new_stream(s, NULL); if (!st) return NULL; @@ -138,6 +139,8 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type) s->ctx_flags &= ~AVFMTCTX_NOHEADER; avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ + flv->last_keyframe_stream_index = s->nb_streams - 1; + add_keyframes_index(s); return st; } @@ -413,7 +416,6 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t m flv->keyframe_count = timeslen; times = NULL; filepositions = NULL; - add_keyframes_index(s); } else { invalid: av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); @@ -455,12 +457,14 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, } break; case AMF_DATA_TYPE_OBJECT: - if ((vstream || astream) && key && + if (key && ioc->seekable && !strcmp(KEYFRAMES_TAG, key) && depth == 1) if (parse_keyframes_index(s, ioc, max_pos) < 0) av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n"); + else + add_keyframes_index(s); while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) if (amf_parse_object(s, astream, vstream, str_val, max_pos, |