[FFmpeg-devel] [PATCH] libavformat/matroskadec.c: Parse stream durations set by mkvmerge and populate them in AVStream.
Sasi Inguva
isasi at google.com
Fri Jul 31 22:00:02 CEST 2015
Signed-off-by: Sasi Inguva <isasi at google.com>
---
libavformat/matroskadec.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 1807cae..03b564e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -41,6 +41,7 @@
#include "libavutil/lzo.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
#include "libavutil/time_internal.h"
#include "libavcodec/bytestream.h"
@@ -1418,10 +1419,25 @@ static void matroska_convert_tags(AVFormatContext *s)
&chapter[j].chapter->metadata, NULL);
} else if (tags[i].target.trackuid) {
MatroskaTrack *track = matroska->tracks.elem;
- for (j = 0; j < matroska->tracks.nb_elem; j++)
- if (track[j].uid == tags[i].target.trackuid && track[j].stream)
+ for (j = 0; j < matroska->tracks.nb_elem; j++) {
+ if (track[j].uid == tags[i].target.trackuid && track[j].stream) {
+ MatroskaTag *track_tags = tags[i].tag.elem;
+ int64_t track_duration_ms;
+ for (int ind = 0; ind < tags[i].tag.nb_elem; ++ind) {
+ if (track_tags[ind].name &&
+ !av_strcasecmp(track_tags[ind].name, "duration") &&
+ track_tags[ind].string &&
+ (av_parse_time(&track_duration_ms, track_tags[ind].string, 1) == 0)) {
+ track[j].stream->duration = av_rescale_q(track_duration_ms,
+ (AVRational){ 1, 1000000 },
+ track[j].stream->time_base);
+ }
+ }
+
matroska_convert_tag(s, &tags[i].tag,
&track[j].stream->metadata, NULL);
+ }
+ }
} else {
matroska_convert_tag(s, &tags[i].tag, &s->metadata,
tags[i].target.type);
--
2.5.0.rc2.392.g76e840b
More information about the ffmpeg-devel
mailing list