aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2020-07-21 15:40:19 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2020-07-21 15:40:19 +0200
commit60df978a075e57ca2b4de611e0cb4ded3c36cd0a (patch)
treef2e70976b384c65ababa07889b605960be37e8b1
parent11767aaaf3b60791c7c29c6cfc55d676fd4cdf28 (diff)
downloadODR-PadEnc-60df978a075e57ca2b4de611e0cb4ded3c36cd0a.tar.gz
ODR-PadEnc-60df978a075e57ca2b4de611e0cb4ded3c36cd0a.tar.bz2
ODR-PadEnc-60df978a075e57ca2b4de611e0cb4ded3c36cd0a.zip
Add dump current and completed slide options
-rw-r--r--src/odr-padenc.cpp28
-rw-r--r--src/odr-padenc.h3
-rw-r--r--src/sls.cpp21
-rw-r--r--src/sls.h2
4 files changed, 51 insertions, 3 deletions
diff --git a/src/odr-padenc.cpp b/src/odr-padenc.cpp
index 0a7629a..b919074 100644
--- a/src/odr-padenc.cpp
+++ b/src/odr-padenc.cpp
@@ -61,6 +61,9 @@ static void usage(const char* name) {
" been encoded.\n"
" -s, --sleep=DUR Wait DUR seconds between each slide\n"
" Default: %d\n"
+ " --dump-current-slide=F1 Write the slide currently being transmitted to the file F1\n"
+ " --dump-completed-slide=F2 Once the slide is transmitted, move the file from F1 to F2\n"
+ " Works only in uniform mode\n"
" -o, --output=FILENAME FIFO to write PAD data into.\n"
" Default: %s\n"
" -t, --dls=FILENAME FIFO or file to read DLS text from.\n"
@@ -144,6 +147,8 @@ int main(int argc, char *argv[]) {
{"init-burst", required_argument, 0, 'i'},
{"xpad-interval", required_argument, 0, 'X'},
{"verbose", no_argument, 0, 'v'},
+ {"dump-current-slide", required_argument, 0, 1},
+ {"dump-completed-slide", required_argument, 0, 2},
{0,0,0,0},
};
@@ -204,6 +209,12 @@ int main(int argc, char *argv[]) {
case 'v':
verbose++;
break;
+ case 1: // dump-current-slide
+ options.current_slide_dump_name = optarg;
+ break;
+ case 2: // dump-completed-slide
+ options.completed_slide_dump_name = optarg;
+ break;
case '?':
case 'h':
usage(argv[0]);
@@ -423,7 +434,7 @@ int PadEncoder::EncodeSlide(bool skip_if_already_queued) {
if (!slides.Empty()) {
slide_metadata_t slide = slides.GetSlide();
- if (sls_encoder.encodeSlide(slide.filepath, slide.fidx, options.raw_slides, options.max_slide_size)) {
+ if (sls_encoder.encodeSlide(slide.filepath, slide.fidx, options.raw_slides, options.max_slide_size, options.current_slide_dump_name)) {
slides_success = true;
if (options.erase_after_tx) {
if (unlink(slide.filepath.c_str()))
@@ -527,6 +538,21 @@ int UniformPadEncoder::Encode() {
// handle SLS
if (options.SLSEnabled()) {
+
+ // Check if slide transmission is complete
+ if ( not options.completed_slide_dump_name.empty() and
+ not options.current_slide_dump_name.empty() and
+ not pad_packetizer.QueueContainsDG(SLSEncoder::APPTYPE_MOT_START)) {
+ if (rename(options.current_slide_dump_name.c_str(), options.completed_slide_dump_name.c_str())) {
+ if (errno != ENOENT) {
+ perror("ODR-PadEnc Error: renaming completed slide file failed");
+ }
+ }
+ else {
+ fprintf(stderr, "ODR-PadEnc completed slide transmission.\n");
+ }
+ }
+
if (options.slide_interval > 0) {
// encode slides regularly
if (pad_timeline >= next_slide) {
diff --git a/src/odr-padenc.h b/src/odr-padenc.h
index 9ecf4a4..bda82f4 100644
--- a/src/odr-padenc.h
+++ b/src/odr-padenc.h
@@ -67,6 +67,9 @@ struct PadEncoderOptions {
std::vector<std::string> dls_files;
const char* item_state_file;
+ std::string current_slide_dump_name;
+ std::string completed_slide_dump_name;
+
PadEncoderOptions() :
padlen(58),
erase_after_tx(false),
diff --git a/src/sls.cpp b/src/sls.cpp
index f19829f..f0b72f7 100644
--- a/src/sls.cpp
+++ b/src/sls.cpp
@@ -353,8 +353,23 @@ size_t SLSEncoder::resizeImage(MagickWand* m_wand, unsigned char** blob, const s
}
#endif
+static void dump_slide(const std::string& dump_name, const uint8_t *blob, size_t size)
+{
+ FILE* fd = fopen(dump_name.c_str(), "w");
+
+ if (fd == nullptr) {
+ perror(("ODR-PadEnc Error: Unable to open file '" + dump_name + "' for writing").c_str());
+ return;
+ }
+
+ if (fwrite(blob, size, 1, fd) == 0) {
+ perror(("ODR-PadEnc Error: Unable to write to file '" + dump_name + "'").c_str());
+ }
+
+ fclose(fd);
+}
-bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides, size_t max_slide_size)
+bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides, size_t max_slide_size, const std::string& dump_name)
{
bool result = false;
@@ -566,6 +581,10 @@ bool SLSEncoder::encodeSlide(const std::string& fname, int fidx, bool raw_slides
pad_packetizer->AddDG(mscdg, false);
}
+ if (not dump_name.empty()) {
+ dump_slide(dump_name, blob, blobsize);
+ }
+
result = true;
}
diff --git a/src/sls.h b/src/sls.h
index 97b6ed4..07e05dc 100644
--- a/src/sls.h
+++ b/src/sls.h
@@ -252,7 +252,7 @@ public:
SLSEncoder(PADPacketizer* pad_packetizer) : pad_packetizer(pad_packetizer), cindex_header(0), cindex_body(0) {}
- bool encodeSlide(const std::string& fname, int fidx, bool raw_slides, size_t max_slide_size);
+ bool encodeSlide(const std::string& fname, int fidx, bool raw_slides, size_t max_slide_size, const std::string& dump_name);
static bool isSlideParamFileFilename(const std::string& filename);
};