Skip to content

Commit ec8bacd

Browse files
committed
Fix live catalog initData fallback
1 parent c6a5bbb commit ec8bacd

2 files changed

Lines changed: 33 additions & 6 deletions

File tree

src/cmsf_packager.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,12 +659,7 @@ LiveCatalog build_live_catalog(const std::vector<TrackDescription>& tracks,
659659
std::map<std::string, std::string> init_data_by_track;
660660
for (std::size_t index = 0; index < tracks.size(); ++index) {
661661
const auto& track = tracks[index];
662-
std::vector<std::uint8_t> track_init;
663-
try {
664-
track_init = build_track_specific_init_segment(init_segment, track, index);
665-
} catch (...) {
666-
track_init = std::vector<std::uint8_t>(init_segment.begin(), init_segment.end());
667-
}
662+
std::vector<std::uint8_t> track_init = build_track_specific_init_segment(init_segment, track, index);
668663
init_data_by_track.emplace(track.track_name, local_base64_encode(track_init));
669664
result.track_initializations.push_back({
670665
.track_name = track.track_name,

tests/cmaf_segmenter_test.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,38 @@ int main() {
614614
ok &= expect(audio_init_boxes[0].type == "ftyp" && audio_init_boxes[1].type == "moov",
615615
"expected audio initData to contain ftyp and moov boxes");
616616

617+
const auto live_catalog = build_live_catalog(multitrack_segmented.tracks, multitrack_init_bytes, true);
618+
const std::string live_catalog_text(live_catalog.catalog_payload.begin(), live_catalog.catalog_payload.end());
619+
const std::string live_video_init_data = catalog_init_data(live_catalog_text, "vide_1");
620+
const std::string live_audio_init_data = catalog_init_data(live_catalog_text, "soun_2");
621+
const auto live_video_init_bytes = base64_decode(live_video_init_data);
622+
const auto live_audio_init_bytes = base64_decode(live_audio_init_data);
623+
const auto live_video_init_tracks = extract_tracks(parse_mp4_boxes(live_video_init_bytes), live_video_init_bytes);
624+
const auto live_audio_init_tracks = extract_tracks(parse_mp4_boxes(live_audio_init_bytes), live_audio_init_bytes);
625+
ok &= expect(live_catalog.track_initializations.size() == 2, "expected live catalog to expose per-track init payloads");
626+
ok &= expect_contains(live_catalog_text, "\"isLive\":true", "expected live catalog isLive flag");
627+
ok &= expect(!live_video_init_data.empty(), "expected live video initData in catalog");
628+
ok &= expect(!live_audio_init_data.empty(), "expected live audio initData in catalog");
629+
ok &= expect(live_video_init_data != live_audio_init_data, "expected live per-track initData entries to differ");
630+
ok &= expect(live_catalog.track_initializations[0].init_segment == live_video_init_bytes,
631+
"expected live video init segment to match catalog initData");
632+
ok &= expect(live_catalog.track_initializations[1].init_segment == live_audio_init_bytes,
633+
"expected live audio init segment to match catalog initData");
634+
ok &= expect(live_video_init_tracks.size() == 1, "expected one track in live video init segment");
635+
ok &= expect(live_audio_init_tracks.size() == 1, "expected one track in live audio init segment");
636+
ok &= expect(live_video_init_tracks.front().codec == "avc1.64000C", "expected live avc1-only init segment");
637+
ok &= expect(live_audio_init_tracks.front().codec == "mp4a.40.2", "expected live mp4a-only init segment");
638+
639+
bool live_catalog_rejected_bad_track = false;
640+
try {
641+
std::vector<TrackDescription> bad_tracks = multitrack_segmented.tracks;
642+
bad_tracks.front().track_id = 99;
643+
(void)build_live_catalog(bad_tracks, multitrack_init_bytes, true);
644+
} catch (...) {
645+
live_catalog_rejected_bad_track = true;
646+
}
647+
ok &= expect(live_catalog_rejected_bad_track, "expected live catalog to reject missing track init data");
648+
617649
const auto hevc_main_bytes = make_hevc_init_mp4(0x01, 0x60000000, {0xB0, 0x00, 0x00, 0x00, 0x00, 0x00}, 90);
618650
const auto hevc_high_bytes = make_hevc_init_mp4(0x22, 0x40000000, {0xB0, 0x00, 0x00, 0x00, 0x00, 0x00}, 150);
619651
const auto hevc_main_tracks = extract_tracks(parse_mp4_boxes(hevc_main_bytes), hevc_main_bytes);

0 commit comments

Comments
 (0)