|
|
@@ -797,6 +797,7 @@ static int mov_write_dfla_tag(AVIOContext *pb, MOVTrack *track) |
|
|
static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) |
|
|
static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) |
|
|
{ |
|
|
{ |
|
|
int64_t pos = avio_tell(pb); |
|
|
int64_t pos = avio_tell(pb); |
|
|
|
|
|
int channels, channel_map; |
|
|
avio_wb32(pb, 0); |
|
|
avio_wb32(pb, 0); |
|
|
ffio_wfourcc(pb, "dOps"); |
|
|
ffio_wfourcc(pb, "dOps"); |
|
|
avio_w8(pb, 0); /* Version */ |
|
|
avio_w8(pb, 0); /* Version */ |
|
|
@@ -807,12 +808,22 @@ static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra |
|
|
/* extradata contains an Ogg OpusHead, other than byte-ordering and |
|
|
/* extradata contains an Ogg OpusHead, other than byte-ordering and |
|
|
OpusHead's preceeding magic/version, OpusSpecificBox is currently |
|
|
OpusHead's preceeding magic/version, OpusSpecificBox is currently |
|
|
identical. */ |
|
|
identical. */ |
|
|
avio_w8(pb, AV_RB8(track->par->extradata + 9)); /* OuputChannelCount */ |
|
|
|
|
|
|
|
|
channels = AV_RB8(track->par->extradata + 9); |
|
|
|
|
|
channel_map = AV_RB8(track->par->extradata + 18); |
|
|
|
|
|
|
|
|
|
|
|
avio_w8(pb, channels); /* OuputChannelCount */ |
|
|
avio_wb16(pb, AV_RL16(track->par->extradata + 10)); /* PreSkip */ |
|
|
avio_wb16(pb, AV_RL16(track->par->extradata + 10)); /* PreSkip */ |
|
|
avio_wb32(pb, AV_RL32(track->par->extradata + 12)); /* InputSampleRate */ |
|
|
avio_wb32(pb, AV_RL32(track->par->extradata + 12)); /* InputSampleRate */ |
|
|
avio_wb16(pb, AV_RL16(track->par->extradata + 16)); /* OutputGain */ |
|
|
avio_wb16(pb, AV_RL16(track->par->extradata + 16)); /* OutputGain */ |
|
|
|
|
|
avio_w8(pb, channel_map); /* ChannelMappingFamily */ |
|
|
/* Write the rest of the header out without byte-swapping. */ |
|
|
/* Write the rest of the header out without byte-swapping. */ |
|
|
avio_write(pb, track->par->extradata + 18, track->par->extradata_size - 18); |
|
|
|
|
|
|
|
|
if (channel_map) { |
|
|
|
|
|
if (track->par->extradata_size < 21 + channels) { |
|
|
|
|
|
av_log(s, AV_LOG_ERROR, "invalid extradata size\n"); |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
} |
|
|
|
|
|
avio_write(pb, track->par->extradata + 19, 2 + channels); /* ChannelMappingTable */ |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return update_size(pb, pos); |
|
|
return update_size(pb, pos); |
|
|
} |
|
|
} |
|
|
|