diff --git a/servico/src/include/serviceWindowGeneration.h b/servico/src/include/serviceWindowGeneration.h index 3565d24..a85b8cc 100644 --- a/servico/src/include/serviceWindowGeneration.h +++ b/servico/src/include/serviceWindowGeneration.h @@ -9,8 +9,6 @@ #include "jthread.h" #include "dprintf.h" #include "Mixer.h" -//#include "synchronizer.h" -//#include "listenerSynchronizer.h" #include "listenerTradutor.h" #include "tradutorPortGlosa.h" #include "serviceException.h" @@ -23,11 +21,7 @@ #define DEVELOPER "devel" #define PRODUCTION "prod" -#define BASEDIR "vlibras_user/dicionario_libras/" -#define BASEDIRTRANSP "vlibras_user/dicionarioTransp_libras/" -#define VIDEO_POSE_NEUTRA "poseneutra" -#define EXTENSAO_DICIONARIO ".ts" -#define PATH_DEVEL "vlibras_user/vlibras-contents/videos/" +#define PATH_DEVEL_CONTENTS "vlibras_user/vlibras-contents/videos/" #define PATH_DEVEL_UPLOADS "vlibras_user/vlibras-contents/uploads/" #define PATH_VBOX_UPLOADS "vlibras_user/.vlibras-conf/uploads/" #define PATH_CONF_FILE "vlibras_user/.vlibras-conf/param.json" @@ -46,7 +40,6 @@ class ServiceWindowGeneration { protected: TradutorPortGlosa* tradutor; - //Synchronizer* sincronizador; Mixer* mixer; StreamSocket* core_socket; @@ -59,7 +52,7 @@ protected: bool parsingSuccessful; char* path_input; - char* path_libras; + char* path_client; char* path_contents; char* path_uploads; char* client_type; @@ -75,15 +68,10 @@ protected: virtual void setSizeOfSubtitles(int sub_size) = 0; virtual void setPathContents() = 0; - virtual void setPathLibras() = 0; - //virtual void setBackground() = 0; virtual void connectToUnity() = 0; virtual void sendGlosa(string glosa) = 0; virtual void waitVideoGeneration() = 0; - - //virtual void transcodeVideoToWebm(); - virtual void transcodeVideoToMp4() = 0; public: virtual void initialize() = 0; diff --git a/servico/src/include/serviceWindowGenerationFromRec.h b/servico/src/include/serviceWindowGenerationFromRec.h index 2d132da..5bab290 100644 --- a/servico/src/include/serviceWindowGenerationFromRec.h +++ b/servico/src/include/serviceWindowGenerationFromRec.h @@ -16,15 +16,11 @@ private: void addPTS(int64_t pts); void setSizeOfSubtitles(int sub_size); void setPathContents(); - void setPathLibras(); - //void setBackground(); void connectToUnity(); void sendGlosa(string glosa); void waitVideoGeneration(); - void transcodeVideoToMp4(); - void createThumbnail(); bool isRunning(); public: ServiceWindowGenerationFromRec(char* pathVideo, int sublanguage, int position, int size, @@ -36,7 +32,6 @@ public: void notifyTextRecognized(unsigned char* text, int64_t pts); void notifyTranslation(vector* glosas); void notifyTranslator(unsigned char* text); - //void notifyEndOfSynchronization(); void notifyEnd(int sentences_size); void initialize(); diff --git a/servico/src/include/serviceWindowGenerationFromSRT.h b/servico/src/include/serviceWindowGenerationFromSRT.h index d602125..57c206e 100644 --- a/servico/src/include/serviceWindowGenerationFromSRT.h +++ b/servico/src/include/serviceWindowGenerationFromSRT.h @@ -19,15 +19,11 @@ private: void addPTS(int64_t pts); void setSizeOfSubtitles(int sub_size); void setPathContents(); - void setPathLibras(); - //void setBackground(); void connectToUnity(); void sendGlosa(string glosa); void waitVideoGeneration(); - void transcodeVideoToMp4(); - void createThumbnail(); bool isRunning(); public: //construtor de serviço de video e legenda @@ -40,7 +36,6 @@ public: void notifySubtitle(unsigned char* subtitle, int64_t pts); void notifyTranslation(vector* glosas); void notifyTranslator(unsigned char* text); - //void notifyEndOfSynchronization(); void notifyEnd(int sub_size); void initialize(); diff --git a/servico/src/include/serviceWindowGenerationFromText.h b/servico/src/include/serviceWindowGenerationFromText.h index 9b40b56..9131a9c 100644 --- a/servico/src/include/serviceWindowGenerationFromText.h +++ b/servico/src/include/serviceWindowGenerationFromText.h @@ -15,14 +15,11 @@ private: void setSizeOfSubtitles(int sub_size); void setPathContents(); - void setPathLibras(); - //void setBackground(); void connectToUnity(); void sendGlosa(string glosa); void waitVideoGeneration(); - void transcodeVideoToMp4(); bool isRunning(); public: ServiceWindowGenerationFromText(char* pathFile, int transparency, char* id, char* client); @@ -31,7 +28,6 @@ public: void notifyLine(unsigned char* line); void notifyTranslation(vector* glosas); void notifyTranslator(unsigned char* text); - //void notifyEndOfSynchronization(); void notifyEnd(int line_size); void initialize(); diff --git a/servico/src/serviceWindowGenerationFromRec.cpp b/servico/src/serviceWindowGenerationFromRec.cpp index 95d4d85..9a20188 100644 --- a/servico/src/serviceWindowGenerationFromRec.cpp +++ b/servico/src/serviceWindowGenerationFromRec.cpp @@ -50,14 +50,13 @@ ServiceWindowGenerationFromRec::~ServiceWindowGenerationFromRec(){ free(vetor_pts); if (tradutor) delete tradutor; if (rec) delete rec; - //if (sincronizador) delete sincronizador; if (mixer) delete mixer; DDDPRINTF("Service Rec finished!\n"); } void ServiceWindowGenerationFromRec::setPathContents(){ if(strcmp(client_type,DEVELOPER) == 0){ - this->path_contents = PATH_DEVEL; + this->path_contents = PATH_DEVEL_CONTENTS; this->path_uploads = PATH_DEVEL_UPLOADS; rec->setPathAudioContents(path_uploads); }else if(strcmp(client_type, PRODUCTION) == 0){ @@ -78,40 +77,11 @@ void ServiceWindowGenerationFromRec::setPathContents(){ } } -void ServiceWindowGenerationFromRec::setPathLibras(){ - char* final_path = new char[MAX_SIZE_PATH]; - strcpy(final_path, this->path_uploads); - strcat(final_path, this->user_id); - strcat(final_path, "/video_libras.ts"); - - this->path_libras = final_path; -} - -// void ServiceWindowGenerationFromRec::setBackground(){ -// if(this->transparency == 0) { //pega dicionario com BackGround opaco -// char* dicPath; -// dicPath = getenv("DIC_LIBRAS"); -// if(dicPath != NULL) -// sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else -// sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); - -// } else if(this->transparency == 1) { //pega dicionario com BackGround transparente -// char* dicTPath; -// dicTPath = getenv("DICTRANSP_LIBRAS"); -// if(dicTPath != NULL) -// sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else -// sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// } -// } - void ServiceWindowGenerationFromRec::setSizeOfSubtitles(int sub_size){ numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas){ sendGlosa(END_NOTIFICATION); waitVideoGeneration(); - //sincronizador->stop(); } } @@ -129,19 +99,6 @@ void ServiceWindowGenerationFromRec::notifyTextRecognized(unsigned char* text, i notifyTranslator(text); } -// //Quando o sincronizador termina, ele invoca esse método para avisar -// void ServiceWindowGenerationFromRec::notifyEndOfSynchronization() { -// if (this->service_type == SERVICE_TYPE_REC) { -// mixer = new Mixer(); -// mixer->initialize(this->path_input, this->path_libras,this->position,this->size, -// this->transparency, this->user_id, this->path_uploads, this->path_contents); -// createThumbnail(); -// }else{ -// transcodeVideoToMp4(); -// } -// this->running = false; -// } - void ServiceWindowGenerationFromRec::notifyTranslation(vector * glosas) { for (int i = 0; i < glosas->size(); i++) { locale loc; @@ -150,7 +107,6 @@ void ServiceWindowGenerationFromRec::notifyTranslation(vector * glosas) glosa_lower += std::tolower(glosas->at(i).at(k), loc); } //int64_t pts_notificado = vetor_pts->front(); - //sincronizador->recebeglosa(glosa_lower, pts_notificado); sendGlosa(glosa_lower); } @@ -174,43 +130,11 @@ bool ServiceWindowGenerationFromRec::isFinished(){ void ServiceWindowGenerationFromRec::initialize(){ DPRINTF("Service REC Initialize.\n"); - rec->addListener(this); - setPathLibras(); - - if(this->sub_language == 1) - tradutor->addListener(this); - - if(this->service_type != SERVICE_TYPE_REC_ONLY_AUDIO){ - vector tokens; - char* pathtmp = this->path_input; - int size = strlen(pathtmp); - char vtemp [size]; - - strcpy(vtemp, pathtmp); - pathtmp = strtok(vtemp, "."); - while (pathtmp != NULL) { - tokens.push_back(string(pathtmp)); - pathtmp = strtok(NULL, "."); - } - - string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; - this->path_libras = new char[buildstrpath.size()]; - strcpy(this->path_libras, buildstrpath.c_str()); - //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras); - - }else{ - tradutor->addListener(this); - } + rec->addListener(this); + tradutor->addListener(this); connectToUnity(); - // setBackground(); - - // uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro - // sincronizador->setPCRBase(pcr_base); - // sincronizador->addListener(this); - // sincronizador->Start(); - try{ rec->initialize(); } catch(RecognizeException ex){ @@ -229,7 +153,6 @@ void ServiceWindowGenerationFromRec::sendGlosa(string glosa) { char* ok_core = new char[4]; core_socket->read(ok_core, 4); //aguarda o unity confirmar o recebimento da glosa - //cout << "Recebi: " << ok_core << endl; delete [] ok_core; } @@ -250,7 +173,6 @@ void ServiceWindowGenerationFromRec::waitVideoGeneration() { try{ do{ core_socket->read(endgeneration, sizeof(endgeneration)); - //usleep(500000); }while(strcmp(endgeneration, END_NOTIFICATION) != 0); core_socket->close(); this->running = false; @@ -259,25 +181,6 @@ void ServiceWindowGenerationFromRec::waitVideoGeneration() { } } -void ServiceWindowGenerationFromRec::transcodeVideoToMp4(){ - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); - string command = "ffmpeg -i "; - command.append(path_libras) - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") - .append(path_contents).append(user_id).append(".mp4"); - //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); - system(command.c_str()); -} - -void ServiceWindowGenerationFromRec::createThumbnail(){ - string command = "ffmpeg -ss 10 -i "; - command.append(path_contents).append(user_id).append(".mp4") - .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ") - .append(path_contents).append(user_id).append(".png"); - //printf("[INFO]: Thumbnail command -> %s\n", command.c_str()); - system(command.c_str()); -} - void ServiceWindowGenerationFromRec::Run(){ while(isRunning()){ usleep(200000); diff --git a/servico/src/serviceWindowGenerationFromSRT.cpp b/servico/src/serviceWindowGenerationFromSRT.cpp index 7a11d2b..9bfa90c 100644 --- a/servico/src/serviceWindowGenerationFromSRT.cpp +++ b/servico/src/serviceWindowGenerationFromSRT.cpp @@ -53,7 +53,6 @@ ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() { free(vetor_pts); if (mixer) delete mixer; if (tradutor) delete tradutor; - //if (sincronizador) delete sincronizador; if (extratorSRT)delete extratorSRT; if (extrator_factory) delete extrator_factory; DDDPRINTF("Service SRT finalized!\n"); @@ -61,8 +60,7 @@ ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() { void ServiceWindowGenerationFromSRT::setPathContents() { if(strcmp(client_type,DEVELOPER) == 0){ - this->path_contents = PATH_DEVEL; - this->path_uploads = PATH_DEVEL_UPLOADS; + this->path_contents = PATH_DEVEL_CONTENTS; }else if(strcmp(client_type, PRODUCTION) == 0){ ifstream conf_file(PATH_CONF_FILE, ifstream::binary); parsingSuccessful = reader.parse(conf_file, root); @@ -73,47 +71,17 @@ void ServiceWindowGenerationFromSRT::setPathContents() { string attr = root.get("storage", PATH_VBOX_UPLOADS).asString(); this->path_contents = new char[MAX_SIZE_PATH]; strcpy(this->path_contents, attr.c_str()); - this->path_uploads = PATH_VBOX_UPLOADS; conf_file.close(); }else{ throw ServiceException("Invalid client!"); } } -void ServiceWindowGenerationFromSRT::setPathLibras() { - char* final_path = new char[MAX_SIZE_PATH]; - strcpy(final_path, this->path_uploads); - strcat(final_path, this->user_id); - strcat(final_path, "/video_libras.ts"); - - this->path_libras = final_path; -} - -// void ServiceWindowGenerationFromSRT::setBackground() { -// if(this->transparency == 0) { //pega dicionario com BackGround opaco -// char* dicPath; -// dicPath = getenv("DIC_LIBRAS"); -// if(dicPath != NULL) -// sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else -// sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); - -// } else if(this->transparency == 1) { //pega dicionario com BackGround transparente -// char* dicTPath; -// dicTPath = getenv("DICTRANSP_LIBRAS"); -// if(dicTPath != NULL) -// sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else -// sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// } -// } - void ServiceWindowGenerationFromSRT::setSizeOfSubtitles(int sub_size) { numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas){ sendGlosa(END_NOTIFICATION); waitVideoGeneration(); - //sincronizador->stop(); } } @@ -134,18 +102,6 @@ void ServiceWindowGenerationFromSRT::notifySubtitle(unsigned char *subtitle, int notifyTranslator(subtitle); } -// void ServiceWindowGenerationFromSRT::notifyEndOfSynchronization() { -// if (this->service_type == SERVICE_TYPE_SRT) { -// mixer = new Mixer(); -// mixer->initialize(this->path_input, this->path_libras,this->position,this->size, -// this->transparency, this->user_id, this->path_uploads, this->path_contents); -// createThumbnail(); -// }else{ -// transcodeVideoToMp4(); -// } -// this->running = false; -// } - void ServiceWindowGenerationFromSRT::notifyTranslation(vector * glosas) { for (int i = 0; i < glosas->size(); i++) { locale loc; @@ -155,7 +111,6 @@ void ServiceWindowGenerationFromSRT::notifyTranslation(vector * glosas) } sendGlosa(glosa_lower); //int64_t pts_notificado = vetor_pts->front(); - //sincronizador->recebeglosa(glosa_lower, pts_notificado); } vetor_pts->erase(vetor_pts->begin()); @@ -181,45 +136,14 @@ void ServiceWindowGenerationFromSRT::initialize() { extratorSRT->addListener(this); extratorSRT->setFilePath(path_srt); - setPathLibras(); - - if (this->sub_language == 1) - tradutor->addListener(this); - - if(this->service_type != SERVICE_TYPE_SRT_ONLY){ - vector tokens; - char* pathtmp = this->path_input; - int size = strlen(pathtmp); - char vtemp [size]; + tradutor->addListener(this); - strcpy(vtemp, pathtmp); - pathtmp = strtok(vtemp, "."); - while (pathtmp != NULL) { - tokens.push_back(string(pathtmp)); - pathtmp = strtok(NULL, "."); - } - - string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; - this->path_libras = new char[buildstrpath.size()]; - strcpy(this->path_libras, buildstrpath.c_str()); - //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras); - - }else{ - tradutor->addListener(this); - } - - //setBackground(); - - if (service_type != SERVICE_TYPE_SRT) { - uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro - //sincronizador->setPCRBase(pcr_base); - } + // if (service_type != SERVICE_TYPE_SRT) { + // uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro + // } connectToUnity(); - // sincronizador->addListener(this); - // sincronizador->Start(); - try{ extratorSRT->initialize(); }catch(ExtratorException ex){ @@ -238,7 +162,6 @@ void ServiceWindowGenerationFromSRT::sendGlosa(string glosa) { char* ok_core = new char[3]; core_socket->read(ok_core, 3); //aguarda o unity confirmar o recebimento da glosa - //cout << "Recebi: " << ok_core << endl; delete [] ok_core; } @@ -259,7 +182,6 @@ void ServiceWindowGenerationFromSRT::waitVideoGeneration() { try{ do{ core_socket->read(endgeneration, sizeof(endgeneration)); - //usleep(500000); }while(strcmp(endgeneration, END_NOTIFICATION) != 0); core_socket->close(); this->running = false; @@ -268,25 +190,6 @@ void ServiceWindowGenerationFromSRT::waitVideoGeneration() { } } -void ServiceWindowGenerationFromSRT::transcodeVideoToMp4(){ - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); - string command = "ffmpeg -i "; - command.append(path_libras) - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") - .append(path_contents).append(user_id).append(".mp4"); - //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); - system(command.c_str()); -} - -void ServiceWindowGenerationFromSRT::createThumbnail(){ - string command = "ffmpeg -ss 10 -i "; - command.append(path_contents).append(user_id).append(".mp4") - .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ") - .append(path_contents).append(user_id).append(".png"); - //printf("[INFO]: Thumbnail command -> %s\n", command.c_str()); - system(command.c_str()); -} - void ServiceWindowGenerationFromSRT::Run() { while(isRunning()){ usleep(200000); diff --git a/servico/src/serviceWindowGenerationFromText.cpp b/servico/src/serviceWindowGenerationFromText.cpp index 6dff586..da023c1 100644 --- a/servico/src/serviceWindowGenerationFromText.cpp +++ b/servico/src/serviceWindowGenerationFromText.cpp @@ -25,7 +25,6 @@ ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile, ServiceWindowGenerationFromText::~ServiceWindowGenerationFromText() { free(vetor_pts); if (tradutor) delete tradutor; - //if (sincronizador) delete sincronizador; if (extratorTXT)delete extratorTXT; if (extrator_factory) delete extrator_factory; DDDPRINTF("Service Text finalized!\n"); @@ -33,8 +32,7 @@ ServiceWindowGenerationFromText::~ServiceWindowGenerationFromText() { void ServiceWindowGenerationFromText::setPathContents() { if(strcmp(client_type,DEVELOPER) == 0){ - this->path_contents = PATH_DEVEL; - this->path_uploads = PATH_DEVEL_UPLOADS; + this->path_contents = PATH_DEVEL_CONTENTS; }else if(strcmp(client_type, PRODUCTION) == 0){ ifstream conf_file(PATH_CONF_FILE, ifstream::binary); parsingSuccessful = reader.parse(conf_file, root); @@ -44,47 +42,16 @@ void ServiceWindowGenerationFromText::setPathContents() { string attr = root.get("storage", PATH_VBOX_UPLOADS).asString(); this->path_contents = new char[MAX_SIZE_PATH]; strcpy(this->path_contents, attr.c_str()); - this->path_uploads = PATH_VBOX_UPLOADS; }else{ throw ServiceException("Invalid client!"); } } -void ServiceWindowGenerationFromText::setPathLibras() { - char* final_path = new char[MAX_SIZE_PATH]; - strcpy(final_path, this->path_uploads); - strcat(final_path, this->user_id); - strcat(final_path, "/video_libras.ts"); - - this->path_libras = final_path; -} - -// void ServiceWindowGenerationFromText::setBackground() { -// if(this->transparency == 0) { //pega dicionario com BackGround opaco -// char* dicPath; -// dicPath = getenv("DIC_LIBRAS"); -// if(dicPath != NULL) -// sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else -// sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); - -// } else if(this->transparency == 1) { //pega dicionario com BackGround transparente -// char* dicTPath; -// dicTPath = getenv("DICTRANSP_LIBRAS"); -// if(dicTPath != NULL) -// sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// else{ -// sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); -// } -// } -// } - void ServiceWindowGenerationFromText::setSizeOfSubtitles(int sub_size) { numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas){ sendGlosa(END_NOTIFICATION); waitVideoGeneration(); - //sincronizador->stop(); } } @@ -96,11 +63,6 @@ void ServiceWindowGenerationFromText::notifyLine(unsigned char* line) { notifyTranslator(line); } -// void ServiceWindowGenerationFromText::notifyEndOfSynchronization() { -// transcodeVideoToMp4(); -// this->running = false; -// } - void ServiceWindowGenerationFromText::notifyTranslation(vector * glosas) { for (int i = 0; i < glosas->size(); i++) { locale loc; @@ -109,7 +71,6 @@ void ServiceWindowGenerationFromText::notifyTranslation(vector * glosas) glosa_lower += std::tolower(glosas->at(i).at(k), loc); } sendGlosa(glosa_lower); - //sincronizador->recebeglosa(glosa_lower, 1000); } legendas_enviadas++; } @@ -133,19 +94,10 @@ void ServiceWindowGenerationFromText::initialize() { extratorTXT->addListener(this); extratorTXT->setFilePath(path_input); - setPathLibras(); - tradutor->addListener(this); connectToUnity(); - //setBackground(); - - // uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro - // sincronizador->setPCRBase(pcr_base); - // sincronizador->addListener(this); - // sincronizador->Start(); - try{ extratorTXT->initialize(); }catch(ExtratorException ex){ @@ -164,7 +116,6 @@ void ServiceWindowGenerationFromText::sendGlosa(string glosa) { char* ok_core = new char[3]; core_socket->read(ok_core, 3); //aguarda o unity confirmar o recebimento da glosa - //cout << "Recebi: " << ok_core << endl; delete [] ok_core; } @@ -185,7 +136,6 @@ void ServiceWindowGenerationFromText::waitVideoGeneration() { try{ do{ core_socket->read(endgeneration, sizeof(endgeneration)); - //usleep(500000); }while(strcmp(endgeneration, END_NOTIFICATION) != 0); core_socket->close(); this->running = false; @@ -194,16 +144,6 @@ void ServiceWindowGenerationFromText::waitVideoGeneration() { } } -void ServiceWindowGenerationFromText::transcodeVideoToMp4(){ - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); - string command = "ffmpeg -i "; - command.append(path_libras) - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") - .append(path_contents).append(user_id).append(".mp4"); - //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); - system(command.c_str()); -} - void ServiceWindowGenerationFromText::Run(){ while(isRunning()){ usleep(200000); diff --git a/synchronizer/src/include/listenerSynchronizer.h b/synchronizer/src/include/listenerSynchronizer.h deleted file mode 100644 index b547b23..0000000 --- a/synchronizer/src/include/listenerSynchronizer.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _LISTENER_SYNCHRONIZER_H -#define _LISTENER_SYNCHRONIZER_H - -#include -#include - -using namespace std; - -class ListenerSynchronizer { -public: - virtual void notifyEndOfSynchronization() = 0; -}; - -#endif \ No newline at end of file diff --git a/synchronizer/src/include/synchronizer.h b/synchronizer/src/include/synchronizer.h deleted file mode 100644 index e40eec3..0000000 --- a/synchronizer/src/include/synchronizer.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef SYNCHRONIZER_H -#define SYNCHRONIZER_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "dprintf.h" -#include "jmutex.h" -#include "jthread.h" -#include "listenerSynchronizer.h" -//#include "httpstreamer.h" - -#define VIDEO_PADRAO "vlibras_user/dicionario_libras/poseneutra.ts" -#define VIDEOTRANSP_PADRAO "vlibras_user/dicionarioTransp_libras/poseneutra.ts" - -//DICIONARIO 30 fps -#define PCRPID 256 -#define PESPID 256 - -//DICIONARIO 45 fps -//#define PCRPID 4097 -//#define PESPID 4113 - -using namespace jthread; -using namespace std; - -class Synchronizer : public jthread::Thread { - -private: - bool hastext; - int taxa; - int filefd; - vector *videos; - int devicetv; - - uint64_t pcrBaseGeral; - uint64_t ultimoPCRBase; - uint64_t ultimoPCRBaseMod; - int64_t pcr_inicial; - int mediaDiferencaPCR; - int contagemPCR; - - ofstream escreveAux; - char* extensao; - char* baseDir; - - int64_t tempo_poseneutra; - vector *vector_pts; - int flagPrimeiroArquivo; - - list * listeners; - Mutex* mutex_sync; - Mutex* mutexi; - - char* path_libras; - int transparency; - - int count_tasks; - bool service_running; - - -public: - Synchronizer(); - Synchronizer(/*int64_t pcr_inicial, */char*baseDir, char* extensao, char* path_libras, int transparency); - virtual ~Synchronizer(); - - void setPCRBase(uint64_t pcr_base); - - void Run(); - void stop(); - - void soletraGlosa(string glosa, int64_t pts);//em fase de teste - void recebeglosa(char * video, int tam, int64_t pts); - void recebeglosa(string glosa, int64_t pts); - char * getproximoarquivo(); - - void msleep(long tsleep, long *desconto); - - int gettaxa(); - int64_t getMilisegundos(); - - void settaxa(int taxa); - - vector * getVideos(); - - void analisaPCR(unsigned char * pacote); - void analisaPTSDTS(unsigned char *pacote); - int getPid(unsigned char *pacote); - bool contemAF(unsigned char *pacote); - int getTamanhoAF(unsigned char *pacote); - bool contemPCR(unsigned char *pacote); - uint64_t retornaPCRBase(unsigned char *pacote); - void setPCRBase(unsigned char *pacote, uint64_t pcrbase); - bool contemPayloadStartIndicator(unsigned char *pacote); - bool contemPayloadData(unsigned char *pacote); - bool verificaPESStartCode(unsigned char *PESPacket); - bool verificaPESStreamID(unsigned char *PESPacket); - bool contemPTS(unsigned char *PESPacket); - bool contemDTS(unsigned char *PESPacket); - uint64_t retornaPTS(unsigned char *PESPacket); - uint64_t retornaDTS(unsigned char *PESPacket); - void setNovoPTS(unsigned char *pacote, uint64_t PTS); - void setNovoDTS(unsigned char *pacote, uint64_t DTS); - void escrevePacote(char *pacote); - int escrevePacote(int * descritor, char *pacote, int size); - - virtual void addListener(ListenerSynchronizer* listener); - virtual void removeListener(ListenerSynchronizer* listener); - virtual void notifyListeners(); - -}; - - -#endif /* SYNCHRONIZER_H */ diff --git a/synchronizer/src/synchronizer.cpp b/synchronizer/src/synchronizer.cpp deleted file mode 100644 index 19852e9..0000000 --- a/synchronizer/src/synchronizer.cpp +++ /dev/null @@ -1,568 +0,0 @@ -#include "synchronizer.h" - -Synchronizer::Synchronizer() { - baseDir = (char*) "vlibras_user/dicionario_libras/"; - extensao = (char*) ".ts"; - filefd = 0; - videos = new vector (); - vector_pts = new vector (); - this->mutexi = new Mutex(); - - this->baseDir = new char[strlen(baseDir) + 1]; - strcpy(this->baseDir, baseDir); - - this->extensao = new char[strlen(extensao) + 1]; - strcpy(this->extensao, extensao); - flagPrimeiroArquivo = 1; - listeners = new list(); - this->path_libras = path_libras; - DPRINTF("Done!\n") -} - -Synchronizer::Synchronizer(/*int64_t pcr_inicial, */char* baseDir, char* extensao, char* path_libras, int transparency) { - - hastext = true; - count_tasks = 0; // Usado no teste de Eduardo! - service_running = true; - - this->pcr_inicial = -1; - this->tempo_poseneutra = 120000; - - this->transparency = transparency; - - //cout << "\n\nTransparencia: " << this->transparency << "\n"; - - this->baseDir = new char[strlen(baseDir) + 1]; - strcpy(this->baseDir, baseDir); - - //cout << "\n\n#######BASEDIR: " << this->baseDir << "\n"; - - this->extensao = new char[strlen(extensao) + 1]; - strcpy(this->extensao, extensao); - - filefd = 0; - videos = new vector (); - pcrBaseGeral = 0; - ultimoPCRBase = 0; - mediaDiferencaPCR = 0; - contagemPCR = 0; - vector_pts = new vector (); - flagPrimeiroArquivo = 1; - listeners = new list(); - this->path_libras = new char[strlen(path_libras) + 1]; - strcpy(this->path_libras, path_libras); - //cout << "-> path libras sync: " << path_libras << endl; - this->mutex_sync = new Mutex(); - this->mutexi = new Mutex(); - - DPRINTF("Done!\n") -} - -Synchronizer::~Synchronizer() { - free(videos); - listeners->clear(); - delete listeners; - if (escreveAux.is_open()) escreveAux.close(); - DDDPRINTF("Synchronizer finalized!\n"); - -} - -string toLower(string strr) { - char str[100]; - string ret; - strcpy(str, strr.c_str()); - int differ = 'A' - 'a'; - char ch; - int ii = strlen(str); - for (int i = 0; i < ii; i++) { - strncpy(&ch, str + i, 1); - if (ch >= 'A' && ch <= 'Z') { - ch = ch - differ; - memcpy(str + i, &ch, 1); - } - } - ret = str; - return ret; -} - -void Synchronizer::setPCRBase(uint64_t pcr_base){ - this->pcr_inicial = pcr_base; -} - -char* converteString(string palavra) { - - const char* aux = new char[palavra.size()]; - aux = palavra.c_str(); - char * aux2 = (char*) aux; - - return aux2; -} - -/* Método utilizado pelos serviços (Services Generation) para informar que - este processo pode ser finalizado após a demanda atual, isto é, depois - que terminar de gerar os vídeos que estão na fila. - */ -void Synchronizer::stop() { - //printf("> O Synchronizer recebeu a mensagem de que pode terminar a execução\n"); - service_running = false; -} - -int Synchronizer::gettaxa() { - return taxa; -} - -void Synchronizer::settaxa(int taxa) { - this->taxa = taxa; -} - -vector * Synchronizer::getVideos() { - return videos; -} - -/* Trata a glosa de modo single, ou seja, havendo sinal ou soletrando, - este método é chamado individualmente em cada sinal correspondente. - */ -void Synchronizer::recebeglosa(char * video, int tam, int64_t pts) { - mutexi->Lock(); - char *video_copy = new char [tam + 1]; - strcpy(video_copy, video); - videos->push_back(video_copy); - count_tasks++; - vector_pts->push_back(pts); - mutexi->Unlock(); -} - -int64_t Synchronizer::getMilisegundos() { - struct timeval tempo; - gettimeofday(&tempo, NULL); - return (int64_t) tempo.tv_sec * 1000 + tempo.tv_usec / 1000; -} - -void Synchronizer::msleep(long tsleep, long *desconto) { - struct timeval tempo; - long deltaTAux = 0; - long tusleep = 0; - int64_t tAux = 0, tAux2 = 0; - - tsleep -= *desconto; - - tusleep = tsleep / 1000; - - gettimeofday(&tempo, NULL); - tAux = tempo.tv_sec * 1000 + tempo.tv_usec / 1000; - - while ((tsleep > 0) && (deltaTAux <= tsleep)) { - usleep(tusleep); - - gettimeofday(&tempo, NULL); - tAux2 = tempo.tv_sec * 1000 + tempo.tv_usec / 1000; - - deltaTAux = (tAux2 - tAux)*1000; - } - - //desconto = (deltaTAux - (tsleep/1000))*1000; - *desconto = (deltaTAux - tsleep); -} - -char* proximo = new char[1000]; -char* proximo2 = new char[1000]; - -char * Synchronizer::getproximoarquivo() { - char * video = new char[1000]; - string s1, s2, s3; - video = NULL; - list::iterator it; - //proximo = NULL; - - if (videos->size() == 0) { - if(this->transparency == 0){ - return VIDEO_PADRAO; - }else{ - return VIDEOTRANSP_PADRAO; - } - } - - mutexi->Lock(); - video = videos->front(); - - videos->erase(videos->begin()); - mutexi->Unlock(); - - if (video == NULL) { - if(this->transparency == 0){ - return VIDEO_PADRAO; - }else{ - return VIDEOTRANSP_PADRAO; - } - }else{ - return video; - } -} - -void Synchronizer::analisaPCR(unsigned char *pacote) { - // preciso ter o PID de PCR - if ((getPid(pacote) != PCRPID) || (!contemAF(pacote)) - //if ((!contemAF(pacote)) - || (getTamanhoAF(pacote) == 0) || (!contemPCR(pacote))) { - - - if (contemPCR(pacote)){ - //printf("Encontrei PCR - PID:%d\n", getPid(pacote)); - - } - return; - } - - uint64_t pcrBase = retornaPCRBase(pacote); - - if (mediaDiferencaPCR != 0 && contagemPCR == 0) { // nesse caso esse eh o primeiro PCR de um novo video - //printf("Encontrei o primeiro PCR de um video!\n"); - setPCRBase(pacote, pcrBaseGeral + mediaDiferencaPCR); // tem que multiplicar por 2 o mediaDiferencaPCR? - ultimoPCRBaseMod = pcrBaseGeral + mediaDiferencaPCR; - mediaDiferencaPCR = 0; - } else if (mediaDiferencaPCR == 0 && contagemPCR == 0 && flagPrimeiroArquivo == 1) { - flagPrimeiroArquivo = 0; - setPCRBase(pacote, pcr_inicial + mediaDiferencaPCR); // tem que multiplicar por 2 o mediaDiferencaPCR? - contagemPCR++; - sleep(1); - ultimoPCRBaseMod = pcr_inicial + mediaDiferencaPCR; - - } - else { - - mediaDiferencaPCR = (ultimoPCRBase > 0) ? pcrBase - ultimoPCRBase : 0; - contagemPCR++; - - //if (pcrBaseGeral != 0) { // se nao for o primeiro video //2 - Mudei para o serviço - setPCRBase(pacote, ultimoPCRBaseMod + mediaDiferencaPCR); - ultimoPCRBaseMod += mediaDiferencaPCR; - //} - } - - ultimoPCRBase = pcrBase; - -} - -void Synchronizer::analisaPTSDTS(unsigned char *pacote) { - int inicioPESData = 4; - if (contemAF(pacote)) inicioPESData += getTamanhoAF(pacote) + 1; - - if ((!verificaPESStartCode(pacote + inicioPESData)) || - (!verificaPESStreamID(pacote + inicioPESData)) || - (!contemPTS(pacote + inicioPESData))) { - - return; - } - - uint64_t PTS = retornaPTS(pacote + inicioPESData); - int diferenca = PTS - ultimoPCRBase; - // confirmar se isso aqui SEMPRE eh chamado depois de pelo menos um PCR ser encontrado, principalmente - // no inicio do video - if (ultimoPCRBaseMod != 0) - setNovoPTS(pacote + inicioPESData, ultimoPCRBaseMod + diferenca); - else - setNovoPTS(pacote + inicioPESData, pcrBaseGeral + diferenca); - - if (!contemDTS(pacote + inicioPESData)) return; - - uint64_t DTS = retornaDTS(pacote + inicioPESData); - diferenca = DTS - ultimoPCRBase; - - if (ultimoPCRBaseMod != 0) - setNovoDTS(pacote + inicioPESData, ultimoPCRBaseMod + diferenca); - else - setNovoDTS(pacote + inicioPESData, pcrBaseGeral + diferenca); -} - -int Synchronizer::getPid(unsigned char *pacote) { - return ((pacote[1] & 0x1F) << 8) | pacote[2]; -} - -bool Synchronizer::contemAF(unsigned char *pacote) { - return pacote[3] & 0x20; -} - -int Synchronizer::getTamanhoAF(unsigned char *pacote) { - return pacote[4]; -} - -bool Synchronizer::contemPCR(unsigned char *pacote) { - return pacote[5] & 0x10; -} - -uint64_t Synchronizer::retornaPCRBase(unsigned char *pacote) { - uint64_t pcrbase = 0; - - pcrbase = (uint64_t) pacote[6] << 25 | pacote[7] << 17 | pacote[8] << 9 - | pacote[9] << 1 | (pacote[10] & 0x80) >> 7; - - return pcrbase; -} - -void Synchronizer::setPCRBase(unsigned char *pacote, uint64_t pcrbase) { - pacote[6] = pcrbase >> 25; - pacote[7] = pcrbase >> 17; - pacote[8] = pcrbase >> 9; - pacote[9] = pcrbase >> 1; - if ((pcrbase << 63) != 0) - pacote[10] = pacote[10] | 0x80; - else - pacote[10] = pacote[10] & 0x7F; -} - -bool Synchronizer::contemPayloadStartIndicator(unsigned char *pacote) { - return pacote[1] & 0x40; -} - -bool Synchronizer::contemPayloadData(unsigned char *pacote) { - return pacote[3] & 0x10; -} - -bool Synchronizer::verificaPESStartCode(unsigned char *PESPacket) { - return (((PESPacket[0] << 16) | (PESPacket[1] << 8) | (PESPacket[2])) - == 0x000001) ? 1 : 0; -} - -bool Synchronizer::verificaPESStreamID(unsigned char *PESPacket) { - int stream_id = PESPacket[3]; - - return ((stream_id != 0xBC) && (stream_id != 0xBE) && (stream_id != 0xBF) - && (stream_id != 0xF0) && (stream_id != 0xF1) && (stream_id != 0xFF) - && (stream_id != 0xF2) && (stream_id != 0xF8)); -} - -bool Synchronizer::contemPTS(unsigned char *PESPacket) { - //printf("\nTem PTS: %d\n", PESPacket[7] & 0x80); - return PESPacket[7] & 0x80; -} - -bool Synchronizer::contemDTS(unsigned char *PESPacket) { - return PESPacket[7] & 0x40; -} - -uint64_t Synchronizer::retornaPTS(unsigned char *PESPacket) { - uint64_t PTS = (uint64_t) ((PESPacket[9] & 0x0E) >> 1) << 30 | - (PESPacket[10] << 22) | - (((PESPacket[11] & 0xFE) >> 1) << 15) | - (PESPacket[12] << 7) | - ((PESPacket[13] & 0xFE) >> 1); - return PTS; -} - -uint64_t Synchronizer::retornaDTS(unsigned char *PESPacket) { - uint64_t DTS = (uint64_t) ((PESPacket[14] & 0x0E) >> 1) << 30 | - (PESPacket[15] << 22) | - (((PESPacket[16] & 0xFE) >> 1) << 15) | - (PESPacket[17] << 7) | - ((PESPacket[18] & 0xFE) >> 1); - return DTS; -} - -void Synchronizer::setNovoPTS(unsigned char *pacote, uint64_t PTS) { - pacote[9] = pacote[9] & 0xF1; - pacote[9] = pacote[9] | ((PTS >> 30) << 1); - pacote[10] = PTS >> 22; - pacote[11] = pacote[11] & 0x1; - pacote[11] = pacote[11] | ((PTS >> 15) << 1); - pacote[12] = PTS >> 7; - pacote[13] = pacote[13] & 0x1; - pacote[13] = pacote[13] | PTS << 1; -} - -void Synchronizer::setNovoDTS(unsigned char *pacote, uint64_t DTS) { - pacote[14] = pacote[14] & 0xF1; - pacote[14] = pacote[14] | ((DTS >> 30) << 1); - pacote[15] = DTS >> 22; - pacote[16] = pacote[16] & 0x1; - pacote[16] = pacote[16] | ((DTS >> 15) << 1); - pacote[17] = DTS >> 7; - pacote[18] = pacote[18] & 0x1; - pacote[18] = pacote[18] | DTS << 1; -} - -void Synchronizer::escrevePacote(char *pacote) { - if (!escreveAux.is_open()) { - escreveAux.open(this->path_libras, ios::out | ios::binary); - - } - //printf("tamanho do pacote = %d\n\n", strlen(pacote)); - escreveAux.write(pacote, 188*70); - //printf(" OK!\n\n"); - -} - -int Synchronizer::escrevePacote(int * descritor, char *pacote, int size) { - if (*descritor < 0) {// ainda não abri - *descritor = open(this->path_libras, O_WRONLY | O_CREAT, 0660); - if (descritor < 0) { - printf("Can't open output file\n"); - return -1; - } - } - return write(*descritor, pacote, size); -} - -void ouch(int sig) { - printf("\nSinal Capturado %d", sig); - (void) signal(SIGPIPE, SIG_DFL); - -} - -void Synchronizer::soletraGlosa(string glosa, int64_t pts) { - - //string path = (string) baseDir + glosa + (string) extensao; - //cout << "\n***Glosa NAO ENCONTRADA: " << glosa << endl; - /*mutexi->Lock(); - int file = open(converteString(path), O_RDONLY); - mutexi->Unlock();*/ - //if (file != NULL) { - for (int i = 0; i < glosa.length(); i++) { - if (glosa[i] == '[') - return; - char c = glosa[i]; - if (c >= 97 && c <= 122) { - string path2 = (string) baseDir + glosa[i] + (string) extensao; - char* path2_char = converteString(path2); - recebeglosa(converteString(path2), strlen(path2_char), pts); - } - } - //close(file); - //} else { - // printf("*** ERRO ao abrir o arquivo."); - //} - -} - -/* Utilizado no teste de Eduardo */ -void Synchronizer::recebeglosa(string glosa, int64_t pts) { - glosa = toLower(glosa); - - size_t found; - found=glosa.rfind("dl"); - if (found == 0) - glosa = glosa.substr(2, glosa.length()); - - string path = (string) baseDir + glosa.c_str() + (string) extensao; - char* urlchar = converteString(path); - mutexi->Lock(); - FILE *f = fopen(urlchar, "r"); - mutexi->Unlock(); - if (f == NULL) { - soletraGlosa(glosa, pts); - } else { - fclose(f); - recebeglosa(urlchar, strlen(urlchar), pts); - } - -} - - -void Synchronizer::addListener(ListenerSynchronizer* listener) { - listeners->push_back(listener); -} - -void Synchronizer::removeListener(ListenerSynchronizer* listener) { - listeners->remove(listener); -} - -void Synchronizer::notifyListeners() { - for (list::iterator i = listeners->begin(); i != listeners->end(); i++) { - (*i)->notifyEndOfSynchronization(); - } -} - -void Synchronizer::Run() { - - pcrBaseGeral = ultimoPCRBase = mediaDiferencaPCR = contagemPCR = ultimoPCRBaseMod = 0; - int64_t t0 = 0, tf = 0; - int64_t pts_run; - int cnt, finalcnt, bitrate = 1121600, deltaT = 0; - int bufferSize = 7 * 188; - char * buff = new char[bufferSize]; - - char * arquivo; - - while (videos->size() == 0){ - usleep(50000); //50ms - } - - if(this->transparency == 0) - arquivo = VIDEO_PADRAO; - else - arquivo = VIDEOTRANSP_PADRAO; - - mutexi->Lock(); - filefd = open(arquivo, O_RDONLY); - mutexi->Unlock(); - - if (filefd < 0) - cout << "NAO CONSEGUI ABRIR O ARQUIVO2 - " << arquivo << endl; - - (void) signal(SIGPIPE, ouch); - - int videos_processed = 0; - - int desc_out = -1; - - while (videos_processed <= count_tasks || service_running) { - - cnt = read(filefd, buff, bufferSize); - - // atualiza os valores de PCR e PTS/DTS para cada video - for (int i = 0; i < cnt / 188; i++) { - analisaPCR((unsigned char*) buff + (188 * i)); - analisaPTSDTS((unsigned char*) buff + (188 * i)); - } - - escrevePacote(&desc_out,buff,cnt); - free(buff); - buff = new char[bufferSize]; - - finalcnt = cnt; - if (finalcnt == 0) { - - while (videos->size() == 0 && service_running) { // esperando arquivos do serviço - usleep(10000); - } - - pts_run = vector_pts->front(); - if (ultimoPCRBaseMod + tempo_poseneutra < pts_run) { - if(this->transparency == 0){ - arquivo = VIDEO_PADRAO; - }else{ - arquivo = VIDEOTRANSP_PADRAO; - } - - }else { - if (vector_pts->size() > 0) { - vector_pts->erase(vector_pts->begin()); - arquivo = getproximoarquivo(); - } - videos_processed++; - } - - close(filefd); - filefd = open(arquivo, O_RDONLY); - if (ultimoPCRBase != 0) { - if (ultimoPCRBaseMod != 0) { - pcrBaseGeral = ultimoPCRBaseMod; - } else { - pcrBaseGeral = ultimoPCRBase; - } - contagemPCR = 0; - ultimoPCRBaseMod = 0; - } - } else if (finalcnt == -1) { - printf("Erro: Finalizando Sincronizador!\n"); - this->stop(); - } - } // Fim do while! - - //fsync(desc_out); - close(filefd); - close(desc_out); - notifyListeners(); - -} - - -- libgit2 0.21.2