Quoting Vittorio Giovara (2016-06-10 16:52:39)
> On Fri, Jun 10, 2016 at 4:56 AM, Anton Khirnov <[email protected]> wrote:
> > Quoting Vittorio Giovara (2016-06-10 00:55:18)
> >> Store data from each stsd in a separate extradata buffer, keep track of
> >> the stsc index for read and seek operations, switch buffers when the
> >> index differs. Decoder is notified with an AV_PKT_DATA_NEW_EXTRADATA
> >> packet side data.
> >>
> >> Since H264 supports this notification, and can be reset midstream, enable
> >> this feature only for multiple avcC's. All other stsd types (such as
> >> hvc1 and hev1) need decoder-side changes, so they are left disabled for
> >> now.
> >>
> >> Signed-off-by: Vittorio Giovara <[email protected]>
> >> ---
> >> Only modified to avoid caching a zero-sized extradata.
> >> Vittorio
> >>
> >>  libavformat/isom.h |   8 ++++
> >>  libavformat/mov.c  | 123 
> >> ++++++++++++++++++++++++++++++++++++++++++++++++++---
> >>  2 files changed, 125 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/libavformat/isom.h b/libavformat/isom.h
> >> index aec623b..75aa70b 100644
> >> --- a/libavformat/isom.h
> >> +++ b/libavformat/isom.h
> >> @@ -105,6 +105,8 @@ typedef struct MOVStreamContext {
> >>      MOVStts *ctts_data;
> >>      unsigned int stsc_count;
> >>      MOVStsc *stsc_data;
> >> +    int stsc_index;
> >> +    int stsc_sample;
> >>      unsigned int stps_count;
> >>      unsigned *stps_data;  ///< partial sync sample for mpeg-2 open gop
> >>      int ctts_index;
> >> @@ -137,6 +139,12 @@ typedef struct MOVStreamContext {
> >>      unsigned int rap_group_count;
> >>      MOVSbgp *rap_group;
> >>
> >> +    /** extradata array (and size) for multiple stsd */
> >> +    uint8_t **extradata;
> >> +    int *extradata_size;
> >> +    int last_stsd_index;
> >> +    int stsd_count;
> >
> > Nit: nb_stsd would be more consistent
> >
> >> +
> >>      int32_t *display_matrix;
> >>  } MOVStreamContext;
> >>
> >> diff --git a/libavformat/mov.c b/libavformat/mov.c
> >> index 125919f..9e2d0e2 100644
> >> --- a/libavformat/mov.c
> >> +++ b/libavformat/mov.c
> >> @@ -1771,8 +1771,7 @@ static int mov_skip_multiple_stsd(MOVContext *c, 
> >> AVIOContext *pb,
> >>      int video_codec_id = ff_codec_get_id(ff_codec_movvideo_tags, format);
> >>
> >>      if (codec_tag &&
> >> -        (codec_tag == AV_RL32("avc1") ||
> >> -         codec_tag == AV_RL32("hvc1") ||
> >> +        (codec_tag == AV_RL32("hvc1") ||
> >>           codec_tag == AV_RL32("hev1") ||
> >>           (codec_tag != format &&
> >>            (c->fc->video_codec_id ? video_codec_id != c->fc->video_codec_id
> >> @@ -1857,6 +1856,20 @@ int ff_mov_read_stsd_entries(MOVContext *c, 
> >> AVIOContext *pb, int entries)
> >>                  return ret;
> >>          } else if (a.size > 0)
> >>              avio_skip(pb, a.size);
> >> +
> >> +        if (sc->stsd_count > 1) {
> >
> > Are all those checks really necessary? Naively I'd expect that
> > stsd_count==1 is not really any different from stsd_count=n for any
> > larger n.
> 
> I just wanted to avoid needlessly allocating the extra layers and
> copying data around.

What data would be copied around? There might be some tiny additional
overhead in read_header, but nothing otherwise.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to