summaryrefslogtreecommitdiffstats
path: root/src/mot-encoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mot-encoder.cpp')
-rw-r--r--src/mot-encoder.cpp47
1 files changed, 41 insertions, 6 deletions
diff --git a/src/mot-encoder.cpp b/src/mot-encoder.cpp
index c3c82b5..5bb285a 100644
--- a/src/mot-encoder.cpp
+++ b/src/mot-encoder.cpp
@@ -233,7 +233,7 @@ struct DATA_GROUP;
DATA_GROUP* packMscDG(MSCDG* msc);
void prepend_dls_dgs(const std::string& text, uint8_t charset);
-void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool raw_dls);
+void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool raw_dls, bool remove_dls);
// PAD related
#define CRC_LEN 2
@@ -305,6 +305,7 @@ static int cindex_body = 0;
#define FPAD_LEN 2
#define DLS_SEG_LEN_PREFIX 2
#define DLS_SEG_LEN_CHAR_MAX 16
+#define DLS_CMD_REMOVE_LABEL 0x01
CharsetConverter charset_converter;
@@ -610,6 +611,7 @@ void usage(char* name)
" ID = 6: ISO/IEC 10646 using UCS-2 BE\n"
" ID = 15: ISO/IEC 10646 using UTF-8\n"
" Default: 15\n"
+ " -r, --remove-dls Always insert a DLS Remove Label command when replacing a DLS text.\n"
" -C, --raw-dls Do not convert DLS texts to Complete EBU Latin based repertoire\n"
" character set encoding.\n"
" -R, --raw-slides Do not process slides. Integrity checks and resizing\n"
@@ -633,6 +635,7 @@ int main(int argc, char *argv[])
bool raw_slides = false;
int charset = CHARSET_UTF8;
bool raw_dls = false;
+ bool remove_dls = false;
const char* dir = NULL;
const char* output = "/tmp/pad.fifo";
@@ -641,6 +644,7 @@ int main(int argc, char *argv[])
const struct option longopts[] = {
{"charset", required_argument, 0, 'c'},
{"raw-dls", no_argument, 0, 'C'},
+ {"remove-dls", no_argument, 0, 'r'},
{"dir", required_argument, 0, 'd'},
{"erase", no_argument, 0, 'e'},
{"output", required_argument, 0, 'o'},
@@ -656,7 +660,7 @@ int main(int argc, char *argv[])
int ch=0;
int index;
while(ch != -1) {
- ch = getopt_long(argc, argv, "eChRc:d:o:p:s:t:v", longopts, &index);
+ ch = getopt_long(argc, argv, "eChRrc:d:o:p:s:t:v", longopts, &index);
switch (ch) {
case 'c':
charset = atoi(optarg);
@@ -664,6 +668,9 @@ int main(int argc, char *argv[])
case 'C':
raw_dls = true;
break;
+ case 'r':
+ remove_dls = true;
+ break;
case 'd':
dir = optarg;
break;
@@ -819,7 +826,7 @@ int main(int argc, char *argv[])
if (not dls_file.empty()) {
// Maybe we have no slides, always update DLS
- writeDLS(output_fd, dls_file, charset, raw_dls);
+ writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls);
sleep(sleepdelay);
}
@@ -843,7 +850,7 @@ int main(int argc, char *argv[])
// Always retransmit DLS after each slide, we want it to be updated frequently
if (not dls_file.empty()) {
- writeDLS(output_fd, dls_file, charset, raw_dls);
+ writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls);
}
sleep(sleepdelay);
@@ -857,7 +864,7 @@ int main(int argc, char *argv[])
}
else if (not dls_file.empty()) { // only DLS
// Always retransmit DLS, we want it to be updated frequently
- writeDLS(output_fd, dls_file, charset, raw_dls);
+ writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls);
sleep(sleepdelay);
}
@@ -1272,7 +1279,28 @@ DATA_GROUP* packMscDG(MSCDG* msc)
}
-void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool raw_dls)
+DATA_GROUP* createDynamicLabelCommand(uint8_t command) {
+ DATA_GROUP* dg = new DATA_GROUP(2, 2, 3);
+ uint8_vector_t &seg_data = dg->data;
+
+ // prefix: toggle? + first seg + last seg + command flag + command
+ seg_data[0] =
+ (dls_toggle ? (1 << 7) : 0) +
+ (1 << 6) +
+ (1 << 5) +
+ (1 << 4) +
+ command;
+
+ // prefix: charset (though irrelevant here)
+ seg_data[1] = CHARSET_COMPLETE_EBU_LATIN;
+
+ // CRC
+ dg->AppendCRC();
+
+ return dg;
+}
+
+void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool raw_dls, bool remove_dls)
{
std::ifstream dls_fstream(dls_file.c_str());
if (!dls_fstream.is_open()) {
@@ -1326,7 +1354,12 @@ void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool
if (verbose) {
fprintf(stderr, "mot-encoder writing %s DLS text \"%s\"\n", dlstext_is_new ? "new" : "old", dlstext.c_str());
}
+
+ DATA_GROUP *remove_label_dg = NULL;
if (dlstext_is_new) {
+ if (remove_dls)
+ remove_label_dg = createDynamicLabelCommand(DLS_CMD_REMOVE_LABEL);
+
dls_toggle = !dls_toggle; // indicate changed text
dlstext_prev = dlstext;
@@ -1334,6 +1367,8 @@ void writeDLS(int output_fd, const std::string& dls_file, uint8_t charset, bool
}
prepend_dls_dgs(dlstext, charset);
+ if (remove_label_dg)
+ pad_packetizer->queue.push_front(remove_label_dg);
pad_packetizer->WriteAllPADs(output_fd);
}