From 88fa98179d8b10dfd3767a0e10e489c4bf6ab4c9 Mon Sep 17 00:00:00 2001 From: Stefan Pöschel Date: Sat, 20 Aug 2016 16:47:09 +0200 Subject: MOT encoder: slight fixes/refactoring/optimization Fixes - double sleepdelay when SLS/DLS used and no slides available - sending additional DLS before the first slide --- src/mot-encoder.cpp | 99 ++++++++++++++++++++++++----------------------------- 1 file changed, 45 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/mot-encoder.cpp b/src/mot-encoder.cpp index b17c74d..4cb6688 100644 --- a/src/mot-encoder.cpp +++ b/src/mot-encoder.cpp @@ -218,7 +218,7 @@ class History { }; -int encodeFile(int output_fd, std::string& fname, int fidx, bool raw_slides); +int encodeFile(int output_fd, const std::string& fname, int fidx, bool raw_slides); uint8_vector_t createMotHeader( size_t blobsize, @@ -786,7 +786,6 @@ int main(int argc, char *argv[]) { int ret; struct dirent *pDirent; - DIR *pDir = NULL; int padlen = 58; bool erase_after_tx = false; int sleepdelay = SLEEPDELAY_DEFAULT; @@ -795,7 +794,7 @@ int main(int argc, char *argv[]) bool raw_dls = false; bool remove_dls = false; - const char* dir = NULL; + const char* sls_dir = NULL; const char* output = "/tmp/pad.fifo"; std::string dls_file; @@ -830,7 +829,7 @@ int main(int argc, char *argv[]) remove_dls = true; break; case 'd': - dir = optarg; + sls_dir = optarg; break; case 'e': erase_after_tx = true; @@ -867,13 +866,13 @@ int main(int argc, char *argv[]) return 2; } - if (dir && not dls_file.empty()) { + if (sls_dir && not dls_file.empty()) { fprintf(stderr, "mot-encoder encoding Slideshow from '%s' and DLS from '%s' to '%s'\n", - dir, dls_file.c_str(), output); + sls_dir, dls_file.c_str(), output); } - else if (dir) { + else if (sls_dir) { fprintf(stderr, "mot-encoder encoding Slideshow from '%s' to '%s'. No DLS.\n", - dir, output); + sls_dir, output); } else if (not dls_file.empty()) { fprintf(stderr, "mot-encoder encoding DLS from '%s' to '%s'. No Slideshow.\n", @@ -951,10 +950,10 @@ int main(int argc, char *argv[]) History slides_history(MAXHISTORYLEN); while(1) { - if (dir) { - pDir = opendir(dir); + if (sls_dir) { // slide + possibly DLS + DIR *pDir = opendir(sls_dir); if (pDir == NULL) { - fprintf(stderr, "mot-encoder Error: cannot open directory '%s'\n", dir); + fprintf(stderr, "mot-encoder Error: cannot open directory '%s'\n", sls_dir); return 1; } @@ -962,7 +961,7 @@ int main(int argc, char *argv[]) while ((pDirent = readdir(pDir)) != NULL) { if (pDirent->d_name[0] != '.') { char imagepath[256]; - sprintf(imagepath, "%s/%s", dir, pDirent->d_name); + sprintf(imagepath, "%s/%s", sls_dir, pDirent->d_name); slide_metadata_t md; md.filepath = imagepath; @@ -975,61 +974,53 @@ int main(int argc, char *argv[]) } } + closedir(pDir); + #if DEBUG slides_history.disp_database(); #endif - // Sort the list in fidx order - slides_to_transmit.sort(); + // if ATM no slides, transmit at least DLS + if (slides_to_transmit.empty()) { + if (not dls_file.empty()) + writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls); - if (not dls_file.empty()) { - // Maybe we have no slides, always update DLS - writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls); sleep(sleepdelay); - } - - // Encode the slides - std::list::iterator it; - for (it = slides_to_transmit.begin(); - it != slides_to_transmit.end(); - ++it) { - - ret = encodeFile(output_fd, it->filepath, it->fidx, raw_slides); - if (ret != 1) { - fprintf(stderr, "mot-encoder Error: cannot encode file '%s'\n", it->filepath.c_str()); - } - - if (erase_after_tx) { - if (unlink(it->filepath.c_str()) == -1) { - fprintf(stderr, "mot-encoder Error: erasing file '%s' failed: ", it->filepath.c_str()); - perror(""); + } else { + // Sort the list in fidx order + slides_to_transmit.sort(); + + // Encode the slides + for (std::list::const_iterator it = slides_to_transmit.cbegin(); + it != slides_to_transmit.cend(); + ++it) { + + ret = encodeFile(output_fd, it->filepath, it->fidx, raw_slides); + if (ret != 1) + fprintf(stderr, "mot-encoder Error: cannot encode file '%s'\n", it->filepath.c_str()); + + if (erase_after_tx) { + if (unlink(it->filepath.c_str()) == -1) { + fprintf(stderr, "mot-encoder Error: erasing file '%s' failed: ", it->filepath.c_str()); + perror(""); + } } - } - // 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, remove_dls); - } + // 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, remove_dls); - sleep(sleepdelay); - } + sleep(sleepdelay); + } - if (slides_to_transmit.empty()) { - sleep(sleepdelay); + slides_to_transmit.resize(0); } - - slides_to_transmit.resize(0); - } - else if (not dls_file.empty()) { // only DLS + } else { // only DLS // Always retransmit DLS, we want it to be updated frequently writeDLS(output_fd, dls_file, charset, raw_dls, remove_dls); sleep(sleepdelay); } - - if (pDir) { - closedir(pDir); - } } delete pad_packetizer; @@ -1053,7 +1044,7 @@ DATA_GROUP* createDataGroupLengthIndicator(size_t len) { } -void warnOnSmallerImage(size_t height, size_t width, std::string& fname) { +void warnOnSmallerImage(size_t height, size_t width, const std::string& fname) { if (height < 240 || width < 320) fprintf(stderr, "mot-encoder Warning: Image '%s' smaller than recommended size (%zu x %zu < 320 x 240 px)\n", fname.c_str(), width, height); } @@ -1067,7 +1058,7 @@ void warnOnSmallerImage(size_t height, size_t width, std::string& fname) { * \return the blobsize */ #if HAVE_MAGICKWAND -size_t resizeImage(MagickWand* m_wand, unsigned char** blob, std::string& fname, bool* jfif_not_png) +size_t resizeImage(MagickWand* m_wand, unsigned char** blob, const std::string& fname, bool* jfif_not_png) { unsigned char* blob_png; unsigned char* blob_jpg; @@ -1141,7 +1132,7 @@ size_t resizeImage(MagickWand* m_wand, unsigned char** blob, std::string& fname, } #endif -int encodeFile(int output_fd, std::string& fname, int fidx, bool raw_slides) +int encodeFile(int output_fd, const std::string& fname, int fidx, bool raw_slides) { int ret = 0; int nseg, lastseglen, i, last, curseglen; -- cgit v1.2.3