On Wed, Aug 31, 2016 at 02:35:48PM +0300, Erkki Seppälä wrote: > Instead of one track reference, allow many, and instead of > of track reference type (ie. 'cdsc'), allow many. > > In addition this patch allows client to explicitly add track references > with side packet AV_PKT_DATA_TRACK_REFERENCES containing > AVTrackReferences (which of there can many many). > > Internally MOVTrack's track references can be manipulated with helper > functions ff_mov_tref* (and is used by a later patch for reading > MOVTRefs). > > Multiple track references can be useful in particular with timed meta > data tracks, indicating the track is related to multiple other tracks. > > This information ends up in ISO media file box 'tref' as specified by > ISO/IEC 14496-12. > > Signed-off-by: Erkki Seppälä <erkki.seppala....@nokia.com> > Signed-off-by: OZOPlayer <oz...@nokia.com> > --- > libavcodec/avcodec.h | 19 +++++++- > libavformat/Makefile | 4 +- > libavformat/movenc.c | 127 > +++++++++++++++++++++++++++++++++++++++++--------- > libavformat/movenc.h | 5 +- > libavformat/movtref.c | 115 +++++++++++++++++++++++++++++++++++++++++++++ > libavformat/movtref.h | 75 +++++++++++++++++++++++++++++ [...]
> @@ -2749,8 +2757,8 @@ static int mov_write_trak_tag(AVFormatContext *s, > AVIOContext *pb, MOVMuxContext > "Not writing any edit list even though one would have > been required\n"); > } > > - if (track->tref_tag) > - mov_write_tref_tag(pb, track); > + if (track->trefs.nb_trefs) > + mov_write_tref_tag(pb, mov, track); > > if ((ret = mov_write_mdia_tag(s, pb, mov, track)) < 0) > return ret; > @@ -3487,16 +3495,82 @@ static int mov_setup_track_ids(MOVMuxContext *mov, > AVFormatContext *s) > return 0; > } > > +static int mov_tref_copy_from_side_data(MOVMuxContext *mov, MOVTrack *track, > AVFormatContext *s) > +{ > + int size; > + int ret; > + int i; > + MOVTRef *tref; > + int *ref_tracks = NULL; > + > + char *ptr = (void*) av_stream_get_side_data(track->st, > + AV_PKT_DATA_TRACK_REFERENCES, > + &size); > + > + if (!ptr) > + return 0; > + > + ret = 0; > + while (ret == 0 && size >= sizeof(AVTrackReferences)) { > + AVTrackReferences refs; > + int *track_ids; > + > + // avoid any potential alignment issues by copying the struct before > accessing it > + // to a well-aligned address > + memcpy(&refs, ptr, sizeof(refs)); > + // as well as the ids > + ref_tracks = av_malloc_array(refs.nb_tracks, sizeof(refs.tracks[0])); > + memcpy(ref_tracks, &((AVTrackReferences*) ptr)->tracks, > sizeof(refs.tracks[0]) * refs.nb_tracks); missing alloc failure check > + > + ret = ff_mov_tref_find_or_add(&track->trefs, > + MKTAG(refs.tag[0], refs.tag[1], > refs.tag[2], refs.tag[3]), > + &tref); > + if (ret < 0) > + goto error; > + > + ret = ff_mov_tref_alloc(tref, refs.nb_tracks, &track_ids); > + if (ret < 0) > + goto error; > + > + for (i = 0; i < refs.nb_tracks; i++) { > + int tref_stream_id = ref_tracks[i]; > + int stream_idx; > + for (stream_idx = 0; stream_idx < mov->nb_streams; ++stream_idx) > + if (mov->tracks[stream_idx].st && > + mov->tracks[stream_idx].st->id == tref_stream_id) { > + track_ids[i] = mov->tracks[stream_idx].track_id; > + break; > + } > + } > + > + size -= refs.next_tref_ofs; > + ptr += refs.next_tref_ofs; missing checks anything comming out of av_stream_get_side_data() could originate from an attacker and have manually choosen evil values. [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB When you are offended at any man's fault, turn to yourself and study your own failings. Then you will forget your anger. -- Epictetus
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel