Commit f9072969 authored by Luca Barbato's avatar Luca Barbato

mov: Do not group tracks if more than one is enabled per type

The specification requires at most 1 track enabled per alternate group.
parent 458e7c94
...@@ -1459,11 +1459,20 @@ static int mov_write_mdia_tag(AVIOContext *pb, MOVTrack *track) ...@@ -1459,11 +1459,20 @@ static int mov_write_mdia_tag(AVIOContext *pb, MOVTrack *track)
return update_size(pb, pos); 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, int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE,
track->timescale, AV_ROUND_UP); track->timescale, AV_ROUND_UP);
int version = duration < INT32_MAX ? 0 : 1; 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) if (track->mode == MODE_ISM)
version = 1; version = 1;
...@@ -1491,7 +1500,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st) ...@@ -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_wb32(pb, 0); /* reserved */ avio_wb32(pb, 0); /* reserved */
avio_wb16(pb, 0); /* layer */ 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 */ /* Volume, only for audio */
if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO)
avio_wb16(pb, 0x0100); avio_wb16(pb, 0x0100);
...@@ -1665,7 +1674,7 @@ static int mov_write_trak_tag(AVIOContext *pb, MOVMuxContext *mov, ...@@ -1665,7 +1674,7 @@ static int mov_write_trak_tag(AVIOContext *pb, MOVMuxContext *mov,
int64_t pos = avio_tell(pb); int64_t pos = avio_tell(pb);
avio_wb32(pb, 0); /* size */ avio_wb32(pb, 0); /* size */
ffio_wfourcc(pb, "trak"); 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 || if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS ||
(track->entry && track->cluster[0].dts) || (track->entry && track->cluster[0].dts) ||
is_clcp_track(track)) { is_clcp_track(track)) {
...@@ -3164,7 +3173,7 @@ static void enable_tracks(AVFormatContext *s) ...@@ -3164,7 +3173,7 @@ static void enable_tracks(AVFormatContext *s)
{ {
MOVMuxContext *mov = s->priv_data; MOVMuxContext *mov = s->priv_data;
int i; int i;
uint8_t enabled[AVMEDIA_TYPE_NB]; int enabled[AVMEDIA_TYPE_NB];
int first[AVMEDIA_TYPE_NB]; int first[AVMEDIA_TYPE_NB];
for (i = 0; i < AVMEDIA_TYPE_NB; i++) { for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
...@@ -3183,7 +3192,7 @@ static void enable_tracks(AVFormatContext *s) ...@@ -3183,7 +3192,7 @@ static void enable_tracks(AVFormatContext *s)
first[st->codec->codec_type] = i; first[st->codec->codec_type] = i;
if (st->disposition & AV_DISPOSITION_DEFAULT) { if (st->disposition & AV_DISPOSITION_DEFAULT) {
mov->tracks[i].flags |= MOV_TRACK_ENABLED; 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) ...@@ -3192,6 +3201,8 @@ static void enable_tracks(AVFormatContext *s)
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_AUDIO:
case AVMEDIA_TYPE_SUBTITLE: case AVMEDIA_TYPE_SUBTITLE:
if (enabled[i] > 1)
mov->per_stream_grouping = 1;
if (!enabled[i] && first[i] >= 0) if (!enabled[i] && first[i] >= 0)
mov->tracks[first[i]].flags |= MOV_TRACK_ENABLED; mov->tracks[first[i]].flags |= MOV_TRACK_ENABLED;
break; break;
......
...@@ -162,6 +162,8 @@ typedef struct MOVMuxContext { ...@@ -162,6 +162,8 @@ typedef struct MOVMuxContext {
int64_t reserved_moov_pos; int64_t reserved_moov_pos;
char *major_brand; char *major_brand;
int per_stream_grouping;
} MOVMuxContext; } MOVMuxContext;
#define FF_MOV_FLAG_RTP_HINT 1 #define FF_MOV_FLAG_RTP_HINT 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment