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

wm4 nfxjfg at googlemail.com
Sat Aug 1 00:31:35 CEST 2015


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);



More information about the ffmpeg-devel mailing list