On Fri, Jun 10, 2016 at 1:23 PM, Anton Khirnov <an...@khirnov.net> wrote: > Quoting Vittorio Giovara (2016-06-10 16:52:39) >> On Fri, Jun 10, 2016 at 4:56 AM, Anton Khirnov <an...@khirnov.net> 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 <vittorio.giov...@gmail.com> >> >> --- >> >> 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.
There also is some overhead in packet_read and packet_seek, but if dropping the condition does make the code a little simpler. I'll resend with this change then. -- Vittorio _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel