[FFmpeg-devel] [PATCH] libavformat/matroskadec.c: Parse stream durations set by mkvmerge and populate them in AVStream.

Sasi Inguva isasi at google.com
Sat Aug 1 20:11:14 CEST 2015


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 <isasi at 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 <nfxjfg at googlemail.com> wrote:
>
>> On Fri, 31 Jul 2015 13:00:02 -0700
>> Sasi Inguva <isasi at google.com> wrote:
>>
>> > 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) {
>>
>> 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 at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>
>


More information about the ffmpeg-devel mailing list