On 04/07/14 16:54, Luca Barbato wrote: > The specification requires at most 1 track enable per alternate group. > --- > libavformat/movenc.c | 21 ++++++++++++++++----- > libavformat/movenc.h | 2 ++ > 2 files changed, 18 insertions(+), 5 deletions(-) > > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > index f5c36fc..b0c380e 100644 > --- a/libavformat/movenc.c > +++ b/libavformat/movenc.c > @@ -1459,11 +1459,20 @@ static int mov_write_mdia_tag(AVIOContext *pb, > MOVTrack *track) > return update_size(pb, pos); > } > > -static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st) > +static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, > + MOVTrack *track, AVStream *st) > { > int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE, > track->timescale, AV_ROUND_UP); > int version = duration < INT32_MAX ? 0 : 1; > + int group = 0; > + > + if (st) { > + if (mov->per_stream_grouping) > + group = st->index; > + else > + group = st->codec->codec_type; > + } > > if (track->mode == MODE_ISM) > version = 1; > @@ -1491,7 +1500,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack > *track, AVStream *st) > avio_wb32(pb, 0); /* reserved */ > avio_wb32(pb, 0); /* reserved */ > avio_wb16(pb, 0); /* layer */ > - avio_wb16(pb, st ? st->codec->codec_type : 0); /* alternate group) */ > + avio_wb16(pb, group); /* alternate group) */ > /* Volume, only for audio */ > if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) > avio_wb16(pb, 0x0100); > @@ -1665,7 +1674,7 @@ static int mov_write_trak_tag(AVIOContext *pb, > MOVMuxContext *mov, > int64_t pos = avio_tell(pb); > avio_wb32(pb, 0); /* size */ > ffio_wfourcc(pb, "trak"); > - mov_write_tkhd_tag(pb, track, st); > + mov_write_tkhd_tag(pb, mov, track, st); > if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS || > (track->entry && track->cluster[0].dts) || > is_clcp_track(track)) { > @@ -3164,7 +3173,7 @@ static void enable_tracks(AVFormatContext *s) > { > MOVMuxContext *mov = s->priv_data; > int i; > - uint8_t enabled[AVMEDIA_TYPE_NB]; > + int enabled[AVMEDIA_TYPE_NB]; > int first[AVMEDIA_TYPE_NB]; > > for (i = 0; i < AVMEDIA_TYPE_NB; i++) { > @@ -3183,7 +3192,7 @@ static void enable_tracks(AVFormatContext *s) > first[st->codec->codec_type] = i; > if (st->disposition & AV_DISPOSITION_DEFAULT) { > mov->tracks[i].flags |= MOV_TRACK_ENABLED; > - enabled[st->codec->codec_type] = 1; > + enabled[st->codec->codec_type]++; > } > } > > @@ -3192,6 +3201,8 @@ static void enable_tracks(AVFormatContext *s) > case AVMEDIA_TYPE_VIDEO: > case AVMEDIA_TYPE_AUDIO: > case AVMEDIA_TYPE_SUBTITLE: > + if (enabled[i] > 1) > + mov->per_stream_grouping = 1; > if (!enabled[i] && first[i] >= 0) > mov->tracks[first[i]].flags |= MOV_TRACK_ENABLED; > break; > diff --git a/libavformat/movenc.h b/libavformat/movenc.h > index 3410080..35be781 100644 > --- a/libavformat/movenc.h > +++ b/libavformat/movenc.h > @@ -162,6 +162,8 @@ typedef struct MOVMuxContext { > int64_t reserved_moov_pos; > > char *major_brand; > + > + int per_stream_grouping; > } MOVMuxContext; > > #define FF_MOV_FLAG_RTP_HINT 1 >
ping. _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel