diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2020-07-21 15:40:19 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2020-07-21 15:40:19 +0200 |
commit | 60df978a075e57ca2b4de611e0cb4ded3c36cd0a (patch) | |
tree | f2e70976b384c65ababa07889b605960be37e8b1 | |
parent | 11767aaaf3b60791c7c29c6cfc55d676fd4cdf28 (diff) | |
download | ODR-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.cpp | 28 | ||||
-rw-r--r-- | src/odr-padenc.h | 3 | ||||
-rw-r--r-- | src/sls.cpp | 21 | ||||
-rw-r--r-- | src/sls.h | 2 |
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; } @@ -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); }; |