mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-12 02:19:35 +00:00
mov: Do not group tracks if more than one is enabled per type
The specification requires at most 1 track enabled per alternate group.
This commit is contained in:
parent
458e7c9483
commit
f90729699d
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user