Skip to content

Commit 5332c4d

Browse files
committed
Added segmenter code for turning an ADM document into S-ADM frames.
1 parent a5766c7 commit 5332c4d

19 files changed

+1479
-0
lines changed

examples/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ target_link_libraries(create_sadm_from_scratch PRIVATE adm)
2626

2727
add_executable(parse_sadm_xml parse_sadm_xml.cpp)
2828
target_link_libraries(parse_sadm_xml PRIVATE adm)
29+
30+
add_executable(adm_segmenter adm_segmenter.cpp)
31+
target_link_libraries(adm_segmenter PRIVATE adm)

examples/adm_segmenter.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include <iostream>
2+
#include <fstream>
3+
#include <sstream>
4+
#include "adm/common_definitions.hpp"
5+
#include "adm/parse.hpp"
6+
#include "adm/write.hpp"
7+
#include "adm/segmenter.hpp"
8+
#include "adm/utilities/id_assignment.hpp"
9+
#include "adm/utilities/object_creation.hpp"
10+
11+
using namespace adm;
12+
13+
std::string genSadmFilename(std::string pref, uint32_t ind);
14+
TrackUidList buildTrackList(std::shared_ptr<Document> document);
15+
16+
int main(int argc, char const *argv[]) {
17+
std::string fout_pre = "/tmp/segmenter_output";
18+
int size = 1000;
19+
int max_fr = 10;
20+
21+
auto document = parseXml("../tests/test_data/segmenter_input.xml");
22+
23+
// Get file length
24+
std::chrono::nanoseconds filelength((uint64_t)(max_fr * size) * 1000000L);
25+
for (auto programme : document->getElements<AudioProgramme>()) {
26+
if (programme->has<Start>() && programme->has<End>()) {
27+
filelength = programme->get<End>().get().asNanoseconds() - programme->get<Start>().get().asNanoseconds();
28+
break;
29+
} else if (programme->has<End>()) {
30+
filelength = programme->get<End>().get().asNanoseconds();
31+
break;
32+
}
33+
}
34+
35+
auto trackUidList = buildTrackList(document);
36+
37+
Segmenter segmenter(document, Time(filelength));
38+
SegmentStart segment_start(std::chrono::milliseconds(0));
39+
SegmentDuration segment_size(std::chrono::milliseconds{size});
40+
int fr = 0;
41+
while (segment_start < filelength && fr < max_fr) {
42+
segmenter.buildFrame(segment_start, segment_size, fr);
43+
auto transportTrackFormat = segmenter.generateTransportTrackFormat(trackUidList,
44+
segment_start, segment_size);
45+
auto frame = segmenter.getFrame();
46+
auto frameHeader = segmenter.getFrameHeader();
47+
48+
std::stringstream xmlStream;
49+
writeXml(xmlStream, frame, *frameHeader);
50+
51+
std::string fname = genSadmFilename(fout_pre, fr);
52+
std::ofstream sfile(fname);
53+
54+
sfile << xmlStream.str();
55+
56+
// Get ready for next frame
57+
xmlStream.str("");
58+
segment_start = SegmentStart(segment_start.get() + segment_size.get());
59+
fr++;
60+
}
61+
62+
return 0;
63+
}
64+
65+
66+
std::string genSadmFilename(std::string pref, uint32_t ind) {
67+
char c[256];
68+
sprintf(c, "%s_%04d.xml", pref.c_str(), ind);
69+
std::string s(c);
70+
return s;
71+
}
72+
73+
TrackUidList buildTrackList(std::shared_ptr<Document> document) {
74+
TrackUidList trackUidList;
75+
76+
auto atus = document->getElements<AudioTrackUid>();
77+
uint16_t track_idx = 1;
78+
for (auto atu : atus) {
79+
TrackUid track_uid;
80+
track_uid.uid = formatId(atu->get<AudioTrackUidId>());
81+
track_uid.trackIndex = track_idx;
82+
trackUidList.trackUid.push_back(track_uid);
83+
track_idx++;
84+
}
85+
return trackUidList;
86+
}

0 commit comments

Comments
 (0)