Commit 1562909b2708f9c69c715dcfcc740645828478f1
1 parent
18e68e96
Exists in
master
and in
1 other branch
Alterações nos parâmetros de entrada
Showing
28 changed files
with
1065 additions
and
898 deletions
Show diff stats
Makefile
| ... | ... | @@ -43,9 +43,8 @@ inputObjs= \ |
| 43 | 43 | inputException.o |
| 44 | 44 | |
| 45 | 45 | servicoObjs= \ |
| 46 | - serviceWindowGeneration.o \ | |
| 47 | 46 | serviceWindowGenerationFromSRT.o \ |
| 48 | - serviceWindowGenerationFromREC.o \ | |
| 47 | + serviceWindowGenerationFromRec.o \ | |
| 49 | 48 | serviceWindowGenerationFromText.o \ |
| 50 | 49 | serviceException.o |
| 51 | 50 | ... | ... |
extrator/src/extratorFactory.cpp
| ... | ... | @@ -8,9 +8,12 @@ ExtratorFactory::~ExtratorFactory(){ |
| 8 | 8 | //TODO |
| 9 | 9 | } |
| 10 | 10 | |
| 11 | -Extrator* ExtratorFactory::getExtrator(int extrator_type){ | |
| 12 | - if(extrator_type == SRT) | |
| 13 | - return new ExtratorSRT(); | |
| 14 | - if(extrator_type == TXT) | |
| 15 | - return new ExtratorTXT(); | |
| 11 | +Extrator* ExtratorFactory::getExtrator(Extrator::ExtratorType extrator_type) { | |
| 12 | + extrator = extrator_type; | |
| 13 | + switch(extrator){ | |
| 14 | + case Extrator::SRT: | |
| 15 | + return new ExtratorSRT(); | |
| 16 | + case Extrator::TXT: | |
| 17 | + return new ExtratorTXT(); | |
| 18 | + } | |
| 16 | 19 | } |
| 17 | 20 | \ No newline at end of file | ... | ... |
extrator/src/extratorSRT.cpp
| ... | ... | @@ -43,7 +43,7 @@ void ExtratorSRT::notifyListeners(unsigned char* subtitle, int64_t pts) { |
| 43 | 43 | } |
| 44 | 44 | |
| 45 | 45 | void ExtratorSRT::notifyEndExtraction(int size) { |
| 46 | - DDPRINTF("Extrator SRT concluiu a extração: %d legendas.\n", size); | |
| 46 | + DPRINTF("Extrator SRT concluiu a extração: %d legendas.\n", size); | |
| 47 | 47 | for(list<ListenerSRT*>::iterator it = listeners->begin(); it != listeners->end(); it++){ |
| 48 | 48 | (*it)->notifyEnd(size); |
| 49 | 49 | } |
| ... | ... | @@ -72,8 +72,7 @@ bool ExtratorSRT::hasNextSubtitle() { |
| 72 | 72 | } |
| 73 | 73 | |
| 74 | 74 | void ExtratorSRT::Run(){ |
| 75 | - printf("\n"); | |
| 76 | - DDPRINTF("[AGUARDE] Extraindo Legendas...\n"); | |
| 75 | + DPRINTF("[AGUARDE] Extraindo Legendas...\n"); | |
| 77 | 76 | |
| 78 | 77 | int sub_index = 0; |
| 79 | 78 | string sub_text = ""; |
| ... | ... | @@ -89,7 +88,6 @@ void ExtratorSRT::Run(){ |
| 89 | 88 | } |
| 90 | 89 | if(sub_index == 0) |
| 91 | 90 | notifyListeners((unsigned char*)"ARQUIVO_VAZIO", 0); |
| 92 | - printf("\n"); | |
| 93 | 91 | finish = true; |
| 94 | 92 | notifyEndExtraction(sub_index); |
| 95 | 93 | } | ... | ... |
extrator/src/extratorTXT.cpp
| ... | ... | @@ -50,7 +50,7 @@ void ExtratorTXT::notifyListeners(unsigned char* line) { |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | void ExtratorTXT::notifyEndExtraction(int size) { |
| 53 | - DDPRINTF("ExtratorTXT concluiu a extração: %d linhas.\n", size); | |
| 53 | + DPRINTF("ExtratorTXT concluiu a extração: %d linhas.\n", size); | |
| 54 | 54 | for(list<ListenerTXT*>::iterator it = listeners->begin(); it != listeners->end(); it++){ |
| 55 | 55 | (*it)->notifyEnd(size); |
| 56 | 56 | } |
| ... | ... | @@ -76,7 +76,7 @@ bool ExtratorTXT::isFinished(){ |
| 76 | 76 | |
| 77 | 77 | void ExtratorTXT::Run(){ |
| 78 | 78 | |
| 79 | - DDPRINTF("[AGUARDE] Extraindo Texto...\n") | |
| 79 | + DPRINTF("[AGUARDE] Extraindo Texto...\n") | |
| 80 | 80 | |
| 81 | 81 | int line_index = 0; |
| 82 | 82 | bool hasNext = true; |
| ... | ... | @@ -99,7 +99,6 @@ void ExtratorTXT::Run(){ |
| 99 | 99 | throw ExtratorException("Falha desconhecida na leitura do arquivo. Tente novamente."); |
| 100 | 100 | } |
| 101 | 101 | } |
| 102 | - printf("\n"); | |
| 103 | 102 | finish = true; |
| 104 | 103 | notifyEndExtraction(line_index); |
| 105 | 104 | } | ... | ... |
extrator/src/include/extrator.h
extrator/src/include/extratorFactory.h
| ... | ... | @@ -5,16 +5,16 @@ |
| 5 | 5 | #include "extratorSRT.h" |
| 6 | 6 | #include "extratorTXT.h" |
| 7 | 7 | |
| 8 | -#define SRT 1 | |
| 9 | -#define TXT 2 | |
| 10 | - | |
| 11 | 8 | class ExtratorFactory{ |
| 12 | 9 | |
| 13 | 10 | public: |
| 14 | 11 | ExtratorFactory(); |
| 15 | 12 | ~ExtratorFactory(); |
| 16 | 13 | |
| 17 | - Extrator* getExtrator(int extrator_type); | |
| 14 | + Extrator* getExtrator(Extrator::ExtratorType extrator_type); | |
| 15 | + | |
| 16 | +private: | |
| 17 | + Extrator::ExtratorType extrator; | |
| 18 | 18 | |
| 19 | 19 | }; |
| 20 | 20 | ... | ... |
log/log
main.cpp
| ... | ... | @@ -12,11 +12,9 @@ |
| 12 | 12 | * Edit on 03 de Fevereiro de 2014 |
| 13 | 13 | */ |
| 14 | 14 | #include "serviceWindowGenerationFromSRT.h" |
| 15 | -#include "serviceWindowGenerationFromREC.h" | |
| 15 | +#include "serviceWindowGenerationFromRec.h" | |
| 16 | 16 | #include "serviceWindowGenerationFromText.h" |
| 17 | 17 | #include "serviceException.h" |
| 18 | -#include "property.h" | |
| 19 | - | |
| 20 | 18 | #include <sys/time.h> |
| 21 | 19 | #include <stdlib.h> |
| 22 | 20 | |
| ... | ... | @@ -32,7 +30,6 @@ void serviceText(char* service, char* path_text, char* transparency, char* id, c |
| 32 | 30 | |
| 33 | 31 | void help(); |
| 34 | 32 | void serviceHelp(int service); |
| 35 | -void setStatusOfReady(char* ready); | |
| 36 | 33 | void fail(string msg); |
| 37 | 34 | void hasFailed(); |
| 38 | 35 | void hasInvalid(); |
| ... | ... | @@ -47,91 +44,61 @@ int main(int argc, char* argv[]) { |
| 47 | 44 | |
| 48 | 45 | gettimeofday(&tv1, NULL); |
| 49 | 46 | t1 = (double)(tv1.tv_sec) + (double)(tv1.tv_usec)/ 1000000.00; |
| 50 | - | |
| 51 | - printf("\n################## VLIBRAS : LAVID ##################\n\n"); | |
| 52 | - | |
| 53 | - if(argc >= 2) { | |
| 54 | - | |
| 47 | + | |
| 48 | + if(argc > 2) { | |
| 49 | + printf("\n################## VLIBRAS : LAVID ##################\n\n"); | |
| 55 | 50 | DDPRINTF("Service Type: %s\n", argv[1]); |
| 56 | - | |
| 57 | 51 | switch((int) atoi(argv[1])){ |
| 58 | - | |
| 59 | 52 | case 1: |
| 60 | - if(argc < 9){ | |
| 53 | + if(argc <= 9){ | |
| 61 | 54 | serviceHelp(1); |
| 62 | 55 | hasInvalid(); |
| 63 | - break; | |
| 64 | - } | |
| 65 | - if(argc == 9){ | |
| 66 | - setStatusOfReady("0"); | |
| 67 | - serviceSRT(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], "user"); | |
| 68 | - setStatusOfReady("1"); | |
| 69 | - }else | |
| 56 | + }else{ | |
| 70 | 57 | serviceSRT(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]); |
| 71 | - | |
| 58 | + } | |
| 72 | 59 | break; |
| 73 | 60 | case 2: |
| 74 | - if(argc < 8){ | |
| 61 | + if(argc <= 8){ | |
| 75 | 62 | serviceHelp(2); |
| 76 | 63 | hasInvalid(); |
| 77 | - break; | |
| 78 | - } | |
| 79 | - if(argc == 8){ | |
| 80 | - setStatusOfReady("0"); | |
| 81 | - serviceREC(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], "user"); | |
| 82 | - setStatusOfReady("1"); | |
| 83 | - }else | |
| 64 | + }else{ | |
| 84 | 65 | serviceREC(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]); |
| 66 | + } | |
| 85 | 67 | break; |
| 86 | 68 | case 3: |
| 87 | - if(argc < 5){ | |
| 69 | + if(argc <= 5){ | |
| 88 | 70 | serviceHelp(3); |
| 89 | 71 | hasInvalid(); |
| 90 | - break; | |
| 91 | - } | |
| 92 | - if(argc == 5){ | |
| 93 | - setStatusOfReady("0"); | |
| 94 | - serviceText(argv[1], argv[2], argv[3], argv[4], "user"); | |
| 95 | - setStatusOfReady("1"); | |
| 96 | - }else | |
| 72 | + }else{ | |
| 97 | 73 | serviceText(argv[1], argv[2], argv[3], argv[4], argv[5]); |
| 74 | + } | |
| 98 | 75 | break; |
| 99 | 76 | case 4: |
| 100 | - if(argc < 5){ | |
| 77 | + if(argc <= 5){ | |
| 101 | 78 | serviceHelp(4); |
| 102 | 79 | hasInvalid(); |
| 103 | - break; | |
| 104 | - } | |
| 105 | - if(argc == 5 ){ | |
| 106 | - setStatusOfReady("0"); | |
| 107 | - serviceOnlySRT(argv[1], argv[2], argv[3], argv[4], "user"); | |
| 108 | - setStatusOfReady("1"); | |
| 109 | - }else | |
| 80 | + }else{ | |
| 110 | 81 | serviceOnlySRT(argv[1], argv[2], argv[3], argv[4], argv[5]); |
| 82 | + } | |
| 111 | 83 | break; |
| 112 | 84 | case 5: |
| 113 | - printf("[INFO] Serviço em manutenção!!!\n"); | |
| 114 | - exit(0); | |
| 115 | - if(argc < 5){ | |
| 85 | + if(argc <= 5){ | |
| 116 | 86 | serviceHelp(5); |
| 117 | 87 | hasInvalid(); |
| 118 | - break; | |
| 119 | - } | |
| 120 | - if (argc == 5){ | |
| 121 | - setStatusOfReady("0"); | |
| 122 | - serviceOnlyAudio(argv[1], argv[2], argv[3], argv[4], "user"); | |
| 123 | - setStatusOfReady("1"); | |
| 124 | - }else | |
| 88 | + }else{ | |
| 125 | 89 | serviceOnlyAudio(argv[1], argv[2], argv[3], argv[4], argv[5]); |
| 90 | + } | |
| 126 | 91 | break; |
| 127 | 92 | default: |
| 128 | - cout << "\nServiço inválido. Tente novamente." << endl; | |
| 129 | - help(); | |
| 93 | + cout << "\nFAIL VLibras: Serviço inválido! Tente --help" << endl; | |
| 130 | 94 | hasInvalid(); |
| 131 | 95 | break; |
| 132 | 96 | } |
| 97 | + }else if(argc == 2 && (strcmp(argv[1], "--help")) == 0){ | |
| 98 | + help(); | |
| 99 | + exit(0); | |
| 133 | 100 | }else{ |
| 134 | - help(); | |
| 101 | + cout << "\nFAIL VLibras: Tente --help para obter informações.\n" << endl; | |
| 135 | 102 | hasInvalid(); |
| 136 | 103 | } |
| 137 | 104 | |
| ... | ... | @@ -142,18 +109,9 @@ int main(int argc, char* argv[]) { |
| 142 | 109 | |
| 143 | 110 | gettimeofday(&tv2, NULL); |
| 144 | 111 | t2 = (double)(tv2.tv_sec) + (double)(tv2.tv_usec)/ 1000000.00; |
| 145 | - cout << endl; | |
| 146 | 112 | DDPRINTF("Time: %lf\n", (t2-t1)); |
| 147 | - DDPRINTF("VLibras concluído!\n\n"); | |
| 113 | + DDPRINTF("VLibras finalized!\n\n"); | |
| 148 | 114 | exit(0); |
| 149 | - | |
| 150 | -} | |
| 151 | - | |
| 152 | -void setStatusOfReady(char* ready){ | |
| 153 | - char* status = new char[256]; | |
| 154 | - strcpy(status, "READY="); | |
| 155 | - strcat(status,ready); | |
| 156 | - Util::Logger::Instance()->writeInfoLog("/home/wesnydy/.vlibras-conf/service/log-vbox", status); | |
| 157 | 115 | } |
| 158 | 116 | |
| 159 | 117 | void serviceSRT(char* service, char* path_video, char* path_srt, char* sublanguage, char* position, |
| ... | ... | @@ -180,8 +138,8 @@ void serviceSRT(char* service, char* path_video, char* path_srt, char* sublangua |
| 180 | 138 | void serviceREC(char* service, char* path_video, char* sublanguage, char* position, char* size, |
| 181 | 139 | char* transparency, char* id, char* client_type){ |
| 182 | 140 | |
| 183 | - ServiceWindowGenerationFromREC * service_rec; | |
| 184 | - service_rec = new ServiceWindowGenerationFromREC(path_video, (int) atoi(sublanguage), | |
| 141 | + ServiceWindowGenerationFromRec * service_rec; | |
| 142 | + service_rec = new ServiceWindowGenerationFromRec(path_video, (int) atoi(sublanguage), | |
| 185 | 143 | (int) atoi(position), (int) atoi(size), (int) atoi(transparency), id, client_type, (int) atoi(service)); |
| 186 | 144 | |
| 187 | 145 | try{ |
| ... | ... | @@ -200,7 +158,7 @@ void serviceREC(char* service, char* path_video, char* sublanguage, char* positi |
| 200 | 158 | void serviceText(char* service, char* path_text, char* transparency, char* id, char* client_type){ |
| 201 | 159 | |
| 202 | 160 | ServiceWindowGenerationFromText *service_text; |
| 203 | - service_text = new ServiceWindowGenerationFromText(path_text, id, (int) atoi(transparency), (int) atoi(service), client_type); | |
| 161 | + service_text = new ServiceWindowGenerationFromText(path_text, (int) atoi(transparency), id, client_type); | |
| 204 | 162 | |
| 205 | 163 | try{ |
| 206 | 164 | service_text->initialize(); |
| ... | ... | @@ -236,8 +194,8 @@ void serviceOnlySRT(char* service, char* path_file, char* transparency, char* id |
| 236 | 194 | |
| 237 | 195 | void serviceOnlyAudio(char* service, char* path_audio, char* transparency, char* id, char* client_type){ |
| 238 | 196 | |
| 239 | - ServiceWindowGenerationFromREC * service_rec; | |
| 240 | - service_rec = new ServiceWindowGenerationFromREC(path_audio, 0, 0, 0, (int) atoi(transparency), id, client_type, (int) atoi(service)); | |
| 197 | + ServiceWindowGenerationFromRec * service_rec; | |
| 198 | + service_rec = new ServiceWindowGenerationFromRec(path_audio, 0, 0, 0, (int) atoi(transparency), id, client_type, (int) atoi(service)); | |
| 241 | 199 | |
| 242 | 200 | try{ |
| 243 | 201 | service_rec->initialize(); |
| ... | ... | @@ -349,21 +307,21 @@ void help() { |
| 349 | 307 | cout << endl |
| 350 | 308 | << "Usage Summary: vlibras [SERVICE] [INPUT] ... [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 351 | 309 | << "\nSERVICE:\n" |
| 352 | - << "1 Video with Subtitles (SRT) - requires INPUT_VIDEO and INPUT_SRT\n" | |
| 353 | - << "2 Video Recognize - requires INPUT_VIDEO\n" | |
| 354 | - << "3 Text - requires INPUT_TEXT_FILE\n" | |
| 355 | - << "4 Subtitles only (SRT) - requires INPUT_SRT\n" | |
| 356 | - << "5 Audio Recognize - requires INPUT_AUDIO\n" | |
| 310 | + << "1 Video with Subtitles (SRT) - requires INPUT_VIDEO and INPUT_SRT\n" | |
| 311 | + << "2 Video Recognize - requires INPUT_VIDEO\n" | |
| 312 | + << "3 Text - requires INPUT_TEXT_FILE\n" | |
| 313 | + << "4 Subtitles only (SRT) - requires INPUT_SRT\n" | |
| 314 | + << "5 Audio Recognize - requires INPUT_AUDIO\n" | |
| 357 | 315 | << "\nSERVICES PARAMETERS:\n" |
| 358 | 316 | << "Video with subtitles:\n" |
| 359 | 317 | << " [INPUT_VIDEO] [INPUT_SRT] [LANGUAGE] [POSITION] [SIZE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 360 | - << "Video Recognize:\n" | |
| 318 | + << "\nVideo Recognize:\n" | |
| 361 | 319 | << " [INPUT_VIDEO] [LANGUAGE] [POSITION] [SIZE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 362 | - << "Text:\n" | |
| 320 | + << "\nText:\n" | |
| 363 | 321 | << " [INPUT_TEXT_FILE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 364 | - << "Subtitles only:\n" | |
| 322 | + << "\nSubtitles only:\n" | |
| 365 | 323 | << " [INPUT_SRT] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 366 | - << "Audio Recognize\n" | |
| 324 | + << "\nAudio Recognize\n" | |
| 367 | 325 | << " [INPUT_AUDIO] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n" |
| 368 | 326 | << "\nPARAMETERS:\n" |
| 369 | 327 | << "INPUT_VIDEO Path of the video file\n" |
| ... | ... | @@ -375,5 +333,6 @@ void help() { |
| 375 | 333 | << "SIZE 1 - means Small, 2 - means Medium, 3 - means Large\n" |
| 376 | 334 | << "TRANSPARENCY 0 - means that the background is opaque , 1 - means that the background is transparent\n" |
| 377 | 335 | << "ID Relative to the unique ID on the Database\n" |
| 378 | - << "CLIENT_TYPE web - necessary only for web clients, others clients can ignore this parameter\n"; | |
| 336 | + << "CLIENT_TYPE prod - means that the client is web/cloud, devel - means that the client is developer\n" | |
| 337 | + << endl; | |
| 379 | 338 | } |
| 380 | 339 | \ No newline at end of file | ... | ... |
mixer/src/Mixer.cpp
| ... | ... | @@ -24,11 +24,12 @@ Mixer::~Mixer() { |
| 24 | 24 | |
| 25 | 25 | /*Faz a chamada ffmpeg no terminal.*/ |
| 26 | 26 | |
| 27 | -void Mixer::initialize(string mainVideo, string slVideo, int positionSecondaryVideo, int sizeSecondaryVideo, int transparency, char* _id, char* client_type){ | |
| 27 | +void Mixer::initialize(string mainVideo, string slVideo, int positionSecondaryVideo, int sizeSecondaryVideo, | |
| 28 | + int transparency, char* _id, char* path_uploads, char* path_contents){ | |
| 28 | 29 | |
| 29 | - DDPRINTF("[AGUARDE] Mixando...\n") | |
| 30 | - | |
| 31 | - client = client_type; | |
| 30 | + DPRINTF("[AGUARDE] Mixando...\n") | |
| 31 | + uploads = path_uploads; | |
| 32 | + contents = path_contents; | |
| 32 | 33 | stringstream ss; |
| 33 | 34 | ss << _id; |
| 34 | 35 | ss >> user_id; |
| ... | ... | @@ -146,24 +147,10 @@ void Mixer::mixVideos () { |
| 146 | 147 | } |
| 147 | 148 | |
| 148 | 149 | void Mixer::setPathFinal(){ |
| 149 | - | |
| 150 | - char* final_path = new char[256]; | |
| 151 | - | |
| 152 | - if(strcmp(client, (char*)WEB_USER) == 0){ | |
| 153 | - pathFinal = PATH_API; | |
| 154 | - pathFinal.append(user_id).append(".mp4"); | |
| 155 | - }else{ | |
| 156 | - try{ | |
| 157 | - PropertyHandler* reader = new PropertyHandler("vlibras_user/.vlibras-conf/configuration/params-vbox.conf"); | |
| 158 | - strcpy(final_path, reader->getAttributeValue("STORAGE")); | |
| 159 | - stringstream ss; | |
| 160 | - ss << final_path; | |
| 161 | - ss >> pathFinal; | |
| 162 | - pathFinal.append("/").append(user_id).append(".mp4"); | |
| 163 | - }catch(RuntimeException &ex){ | |
| 164 | - printf("%s\n", ex.getMessage().c_str()); | |
| 165 | - } | |
| 166 | - } | |
| 150 | + stringstream ss; | |
| 151 | + ss << contents; | |
| 152 | + ss >> pathFinal; | |
| 153 | + pathFinal.append(user_id).append(".mp4"); | |
| 167 | 154 | } |
| 168 | 155 | |
| 169 | 156 | /*Ajusta o FPS do vídeo principal para 45 se preciso...*/ |
| ... | ... | @@ -330,15 +317,11 @@ void Mixer::setMainVideo(string mainVideo){ |
| 330 | 317 | } |
| 331 | 318 | //ajeitar isso depois |
| 332 | 319 | string nameOfMainVideo = mainVideo.substr(0, dotPosition); |
| 333 | - char* final_path = new char[256]; | |
| 334 | - | |
| 335 | - if(strcmp(client, (char*)WEB_USER) == 0){ | |
| 336 | - this->temporaryTextFile = "vlibras_user/vlibras-api/uploads/"; | |
| 337 | - temporaryTextFile.append(this->user_id).append("/tamanho.txt"); | |
| 338 | - }else{ | |
| 339 | - this->temporaryTextFile = "vlibras_user/.vlibras-conf/contents/"; | |
| 340 | - temporaryTextFile.append("tamanho.txt"); | |
| 341 | - } | |
| 320 | + | |
| 321 | + stringstream ss; | |
| 322 | + ss << uploads; | |
| 323 | + ss >> temporaryTextFile; | |
| 324 | + temporaryTextFile.append(this->user_id).append("/tamanho.txt"); | |
| 342 | 325 | //printf("##########temporaryTextFile: %s\n", temporaryTextFile.c_str()); |
| 343 | 326 | } |
| 344 | 327 | string Mixer::getMainVideo(){ | ... | ... |
mixer/src/include/Mixer.h
| ... | ... | @@ -18,9 +18,6 @@ |
| 18 | 18 | #include <fstream> |
| 19 | 19 | #include "dprintf.h" |
| 20 | 20 | #include "property.h" |
| 21 | - | |
| 22 | -using namespace std; | |
| 23 | -using namespace sndesc; | |
| 24 | 21 | |
| 25 | 22 | //SL Video Position |
| 26 | 23 | #define TOP_LEFT 1 |
| ... | ... | @@ -37,11 +34,8 @@ using namespace sndesc; |
| 37 | 34 | #define LARGE_HEIGHT 540 //0.5*1080 |
| 38 | 35 | |
| 39 | 36 | #define MAX_SIZE_PATH 256 |
| 40 | -#define WEB_USER "web" | |
| 41 | -#define PATH_API "vlibras_user/vlibras-api/videos/" | |
| 42 | 37 | |
| 43 | 38 | using namespace std; |
| 44 | -using namespace sndesc; | |
| 45 | 39 | |
| 46 | 40 | class Mixer { |
| 47 | 41 | public: |
| ... | ... | @@ -66,7 +60,7 @@ public: |
| 66 | 60 | int getTransparency(); |
| 67 | 61 | void setNumThreads(string); |
| 68 | 62 | string getNumThreads(); |
| 69 | - void initialize(string mainVideo, string slVideo, int, int, int, char*, char*); | |
| 63 | + void initialize(string mainVideo, string slVideo, int, int, int, char*, char*, char*); | |
| 70 | 64 | void setPathFinal(); |
| 71 | 65 | |
| 72 | 66 | private: |
| ... | ... | @@ -82,7 +76,8 @@ private: |
| 82 | 76 | void convertSecondaryVideoFPS(double); |
| 83 | 77 | |
| 84 | 78 | string mainVideo, secondaryVideo, temporaryTextFile, numThreads, pathFinal, user_id; |
| 85 | - char* client; | |
| 79 | + char* contents; | |
| 80 | + char* uploads; | |
| 86 | 81 | int positionSecondaryVideo; |
| 87 | 82 | double widthSecondaryVideo, heightSecondaryVideo; |
| 88 | 83 | int transparency; | ... | ... |
recognize/src/include/recognize.h
| ... | ... | @@ -23,9 +23,6 @@ |
| 23 | 23 | #define SIZE_BUFFER 256 |
| 24 | 24 | #define CONFIDENCE_RATE 0.10 |
| 25 | 25 | |
| 26 | -#define WEB_USER 1 | |
| 27 | -#define PATH_API_UPLOADS "vlibras_user/vlibras-api/uploads/" | |
| 28 | -#define PATH_VBOX_CONTENTS "vlibras_user/.vlibras-conf/contents/" | |
| 29 | 26 | #define PATH_AUDIO_ORIGIN "/audio/origin/audio_origin.wav" |
| 30 | 27 | #define PATH_AUDIO_PARTS "/audio/parts/" |
| 31 | 28 | #define FILENAME_RECOGNIZED_OUT "/audio/recognized.out" |
| ... | ... | @@ -49,7 +46,7 @@ class Recognize: public Thread { |
| 49 | 46 | |
| 50 | 47 | public: |
| 51 | 48 | |
| 52 | - Recognize(char* _pathVideo, char* id, int client_type); | |
| 49 | + Recognize(char* _pathVideo, char* id); | |
| 53 | 50 | Recognize(char* _pathVideo, char* id, char* rate); |
| 54 | 51 | Recognize(char* _pathVideo, int _inputType, char* id); |
| 55 | 52 | ~Recognize(); |
| ... | ... | @@ -68,6 +65,7 @@ public: |
| 68 | 65 | * Define o tamanho em segundos de cada parte retirada do audio original. |
| 69 | 66 | */ |
| 70 | 67 | void setSizeAudioBlocs(int sec); |
| 68 | + void setPathAudioContents(char* path); | |
| 71 | 69 | |
| 72 | 70 | void addListener(RecognizeListener* listener); |
| 73 | 71 | ... | ... |
recognize/src/recognize.cpp
| 1 | 1 | #include <recognize.h> |
| 2 | 2 | |
| 3 | -Recognize::Recognize(char* _pathVideo, char* _id, int client_type) { | |
| 3 | +Recognize::Recognize(char* _pathVideo, char* _id) { | |
| 4 | 4 | |
| 5 | 5 | listeners = new list<RecognizeListener*>(); |
| 6 | 6 | pathVideo = _pathVideo; |
| ... | ... | @@ -11,12 +11,6 @@ Recognize::Recognize(char* _pathVideo, char* _id, int client_type) { |
| 11 | 11 | ss << _id; |
| 12 | 12 | ss >> id; |
| 13 | 13 | confidenceRate=CONFIDENCE_RATE; |
| 14 | - if(client_type == WEB_USER){ | |
| 15 | - path_contents = (char*) PATH_API_UPLOADS; | |
| 16 | - }else{ | |
| 17 | - path_contents = (char*) PATH_VBOX_CONTENTS; | |
| 18 | - } | |
| 19 | - | |
| 20 | 14 | DPRINTF("Done!\n"); |
| 21 | 15 | } |
| 22 | 16 | |
| ... | ... | @@ -56,7 +50,7 @@ Recognize::~Recognize() { |
| 56 | 50 | |
| 57 | 51 | void Recognize::initialize() { |
| 58 | 52 | |
| 59 | - DDPRINTF("Recognizing...\n"); | |
| 53 | + DPRINTF("Recognizing...\n"); | |
| 60 | 54 | /**printf("*** Initialized Recognition ***\n\nVideo: %s\nType [1-File; 2-Mic]: %d\nFrequency: %d\n\n", |
| 61 | 55 | this->pathVideo, this->inputType, this->frequency);**/ |
| 62 | 56 | |
| ... | ... | @@ -93,6 +87,10 @@ void Recognize::setSizeAudioBlocs(int sec) { |
| 93 | 87 | sizeBlocs = sec; |
| 94 | 88 | } |
| 95 | 89 | |
| 90 | +void Recognize::setPathAudioContents(char* path){ | |
| 91 | + path_contents = path; | |
| 92 | +} | |
| 93 | + | |
| 96 | 94 | |
| 97 | 95 | char* Recognize::extractAudioFromVideo() { |
| 98 | 96 | |
| ... | ... | @@ -208,7 +206,6 @@ void Recognize::breakVideoParts(int timeTotal) { |
| 208 | 206 | |
| 209 | 207 | } |
| 210 | 208 | |
| 211 | - | |
| 212 | 209 | void Recognize::executeJuliusEngine() { |
| 213 | 210 | |
| 214 | 211 | string command, type, freqStr; |
| ... | ... | @@ -225,7 +222,7 @@ void Recognize::executeJuliusEngine() { |
| 225 | 222 | sprintf(cfreq, "%i", frequency); |
| 226 | 223 | command.append(" -smpFreq "). |
| 227 | 224 | append(cfreq). |
| 228 | - append(" -nolog >> "); | |
| 225 | + append(" >> "); | |
| 229 | 226 | command.append(path_contents).append(id).append(FILENAME_RECOGNIZED_OUT); |
| 230 | 227 | //Command of execute Julius |
| 231 | 228 | //printf("\n\nCommand for executeJuliusEngine: %s\n", command.c_str()); |
| ... | ... | @@ -286,7 +283,6 @@ void Recognize::generateConfidence() { |
| 286 | 283 | scores.push_back(avgScores/sizeAvgScores); |
| 287 | 284 | |
| 288 | 285 | }else if(pass==0){ |
| 289 | - | |
| 290 | 286 | notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", 0); |
| 291 | 287 | notifyEndExtraction(count_lines); |
| 292 | 288 | return; |
| ... | ... | @@ -341,7 +337,6 @@ void Recognize::filterOutputJulius() { |
| 341 | 337 | if(getConfidence()) |
| 342 | 338 | notifyListeners(sentence_ptr, pts.front()); |
| 343 | 339 | else{ |
| 344 | - | |
| 345 | 340 | notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", pts.front()); |
| 346 | 341 | } |
| 347 | 342 | scores.erase(scores.begin()); |
| ... | ... | @@ -371,7 +366,7 @@ void Recognize::notifyListeners(char* text, int64_t pts) { |
| 371 | 366 | } |
| 372 | 367 | |
| 373 | 368 | void Recognize::notifyEndExtraction(int sentences_size) { |
| 374 | - DDPRINTF("Recognizer concluiu o reconhecimento: %d sentenças.\n", sentences_size); | |
| 369 | + DPRINTF("Recognizer concluiu o reconhecimento: %d sentenças.\n", sentences_size); | |
| 375 | 370 | for(list<RecognizeListener*>::iterator it = listeners->begin(); it != listeners->end(); it++){ |
| 376 | 371 | (*it)->notifyEnd(sentences_size); |
| 377 | 372 | } |
| ... | ... | @@ -409,8 +404,7 @@ void Recognize::cleanFiles() { |
| 409 | 404 | void Recognize::createDir(){ |
| 410 | 405 | |
| 411 | 406 | string command = "mkdir "; |
| 412 | - command.append(path_contents).append(id) | |
| 413 | - .append(" && mkdir ").append(path_contents).append(id).append("/audio") | |
| 407 | + command.append(path_contents).append(id).append("/audio") | |
| 414 | 408 | .append(" && mkdir ").append(path_contents).append(id).append("/audio/parts") |
| 415 | 409 | .append(" && mkdir ").append(path_contents).append(id).append("/audio/origin"); |
| 416 | 410 | system(command.c_str()); | ... | ... |
servico/src/include/serviceException.h
| ... | ... | @@ -9,17 +9,20 @@ |
| 9 | 9 | * * |
| 10 | 10 | **************************************************************************/ |
| 11 | 11 | |
| 12 | - #ifndef SERVICEEXCEPTION_H | |
| 13 | - #define SERVICEEXCEPTION_H | |
| 12 | +#ifndef SERVICEEXCEPTION_H | |
| 13 | +#define SERVICEEXCEPTION_H | |
| 14 | 14 | |
| 15 | - #include <lavidlib/base/RuntimeException.h> | |
| 15 | +#include <lavidlib/base/RuntimeException.h> | |
| 16 | 16 | |
| 17 | - using namespace lavidlib; | |
| 17 | +using namespace std; | |
| 18 | +using namespace lavidlib; | |
| 18 | 19 | |
| 19 | - class ServiceException : public RuntimeException { | |
| 20 | - public: | |
| 21 | - ServiceException(const std::string message); | |
| 22 | - ServiceException(const char* message); | |
| 23 | - }; | |
| 20 | +class ServiceException : public RuntimeException { | |
| 21 | + | |
| 22 | +public: | |
| 23 | + ServiceException(const string message); | |
| 24 | + ServiceException(const char* message); | |
| 25 | + | |
| 26 | +}; | |
| 24 | 27 | |
| 25 | - #endif /* SERVICEEXCEPTION_H */ | |
| 26 | 28 | \ No newline at end of file |
| 29 | +#endif /* SERVICEEXCEPTION_H */ | |
| 27 | 30 | \ No newline at end of file | ... | ... |
servico/src/include/serviceWindowGeneration.h
| 1 | 1 | #ifndef SERVICEWINDOWGENERATION_H |
| 2 | -#define SERVICEWINDOWGENERATION_H | |
| 2 | +#define SERVICEWINDOWGENERATION_H | |
| 3 | 3 | |
| 4 | -#include <stdlib.h> | |
| 5 | -#include <locale> | |
| 6 | -#include <string> | |
| 7 | -#include <iostream> | |
| 8 | 4 | #include <vector> |
| 9 | -#include <fcntl.h> | |
| 10 | -#include <sys/time.h> | |
| 11 | -#include <limits.h> | |
| 5 | +#include <stdint.h> | |
| 6 | +#include <string> | |
| 7 | +#include <locale> | |
| 8 | +#include "jthread.h" | |
| 12 | 9 | #include "dprintf.h" |
| 13 | -#include "Mixer.h" | |
| 14 | -//#include "inputFile.h" | |
| 15 | 10 | #include "property.h" |
| 16 | -#include "listenerTradutor.h" | |
| 17 | -#include "tradutorPortGlosa.h" | |
| 18 | -//#include "httpstreamer.h" | |
| 11 | +#include "Mixer.h" | |
| 19 | 12 | #include "synchronizer.h" |
| 20 | 13 | #include "listenerSynchronizer.h" |
| 14 | +#include "listenerTradutor.h" | |
| 15 | +#include "tradutorPortGlosa.h" | |
| 21 | 16 | #include "serviceException.h" |
| 22 | 17 | #include <lavidlib/base/RuntimeException.h> |
| 23 | 18 | |
| 24 | -#define WEB_USER "web" | |
| 25 | -#define VIDEO_POSE_NEUTRA "poseneutra" | |
| 19 | +#define DEVELOPER "devel" | |
| 20 | +#define PRODUCTION "prod" | |
| 26 | 21 | #define BASEDIR "vlibras_user/dicionario_libras/" |
| 27 | 22 | #define BASEDIRTRANSP "vlibras_user/dicionarioTransp_libras/" |
| 23 | +#define VIDEO_POSE_NEUTRA "poseneutra" | |
| 28 | 24 | #define EXTENSAO_DICIONARIO ".ts" |
| 29 | -#define PATH_CONTENTS "vlibras_user/.vlibras-conf/contents/" | |
| 30 | -#define PATH_API "vlibras_user/vlibras-api/videos/" | |
| 25 | +#define PATH_DEVEL "vlibras_user/vlibras-contents/videos/" | |
| 26 | +#define PATH_DEVEL_UPLOADS "vlibras_user/vlibras-contents/uploads/" | |
| 27 | +#define PATH_VBOX_UPLOADS "vlibras_user/.vlibras-conf/uploads/" | |
| 28 | +#define PATH_CONF_FILE "vlibras_user/.vlibras-conf/configuration/params-vbox.conf" | |
| 31 | 29 | #define MAX_SIZE_PATH 256 |
| 32 | 30 | |
| 33 | -#define SERVICE_TYPE_SRT 1 /* Subtitle SRT */ | |
| 34 | -#define SERVICE_TYPE_REC 2 /* Reconhecimento de Voz */ | |
| 35 | -#define SERVICE_TYPE_TEXT 3 /* Texto */ | |
| 36 | -#define SERVICE_TYPE_SRT_ONLY 4 /* Subtitle SRT ONLY */ | |
| 37 | -#define SERVICE_TYPE_REC_ONLY_AUDIO 5 /* Subtitle AUDIO ONLY */ | |
| 38 | - | |
| 39 | 31 | using namespace Tradutor; |
| 40 | -//using namespace Util; | |
| 32 | +using namespace jthread; | |
| 41 | 33 | using namespace std; |
| 42 | -using namespace sndesc; | |
| 43 | 34 | |
| 44 | -class ServiceWindowGeneration : public ListenerTradutor, public ListenerSynchronizer{ | |
| 35 | +class ServiceWindowGeneration { | |
| 45 | 36 | |
| 46 | 37 | protected: |
| 38 | + TradutorPortGlosa* tradutor; | |
| 39 | + Synchronizer* sincronizador; | |
| 40 | + PropertyHandler* ppty_h; | |
| 41 | + Mixer* mixer; | |
| 42 | + | |
| 43 | + vector<int64_t>* vetor_pts; | |
| 47 | 44 | |
| 48 | - TradutorPortGlosa * tradutor; | |
| 49 | - //HttpStreamer *sincronizador; | |
| 50 | - Synchronizer * sincronizador; | |
| 51 | - //InputFile * inputfile; | |
| 52 | - Mixer * mixer; | |
| 53 | - PropertyHandler* reader; | |
| 45 | + bool finish; | |
| 46 | + bool running; | |
| 54 | 47 | |
| 55 | - vector<int64_t> * vetor_pts; | |
| 56 | - | |
| 57 | - char* path_input; | |
| 58 | - char* path_audio; | |
| 48 | + char* path_input; | |
| 59 | 49 | char* path_libras; |
| 50 | + char* path_contents; | |
| 51 | + char* path_uploads; | |
| 60 | 52 | char* client_type; |
| 61 | 53 | char* user_id; |
| 62 | 54 | |
| 63 | - bool running; | |
| 55 | + int size; | |
| 56 | + int position; | |
| 57 | + int transparency; | |
| 58 | + int sub_language; | |
| 59 | + int service_type; | |
| 60 | + int numero_legendas; | |
| 61 | + int legendas_enviadas; | |
| 62 | + | |
| 63 | + virtual void setSizeOfSubtitles(int sub_size) = 0; | |
| 64 | + virtual void setPathContents() = 0; | |
| 65 | + virtual void setPathLibras() = 0; | |
| 66 | + virtual void setBackground() = 0; | |
| 67 | + | |
| 68 | + //virtual void transcodeVideoToWebm(); | |
| 69 | + virtual void transcodeVideoToMp4() = 0; | |
| 64 | 70 | |
| 65 | - int size, position, transparency, sublanguage, serviceType, numero_legendas, legendas_enviadas; | |
| 66 | - | |
| 67 | - void setSize(int); | |
| 68 | - void setPosition(int); | |
| 69 | - void setTransparency(int); | |
| 70 | - void setSubLanguage(int sublang); | |
| 71 | - void setServiceType(int type); | |
| 72 | - void setUserId(char* _userId); | |
| 73 | - void setClientType(char* client_type); | |
| 74 | - void setPathInput(char* _path_input); | |
| 75 | - | |
| 76 | - void transcodeVideoToWebm(); | |
| 77 | - void transcodeVideoToMp4(); | |
| 78 | - void createThumbnail(); | |
| 79 | - | |
| 80 | 71 | public: |
| 81 | - | |
| 82 | - ServiceWindowGeneration(); | |
| 83 | - ~ServiceWindowGeneration(); | |
| 84 | - | |
| 85 | - virtual void notifyTranslation(vector<string>* glosas); | |
| 86 | - virtual void notifyEndOfSynchronization(); | |
| 87 | - | |
| 88 | - void initialize(); | |
| 89 | - bool isRunning(); | |
| 90 | - | |
| 91 | - char* getPathLibras(); | |
| 92 | - char* getUserId(); | |
| 93 | - char* getClientType(); | |
| 94 | - char* getPathInput(); | |
| 95 | - string getPathAPI(); | |
| 96 | - TradutorPortGlosa * getTradutor(); | |
| 97 | - | |
| 98 | - void setPathLibras(); | |
| 99 | - void setSizeOfSubtitles(int sub_size); | |
| 100 | - void adicionaPTS(int64_t pts); | |
| 72 | + virtual void initialize() = 0; | |
| 73 | + virtual bool isFinished() = 0; | |
| 74 | + virtual void notifyTranslator(unsigned char* text) = 0; | |
| 101 | 75 | }; |
| 102 | 76 | |
| 103 | 77 | -#endif /* SERVICEWINDOWGENERATION_H */ |
| 78 | +#endif /* SERVICEWINDOWGENERATION_H */ | |
| 104 | 79 | \ No newline at end of file | ... | ... |
servico/src/include/serviceWindowGenerationFromREC.h
| ... | ... | @@ -1,35 +0,0 @@ |
| 1 | -#ifndef SERVICEWINDOWGENERATIONFROMREC_H | |
| 2 | -#define SERVICEWINDOWGENERATIONFROMREC_H | |
| 3 | - | |
| 4 | -#include <stdint.h> | |
| 5 | -#include <stdio.h> | |
| 6 | -#include "jthread.h" | |
| 7 | -#include "serviceWindowGeneration.h" | |
| 8 | -#include "recognize.h" | |
| 9 | -#include "inputFile.h" | |
| 10 | - | |
| 11 | -using namespace std; | |
| 12 | -using namespace jthread; | |
| 13 | - | |
| 14 | -class ServiceWindowGenerationFromREC : public ServiceWindowGeneration, public RecognizeListener, public Thread { | |
| 15 | - | |
| 16 | -private: | |
| 17 | - Recognize *rec; | |
| 18 | - bool finish; | |
| 19 | - | |
| 20 | -public: | |
| 21 | - | |
| 22 | - ServiceWindowGenerationFromREC(char* path_video, int sublanguage, int position, int size, int transparency, char* id, int _serviceType, char* rate); | |
| 23 | - ServiceWindowGenerationFromREC(char* path_video, int sublanguage, int position, int size, int transparency, char* id, char* client_type, int _serviceType); | |
| 24 | - ~ServiceWindowGenerationFromREC(); | |
| 25 | - | |
| 26 | - virtual void notifyTextRecognized(unsigned char* text, int64_t pts); | |
| 27 | - virtual void notifyEnd(int sentences_size); | |
| 28 | - void notifyTranslator(unsigned char *text); | |
| 29 | - | |
| 30 | - void initialize(); | |
| 31 | - bool isFinished(); | |
| 32 | - void Run(); | |
| 33 | -}; | |
| 34 | - | |
| 35 | -#endif /* SERVICEWINDOWGENERATIONFROMREC_H */ |
| ... | ... | @@ -0,0 +1,43 @@ |
| 1 | +#ifndef SERVICEWINDOWGENERATIONFROMREC_H | |
| 2 | +#define SERVICEWINDOWGENERATIONFROMREC_H | |
| 3 | + | |
| 4 | +#include "recognize.h" | |
| 5 | +#include "recognizeListener.h" | |
| 6 | +#include "serviceWindowGeneration.h" | |
| 7 | + | |
| 8 | +#define SERVICE_TYPE_REC 2 | |
| 9 | +#define SERVICE_TYPE_REC_ONLY_AUDIO 5 | |
| 10 | + | |
| 11 | +class ServiceWindowGenerationFromRec : public ServiceWindowGeneration, public RecognizeListener, public ListenerTradutor, public ListenerSynchronizer, public Thread { | |
| 12 | + | |
| 13 | +private: | |
| 14 | + Recognize* rec; | |
| 15 | + | |
| 16 | + void addPTS(int64_t pts); | |
| 17 | + void setSizeOfSubtitles(int sub_size); | |
| 18 | + void setPathContents(); | |
| 19 | + void setPathLibras(); | |
| 20 | + void setBackground(); | |
| 21 | + | |
| 22 | + void transcodeVideoToMp4(); | |
| 23 | + void createThumbnail(); | |
| 24 | + bool isRunning(); | |
| 25 | +public: | |
| 26 | + ServiceWindowGenerationFromRec(char* pathVideo, int sublanguage, int position, int size, | |
| 27 | + int transparency, char* id, int serviceType, char* rate); | |
| 28 | + ServiceWindowGenerationFromRec(char* pathVideo, int sublanguage, int pos, int size, | |
| 29 | + int transp, char* id, char* client, int serviceType); | |
| 30 | + ~ServiceWindowGenerationFromRec(); | |
| 31 | + | |
| 32 | + void notifyTextRecognized(unsigned char* text, int64_t pts); | |
| 33 | + void notifyTranslation(vector<string>* glosas); | |
| 34 | + void notifyTranslator(unsigned char* text); | |
| 35 | + void notifyEndOfSynchronization(); | |
| 36 | + void notifyEnd(int sentences_size); | |
| 37 | + | |
| 38 | + void initialize(); | |
| 39 | + bool isFinished(); | |
| 40 | + void Run(); | |
| 41 | +}; | |
| 42 | + | |
| 43 | +#endif /* SERVICEWINDOWGENERATIONFROMREC_H */ | |
| 0 | 44 | \ No newline at end of file | ... | ... |
servico/src/include/serviceWindowGenerationFromSRT.h
| 1 | 1 | #ifndef SERVICEWINDOWGENERATIONFROMSRT_H |
| 2 | -#define SERVICEWINDOWGENERATIONFROMSRT_H | |
| 2 | +#define SERVICEWINDOWGENERATIONFROMSRT_H | |
| 3 | 3 | |
| 4 | -#include "serviceWindowGeneration.h" | |
| 5 | -#include <pthread.h> | |
| 6 | -#include "inputFile.h" | |
| 7 | -#include "extratorFactory.h" | |
| 8 | 4 | #include "listenerSRT.h" |
| 9 | -#include "stdint.h" | |
| 10 | -#include <vector> | |
| 11 | -#include "jthread.h" | |
| 12 | - | |
| 13 | -#define SRT 1 | |
| 5 | +#include "extratorFactory.h" | |
| 6 | +#include "serviceWindowGeneration.h" | |
| 14 | 7 | |
| 15 | -using namespace std; | |
| 16 | -using namespace jthread; | |
| 17 | -using namespace Util; | |
| 8 | +#define SERVICE_TYPE_SRT 1 | |
| 9 | +#define SERVICE_TYPE_SRT_ONLY 4 | |
| 18 | 10 | |
| 19 | -class ServiceWindowGenerationFromSRT : public ServiceWindowGeneration, public ListenerSRT, public Thread { | |
| 11 | +class ServiceWindowGenerationFromSRT : public ServiceWindowGeneration, public ListenerSRT, public ListenerTradutor, public ListenerSynchronizer, public Thread { | |
| 20 | 12 | |
| 21 | 13 | private: |
| 22 | - pthread_mutex_t *mutex_serviceSRT; | |
| 23 | - ExtratorFactory *extrator_factory; | |
| 24 | - ExtratorSRT * extratorSRT; | |
| 25 | - char* path_srt; | |
| 26 | - bool finish; | |
| 27 | - | |
| 28 | -public: | |
| 14 | + ExtratorFactory* extrator_factory; | |
| 15 | + ExtratorSRT* extratorSRT; | |
| 29 | 16 | |
| 30 | - /* Construtor 1 - legenda e vídeo */ | |
| 31 | - ServiceWindowGenerationFromSRT(char* path_video, char* path_srt, int sublanguage, | |
| 32 | - int position, int size, int transparency, char* id, char* client_type, int _serviceType); | |
| 33 | - /* Construtor 2 - só legenda */ | |
| 34 | - ServiceWindowGenerationFromSRT(char* path_srt, int transparency, char* id, char* client_type, int _serviceType); | |
| 17 | + char* path_srt; | |
| 18 | + | |
| 19 | + void addPTS(int64_t pts); | |
| 20 | + void setSizeOfSubtitles(int sub_size); | |
| 21 | + void setPathContents(); | |
| 22 | + void setPathLibras(); | |
| 23 | + void setBackground(); | |
| 24 | + | |
| 25 | + void transcodeVideoToMp4(); | |
| 26 | + void createThumbnail(); | |
| 27 | + bool isRunning(); | |
| 28 | +public: | |
| 29 | + //construtor de serviço de video e legenda | |
| 30 | + ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage, int pos, | |
| 31 | + int size, int transp, char* id, char* client, int serviceType); | |
| 32 | + //construtor de serviço de somente legenda | |
| 33 | + ServiceWindowGenerationFromSRT(char* pathSRT, int transparency, char* id, char* client, int serviceType); | |
| 35 | 34 | ~ServiceWindowGenerationFromSRT(); |
| 36 | - | |
| 37 | - virtual void notifySubtitle(unsigned char* subtitle, int64_t pts); | |
| 38 | - virtual void notifyEnd(int sub_size); | |
| 39 | - void notifyTranslator(unsigned char* subtitle); | |
| 35 | + | |
| 36 | + void notifySubtitle(unsigned char* subtitle, int64_t pts); | |
| 37 | + void notifyTranslation(vector<string>* glosas); | |
| 38 | + void notifyTranslator(unsigned char* text); | |
| 39 | + void notifyEndOfSynchronization(); | |
| 40 | + void notifyEnd(int sub_size); | |
| 40 | 41 | |
| 41 | 42 | void initialize(); |
| 42 | 43 | bool isFinished(); |
| 43 | 44 | void Run(); |
| 44 | - | |
| 45 | - void setPathSRT(char* path_srt); | |
| 46 | - | |
| 47 | 45 | }; |
| 48 | 46 | |
| 49 | -#endif /* SERVICEWINDOWGENERATIONFROMSRT_H */ | |
| 47 | +#endif /* SERVICEWINDOWGENERATIONFROMSRT_H_ */ | |
| 50 | 48 | \ No newline at end of file | ... | ... |
servico/src/include/serviceWindowGenerationFromText.h
| 1 | -#ifndef _SERVICEWINDOWGENERATIONFROMTEXT_H | |
| 2 | -#define _SERVICEWINDOWGENERATIONFROMTEXT_H | |
| 1 | +#ifndef SERVICEWINDOWGENERATIONFROMTEXT_H | |
| 2 | +#define SERVICEWINDOWGENERATIONFROMTEXT_H | |
| 3 | 3 | |
| 4 | -#include "serviceWindowGeneration.h" | |
| 5 | -#include "extratorFactory.h" | |
| 6 | 4 | #include "listenerTXT.h" |
| 5 | +#include "extratorFactory.h" | |
| 6 | +#include "serviceWindowGeneration.h" | |
| 7 | 7 | |
| 8 | -#define TXT 2 | |
| 9 | -/*FIXME: está restrito a 2K bytes de texto */ | |
| 10 | -#define MAX_TEXT_SIZE 2048 | |
| 8 | +#define MAX_TEXT_SIZE 2048 //FIXME: está restrito a 2K bytes de texto | |
| 11 | 9 | |
| 12 | -class ServiceWindowGenerationFromText : public ServiceWindowGeneration, public ListenerTXT, public Thread { | |
| 10 | +class ServiceWindowGenerationFromText : public ServiceWindowGeneration, public ListenerTXT, public ListenerTradutor, public ListenerSynchronizer, public Thread { | |
| 13 | 11 | |
| 14 | 12 | private: |
| 15 | - ExtratorFactory *extrator_factory; | |
| 16 | - ExtratorTXT * extratorTXT; | |
| 17 | - bool finish; | |
| 18 | - | |
| 13 | + ExtratorFactory* extrator_factory; | |
| 14 | + ExtratorTXT* extratorTXT; | |
| 15 | + | |
| 16 | + void setSizeOfSubtitles(int sub_size); | |
| 17 | + void setPathContents(); | |
| 18 | + void setPathLibras(); | |
| 19 | + void setBackground(); | |
| 20 | + | |
| 21 | + void transcodeVideoToMp4(); | |
| 22 | + bool isRunning(); | |
| 19 | 23 | public: |
| 20 | - ServiceWindowGenerationFromText (char* _path_file, char* user_id, int _transp, int _serviceType, char* _client_type); | |
| 21 | - ~ServiceWindowGenerationFromText (); | |
| 24 | + ServiceWindowGenerationFromText(char* pathFile, int transparency, char* id, char* client); | |
| 25 | + ~ServiceWindowGenerationFromText(); | |
| 22 | 26 | |
| 23 | 27 | void notifyLine(unsigned char* line); |
| 28 | + void notifyTranslation(vector<string>* glosas); | |
| 29 | + void notifyTranslator(unsigned char* text); | |
| 30 | + void notifyEndOfSynchronization(); | |
| 24 | 31 | void notifyEnd(int line_size); |
| 25 | 32 | |
| 26 | 33 | void initialize(); |
| 27 | 34 | bool isFinished(); |
| 28 | - void Run(); | |
| 35 | + void Run(); | |
| 29 | 36 | }; |
| 30 | 37 | |
| 31 | -#endif /* _SERVICEWINDOWGENERATIONFROMTEXT_H */ | |
| 38 | +#endif /* SERVICEWINDOWGENERATIONFROMTEXT_H */ | |
| 32 | 39 | \ No newline at end of file | ... | ... |
servico/src/serviceException.cpp
| ... | ... | @@ -11,10 +11,10 @@ |
| 11 | 11 | |
| 12 | 12 | |
| 13 | 13 | |
| 14 | - #include "serviceException.h" | |
| 14 | +#include "serviceException.h" | |
| 15 | 15 | |
| 16 | - ServiceException::ServiceException(const std::string message) | |
| 17 | - : RuntimeException(message) | |
| 16 | + ServiceException::ServiceException(const std::string message) | |
| 17 | + : RuntimeException(message) | |
| 18 | 18 | { /* TODO */ } |
| 19 | 19 | ServiceException::ServiceException(const char* message) |
| 20 | 20 | : RuntimeException(message) | ... | ... |
servico/src/serviceWindowGeneration.cpp
| ... | ... | @@ -1,283 +0,0 @@ |
| 1 | - | |
| 2 | -#include "serviceWindowGeneration.h" | |
| 3 | - | |
| 4 | -ServiceWindowGeneration::ServiceWindowGeneration() { | |
| 5 | - tradutor = new TradutorPortGlosa(); | |
| 6 | - vetor_pts = new vector<int64_t >(); | |
| 7 | - try{ | |
| 8 | - reader = new PropertyHandler("vlibras_user/.vlibras-conf/configuration/params-vbox.conf"); | |
| 9 | - }catch(RuntimeException &ex){printf("%s\n", ex.getMessage().c_str());} | |
| 10 | - numero_legendas = INT_MAX; | |
| 11 | - legendas_enviadas = 0; | |
| 12 | - this->running = true; | |
| 13 | - serviceType = 0; | |
| 14 | - DPRINTF("Done!\n"); | |
| 15 | -} | |
| 16 | - | |
| 17 | -ServiceWindowGeneration::~ServiceWindowGeneration() { | |
| 18 | - free(vetor_pts); | |
| 19 | - free(path_libras); | |
| 20 | - if (mixer) delete mixer; | |
| 21 | - if (tradutor) delete tradutor; | |
| 22 | - if (sincronizador) delete sincronizador; | |
| 23 | - DDDPRINTF("Service finalized!\n"); | |
| 24 | -} | |
| 25 | - | |
| 26 | -char* ServiceWindowGeneration::getPathLibras() { | |
| 27 | - return path_libras; | |
| 28 | -} | |
| 29 | - | |
| 30 | -char* ServiceWindowGeneration::getPathInput() { | |
| 31 | - return path_input; | |
| 32 | -} | |
| 33 | - | |
| 34 | -string ServiceWindowGeneration::getPathAPI() { | |
| 35 | - return PATH_API; | |
| 36 | -} | |
| 37 | - | |
| 38 | -char* ServiceWindowGeneration::getClientType(){ | |
| 39 | - return client_type; | |
| 40 | -} | |
| 41 | - | |
| 42 | -char* ServiceWindowGeneration::getUserId() { | |
| 43 | - return user_id; | |
| 44 | -} | |
| 45 | - | |
| 46 | -void ServiceWindowGeneration::setPathInput(char* _path_input) { | |
| 47 | - this->path_input = _path_input; | |
| 48 | -} | |
| 49 | - | |
| 50 | -void ServiceWindowGeneration::setClientType(char* client_type) { | |
| 51 | - this->client_type = client_type; | |
| 52 | -} | |
| 53 | - | |
| 54 | -void ServiceWindowGeneration::setUserId(char* _userId) { | |
| 55 | - this->user_id = _userId; | |
| 56 | -} | |
| 57 | - | |
| 58 | -void ServiceWindowGeneration::setServiceType(int type) { | |
| 59 | - serviceType = type; | |
| 60 | -} | |
| 61 | - | |
| 62 | -void ServiceWindowGeneration::setSubLanguage(int sublang){ | |
| 63 | - this->sublanguage = sublang; | |
| 64 | -} | |
| 65 | - | |
| 66 | -void ServiceWindowGeneration::setSize(int size){ | |
| 67 | - this->size = size; | |
| 68 | -} | |
| 69 | - | |
| 70 | -void ServiceWindowGeneration::setPosition(int position){ | |
| 71 | - this->position = position; | |
| 72 | -} | |
| 73 | - | |
| 74 | -void ServiceWindowGeneration::setTransparency(int transparency){ | |
| 75 | - this->transparency = transparency; | |
| 76 | -} | |
| 77 | - | |
| 78 | -void ServiceWindowGeneration::setPathLibras() { | |
| 79 | - | |
| 80 | - char* final_path = new char[MAX_SIZE_PATH]; | |
| 81 | - | |
| 82 | - if(strcmp(client_type, (char*)WEB_USER) == 0){ | |
| 83 | - strcpy(final_path, "vlibras_user/vlibras-api/uploads/"); | |
| 84 | - strcat(final_path, this->user_id); | |
| 85 | - strcat(final_path, "/libras.ts"); | |
| 86 | - }else{ | |
| 87 | - strcpy(final_path, PATH_CONTENTS); | |
| 88 | - strcat(final_path, "libras.ts"); | |
| 89 | - } | |
| 90 | - | |
| 91 | - this->path_libras = final_path; | |
| 92 | - //DDPRINTF("Path TS File: %s\n", this->path_libras); | |
| 93 | -} | |
| 94 | - | |
| 95 | -void ServiceWindowGeneration::setSizeOfSubtitles(int sub_size) { | |
| 96 | - numero_legendas = sub_size; | |
| 97 | - if (legendas_enviadas >= numero_legendas){ | |
| 98 | - sincronizador->stop(); | |
| 99 | - } | |
| 100 | - | |
| 101 | -} | |
| 102 | - | |
| 103 | -void ServiceWindowGeneration::adicionaPTS(int64_t pts) { | |
| 104 | - vetor_pts->push_back(pts); | |
| 105 | -} | |
| 106 | - | |
| 107 | -/* Checado pela subclasse para saber quando o sincronizador terminar. */ | |
| 108 | -bool ServiceWindowGeneration::isRunning() { | |
| 109 | - return this->running; | |
| 110 | -} | |
| 111 | - | |
| 112 | -/* Quando o sincronizador termina, ele invoca esse método para avisar! */ | |
| 113 | -void ServiceWindowGeneration::notifyEndOfSynchronization() { | |
| 114 | - if (serviceType == SERVICE_TYPE_REC || serviceType == SERVICE_TYPE_SRT) { | |
| 115 | - mixer = new Mixer(); | |
| 116 | - mixer->initialize(this->path_input, this->path_libras,this->position,this->size,this->transparency, this->user_id, this->client_type); | |
| 117 | - createThumbnail(); | |
| 118 | - }else{ | |
| 119 | - transcodeVideoToMp4(); | |
| 120 | - } | |
| 121 | - this->running = false; | |
| 122 | -} | |
| 123 | - | |
| 124 | -void ServiceWindowGeneration::initialize() { | |
| 125 | - | |
| 126 | - setPathLibras(); | |
| 127 | - | |
| 128 | - if (this->sublanguage == 1) { | |
| 129 | - tradutor->addListener(this); | |
| 130 | - } | |
| 131 | - | |
| 132 | - // o path do arquivo só poderá conter um "."(ponto), esse identifica a extensão. | |
| 133 | - | |
| 134 | - vector<string> tokens; | |
| 135 | - /* Se for texto não é necessário vídeo de entrada (path_input) */ | |
| 136 | - if (serviceType != SERVICE_TYPE_TEXT && serviceType != SERVICE_TYPE_SRT_ONLY && | |
| 137 | - serviceType != SERVICE_TYPE_REC_ONLY_AUDIO) { | |
| 138 | - char * pathtmp = this->path_input; | |
| 139 | - int size = strlen(pathtmp); | |
| 140 | - char vtemp [size]; | |
| 141 | - strcpy(vtemp, pathtmp); | |
| 142 | - pathtmp = strtok(vtemp, "."); | |
| 143 | - while (pathtmp != NULL) { | |
| 144 | - tokens.push_back(string(pathtmp)); | |
| 145 | - pathtmp = strtok(NULL, "."); | |
| 146 | - } | |
| 147 | - string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; | |
| 148 | - this->path_libras = new char[buildstrpath.size()]; | |
| 149 | - strcpy(this->path_libras, buildstrpath.c_str()); | |
| 150 | - //printf("O ServiceWGeneration montou o seguinte path para o vídeo de Libras: %s\n", path_libras); | |
| 151 | - | |
| 152 | - } else { | |
| 153 | - tradutor->addListener(this); | |
| 154 | - } | |
| 155 | - | |
| 156 | - if(this->transparency == 0) { //pega dicionario com BackGround opaco | |
| 157 | - sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, | |
| 158 | - this->path_libras, this->transparency); | |
| 159 | - } else { | |
| 160 | - if(this->transparency == 1) { //pega dicionario com BackGround transparente | |
| 161 | - sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, | |
| 162 | - this->path_libras,this->transparency); | |
| 163 | - } | |
| 164 | - } | |
| 165 | - | |
| 166 | - if (serviceType != SERVICE_TYPE_SRT) { | |
| 167 | - uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro | |
| 168 | - sincronizador->setPCRBase(pcr_base); | |
| 169 | - } | |
| 170 | - sincronizador->addListener(this); | |
| 171 | - sincronizador->Start(); | |
| 172 | -} | |
| 173 | - | |
| 174 | -/* Método utilizado pelo Tradutor para notificar o texto traduzido. */ | |
| 175 | -void ServiceWindowGeneration::notifyTranslation(vector<string> * glosas) { | |
| 176 | - | |
| 177 | - if (serviceType != SERVICE_TYPE_TEXT) { | |
| 178 | - for (int i = 0; i < glosas->size(); i++) { | |
| 179 | - std::locale loc; | |
| 180 | - std::string glosa_lower = ""; | |
| 181 | - for (int k = 0; k < glosas->at(i).length(); k++) | |
| 182 | - glosa_lower += std::tolower(glosas->at(i).at(k), loc); | |
| 183 | - | |
| 184 | - //cout << "__Glosa [" << i << "] = " << glosa_lower << endl; | |
| 185 | - int64_t pts_notificado = vetor_pts->front(); | |
| 186 | - sincronizador->recebeglosa(glosa_lower, pts_notificado); | |
| 187 | - } | |
| 188 | - /* O 'numero_legendas' é informado pela subclasse através do método setSizeOfSubtitles. | |
| 189 | - Então, inicialmente, seu valor corresponde a um número inteiro máximo. | |
| 190 | - */ | |
| 191 | - /*printf("numero_legendas = %d\nlegendas_enviadas = %d\n", numero_legendas, legendas_enviadas); | |
| 192 | - if (legendas_enviadas >= numero_legendas) { | |
| 193 | - sincronizador->stop(); | |
| 194 | - }*/ | |
| 195 | - vetor_pts->erase(vetor_pts->begin()); | |
| 196 | - } else { | |
| 197 | - //Nova versão! | |
| 198 | - for (int i = 0; i < glosas->size(); i++) { | |
| 199 | - std::locale loc; | |
| 200 | - std::string glosa_lower = ""; | |
| 201 | - for (int k = 0; k < glosas->at(i).length(); k++) | |
| 202 | - glosa_lower += std::tolower(glosas->at(i).at(k), loc); | |
| 203 | - | |
| 204 | - //cout << "__Glosa [" << i << "] = " << glosa_lower << endl; | |
| 205 | - sincronizador->recebeglosa(glosa_lower, 1000); | |
| 206 | - } | |
| 207 | - sincronizador->stop(); | |
| 208 | - } | |
| 209 | - legendas_enviadas++; | |
| 210 | -} | |
| 211 | - | |
| 212 | -void ServiceWindowGeneration::transcodeVideoToWebm() { | |
| 213 | - //printf("[INFO]: A transcodificação para .webm está ativada!\n"); | |
| 214 | - DDDPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); | |
| 215 | - string command = "ffmpeg -i "; | |
| 216 | - command.append(path_libras) | |
| 217 | - .append(" -vcodec libvpx -acodec libvorbis ") | |
| 218 | - //.append(" -v quiet ") | |
| 219 | - .append(PATH_API) | |
| 220 | - .append(getUserId()) | |
| 221 | - .append(".webm"); | |
| 222 | - //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); | |
| 223 | - system(command.c_str()); | |
| 224 | -} | |
| 225 | - | |
| 226 | -void ServiceWindowGeneration::transcodeVideoToMp4() { | |
| 227 | - //if (serviceType == SERVICE_TYPE_TEXT && strcmp(client_type, (char*)"WEB") == 0) | |
| 228 | - // transcodeVideoToWebm(); | |
| 229 | - //else{ | |
| 230 | - //printf("[INFO]: A transcodificação para .mp4 está ativada!\n"); | |
| 231 | - DDDPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); | |
| 232 | - string command = "ffmpeg -i "; | |
| 233 | - command.append(path_libras) | |
| 234 | - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 "); | |
| 235 | - //.append(" -v quiet "); | |
| 236 | - | |
| 237 | - if(strcmp(client_type, (char*)WEB_USER) == 0){ | |
| 238 | - command.append(PATH_API).append(getUserId()); | |
| 239 | - | |
| 240 | - }else{ | |
| 241 | - try{ | |
| 242 | - char* vPath = new char[256]; | |
| 243 | - vPath = reader->getAttributeValue("STORAGE"); | |
| 244 | - command.append(vPath).append("/").append(getUserId()); | |
| 245 | - }catch(RuntimeException &ex){ | |
| 246 | - printf("%s\n", ex.getMessage().c_str()); | |
| 247 | - } | |
| 248 | - } | |
| 249 | - | |
| 250 | - command.append(".mp4"); | |
| 251 | - //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); | |
| 252 | - system(command.c_str()); | |
| 253 | - | |
| 254 | - //.append(" -strict experimental -vcodec mjpeg -r 30 -pix_fmt yuvj422p ") | |
| 255 | - //.append(" -strict experimental -vcodec mpeg2video -r 30 ") | |
| 256 | - //} | |
| 257 | -} | |
| 258 | - | |
| 259 | -void ServiceWindowGeneration::createThumbnail(){ | |
| 260 | - string command = "ffmpeg -ss 10 -i "; | |
| 261 | - //command.append(PATH_API).append(user_id).append(".mp4") | |
| 262 | - //.append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 "); | |
| 263 | - //.append(" -v quiet "); | |
| 264 | - | |
| 265 | - if(strcmp(client_type, (char*)WEB_USER) == 0){ | |
| 266 | - command.append(PATH_API).append(user_id).append(".mp4") | |
| 267 | - .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ") | |
| 268 | - .append(PATH_API).append(getUserId()); | |
| 269 | - }else{ | |
| 270 | - try{ | |
| 271 | - char* pPath = new char[256]; | |
| 272 | - pPath = reader->getAttributeValue("STORAGE"); | |
| 273 | - command.append(pPath).append("/").append(getUserId()).append(".mp4"); | |
| 274 | - }catch(RuntimeException &ex){ | |
| 275 | - printf("%s\n", ex.getMessage().c_str()); | |
| 276 | - } | |
| 277 | - command.append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ") | |
| 278 | - .append(" -v quiet ") | |
| 279 | - .append(PATH_CONTENTS).append(getUserId()); | |
| 280 | - } | |
| 281 | - command.append(".png"); | |
| 282 | - system(command.c_str()); | |
| 283 | -} | |
| 284 | 0 | \ No newline at end of file |
servico/src/serviceWindowGenerationFromREC.cpp
| ... | ... | @@ -1,81 +0,0 @@ |
| 1 | -#include "serviceWindowGenerationFromREC.h" | |
| 2 | - | |
| 3 | -ServiceWindowGenerationFromREC::ServiceWindowGenerationFromREC( | |
| 4 | - char* path_video, int sublanguage, int position, int size, int transparency, char* id, int serviceType, char* rate) { | |
| 5 | - | |
| 6 | - setPathInput(path_video); | |
| 7 | - setSubLanguage(sublanguage); | |
| 8 | - setPosition(position); | |
| 9 | - setSize(size); | |
| 10 | - setTransparency(transparency); | |
| 11 | - setServiceType(serviceType); | |
| 12 | - setUserId(id); | |
| 13 | - rec = new Recognize(path_video, id, rate); | |
| 14 | - finish = false; | |
| 15 | - DPRINTF("Done!\n"); | |
| 16 | -} | |
| 17 | - | |
| 18 | -ServiceWindowGenerationFromREC::ServiceWindowGenerationFromREC( | |
| 19 | - char* path_video, int sublanguage, int position, int size, int transparency, char* id, char* client_type, int serviceType) { | |
| 20 | - | |
| 21 | - setPathInput(path_video); | |
| 22 | - setSubLanguage(sublanguage); | |
| 23 | - setPosition(position); | |
| 24 | - setSize(size); | |
| 25 | - setTransparency(transparency); | |
| 26 | - setServiceType(serviceType); | |
| 27 | - setClientType(client_type); | |
| 28 | - setUserId(id); | |
| 29 | - if(strcmp(client_type, "web") == 0) | |
| 30 | - rec = new Recognize(path_video, id, 1);// parametro 1 indica que é um cliente web | |
| 31 | - else | |
| 32 | - rec = new Recognize(path_video, id, 0);// parametro 0 indica que é um cliente diferente, ex: cloud | |
| 33 | - | |
| 34 | - finish = false; | |
| 35 | - DPRINTF("Done!\n"); | |
| 36 | -} | |
| 37 | - | |
| 38 | -ServiceWindowGenerationFromREC::~ServiceWindowGenerationFromREC() { | |
| 39 | - delete rec; | |
| 40 | - DDDPRINTF("Service REC finished!\n"); | |
| 41 | -} | |
| 42 | - | |
| 43 | -void ServiceWindowGenerationFromREC::notifyTranslator(unsigned char *text) { | |
| 44 | - tradutor->traduz(text); | |
| 45 | -} | |
| 46 | - | |
| 47 | -void ServiceWindowGenerationFromREC::notifyTextRecognized(unsigned char* text, int64_t pts) { | |
| 48 | - adicionaPTS(pts); | |
| 49 | - notifyTranslator(text); | |
| 50 | -} | |
| 51 | - | |
| 52 | -bool ServiceWindowGenerationFromREC::isFinished(){ | |
| 53 | - return finish; | |
| 54 | -} | |
| 55 | - | |
| 56 | -void ServiceWindowGenerationFromREC::notifyEnd(int sentences_size) { | |
| 57 | - DDPRINTF("Service REC recebeu: %d sentenças.\n", sentences_size); | |
| 58 | - setSizeOfSubtitles(sentences_size); | |
| 59 | -} | |
| 60 | - | |
| 61 | -void ServiceWindowGenerationFromREC::initialize() { | |
| 62 | - | |
| 63 | - rec->addListener(this); | |
| 64 | - | |
| 65 | - ServiceWindowGeneration::initialize(); | |
| 66 | - | |
| 67 | - try{ | |
| 68 | - rec->initialize(); | |
| 69 | - } catch(RecognizeException ex){ | |
| 70 | - throw ServiceException(ex.getMessage()); | |
| 71 | - } | |
| 72 | - this->Start(); | |
| 73 | -} | |
| 74 | - | |
| 75 | -void ServiceWindowGenerationFromREC::Run() { | |
| 76 | - | |
| 77 | - while (isRunning()) { | |
| 78 | - usleep(200000); | |
| 79 | - } | |
| 80 | - finish = true; | |
| 81 | -} |
| ... | ... | @@ -0,0 +1,224 @@ |
| 1 | +#include "serviceWindowGenerationFromRec.h" | |
| 2 | + | |
| 3 | +ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec( | |
| 4 | + char* pathVideo, int sublanguage, int pos, int size, int transp, char* id, int serviceType, char* rate){ | |
| 5 | + | |
| 6 | + this->path_input = pathVideo; | |
| 7 | + this->sub_language = sublanguage; | |
| 8 | + this->position = pos; | |
| 9 | + this->size = size; | |
| 10 | + this->transparency = transp; | |
| 11 | + this->user_id = id; | |
| 12 | + this->service_type = serviceType; | |
| 13 | + numero_legendas = INT_MAX; | |
| 14 | + legendas_enviadas = 0; | |
| 15 | + vetor_pts = new vector<int64_t >(); | |
| 16 | + rec = new Recognize(pathVideo, id, rate); | |
| 17 | + tradutor = new TradutorPortGlosa(); | |
| 18 | + running = true; | |
| 19 | + finish = false; | |
| 20 | + DPRINTF("Done!\n"); | |
| 21 | +} | |
| 22 | + | |
| 23 | +ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec( | |
| 24 | + char* pathVideo, int sublanguage, int pos, int size, int transp, char* id, char* client, int serviceType){ | |
| 25 | + | |
| 26 | + this->path_input = pathVideo; | |
| 27 | + this->sub_language = sublanguage; | |
| 28 | + this->position = pos; | |
| 29 | + this->size = size; | |
| 30 | + this->transparency = transp; | |
| 31 | + this->user_id = id; | |
| 32 | + this->client_type = client; | |
| 33 | + this->service_type = serviceType; | |
| 34 | + numero_legendas = INT_MAX; | |
| 35 | + legendas_enviadas = 0; | |
| 36 | + vetor_pts = new vector<int64_t >(); | |
| 37 | + rec = new Recognize(path_input, id);// parametro 1 indica que é um cliente web | |
| 38 | + tradutor = new TradutorPortGlosa(); | |
| 39 | + setPathContents(); | |
| 40 | + running = true; | |
| 41 | + finish = false; | |
| 42 | + DPRINTF("Done!\n"); | |
| 43 | +} | |
| 44 | + | |
| 45 | +ServiceWindowGenerationFromRec::~ServiceWindowGenerationFromRec(){ | |
| 46 | + free(vetor_pts); | |
| 47 | + delete(ppty_h); | |
| 48 | + if (tradutor) delete tradutor; | |
| 49 | + if (rec) delete rec; | |
| 50 | + if (sincronizador) delete sincronizador; | |
| 51 | + if (mixer) delete mixer; | |
| 52 | + DDDPRINTF("Service Rec finished!\n"); | |
| 53 | +} | |
| 54 | + | |
| 55 | +void ServiceWindowGenerationFromRec::setPathContents(){ | |
| 56 | + if(strcmp(client_type,DEVELOPER) == 0){ | |
| 57 | + this->path_contents = PATH_DEVEL; | |
| 58 | + this->path_uploads = PATH_DEVEL_UPLOADS; | |
| 59 | + rec->setPathAudioContents(path_uploads); | |
| 60 | + }else if(strcmp(client_type, PRODUCTION) == 0){ | |
| 61 | + try{ | |
| 62 | + ppty_h = new PropertyHandler(PATH_CONF_FILE, PropertyHandler::READ); | |
| 63 | + this->path_contents = (char*) ppty_h->get_attibute_value("STORAGE"); | |
| 64 | + }catch(RuntimeException &ex){ | |
| 65 | + printf("%s\n", ex.getMessage().c_str()); | |
| 66 | + } | |
| 67 | + this->path_uploads = PATH_VBOX_UPLOADS; | |
| 68 | + rec->setPathAudioContents(path_uploads); | |
| 69 | + }else{ | |
| 70 | + throw new ServiceException("Invalid client!"); | |
| 71 | + } | |
| 72 | +} | |
| 73 | + | |
| 74 | +void ServiceWindowGenerationFromRec::setPathLibras(){ | |
| 75 | + char* final_path = new char[MAX_SIZE_PATH]; | |
| 76 | + strcpy(final_path, this->path_uploads); | |
| 77 | + strcat(final_path, this->user_id); | |
| 78 | + strcat(final_path, "/video_libras.ts"); | |
| 79 | + | |
| 80 | + this->path_libras = final_path; | |
| 81 | +} | |
| 82 | + | |
| 83 | +void ServiceWindowGenerationFromRec::setBackground(){ | |
| 84 | + if(this->transparency == 0) { //pega dicionario com BackGround opaco | |
| 85 | + sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, | |
| 86 | + this->path_libras, this->transparency); | |
| 87 | + } else { | |
| 88 | + if(this->transparency == 1) { //pega dicionario com BackGround transparente | |
| 89 | + sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, | |
| 90 | + this->path_libras, this->transparency); | |
| 91 | + } | |
| 92 | + } | |
| 93 | +} | |
| 94 | + | |
| 95 | +void ServiceWindowGenerationFromRec::setSizeOfSubtitles(int sub_size){ | |
| 96 | + numero_legendas = sub_size; | |
| 97 | + if (legendas_enviadas >= numero_legendas) | |
| 98 | + sincronizador->stop(); | |
| 99 | +} | |
| 100 | + | |
| 101 | +void ServiceWindowGenerationFromRec::addPTS(int64_t pts){ | |
| 102 | + vetor_pts->push_back(pts); | |
| 103 | +} | |
| 104 | + | |
| 105 | +void ServiceWindowGenerationFromRec::notifyTranslator(unsigned char* text){ | |
| 106 | + tradutor->traduz(text); | |
| 107 | +} | |
| 108 | + | |
| 109 | +//Metodo utilizado pelo reconhecedor para avisar sobre novas sentenças reconhecidas | |
| 110 | +void ServiceWindowGenerationFromRec::notifyTextRecognized(unsigned char* text, int64_t pts){ | |
| 111 | + addPTS(pts); | |
| 112 | + notifyTranslator(text); | |
| 113 | +} | |
| 114 | + | |
| 115 | +//Quando o sincronizador termina, ele invoca esse método para avisar | |
| 116 | +void ServiceWindowGenerationFromRec::notifyEndOfSynchronization() { | |
| 117 | + if (this->service_type == SERVICE_TYPE_REC) { | |
| 118 | + mixer = new Mixer(); | |
| 119 | + mixer->initialize(this->path_input, this->path_libras,this->position,this->size, | |
| 120 | + this->transparency, this->user_id, this->path_uploads, this->path_contents); | |
| 121 | + createThumbnail(); | |
| 122 | + }else{ | |
| 123 | + transcodeVideoToMp4(); | |
| 124 | + } | |
| 125 | + this->running = false; | |
| 126 | +} | |
| 127 | + | |
| 128 | +void ServiceWindowGenerationFromRec::notifyTranslation(vector<string> * glosas) { | |
| 129 | + for (int i = 0; i < glosas->size(); i++) { | |
| 130 | + locale loc; | |
| 131 | + string glosa_lower = ""; | |
| 132 | + for (int k = 0; k < glosas->at(i).length(); k++){ | |
| 133 | + glosa_lower += std::tolower(glosas->at(i).at(k), loc); | |
| 134 | + } | |
| 135 | + int64_t pts_notificado = vetor_pts->front(); | |
| 136 | + sincronizador->recebeglosa(glosa_lower, pts_notificado); | |
| 137 | + } | |
| 138 | + vetor_pts->erase(vetor_pts->begin()); | |
| 139 | + legendas_enviadas++; | |
| 140 | +} | |
| 141 | + | |
| 142 | +void ServiceWindowGenerationFromRec::notifyEnd(int sentences_size){ | |
| 143 | + DPRINTF("Service REC recebeu: %d sentenças.\n", sentences_size); | |
| 144 | + setSizeOfSubtitles(sentences_size); | |
| 145 | +} | |
| 146 | + | |
| 147 | +bool ServiceWindowGenerationFromRec::isRunning(){ | |
| 148 | + return this->running; | |
| 149 | +} | |
| 150 | + | |
| 151 | +bool ServiceWindowGenerationFromRec::isFinished(){ | |
| 152 | + return this->finish; | |
| 153 | +} | |
| 154 | + | |
| 155 | +void ServiceWindowGenerationFromRec::initialize(){ | |
| 156 | + DPRINTF("Service REC Initialize.\n"); | |
| 157 | + rec->addListener(this); | |
| 158 | + setPathLibras(); | |
| 159 | + | |
| 160 | + if(this->sub_language == 1) | |
| 161 | + tradutor->addListener(this); | |
| 162 | + | |
| 163 | + if(this->service_type != SERVICE_TYPE_REC_ONLY_AUDIO){ | |
| 164 | + vector<string> tokens; | |
| 165 | + char* pathtmp = this->path_input; | |
| 166 | + int size = strlen(pathtmp); | |
| 167 | + char vtemp [size]; | |
| 168 | + | |
| 169 | + strcpy(vtemp, pathtmp); | |
| 170 | + pathtmp = strtok(vtemp, "."); | |
| 171 | + while (pathtmp != NULL) { | |
| 172 | + tokens.push_back(string(pathtmp)); | |
| 173 | + pathtmp = strtok(NULL, "."); | |
| 174 | + } | |
| 175 | + | |
| 176 | + string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; | |
| 177 | + this->path_libras = new char[buildstrpath.size()]; | |
| 178 | + strcpy(this->path_libras, buildstrpath.c_str()); | |
| 179 | + //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras); | |
| 180 | + | |
| 181 | + }else{ | |
| 182 | + tradutor->addListener(this); | |
| 183 | + } | |
| 184 | + | |
| 185 | + setBackground(); | |
| 186 | + | |
| 187 | + uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro | |
| 188 | + sincronizador->setPCRBase(pcr_base); | |
| 189 | + sincronizador->addListener(this); | |
| 190 | + sincronizador->Start(); | |
| 191 | + | |
| 192 | + try{ | |
| 193 | + rec->initialize(); | |
| 194 | + } catch(RecognizeException ex){ | |
| 195 | + throw ServiceException(ex.getMessage()); | |
| 196 | + } | |
| 197 | + this->Start(); | |
| 198 | +} | |
| 199 | + | |
| 200 | +void ServiceWindowGenerationFromRec::transcodeVideoToMp4(){ | |
| 201 | + DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); | |
| 202 | + string command = "ffmpeg -i "; | |
| 203 | + command.append(path_libras) | |
| 204 | + .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") | |
| 205 | + .append(path_contents).append(user_id).append(".mp4"); | |
| 206 | + //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); | |
| 207 | + system(command.c_str()); | |
| 208 | +} | |
| 209 | + | |
| 210 | +void ServiceWindowGenerationFromRec::createThumbnail(){ | |
| 211 | + string command = "ffmpeg -ss 10 -i "; | |
| 212 | + command.append(path_contents).append(user_id).append(".mp4") | |
| 213 | + .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ") | |
| 214 | + .append(path_contents).append(user_id).append(".png"); | |
| 215 | + //printf("[INFO]: Thumbnail command -> %s\n", command.c_str()); | |
| 216 | + system(command.c_str()); | |
| 217 | +} | |
| 218 | + | |
| 219 | +void ServiceWindowGenerationFromRec::Run(){ | |
| 220 | + while(isRunning()){ | |
| 221 | + usleep(200000); | |
| 222 | + } | |
| 223 | + finish = true; | |
| 224 | +} | |
| 0 | 225 | \ No newline at end of file | ... | ... |
servico/src/serviceWindowGenerationFromSRT.cpp
| 1 | 1 | #include "serviceWindowGenerationFromSRT.h" |
| 2 | 2 | |
| 3 | +ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage, | |
| 4 | + int pos, int size, int transp, char* id, char* client, int serviceType) { | |
| 5 | + | |
| 6 | + this->path_input = pathVideo; | |
| 7 | + this->path_srt = pathSRT; | |
| 8 | + this-> sub_language = sublanguage; | |
| 9 | + this->position = pos; | |
| 10 | + this->size = size; | |
| 11 | + this->transparency = transp; | |
| 12 | + this->user_id = id; | |
| 13 | + this->client_type = client; | |
| 14 | + this->service_type = serviceType; | |
| 15 | + numero_legendas = INT_MAX; | |
| 16 | + legendas_enviadas = 0; | |
| 17 | + vetor_pts = new vector<int64_t >(); | |
| 18 | + tradutor = new TradutorPortGlosa(); | |
| 19 | + extrator_factory = new ExtratorFactory(); | |
| 20 | + setPathContents(); | |
| 21 | + running = true; | |
| 22 | + finish = false; | |
| 23 | + DPRINTF("Done!\n"); | |
| 24 | +} | |
| 3 | 25 | |
| 4 | -//Construtor Service 1 | |
| 5 | -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* path_video, char* path_srt, int sublanguage, | |
| 6 | - int position, int size, int transparency, char* id, char* client_type, int serviceType) { | |
| 7 | - | |
| 26 | +ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathSRT, int transp, char* id, char* client, int serviceType) { | |
| 27 | + | |
| 28 | + this->path_srt = pathSRT; | |
| 29 | + this->transparency = transp; | |
| 30 | + this->user_id = id; | |
| 31 | + this->client_type = client; | |
| 32 | + this->service_type = serviceType; | |
| 33 | + numero_legendas = INT_MAX; | |
| 34 | + legendas_enviadas = 0; | |
| 35 | + vetor_pts = new vector<int64_t >(); | |
| 36 | + tradutor = new TradutorPortGlosa(); | |
| 8 | 37 | extrator_factory = new ExtratorFactory(); |
| 9 | - setPathInput(path_video); | |
| 10 | - setPathSRT(path_srt); | |
| 11 | - setClientType(client_type); | |
| 12 | - setPosition(position); | |
| 13 | - setSize(size); | |
| 14 | - setTransparency(transparency); | |
| 15 | - setSubLanguage(sublanguage); | |
| 16 | - setServiceType(serviceType); | |
| 17 | - setUserId(id); | |
| 18 | - finish = false; | |
| 19 | - DPRINTF("Done!\n"); | |
| 20 | -} | |
| 21 | - | |
| 22 | -//Construtor Service 4 | |
| 23 | -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* path_srt, int transparency, char* id, char* client_type, int serviceType) { | |
| 24 | - | |
| 25 | - extrator_factory = new ExtratorFactory(); | |
| 26 | - setPathInput(path_srt); | |
| 27 | - setClientType(client_type); | |
| 28 | - setTransparency(transparency); | |
| 29 | - setServiceType(serviceType); | |
| 30 | - setUserId(id); | |
| 31 | - finish = false; | |
| 32 | - DPRINTF("Done!\n"); | |
| 38 | + setPathContents(); | |
| 39 | + running = true; | |
| 40 | + finish = false; | |
| 41 | + DPRINTF("Done!\n"); | |
| 33 | 42 | } |
| 34 | 43 | |
| 35 | 44 | ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() { |
| 36 | - if (mutex_serviceSRT) delete mutex_serviceSRT; | |
| 37 | - delete extratorSRT; | |
| 45 | + free(vetor_pts); | |
| 46 | + delete(ppty_h); | |
| 47 | + if (mixer) delete mixer; | |
| 48 | + if (tradutor) delete tradutor; | |
| 49 | + if (sincronizador) delete sincronizador; | |
| 50 | + if (extratorSRT)delete extratorSRT; | |
| 51 | + if (extrator_factory) delete extrator_factory; | |
| 38 | 52 | DDDPRINTF("Service SRT finalized!\n"); |
| 39 | 53 | } |
| 40 | 54 | |
| 41 | -void ServiceWindowGenerationFromSRT::notifyTranslator(unsigned char* subtitle) { | |
| 55 | +void ServiceWindowGenerationFromSRT::setPathContents() { | |
| 56 | + if(strcmp(client_type,DEVELOPER) == 0){ | |
| 57 | + this->path_contents = PATH_DEVEL; | |
| 58 | + this->path_uploads = PATH_DEVEL_UPLOADS; | |
| 59 | + }else if(strcmp(client_type, PRODUCTION) == 0){ | |
| 60 | + try{ | |
| 61 | + ppty_h = new PropertyHandler(PATH_CONF_FILE, PropertyHandler::READ); | |
| 62 | + this->path_contents = (char*) ppty_h->get_attibute_value("STORAGE"); | |
| 63 | + }catch(RuntimeException &ex){ | |
| 64 | + printf("%s\n", ex.getMessage().c_str()); | |
| 65 | + } | |
| 66 | + this->path_uploads = PATH_VBOX_UPLOADS; | |
| 67 | + }else{ | |
| 68 | + throw new ServiceException("Invalid client!"); | |
| 69 | + } | |
| 70 | +} | |
| 71 | + | |
| 72 | +void ServiceWindowGenerationFromSRT::setPathLibras() { | |
| 73 | + char* final_path = new char[MAX_SIZE_PATH]; | |
| 74 | + strcpy(final_path, this->path_uploads); | |
| 75 | + strcat(final_path, this->user_id); | |
| 76 | + strcat(final_path, "/video_libras.ts"); | |
| 77 | + | |
| 78 | + this->path_libras = final_path; | |
| 79 | +} | |
| 80 | + | |
| 81 | +void ServiceWindowGenerationFromSRT::setBackground() { | |
| 82 | + if(this->transparency == 0) { //pega dicionario com BackGround opaco | |
| 83 | + sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, | |
| 84 | + this->path_libras, this->transparency); | |
| 85 | + } else { | |
| 86 | + if(this->transparency == 1) { //pega dicionario com BackGround transparente | |
| 87 | + sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, | |
| 88 | + this->path_libras, this->transparency); | |
| 89 | + } | |
| 90 | + } | |
| 91 | +} | |
| 42 | 92 | |
| 93 | +void ServiceWindowGenerationFromSRT::setSizeOfSubtitles(int sub_size) { | |
| 94 | + numero_legendas = sub_size; | |
| 95 | + if (legendas_enviadas >= numero_legendas) | |
| 96 | + sincronizador->stop(); | |
| 97 | +} | |
| 98 | + | |
| 99 | +void ServiceWindowGenerationFromSRT::addPTS(int64_t pts){ | |
| 100 | + vetor_pts->push_back(pts); | |
| 101 | +} | |
| 102 | + | |
| 103 | +void ServiceWindowGenerationFromSRT::notifyTranslator(unsigned char* subtitle) { | |
| 43 | 104 | const char* constchar = (const char*) subtitle; |
| 44 | 105 | char* legenda_copy = new char[strlen(constchar)+1]; |
| 45 | 106 | strcpy(legenda_copy, constchar); |
| ... | ... | @@ -48,67 +109,122 @@ void ServiceWindowGenerationFromSRT::notifyTranslator(unsigned char* subtitle) { |
| 48 | 109 | } |
| 49 | 110 | |
| 50 | 111 | void ServiceWindowGenerationFromSRT::notifySubtitle(unsigned char *subtitle, int64_t pts){ |
| 51 | - adicionaPTS(pts); | |
| 52 | - notifyTranslator(subtitle); | |
| 112 | + addPTS(pts); | |
| 113 | + notifyTranslator(subtitle); | |
| 53 | 114 | } |
| 54 | 115 | |
| 55 | -bool ServiceWindowGenerationFromSRT::isFinished(){ | |
| 56 | - return finish; | |
| 116 | +void ServiceWindowGenerationFromSRT::notifyEndOfSynchronization() { | |
| 117 | + if (this->service_type == SERVICE_TYPE_SRT) { | |
| 118 | + mixer = new Mixer(); | |
| 119 | + mixer->initialize(this->path_input, this->path_libras,this->position,this->size, | |
| 120 | + this->transparency, this->user_id, this->path_uploads, this->path_contents); | |
| 121 | + createThumbnail(); | |
| 122 | + }else{ | |
| 123 | + transcodeVideoToMp4(); | |
| 124 | + } | |
| 125 | + this->running = false; | |
| 126 | +} | |
| 127 | + | |
| 128 | +void ServiceWindowGenerationFromSRT::notifyTranslation(vector<string> * glosas) { | |
| 129 | + for (int i = 0; i < glosas->size(); i++) { | |
| 130 | + locale loc; | |
| 131 | + string glosa_lower = ""; | |
| 132 | + for (int k = 0; k < glosas->at(i).length(); k++){ | |
| 133 | + glosa_lower += std::tolower(glosas->at(i).at(k), loc); | |
| 134 | + } | |
| 135 | + int64_t pts_notificado = vetor_pts->front(); | |
| 136 | + sincronizador->recebeglosa(glosa_lower, pts_notificado); | |
| 137 | + } | |
| 138 | + vetor_pts->erase(vetor_pts->begin()); | |
| 139 | + legendas_enviadas++; | |
| 57 | 140 | } |
| 58 | 141 | |
| 59 | 142 | void ServiceWindowGenerationFromSRT::notifyEnd(int sub_size) { |
| 60 | - DDPRINTF("Service SRT recebeu: %d legendas.\n", sub_size); | |
| 143 | + DPRINTF("Service SRT recebeu: %d legendas.\n", sub_size); | |
| 61 | 144 | setSizeOfSubtitles(sub_size); |
| 62 | 145 | } |
| 63 | 146 | |
| 64 | -void ServiceWindowGenerationFromSRT::setPathSRT(char* path_srt) { | |
| 65 | - this->path_srt = path_srt; | |
| 147 | +bool ServiceWindowGenerationFromSRT::isRunning() { | |
| 148 | + return this->running; | |
| 149 | +} | |
| 150 | + | |
| 151 | +bool ServiceWindowGenerationFromSRT::isFinished() { | |
| 152 | + return this->finish; | |
| 66 | 153 | } |
| 67 | 154 | |
| 68 | 155 | void ServiceWindowGenerationFromSRT::initialize() { |
| 156 | + DPRINTF("Service SRT Initialize.\n"); | |
| 157 | + extratorSRT = (ExtratorSRT*) extrator_factory->getExtrator(Extrator::SRT); | |
| 158 | + extratorSRT->addListener(this); | |
| 159 | + extratorSRT->setFilePath(path_srt); | |
| 69 | 160 | |
| 70 | - DDPRINTF("Service SRT Initialize.\n"); | |
| 161 | + setPathLibras(); | |
| 162 | + | |
| 163 | + if (this->sub_language == 1) | |
| 164 | + tradutor->addListener(this); | |
| 71 | 165 | |
| 72 | - //codigo abaixo sera arrumado apos a aplicação do factory pattern | |
| 73 | - | |
| 74 | - if(serviceType == 1){ | |
| 75 | - | |
| 76 | - extratorSRT = (ExtratorSRT*)extrator_factory->getExtrator(SRT); | |
| 77 | - extratorSRT->addListener(this); | |
| 78 | - extratorSRT->setFilePath(path_srt); | |
| 79 | - | |
| 80 | - ServiceWindowGeneration::initialize(); | |
| 81 | - | |
| 82 | - try{ | |
| 83 | - extratorSRT->initialize(); | |
| 84 | - }catch(ExtratorException ex){ | |
| 85 | - throw ServiceException(ex.getMessage()); | |
| 86 | - } | |
| 87 | - this->Start(); | |
| 88 | - | |
| 89 | - } else{ | |
| 90 | - /*Este serviço utiliza apenas o arquivo de legendas (SRT) como entrada, | |
| 91 | - portanto, não é preciso monitorar as informações do PCR a partir do | |
| 92 | - objeto InputFile().*/ | |
| 93 | - extratorSRT = (ExtratorSRT*)extrator_factory->getExtrator(SRT); | |
| 94 | - extratorSRT->addListener(this); | |
| 95 | - extratorSRT->setFilePath(path_input); | |
| 96 | - | |
| 97 | - ServiceWindowGeneration::initialize(); | |
| 98 | - | |
| 99 | - try{ | |
| 100 | - extratorSRT->initialize(); | |
| 101 | - }catch(ExtratorException ex){ | |
| 102 | - throw ServiceException(ex.getMessage()); | |
| 103 | - } | |
| 104 | - this->Start(); | |
| 166 | + if(this->service_type != SERVICE_TYPE_SRT_ONLY){ | |
| 167 | + vector<string> tokens; | |
| 168 | + char* pathtmp = this->path_input; | |
| 169 | + int size = strlen(pathtmp); | |
| 170 | + char vtemp [size]; | |
| 171 | + | |
| 172 | + strcpy(vtemp, pathtmp); | |
| 173 | + pathtmp = strtok(vtemp, "."); | |
| 174 | + while (pathtmp != NULL) { | |
| 175 | + tokens.push_back(string(pathtmp)); | |
| 176 | + pathtmp = strtok(NULL, "."); | |
| 177 | + } | |
| 178 | + | |
| 179 | + string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; | |
| 180 | + this->path_libras = new char[buildstrpath.size()]; | |
| 181 | + strcpy(this->path_libras, buildstrpath.c_str()); | |
| 182 | + //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras); | |
| 183 | + | |
| 184 | + }else{ | |
| 185 | + tradutor->addListener(this); | |
| 186 | + } | |
| 187 | + | |
| 188 | + setBackground(); | |
| 189 | + | |
| 190 | + if (service_type != SERVICE_TYPE_SRT) { | |
| 191 | + uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro | |
| 192 | + sincronizador->setPCRBase(pcr_base); | |
| 193 | + } | |
| 194 | + | |
| 195 | + sincronizador->addListener(this); | |
| 196 | + sincronizador->Start(); | |
| 197 | + | |
| 198 | + try{ | |
| 199 | + extratorSRT->initialize(); | |
| 200 | + }catch(ExtratorException ex){ | |
| 201 | + throw ServiceException(ex.getMessage()); | |
| 105 | 202 | } |
| 203 | + this->Start(); | |
| 204 | +} | |
| 106 | 205 | |
| 206 | +void ServiceWindowGenerationFromSRT::transcodeVideoToMp4(){ | |
| 207 | + DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); | |
| 208 | + string command = "ffmpeg -i "; | |
| 209 | + command.append(path_libras) | |
| 210 | + .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") | |
| 211 | + .append(path_contents).append(user_id).append(".mp4"); | |
| 212 | + //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); | |
| 213 | + system(command.c_str()); | |
| 107 | 214 | } |
| 108 | 215 | |
| 109 | -void ServiceWindowGenerationFromSRT::Run() { | |
| 110 | - while (isRunning()) { | |
| 111 | - usleep(200000); //200ms | |
| 112 | - } | |
| 113 | - finish = true; | |
| 216 | +void ServiceWindowGenerationFromSRT::createThumbnail(){ | |
| 217 | + string command = "ffmpeg -ss 10 -i "; | |
| 218 | + command.append(path_contents).append(user_id).append(".mp4") | |
| 219 | + .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ") | |
| 220 | + .append(path_contents).append(user_id).append(".png"); | |
| 221 | + //printf("[INFO]: Thumbnail command -> %s\n", command.c_str()); | |
| 222 | + system(command.c_str()); | |
| 114 | 223 | } |
| 224 | + | |
| 225 | +void ServiceWindowGenerationFromSRT::Run() { | |
| 226 | + while(isRunning()){ | |
| 227 | + usleep(200000); | |
| 228 | + } | |
| 229 | + finish = true; | |
| 230 | +} | |
| 115 | 231 | \ No newline at end of file | ... | ... |
servico/src/serviceWindowGenerationFromText.cpp
| 1 | 1 | #include "serviceWindowGenerationFromText.h" |
| 2 | 2 | |
| 3 | -ServiceWindowGenerationFromText::ServiceWindowGenerationFromText ( | |
| 4 | - char* path_file, char* username, int transp, int serviceType, char* client_type) { | |
| 5 | - | |
| 6 | - extrator_factory = new ExtratorFactory(); | |
| 7 | - setPathInput(path_file); | |
| 8 | - setClientType(client_type); | |
| 9 | - setUserId(username); | |
| 10 | - setTransparency(transp); | |
| 11 | - setServiceType(serviceType); | |
| 3 | +ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile, int transp, char* id, char* client) { | |
| 4 | + this->path_input = pathFile; | |
| 5 | + this->transparency = transp; | |
| 6 | + this->user_id = id; | |
| 7 | + client_type = client; | |
| 8 | + running = true; | |
| 12 | 9 | finish = false; |
| 10 | + numero_legendas = INT_MAX; | |
| 11 | + legendas_enviadas = 0; | |
| 12 | + vetor_pts = new vector<int64_t >(); | |
| 13 | + tradutor = new TradutorPortGlosa(); | |
| 14 | + extrator_factory = new ExtratorFactory(); | |
| 15 | + setPathContents(); | |
| 16 | + running = true; | |
| 17 | + finish = false; | |
| 18 | + DPRINTF("Done!\n"); | |
| 13 | 19 | } |
| 14 | 20 | |
| 15 | 21 | ServiceWindowGenerationFromText::~ServiceWindowGenerationFromText() { |
| 16 | - delete extratorTXT; | |
| 17 | - DDDPRINTF("Service Text finished!\n"); | |
| 22 | + free(vetor_pts); | |
| 23 | + delete(ppty_h); | |
| 24 | + if (tradutor) delete tradutor; | |
| 25 | + if (sincronizador) delete sincronizador; | |
| 26 | + if (extratorTXT)delete extratorTXT; | |
| 27 | + if (extrator_factory) delete extrator_factory; | |
| 28 | + DDDPRINTF("Service Text finalized!\n"); | |
| 29 | +} | |
| 30 | + | |
| 31 | +void ServiceWindowGenerationFromText::setPathContents() { | |
| 32 | + if(strcmp(client_type,DEVELOPER) == 0){ | |
| 33 | + this->path_contents = PATH_DEVEL; | |
| 34 | + this->path_uploads = PATH_DEVEL_UPLOADS; | |
| 35 | + }else if(strcmp(client_type, PRODUCTION) == 0){ | |
| 36 | + try{ | |
| 37 | + ppty_h = new PropertyHandler(PATH_CONF_FILE, PropertyHandler::READ); | |
| 38 | + this->path_contents = (char*) ppty_h->get_attibute_value("STORAGE"); | |
| 39 | + }catch(RuntimeException &ex){ | |
| 40 | + printf("%s\n", ex.getMessage().c_str()); | |
| 41 | + } | |
| 42 | + this->path_uploads = PATH_VBOX_UPLOADS; | |
| 43 | + }else{ | |
| 44 | + throw new ServiceException("Invalid client!"); | |
| 45 | + } | |
| 46 | +} | |
| 47 | + | |
| 48 | +void ServiceWindowGenerationFromText::setPathLibras() { | |
| 49 | + char* final_path = new char[MAX_SIZE_PATH]; | |
| 50 | + strcpy(final_path, this->path_uploads); | |
| 51 | + strcat(final_path, this->user_id); | |
| 52 | + strcat(final_path, "/video_libras.ts"); | |
| 53 | + | |
| 54 | + this->path_libras = final_path; | |
| 55 | +} | |
| 56 | + | |
| 57 | +void ServiceWindowGenerationFromText::setBackground() { | |
| 58 | + if(this->transparency == 0) { //pega dicionario com BackGround opaco | |
| 59 | + sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, | |
| 60 | + this->path_libras, this->transparency); | |
| 61 | + } else { | |
| 62 | + if(this->transparency == 1) { //pega dicionario com BackGround transparente | |
| 63 | + sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, | |
| 64 | + this->path_libras, this->transparency); | |
| 65 | + } | |
| 66 | + } | |
| 67 | +} | |
| 68 | + | |
| 69 | +void ServiceWindowGenerationFromText::setSizeOfSubtitles(int sub_size) { | |
| 70 | + numero_legendas = sub_size; | |
| 71 | + if (legendas_enviadas >= numero_legendas) | |
| 72 | + sincronizador->stop(); | |
| 73 | +} | |
| 74 | + | |
| 75 | +void ServiceWindowGenerationFromText::notifyTranslator(unsigned char* text) { | |
| 76 | + tradutor->traduz(text); | |
| 18 | 77 | } |
| 19 | 78 | |
| 20 | 79 | void ServiceWindowGenerationFromText::notifyLine(unsigned char* line) { |
| 21 | - tradutor->traduz(line); | |
| 80 | + notifyTranslator(line); | |
| 81 | +} | |
| 82 | + | |
| 83 | +void ServiceWindowGenerationFromText::notifyEndOfSynchronization() { | |
| 84 | + transcodeVideoToMp4(); | |
| 85 | + this->running = false; | |
| 22 | 86 | } |
| 23 | 87 | |
| 88 | +void ServiceWindowGenerationFromText::notifyTranslation(vector<string> * glosas) { | |
| 89 | + for (int i = 0; i < glosas->size(); i++) { | |
| 90 | + locale loc; | |
| 91 | + string glosa_lower = ""; | |
| 92 | + for (int k = 0; k < glosas->at(i).length(); k++){ | |
| 93 | + glosa_lower += std::tolower(glosas->at(i).at(k), loc); | |
| 94 | + } | |
| 95 | + sincronizador->recebeglosa(glosa_lower, 1000); | |
| 96 | + } | |
| 97 | + sincronizador->stop(); | |
| 98 | + legendas_enviadas++; | |
| 99 | +} | |
| 100 | + | |
| 101 | + | |
| 24 | 102 | void ServiceWindowGenerationFromText::notifyEnd(int line_size) { |
| 25 | - DDPRINTF("Service TXT recebeu: %d linhas.\n", line_size); | |
| 103 | + DPRINTF("Service Text recebeu: %d linhas.\n", line_size); | |
| 26 | 104 | setSizeOfSubtitles(line_size); |
| 27 | 105 | } |
| 28 | 106 | |
| 107 | +bool ServiceWindowGenerationFromText::isRunning() { | |
| 108 | + return this->running; | |
| 109 | +} | |
| 110 | + | |
| 29 | 111 | bool ServiceWindowGenerationFromText::isFinished() { |
| 30 | - return finish; | |
| 112 | + return this->finish; | |
| 31 | 113 | } |
| 32 | 114 | |
| 33 | 115 | void ServiceWindowGenerationFromText::initialize() { |
| 34 | - DDPRINTF("Service Text Initialize.\n"); | |
| 35 | - | |
| 36 | - extratorTXT = (ExtratorTXT*) extrator_factory->getExtrator(TXT); | |
| 116 | + DPRINTF("Service Text Initialize.\n"); | |
| 117 | + extratorTXT = (ExtratorTXT*) extrator_factory->getExtrator(Extrator::TXT); | |
| 37 | 118 | extratorTXT->addListener(this); |
| 38 | - extratorTXT->setFilePath(getPathInput()); | |
| 39 | - | |
| 40 | - ServiceWindowGeneration::initialize(); | |
| 119 | + extratorTXT->setFilePath(path_input); | |
| 120 | + | |
| 121 | + setPathLibras(); | |
| 122 | + | |
| 123 | + tradutor->addListener(this); | |
| 124 | + | |
| 125 | + setBackground(); | |
| 126 | + | |
| 127 | + uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro | |
| 128 | + sincronizador->setPCRBase(pcr_base); | |
| 129 | + sincronizador->addListener(this); | |
| 130 | + sincronizador->Start(); | |
| 41 | 131 | |
| 42 | 132 | try{ |
| 43 | 133 | extratorTXT->initialize(); |
| ... | ... | @@ -47,9 +137,19 @@ void ServiceWindowGenerationFromText::initialize() { |
| 47 | 137 | this->Start(); |
| 48 | 138 | } |
| 49 | 139 | |
| 50 | -void ServiceWindowGenerationFromText::Run() { | |
| 51 | - while (isRunning()) { | |
| 52 | - usleep(200000); //200ms | |
| 53 | - } | |
| 54 | - finish = true; | |
| 140 | +void ServiceWindowGenerationFromText::transcodeVideoToMp4(){ | |
| 141 | + DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n"); | |
| 142 | + string command = "ffmpeg -i "; | |
| 143 | + command.append(path_libras) | |
| 144 | + .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") | |
| 145 | + .append(path_contents).append(user_id).append(".mp4"); | |
| 146 | + //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); | |
| 147 | + system(command.c_str()); | |
| 55 | 148 | } |
| 149 | + | |
| 150 | +void ServiceWindowGenerationFromText::Run(){ | |
| 151 | + while(isRunning()){ | |
| 152 | + usleep(200000); | |
| 153 | + } | |
| 154 | + finish = true; | |
| 155 | +} | |
| 56 | 156 | \ No newline at end of file | ... | ... |
synchronizer/src/synchronizer.cpp
| ... | ... | @@ -175,27 +175,28 @@ char * Synchronizer::getproximoarquivo() { |
| 175 | 175 | //proximo = NULL; |
| 176 | 176 | |
| 177 | 177 | if (videos->size() == 0) { |
| 178 | - if(this->transparency == 0) | |
| 179 | - return VIDEO_PADRAO; | |
| 180 | - else | |
| 181 | - return VIDEOTRANSP_PADRAO; | |
| 178 | + if(this->transparency == 0){ | |
| 179 | + return VIDEO_PADRAO; | |
| 180 | + }else{ | |
| 181 | + return VIDEOTRANSP_PADRAO; | |
| 182 | + } | |
| 182 | 183 | } |
| 183 | 184 | |
| 184 | 185 | mutexi->Lock(); |
| 185 | 186 | video = videos->front(); |
| 187 | + | |
| 186 | 188 | videos->erase(videos->begin()); |
| 187 | 189 | mutexi->Unlock(); |
| 188 | 190 | |
| 189 | 191 | if (video == NULL) { |
| 190 | - if(this->transparency == 0) | |
| 191 | - return VIDEO_PADRAO; | |
| 192 | - else | |
| 193 | - return VIDEOTRANSP_PADRAO; | |
| 194 | - | |
| 195 | - } else { | |
| 192 | + if(this->transparency == 0){ | |
| 193 | + return VIDEO_PADRAO; | |
| 194 | + }else{ | |
| 195 | + return VIDEOTRANSP_PADRAO; | |
| 196 | + } | |
| 197 | + }else{ | |
| 196 | 198 | return video; |
| 197 | 199 | } |
| 198 | - | |
| 199 | 200 | } |
| 200 | 201 | |
| 201 | 202 | void Synchronizer::analisaPCR(unsigned char *pacote) { |
| ... | ... | @@ -420,7 +421,6 @@ void Synchronizer::soletraGlosa(string glosa, int64_t pts) { |
| 420 | 421 | return; |
| 421 | 422 | char c = glosa[i]; |
| 422 | 423 | if (c >= 97 && c <= 122) { |
| 423 | - //cout << "soletrando a letra: " << glosa[i] << endl; | |
| 424 | 424 | string path2 = (string) baseDir + glosa[i] + (string) extensao; |
| 425 | 425 | char* path2_char = converteString(path2); |
| 426 | 426 | recebeglosa(converteString(path2), strlen(path2_char), pts); |
| ... | ... | @@ -505,6 +505,7 @@ void Synchronizer::Run() { |
| 505 | 505 | int desc_out = -1; |
| 506 | 506 | |
| 507 | 507 | while (videos_processed <= count_tasks || service_running) { |
| 508 | + | |
| 508 | 509 | cnt = read(filefd, buff, bufferSize); |
| 509 | 510 | |
| 510 | 511 | // atualiza os valores de PCR e PTS/DTS para cada video |
| ... | ... | @@ -551,8 +552,6 @@ void Synchronizer::Run() { |
| 551 | 552 | contagemPCR = 0; |
| 552 | 553 | ultimoPCRBaseMod = 0; |
| 553 | 554 | } |
| 554 | - | |
| 555 | - | |
| 556 | 555 | } else if (finalcnt == -1) { |
| 557 | 556 | printf("Erro: Finalizando Sincronizador!\n"); |
| 558 | 557 | this->stop(); | ... | ... |
util/src/include/property.h
| ... | ... | @@ -6,43 +6,60 @@ |
| 6 | 6 | * João Pessoa - PB - Brasil * |
| 7 | 7 | * * |
| 8 | 8 | * Author: Leonardo de Araújo Domingues (leonardo.araujo@lavid.ufpb.br) * |
| 9 | - * Date: Qui Nov 28 14:05:39 BRT 2013 * | |
| 9 | + * Date: Mon Jun 1 19:29:50 BRT 2015 * | |
| 10 | 10 | * * |
| 11 | 11 | **************************************************************************/ |
| 12 | 12 | |
| 13 | - #ifndef PROPERTY_H | |
| 14 | - #define PROPERTY_H | |
| 13 | + #ifndef PROPERTYHANDLER_H | |
| 14 | + #define PROPERTYHANDLER_H | |
| 15 | 15 | |
| 16 | - #include "logger.h" | |
| 17 | 16 | #include <stdio.h> |
| 18 | 17 | #include <stdlib.h> |
| 18 | + #include <map> | |
| 19 | 19 | #include <string> |
| 20 | 20 | #include <string.h> |
| 21 | - #include <lavidlib/io/BufferedReader.h> | |
| 21 | + #include <lavidlib/io/File.h> | |
| 22 | 22 | #include <lavidlib/io/FileIO.h> |
| 23 | + #include <lavidlib/io/BufferedReader.h> | |
| 23 | 24 | #include <lavidlib/io/IOException.h> |
| 24 | 25 | #include <lavidlib/io/EOFException.h> |
| 25 | 26 | #include <lavidlib/base/RuntimeException.h> |
| 26 | 27 | |
| 27 | - #define EXTENSION ".conf" | |
| 28 | - | |
| 29 | - using namespace std; | |
| 30 | 28 | using namespace lavidlib; |
| 31 | 29 | |
| 32 | - namespace sndesc { | |
| 33 | - | |
| 34 | - class PropertyHandler { | |
| 30 | + class PropertyHandler { | |
| 35 | 31 | public: |
| 36 | - PropertyHandler(string filename); | |
| 32 | + enum HandlerMode { | |
| 33 | + READ, | |
| 34 | + WRITE | |
| 35 | + }; | |
| 36 | + PropertyHandler(char* _filename, PropertyHandler::HandlerMode _handler_mode); | |
| 37 | 37 | virtual ~PropertyHandler(); |
| 38 | - char* getAttributeValue(string attr); | |
| 38 | + | |
| 39 | + int attr_exists(char* _attr); | |
| 40 | + const char* get_attibute_value(char* _attr); | |
| 41 | + void set_attribute_value(char* _attr_p, char* _value_p); | |
| 42 | + void update_properties(); | |
| 43 | + int remove_attribute(char* _attr_p); | |
| 39 | 44 | |
| 40 | 45 | private: |
| 41 | - BufferedReader* rbuffer; | |
| 42 | - FileIO* file_property; | |
| 43 | - int checkFileExtension(string &filename); | |
| 44 | 46 | |
| 45 | - }; | |
| 46 | - } | |
| 47 | + std::string filename; | |
| 48 | + File* file_p; | |
| 49 | + FileIO* file_io_p; | |
| 50 | + BufferedReader* buff_reader_p; | |
| 51 | + HandlerMode handler_mode; | |
| 52 | + | |
| 53 | + std::map<std::string, std::string> * map_ppty_p; | |
| 54 | + | |
| 55 | + int check_file_extension(char* _filename); | |
| 56 | + void format_line_str(std::string* _line_str); | |
| 57 | + int load_properties(); | |
| 58 | + void init_write_mode(); | |
| 59 | + std::string get_key(std::string _ppty_line); | |
| 60 | + std::string get_value(std::string _ppty_line); | |
| 61 | + int write_properties_on_file(std::string _key, std::string _value, FILE* _file_output); | |
| 62 | + }; | |
| 63 | + | |
| 47 | 64 | |
| 48 | - #endif /* PROPERTY_H */ | |
| 49 | 65 | \ No newline at end of file |
| 66 | + #endif /* PROPERTYHANDLER_H */ | |
| 50 | 67 | \ No newline at end of file | ... | ... |
util/src/logger.cpp
util/src/property.cpp
| ... | ... | @@ -6,74 +6,231 @@ |
| 6 | 6 | * João Pessoa - PB - Brasil * |
| 7 | 7 | * * |
| 8 | 8 | * Author: Leonardo de Araújo Domingues (leonardo.araujo@lavid.ufpb.br) * |
| 9 | - * Date: Qui Nov 28 14:06:10 BRT 2013 * | |
| 9 | + * Date: Mon Jun 1 19:29:50 BRT 2015 * | |
| 10 | 10 | * * |
| 11 | 11 | **************************************************************************/ |
| 12 | 12 | |
| 13 | - #include "property.h" | |
| 13 | +#include "property.h" | |
| 14 | + | |
| 15 | + | |
| 16 | +PropertyHandler::PropertyHandler(char* _filename, PropertyHandler::HandlerMode _handler_mode) | |
| 17 | +{ | |
| 18 | + if ( check_file_extension(_filename) == -1 ) | |
| 19 | + throw new RuntimeException("Format file not is supported"); | |
| 20 | + | |
| 21 | + filename = (std::string) _filename; | |
| 22 | + handler_mode = _handler_mode; | |
| 23 | + | |
| 24 | + switch (handler_mode) | |
| 25 | + { | |
| 26 | + case READ: | |
| 27 | + if ( load_properties() <= 0 ) | |
| 28 | + throw new RuntimeException("Cannot to load properties of the file"); | |
| 29 | + break; | |
| 30 | + case WRITE: | |
| 31 | + init_write_mode(); | |
| 32 | + break; | |
| 33 | + default: | |
| 34 | + printf("Handler mode not supported"); | |
| 35 | + exit(1); | |
| 36 | + } | |
| 37 | + | |
| 38 | +} | |
| 39 | + | |
| 40 | + | |
| 41 | +PropertyHandler::~PropertyHandler() | |
| 42 | +{ | |
| 43 | + if (handler_mode == WRITE) | |
| 44 | + update_properties(); | |
| 45 | + | |
| 46 | + if (buff_reader_p) delete buff_reader_p; | |
| 47 | + if (file_io_p) delete file_io_p; | |
| 48 | + if (file_p) delete file_p; | |
| 49 | + if (map_ppty_p) delete map_ppty_p; | |
| 50 | + | |
| 51 | +} | |
| 52 | + | |
| 53 | + | |
| 54 | +int PropertyHandler::load_properties() | |
| 55 | +{ | |
| 56 | + std::string buff_str; | |
| 57 | + int buff_index = 0; | |
| 58 | + | |
| 59 | + file_p = new File(filename); | |
| 60 | + try { | |
| 61 | + file_io_p = new FileIO(file_p->getPath(), FileIO::MODE_READ); | |
| 62 | + } | |
| 63 | + catch(IOException &ex) { | |
| 64 | + printf("[ERROR] %s\n", ex.getMessage().c_str()); | |
| 65 | + exit(1); | |
| 66 | + } | |
| 67 | + | |
| 68 | + buff_reader_p = new BufferedReader(file_io_p); | |
| 69 | + map_ppty_p = new std::map<std::string, std::string>(); | |
| 70 | + | |
| 71 | + try { | |
| 72 | + buff_str = buff_reader_p->readLine(); | |
| 73 | + | |
| 74 | + while (buff_str.size() > 0) | |
| 75 | + { | |
| 76 | + buff_index++; | |
| 77 | + format_line_str(&buff_str); | |
| 78 | + | |
| 79 | + map_ppty_p->insert(map_ppty_p->begin(), | |
| 80 | + (std::pair<std::string, std::string>(get_key(buff_str), get_value(buff_str)))); | |
| 81 | + | |
| 82 | + /* get next line (key, value) */ | |
| 83 | + buff_str = buff_reader_p->readLine(); | |
| 84 | + } | |
| 85 | + | |
| 86 | + } catch (EOFException &ex) { | |
| 87 | + printf("[ERROR] %s\n", ex.getMessage().c_str()); | |
| 88 | + } | |
| 89 | + | |
| 90 | + return buff_index; | |
| 91 | + | |
| 92 | +} | |
| 93 | + | |
| 94 | + | |
| 95 | +void PropertyHandler::init_write_mode() | |
| 96 | +{ | |
| 97 | + /* init map structure to manipulate the properties in WRITE mode */ | |
| 98 | + map_ppty_p = new std::map<std::string, std::string>(); | |
| 99 | +} | |
| 100 | + | |
| 101 | + | |
| 102 | +int PropertyHandler::attr_exists(char* _attr) | |
| 103 | +{ | |
| 104 | + std::map<std::string, std::string>::iterator it; | |
| 105 | + if ( (it = map_ppty_p->find((const char*) _attr)) != map_ppty_p->end() ) | |
| 106 | + return 1; | |
| 107 | + return 0; | |
| 108 | +} | |
| 109 | + | |
| 110 | +const char* PropertyHandler::get_attibute_value(char* _attr) | |
| 111 | +{ | |
| 112 | + if (attr_exists(_attr)) | |
| 113 | + { | |
| 114 | + return (map_ppty_p->find((const char*) _attr)->second).c_str(); | |
| 115 | + } | |
| 116 | + return _attr; | |
| 117 | +} | |
| 14 | 118 | |
| 15 | - using namespace std; | |
| 16 | 119 | |
| 17 | - namespace sndesc { | |
| 120 | +void PropertyHandler::set_attribute_value(char* _attr_p, char* _value_p) | |
| 121 | +{ | |
| 122 | + if (handler_mode == PropertyHandler::READ) | |
| 123 | + throw new RuntimeException("Cannot set properties in the READ mode"); | |
| 124 | + | |
| 125 | + if (attr_exists(_attr_p)) | |
| 126 | + throw new RuntimeException("This attribute already exists"); | |
| 127 | + | |
| 128 | + map_ppty_p->insert(map_ppty_p->begin(), | |
| 129 | + (std::pair<std::string, std::string>((std::string) _attr_p, (std::string) _value_p))); | |
| 130 | +} | |
| 131 | + | |
| 132 | + | |
| 133 | +void PropertyHandler::update_properties() | |
| 134 | +{ | |
| 135 | + FILE* file_output_p; | |
| 136 | + file_output_p = fopen (filename.c_str(), "w"); | |
| 137 | + if (file_output_p == NULL) | |
| 138 | + throw new IOException("Cannot open file to write properties"); | |
| 139 | + fseek(file_output_p, 0, SEEK_SET); | |
| 140 | + | |
| 141 | + std::string str_properties; | |
| 142 | + | |
| 143 | + std::map<std::string, std::string>::iterator it; | |
| 144 | + for (it = map_ppty_p->begin(); it != map_ppty_p->end(); it++) | |
| 145 | + if ( write_properties_on_file(it->first, it->second, file_output_p) == 0 ) | |
| 146 | + throw new IOException("Error to write properties in the file"); | |
| 147 | + | |
| 148 | + fclose (file_output_p); | |
| 149 | +} | |
| 150 | + | |
| 151 | + | |
| 152 | +int PropertyHandler::write_properties_on_file(std::string _key, std::string _value, FILE* _file_output) | |
| 153 | +{ | |
| 154 | + std::string str_properties = _key; | |
| 155 | + str_properties.append("="); | |
| 156 | + str_properties.append(_value); | |
| 157 | + | |
| 158 | + int count_bytes = 0; | |
| 159 | + | |
| 160 | + count_bytes += fputs((char*) str_properties.c_str(), _file_output); | |
| 161 | + count_bytes += fputs("\n", _file_output); | |
| 162 | + | |
| 163 | + return count_bytes; | |
| 164 | +} | |
| 165 | + | |
| 166 | +//TODO | |
| 167 | +int PropertyHandler::remove_attribute(char* _attr_p) | |
| 168 | +{ | |
| 169 | + | |
| 170 | + if (attr_exists(_attr_p)) { | |
| 171 | + | |
| 172 | + if ( map_ppty_p->erase((const char*) _attr_p) != 1 ) | |
| 173 | + throw new RuntimeException("Cannot remove attribute of the map structure"); | |
| 174 | + | |
| 175 | + /* if delete the attribute corretly, update the map of the properties */ | |
| 176 | + update_properties(); | |
| 177 | + return 1; | |
| 178 | + } | |
| 179 | + return 0; | |
| 180 | +} | |
| 181 | + | |
| 182 | + | |
| 183 | +#define CONF_FILE_EXTENSION ".conf" | |
| 184 | +/** | |
| 185 | + Verify if the file extension is valid. | |
| 186 | +*/ | |
| 187 | +int PropertyHandler::check_file_extension(char* _filename) | |
| 188 | +{ | |
| 189 | + return ((std::string) _filename).find(CONF_FILE_EXTENSION); | |
| 190 | +} | |
| 191 | + | |
| 192 | +#undef CONF_FILE_EXTENSION /* .conf */ | |
| 193 | + | |
| 194 | + | |
| 195 | +#define CHAR_TO_REMOVE " \t" | |
| 196 | +/** | |
| 197 | + Remove all whitespaces in the text line. | |
| 198 | +*/ | |
| 199 | +void PropertyHandler::format_line_str(std::string* _line_str) | |
| 200 | +{ | |
| 201 | + int index = -1; | |
| 202 | + std::string chars_rm_str = (std::string) CHAR_TO_REMOVE; | |
| 203 | + for (int i = 0; i < chars_rm_str.size(); i++) | |
| 204 | + { | |
| 205 | + while ( (index = (int) _line_str->find(chars_rm_str[i]) ) != std::string::npos) | |
| 206 | + { | |
| 207 | + _line_str->replace(index, 1, ""); // remove whitespaces (" ") replacing your position by "" | |
| 208 | + } | |
| 209 | + } | |
| 210 | +} | |
| 211 | +#undef CHAR_TO_REMOVE | |
| 212 | + | |
| 213 | +#define TOKEN_ATTR "=" | |
| 214 | +std::string PropertyHandler::get_key(std::string _ppty_line) | |
| 215 | +{ | |
| 216 | + int target_pos = -1; | |
| 217 | + target_pos = _ppty_line.find(TOKEN_ATTR); | |
| 218 | + | |
| 219 | + if (target_pos < 1) /* minimum lenght of a key (k=value) */ | |
| 220 | + throw new RuntimeException("Bad format sentence"); | |
| 221 | + | |
| 222 | + return (std::string) _ppty_line.substr(0, target_pos); | |
| 223 | +} | |
| 18 | 224 | |
| 19 | - PropertyHandler::PropertyHandler(string filename) { | |
| 20 | - | |
| 21 | - try { | |
| 22 | - if (checkFileExtension(filename) != 1) | |
| 23 | - throw new RuntimeException("Format file not is recognized!"); | |
| 24 | - file_property = new FileIO(filename, FileIO::MODE_READ); | |
| 25 | - } catch (IOException &ex) { | |
| 26 | - printf("[FAILED] Can't open file %s\n%s\n", filename.c_str(), | |
| 27 | - ex.getMessage().c_str()); | |
| 28 | - } | |
| 29 | - } | |
| 30 | - | |
| 31 | - PropertyHandler::~PropertyHandler() { | |
| 32 | - if (rbuffer) | |
| 33 | - delete rbuffer; | |
| 34 | - if (file_property) | |
| 35 | - delete file_property; | |
| 36 | - } | |
| 37 | - | |
| 38 | - char* PropertyHandler::getAttributeValue(string attr) { | |
| 39 | - | |
| 40 | - char* value1; | |
| 41 | - char* value2; | |
| 42 | - | |
| 43 | - rbuffer = new BufferedReader(file_property); | |
| 44 | - string fline; | |
| 45 | - try { | |
| 46 | - int target_pos = -1, begin = 0; | |
| 47 | - string attr_t, value_t; | |
| 48 | - while((fline = rbuffer->readLine()).size() > 0) { | |
| 49 | - target_pos = fline.find("="); | |
| 50 | - if (target_pos < 2) | |
| 51 | - throw new RuntimeException("The assignment symbol was not found."); | |
| 52 | - | |
| 53 | - attr_t = fline.substr(begin, target_pos); | |
| 54 | - begin = target_pos+1; | |
| 55 | - value_t = fline.substr(begin, fline.size()); | |
| 56 | - | |
| 57 | - if (attr.compare(attr_t) == 0) { | |
| 58 | - file_property->seek(0); | |
| 59 | - value1 = new char[value_t.length() + 1]; | |
| 60 | - strcpy(value1, value_t.c_str()); | |
| 61 | - return value1; | |
| 62 | - } | |
| 63 | - target_pos = -1; | |
| 64 | - begin = 0; | |
| 65 | - } | |
| 66 | - } catch (lavidlib::EOFException &ex) { | |
| 67 | - printf("[INFO] File is completed.\n%s\n", ex.getMessage().c_str()); | |
| 68 | - } | |
| 69 | - file_property->seek(0); | |
| 70 | - strcpy(value2, fline.c_str()); | |
| 71 | - return value2; | |
| 72 | - } | |
| 73 | - | |
| 74 | - int PropertyHandler::checkFileExtension(string &filename) { | |
| 75 | - | |
| 76 | - return (filename.find(EXTENSION) > 0 && | |
| 77 | - (filename.size() == (filename.find(EXTENSION) + strlen(EXTENSION)))) ? 1 : -1; | |
| 78 | - } | |
| 79 | - } | |
| 80 | 225 | \ No newline at end of file |
| 226 | + | |
| 227 | +std::string PropertyHandler::get_value(std::string _ppty_line) | |
| 228 | +{ | |
| 229 | + int target_pos = -1; | |
| 230 | + target_pos = _ppty_line.find(TOKEN_ATTR); | |
| 231 | + | |
| 232 | + if (target_pos < 1) /* minimum lenght of a key (k=value) */ | |
| 233 | + throw new RuntimeException("Bad format sentence"); | |
| 234 | + | |
| 235 | + return (std::string) _ppty_line.substr(target_pos+1, _ppty_line.size()); | |
| 236 | +} | |
| 237 | +#undef TOKEN_ATTR | |
| 81 | 238 | \ No newline at end of file | ... | ... |