From 35df377171bd73d26db2c2b0b92cc2381a3adae7 Mon Sep 17 00:00:00 2001 From: Luigi Yucheng LIU Date: Tue, 26 Aug 2014 21:24:24 +0800 Subject: New fidx management based on slide footprint footprint = file name + file size + last modification time --- src/mot-encoder.cpp | 126 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 98 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/mot-encoder.cpp b/src/mot-encoder.cpp index f2c2fb7..c864d68 100644 --- a/src/mot-encoder.cpp +++ b/src/mot-encoder.cpp @@ -33,7 +33,6 @@ #include #include #include -#include // for transmission history #include #include #include @@ -57,7 +56,7 @@ extern "C" { #define STR(x) XSTR(x) #define MAXSEGLEN 8179 -#define MAXDLS 128 // limit defined in ETSI TS 102 980 +#define MAXDLS 128 #define MAXSLIDESIZE 50000 #define MAXSLIDEID 9999 @@ -105,6 +104,14 @@ struct slide_metadata_t { return this->filepath < other.filepath; } }; +struct history_t { + // footprints to slide + std::vector footprints; + + // position to the last added + unsigned int cursor; +}; + /* typedef struct { // MOT HEADER CUSTOMIZED FOR SLIDESHOW APP @@ -131,6 +138,13 @@ void writeMotPAD(int output_fd, void create_dls_datagroup(char* text, int padlen); void writeDLS(int output_fd, const char* dls_file, int padlen); +bool find_footprint(const struct history_t & slide_history, const std::string & footprint, + int & fidx); +void add_foorprint(struct history_t & slide_history, const std::string & footprint, + int & fidx, unsigned int max_len_history); +void make_footprint(const char * filepath, std::string & footprint); + + int get_xpadlengthmask(int padlen); #define ALLOWED_PADLEN "23, 26, 34, 42, 58" @@ -183,7 +197,7 @@ int main(int argc, char *argv[]) DIR *pDir = NULL; int padlen = 58; bool erase_after_tx = false; - int sleepdelay = SLEEPDELAY_DEFAULT; // apply the default delay + int sleepdelay = SLEEPDELAY_DEFAULT; const char* dir = NULL; const char* output = "/tmp/pad.fifo"; @@ -268,10 +282,10 @@ int main(int argc, char *argv[]) MagickWandGenesis(); std::list slides_to_transmit; - std::map transmission_history; - std::map::iterator it_transmission_history; + struct history_t slide_history; fidx = 0; + slide_history.cursor = fidx; while(1) { if (dir) { pDir = opendir(dir); @@ -280,9 +294,7 @@ int main(int argc, char *argv[]) return 1; } - if (transmission_history.size() >= MAXSLIDEID) { - transmission_history.clear(); - } + // // Add new slides to transmit to list while ((pDirent = readdir(pDir)) != NULL) { @@ -290,27 +302,17 @@ int main(int argc, char *argv[]) char imagepath[256]; sprintf(imagepath, "%s/%s", dir, pDirent->d_name); + std::string footprint; slide_metadata_t md; - md.filepath = imagepath; + md.filepath = imagepath; + + // gestion du fidx + make_footprint(imagepath, footprint); + if (!find_footprint(slide_history, footprint, fidx)) { + add_foorprint(slide_history, footprint, fidx, MAXSLIDEID); + } - // if an image was transmitted before, it resumes its old file identity - it_transmission_history = transmission_history.find(pDirent->d_name); - if (it_transmission_history != transmission_history.end()) { - md.fidx = it_transmission_history->second; - } - else { - md.fidx = fidx; - - // update transmission history - transmission_history[pDirent->d_name] = md.fidx; - - if (fidx == MAXSLIDEID) { - fidx = 0; - } - else { - fidx++; - } - } + md.fidx = fidx; slides_to_transmit.push_back(md); @@ -318,6 +320,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "mot-encoder found slide %s\n", imagepath); } + fidx++; } } @@ -356,7 +359,6 @@ int main(int argc, char *argv[]) } slides_to_transmit.resize(0); - } else if (dls_file) { // only DLS // Always retransmit DLS, we want it to be updated frequently @@ -1063,3 +1065,71 @@ int get_xpadlengthmask(int padlen) return xpadlengthmask; } +bool find_footprint(const struct history_t & slide_history, const std::string & footprint, + int & fidx) { + + bool found = false; + + for (unsigned int cursor(0); + cursor < slide_history.footprints.size(); + cursor++) { + + if (slide_history.footprints[cursor] == footprint) { + + found = true; + fidx = (int) cursor; + break; + } + } + + return found; +} + +void add_foorprint(struct history_t & slide_history, const std::string & footprint, + int & fidx, unsigned int max_len_history) { + + if (slide_history.footprints.size() > max_len_history) { + slide_history.footprints[slide_history.cursor] = footprint; + } + else { + slide_history.footprints.push_back(footprint); + } + + fidx = (int) slide_history.cursor; + + // update cursor + slide_history.cursor = (slide_history.cursor == max_len_history) ? 0 : slide_history.cursor + 1; +} + +void make_footprint(const char * filepath, std::string & footprint) { + + char footprint_str[256]; + int len_path = strlen(filepath); + struct stat attrib; + int cursor; + int cursor2; + + // obtenir le nom du fichier + for (cursor = len_path - 1; + cursor >= 0; + cursor--) { + + if (filepath[cursor] == '/') { + break; + } + } + + cursor2 = 0; + for (cursor++; cursor < len_path; cursor++) { + + footprint_str[cursor2] = filepath[cursor]; + cursor2++; + } + footprint_str[cursor2]='\0'; + + // footprint = filename + size + last modification time + stat(filepath, &attrib); + sprintf(footprint_str, "%s_%d_%d", footprint_str, (int)attrib.st_size, (int)attrib.st_mtime); + footprint.assign(footprint_str); + +} -- cgit v1.2.3