aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2017-07-31 11:15:40 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2017-07-31 11:15:40 +0200
commit3c6c1ea2b45ec06ce493d595fc8cd3a03f056a84 (patch)
tree5c5dc7f84ff62cef70bbf3dbb15c30bdd96308ba
parent5d1b6420535c72d7a8df85a5db08ff1c0230690a (diff)
downloaddabmux-3c6c1ea2b45ec06ce493d595fc8cd3a03f056a84.tar.gz
dabmux-3c6c1ea2b45ec06ce493d595fc8cd3a03f056a84.tar.bz2
dabmux-3c6c1ea2b45ec06ce493d595fc8cd3a03f056a84.zip
Insert metadata properly and enable EDI out in zmq2edi
-rw-r--r--src/dabOutput/metadata.cpp14
-rw-r--r--src/zmq2edi/zmq2edi.cpp33
2 files changed, 28 insertions, 19 deletions
diff --git a/src/dabOutput/metadata.cpp b/src/dabOutput/metadata.cpp
index cb355cc..a77ccf5 100644
--- a/src/dabOutput/metadata.cpp
+++ b/src/dabOutput/metadata.cpp
@@ -35,7 +35,7 @@
#endif
template <typename T>
-size_t write_meta(output_metadata_id_e md, uint8_t *buf, T value)
+size_t write_meta(output_metadata_id_e md, uint8_t *buf, const T value)
{
buf[0] = static_cast<uint8_t>(md);
@@ -48,12 +48,16 @@ size_t write_meta(output_metadata_id_e md, uint8_t *buf, T value)
buf[3] = value;
}
else if (len_value == 2) {
- const uint16_t value = htons(value);
- memcpy(buf + 3, &value, sizeof(value));
+ const uint16_t val = htons(value);
+ memcpy(buf + 3, &val, sizeof(val));
}
else if (len_value == 4) {
- const uint32_t value = htons(value);
- memcpy(buf + 3, &value, sizeof(value));
+ const uint32_t val = htonl(value);
+ memcpy(buf + 3, &val, sizeof(val));
+ }
+ else {
+ throw std::runtime_error("Unsupported metadata len " +
+ std::to_string(len_value));
}
return 3 + len_value;
diff --git a/src/zmq2edi/zmq2edi.cpp b/src/zmq2edi/zmq2edi.cpp
index 7a2eed1..5fd02e2 100644
--- a/src/zmq2edi/zmq2edi.cpp
+++ b/src/zmq2edi/zmq2edi.cpp
@@ -160,11 +160,11 @@ static metadata_t get_md_one_frame(uint8_t *buf, size_t size, size_t *consumed_b
while (remaining) {
uint8_t id = buf[0];
- uint16_t len = (((uint16_t)buf[0]) << 8) + buf[1];
+ uint16_t len = (((uint16_t)buf[1]) << 8) + buf[2];
if (id == static_cast<uint8_t>(output_metadata_id_e::separation_marker)) {
if (len != 0) {
- etiLog.level(warn) << "Invalid length for metadata: separation_marker";
+ etiLog.level(warn) << "Invalid length " << len << " for metadata: separation_marker";
}
if (not utc_offset_received or not edi_time_received or not dlfc_received) {
@@ -177,42 +177,42 @@ static metadata_t get_md_one_frame(uint8_t *buf, size_t size, size_t *consumed_b
}
else if (id == static_cast<uint8_t>(output_metadata_id_e::utc_offset)) {
if (len != 2) {
- etiLog.level(warn) << "Invalid length for metadata: utc_offset";
+ etiLog.level(warn) << "Invalid length " << len << " for metadata: utc_offset";
}
if (remaining < 2) {
throw std::runtime_error("Insufficient data for utc_offset");
}
uint16_t utco;
- std::memcpy(&utco, buf + 2, sizeof(utco));
- md.utc_offset = ntohl(utco);
+ std::memcpy(&utco, buf + 3, sizeof(utco));
+ md.utc_offset = ntohs(utco);
utc_offset_received = true;
remaining -= 5;
buf += 5;
}
else if (id == static_cast<uint8_t>(output_metadata_id_e::edi_time)) {
if (len != 4) {
- etiLog.level(warn) << "Invalid length for metadata: edi_time";
+ etiLog.level(warn) << "Invalid length " << len << " for metadata: edi_time";
}
if (remaining < 4) {
throw std::runtime_error("Insufficient data for edi_time");
}
uint32_t edi_time;
- std::memcpy(&edi_time, buf + 2, sizeof(edi_time));
+ std::memcpy(&edi_time, buf + 3, sizeof(edi_time));
md.edi_time = ntohl(edi_time);
edi_time_received = true;
remaining -= 7;
buf += 7;
}
else if (id == static_cast<uint8_t>(output_metadata_id_e::dlfc)) {
- if (len != 3) {
- etiLog.level(warn) << "Invalid length for metadata: dlfc";
+ if (len != 2) {
+ etiLog.level(warn) << "Invalid length " << len << " for metadata: dlfc";
}
if (remaining < 2) {
throw std::runtime_error("Insufficient data for dlfc");
}
uint16_t dlfc;
- std::memcpy(&dlfc, buf + 2, sizeof(dlfc));
- md.dlfc = ntohl(dlfc);
+ std::memcpy(&dlfc, buf + 3, sizeof(dlfc));
+ md.dlfc = ntohs(dlfc);
dlfc_received = true;
remaining -= 5;
buf += 5;
@@ -234,9 +234,14 @@ static void send_eti_frame(uint8_t* p, metadata_t metadata)
edi_tagDETI.stat = p[0];
// LIDATA FCT
- //const int fct = p[4];
edi_tagDETI.dlfc = metadata.dlfc;
+ const int fct = p[4];
+ if (metadata.dlfc % 250 != fct) {
+ etiLog.level(warn) << "Frame FCT=" << fct << " does not correspond to DLFC=" << metadata.dlfc;
+ }
+
+
bool ficf = (p[5] & 0x80) >> 7;
const int nst = p[5] & 0x7F;
@@ -458,6 +463,8 @@ int start(int argc, char **argv)
return 1;
}
+ edi_conf.destinations.push_back(edi_destination);
+
print_edi_conf();
edi_setup();
@@ -520,8 +527,6 @@ int start(int argc, char **argv)
for (auto &f : all_frames) {
size_t consumed_bytes = 0;
- std::cerr << "MD: " << incoming.size() - offset << std::endl;
-
f.second = get_md_one_frame(
static_cast<uint8_t*>(incoming.data()) + offset,
incoming.size() - offset,