summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Pöschel <github@basicmaster.de>2016-08-20 16:47:09 +0200
committerStefan Pöschel <github@basicmaster.de>2016-08-20 16:47:09 +0200
commitd688829ecd3a021a5512100873c1a3b20b8ff131 (patch)
tree1e3645a6b622819e1fbb55141808966634663e1b
parent9b6fe48ffc63832125b519e7f839650a16d79804 (diff)
downloadODR-AudioEnc-d688829ecd3a021a5512100873c1a3b20b8ff131.tar.gz
ODR-AudioEnc-d688829ecd3a021a5512100873c1a3b20b8ff131.tar.bz2
ODR-AudioEnc-d688829ecd3a021a5512100873c1a3b20b8ff131.zip
MOT encoder: slight fixes/refactoring/optimization
Fixes - double sleepdelay when SLS/DLS used and no slides available - sending additional DLS before the first slide
-rw-r--r--src/mot-encoder.cpp99
1 files changed, 45 insertions, 54 deletions
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<slide_metadata_t>::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<slide_metadata_t>::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;