diff options
author | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2015-02-07 18:18:02 +0300 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2015-02-07 18:23:36 +0300 |
commit | ac923ed47002092e16e3fbd252f607e1d68a9106 (patch) | |
tree | 94517dd4735b1cea19522ea9e10c90aebdd9d6ea /libavformat | |
parent | ec8ec999f4a3f56ba39328106d358ee01efbc14e (diff) |
lavf/mlv: Only add streams that are supposed to contain frames.
Fixes ticket #4296.
Reviewed-by: Peter Ross
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mlvdec.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/libavformat/mlvdec.c b/libavformat/mlvdec.c index d0c51ae114..9d821bb7b3 100644 --- a/libavformat/mlvdec.c +++ b/libavformat/mlvdec.c @@ -242,6 +242,7 @@ static int read_header(AVFormatContext *avctx) AVIOContext *pb = avctx->pb; AVStream *vst = NULL, *ast = NULL; int size, ret; + unsigned nb_video_frames, nb_audio_frames; uint64_t guid; char guidstr[32]; @@ -259,11 +260,17 @@ static int read_header(AVFormatContext *avctx) avio_skip(pb, 8); //fileNum, fileCount, fileFlags mlv->class[0] = avio_rl16(pb); - if (mlv->class[0]) { + mlv->class[1] = avio_rl16(pb); + + nb_video_frames = avio_rl32(pb); + nb_audio_frames = avio_rl32(pb); + + if (nb_video_frames && mlv->class[0]) { vst = avformat_new_stream(avctx, NULL); if (!vst) return AVERROR(ENOMEM); vst->id = 0; + vst->nb_frames = nb_video_frames; if ((mlv->class[0] & (MLV_CLASS_FLAG_DELTA|MLV_CLASS_FLAG_LZMA))) avpriv_request_sample(avctx, "compression"); vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; @@ -289,12 +296,12 @@ static int read_header(AVFormatContext *avctx) } } - mlv->class[1] = avio_rl16(pb); - if (mlv->class[1]) { + if (nb_audio_frames && mlv->class[1]) { ast = avformat_new_stream(avctx, NULL); if (!ast) return AVERROR(ENOMEM); ast->id = 1; + ast->nb_frames = nb_audio_frames; if ((mlv->class[1] & MLV_CLASS_FLAG_LZMA)) avpriv_request_sample(avctx, "compression"); if ((mlv->class[1] & ~MLV_CLASS_FLAG_LZMA) != MLV_AUDIO_CLASS_WAV) @@ -304,16 +311,6 @@ static int read_header(AVFormatContext *avctx) avpriv_set_pts_info(ast, 33, 1, ast->codec->sample_rate); } - if (vst) - vst->nb_frames = avio_rl32(pb); - else - avio_skip(pb, 4); - - if (ast) - ast->nb_frames = avio_rl32(pb); - else - avio_skip(pb, 4); - if (vst) { AVRational framerate; framerate.num = avio_rl32(pb); |