summaryrefslogtreecommitdiff
path: root/libavformat/mlvdec.c
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2015-02-07 16:18:02 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2015-02-07 16:23:36 +0100
commitac923ed47002092e16e3fbd252f607e1d68a9106 (patch)
tree94517dd4735b1cea19522ea9e10c90aebdd9d6ea /libavformat/mlvdec.c
parentec8ec999f4a3f56ba39328106d358ee01efbc14e (diff)
lavf/mlv: Only add streams that are supposed to contain frames.
Fixes ticket #4296. Reviewed-by: Peter Ross
Diffstat (limited to 'libavformat/mlvdec.c')
-rw-r--r--libavformat/mlvdec.c23
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);