Also I can check if the stream duration values are sane, by checking that they are less than the total duration of the file.
On Fri, Jul 31, 2015 at 3:56 PM, Sasi Inguva <is...@google.com> wrote: > The syntax is the normal syntax HH:MM:SS used everywhere. > av_parse_time can parse both [-]HH:MM:SS[.m...]]] and [-]S+[.m...] > syntax for duration. So if mkvmerge outputs 1200.00 secs in duration it > would be able to parse that also . > > On Fri, Jul 31, 2015 at 3:31 PM, wm4 <nfx...@googlemail.com> wrote: > >> On Fri, 31 Jul 2015 13:00:02 -0700 >> Sasi Inguva <is...@google.com> wrote: >> >> > Signed-off-by: Sasi Inguva <is...@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) { >> >> Adding the { and } seems redundant, but personally I don't mind. >> >> > + 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)) { >> >> Who says the syntax mkvmerge writes and the syntax av_parse_time() will >> always be the same? I'm not sure if we should rely on this. >> >> > + 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); >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel