2012/2/21 Martin Storsjö <[email protected]>

> For video, mark the first sample in a trun which doesn't have the
> sample-is-non-sync-sample flag set as a keyframe.
>
> In particular, the "sample does not depend on other samples" flag
> isn't enough to make it a keyframe, since later frames still can
> reference frames prior to that one (the flag only says that that
> particular frame doesn't depend on other frames).
>
> This fixes bug 215.
> ---
>  libavformat/mov.c |   13 +++++++++----
>  1 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index fbc7223..2242ba7 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -2218,7 +2218,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext
> *pb, MOVAtom atom)
>     int64_t dts;
>     int data_offset = 0;
>     unsigned entries, first_sample_flags = frag->flags;
> -    int flags, distance, i;
> +    int flags, distance, i, found_keyframe = 0;
>
>     for (i = 0; i < c->fc->nb_streams; i++) {
>         if (c->fc->streams[i]->id == frag->track_id) {
> @@ -2272,7 +2272,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext
> *pb, MOVAtom atom)
>         unsigned sample_size = frag->size;
>         int sample_flags = i ? frag->flags : first_sample_flags;
>         unsigned sample_duration = frag->duration;
> -        int keyframe;
> +        int keyframe = 0;
>
>         if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration =
> avio_rb32(pb);
>         if (flags & MOV_TRUN_SAMPLE_SIZE)     sample_size     =
> avio_rb32(pb);
> @@ -2281,8 +2281,13 @@ static int mov_read_trun(MOVContext *c, AVIOContext
> *pb, MOVAtom atom)
>         sc->ctts_data[sc->ctts_count].duration = (flags &
> MOV_TRUN_SAMPLE_CTS) ?
>                                                   avio_rb32(pb) : 0;
>         sc->ctts_count++;
> -        if ((keyframe = st->codec->codec_type == AVMEDIA_TYPE_AUDIO ||
> -             (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS && !i && !(sample_flags
> & ~MOV_FRAG_SAMPLE_FLAG_DEGRADATION_PRIORITY_MASK)) || sample_flags &
> MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO))
> +        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
> +            keyframe = 1;
> +        else if (!found_keyframe)
> +            keyframe = found_keyframe =
> +                !(sample_flags & (MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC |
> +                                  MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
> +        if (keyframe)
>             distance = 0;
>         av_add_index_entry(st, offset, dts, sample_size, distance,
>                            keyframe ? AVINDEX_KEYFRAME : 0);
> --
> 1.7.3.1
>
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
>

Looks good to me.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to