diff --git a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/bear-320x240-vp9-opus-audio.mp4 b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/bear-320x240-vp9-opus-audio.mp4 index 646ae1c329..db1cc3a4ae 100644 Binary files a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/bear-320x240-vp9-opus-audio.mp4 and b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/bear-320x240-vp9-opus-audio.mp4 differ diff --git a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/decrypted-bear-320x240-vp9-opus-audio-0.mp4 b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/decrypted-bear-320x240-vp9-opus-audio-0.mp4 index 54a091c00c..4332c1ac88 100644 Binary files a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/decrypted-bear-320x240-vp9-opus-audio-0.mp4 and b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/decrypted-bear-320x240-vp9-opus-audio-0.mp4 differ diff --git a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/output.mpd b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/output.mpd index 159d99300f..fcf3d57d14 100644 --- a/packager/app/test/testdata/opus-vp9-mp4-with-encryption/output.mpd +++ b/packager/app/test/testdata/opus-vp9-mp4-with-encryption/output.mpd @@ -10,8 +10,8 @@ bear-320x240-vp9-opus-audio.mp4 - - + + diff --git a/packager/media/formats/mp4/mp4_muxer.cc b/packager/media/formats/mp4/mp4_muxer.cc index 35202a4a01..44f9ebfca2 100644 --- a/packager/media/formats/mp4/mp4_muxer.cc +++ b/packager/media/formats/mp4/mp4_muxer.cc @@ -135,6 +135,16 @@ void GenerateSinf(FourCC old_type, track_encryption.default_kid = encryption_config.key_id; } +// The roll distance is expressed in sample units and always takes negative +// values. +int16_t GetRollDistance(uint64_t seek_preroll_ns, uint32_t sampling_frequency) { + const double kNanosecondsPerSecond = 1000000000; + const double preroll_in_samples = + seek_preroll_ns / kNanosecondsPerSecond * sampling_frequency; + // Round to closest integer. + return -static_cast(preroll_in_samples + 0.5); +} + } // namespace MP4Muxer::MP4Muxer(const MuxerOptions& options) : Muxer(options) {} @@ -497,34 +507,16 @@ bool MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info, entry.format = FOURCC_enca; } - // Opus requires at least one sample group description box and at least one - // sample to group box with grouping type 'roll' within sample table box. - if (audio_info->codec() == kCodecOpus) { + if (audio_info->seek_preroll_ns() > 0) { sample_table.sample_group_descriptions.resize(1); SampleGroupDescription& sample_group_description = sample_table.sample_group_descriptions.back(); sample_group_description.grouping_type = FOURCC_roll; sample_group_description.audio_roll_recovery_entries.resize(1); - // The roll distance is expressed in sample units and always takes negative - // values. - const uint64_t kNanosecondsPerSecond = 1000000000ull; sample_group_description.audio_roll_recovery_entries[0].roll_distance = - (0 - (audio_info->seek_preroll_ns() * audio.samplerate + - kNanosecondsPerSecond / 2)) / - kNanosecondsPerSecond; - - sample_table.sample_to_groups.resize(1); - SampleToGroup& sample_to_group = sample_table.sample_to_groups.back(); - sample_to_group.grouping_type = FOURCC_roll; - - sample_to_group.entries.resize(1); - SampleToGroupEntry& sample_to_group_entry = sample_to_group.entries.back(); - // All samples are in track fragments. - sample_to_group_entry.sample_count = 0; - sample_to_group_entry.group_description_index = - SampleToGroupEntry::kTrackGroupDescriptionIndexBase + 1; - } else if (audio_info->seek_preroll_ns() != 0) { - LOG(WARNING) << "Unexpected seek preroll for codec " << audio_info->codec(); + GetRollDistance(audio_info->seek_preroll_ns(), audio.samplerate); + // sample to group box is not allowed in the init segment per CMAF + // specification. It is put in the fragment instead. } return true; }