Commit 54a15ec5efa5fe186ded45893d26560fa62cd01e

Authored by Wesnydy Ribeiro
1 parent a0edc914
Exists in master and in 1 other branch devel

Adicionado suporte para legenda webVTT

@@ -40,6 +40,7 @@ extratorOBJS = \ @@ -40,6 +40,7 @@ extratorOBJS = \
40 extratorFactory.o \ 40 extratorFactory.o \
41 extratorSRT.o \ 41 extratorSRT.o \
42 extratorTXT.o \ 42 extratorTXT.o \
  43 + extratorVTT.o \
43 subtitle.o 44 subtitle.o
44 45
45 inputOBJS = \ 46 inputOBJS = \
@@ -63,7 +64,7 @@ servicoOBJS = \ @@ -63,7 +64,7 @@ servicoOBJS = \
63 serviceException.o \ 64 serviceException.o \
64 serviceTester.o \ 65 serviceTester.o \
65 serviceWindowGenerationFromRec.o \ 66 serviceWindowGenerationFromRec.o \
66 - serviceWindowGenerationFromSRT.o \ 67 + serviceWindowGenerationFromSubtitle.o \
67 serviceWindowGenerationFromText.o 68 serviceWindowGenerationFromText.o
68 69
69 tradutorOBJS = \ 70 tradutorOBJS = \
extrator/src/extratorFactory.cpp
@@ -9,5 +9,8 @@ Extrator* ExtratorFactory::getExtrator(Extrator::ExtratorType extrator_type) { @@ -9,5 +9,8 @@ Extrator* ExtratorFactory::getExtrator(Extrator::ExtratorType extrator_type) {
9 case Extrator::TXT: 9 case Extrator::TXT:
10 PRINTL(util::_DEBUG, "ExtratorTXT selected!\n"); 10 PRINTL(util::_DEBUG, "ExtratorTXT selected!\n");
11 return new ExtratorTXT(); 11 return new ExtratorTXT();
  12 + case Extrator::VTT:
  13 + PRINTL(util::_DEBUG, "ExtratorVTT selected!\n");
  14 + return new ExtratorVTT();
12 } 15 }
13 } 16 }
14 \ No newline at end of file 17 \ No newline at end of file
extrator/src/extratorSRT.cpp
1 #include "extratorSRT.h" 1 #include "extratorSRT.h"
2 2
3 ExtratorSRT::ExtratorSRT(){ 3 ExtratorSRT::ExtratorSRT(){
4 - listeners = new list<ListenerSRT*>(); 4 + listeners = new list<ListenerSub*>();
5 finish = false; 5 finish = false;
6 seek_pos = 0; 6 seek_pos = 0;
7 hasNextSub = true; 7 hasNextSub = true;
@@ -32,19 +32,19 @@ void ExtratorSRT::initialize(){ @@ -32,19 +32,19 @@ void ExtratorSRT::initialize(){
32 } 32 }
33 33
34 34
35 -void ExtratorSRT::addListener(ListenerSRT* listener){ 35 +void ExtratorSRT::addListener(ListenerSub* listener){
36 listeners->push_back(listener); 36 listeners->push_back(listener);
37 } 37 }
38 38
39 void ExtratorSRT::notifyListeners(unsigned char* subtitle, int64_t pts) { 39 void ExtratorSRT::notifyListeners(unsigned char* subtitle, int64_t pts) {
40 - for(list<ListenerSRT*>::iterator it = listeners->begin(); it != listeners->end(); it++){ 40 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
41 (*it)->notifySubtitle(subtitle, pts); 41 (*it)->notifySubtitle(subtitle, pts);
42 } 42 }
43 } 43 }
44 44
45 void ExtratorSRT::notifyEndExtraction(int size) { 45 void ExtratorSRT::notifyEndExtraction(int size) {
46 PRINTL(util::_DEBUG, "Extrator SRT concluiu a extração: %d legendas.\n", size); 46 PRINTL(util::_DEBUG, "Extrator SRT concluiu a extração: %d legendas.\n", size);
47 - for(list<ListenerSRT*>::iterator it = listeners->begin(); it != listeners->end(); it++){ 47 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
48 (*it)->notifyEnd(size); 48 (*it)->notifyEnd(size);
49 } 49 }
50 } 50 }
@@ -136,15 +136,32 @@ Subtitle* ExtratorSRT::next() { @@ -136,15 +136,32 @@ Subtitle* ExtratorSRT::next() {
136 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE; 136 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE;
137 137
138 } catch (lavidlib::EOFException &ex) { 138 } catch (lavidlib::EOFException &ex) {
139 - sub->setSubtitleText(text_sub); 139 + sub->setSubtitleText(formatText(text_sub));
140 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE; 140 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE;
141 hasNextSub = false; 141 hasNextSub = false;
142 return sub; 142 return sub;
143 } 143 }
144 - sub->setSubtitleText(text_sub); 144 + sub->setSubtitleText(formatText(text_sub));
145 delete(bff_reader); 145 delete(bff_reader);
146 return sub; 146 return sub;
147 } 147 }
  148 +
  149 +string ExtratorSRT::formatText(string line){
  150 + int lessThanPos;
  151 + int moreThanPos;
  152 + string f_line = line;
  153 +
  154 + lessThanPos = f_line.find_first_of(LESS_THAN); //pega a posição do simbolo '<'
  155 + moreThanPos = f_line.find_first_of(MORE_THAN); //pega a posição do simbolo '>'
  156 +
  157 + while(lessThanPos != string::npos && moreThanPos != string::npos){
  158 + f_line = f_line.erase(lessThanPos, moreThanPos - (lessThanPos-1)); //remove o trecho '<string>'
  159 + lessThanPos = f_line.find_first_of(LESS_THAN);
  160 + moreThanPos = f_line.find_first_of(MORE_THAN);
  161 + }
  162 +
  163 + return f_line;
  164 +}
148 165
149 int64_t ExtratorSRT::str_to_time(string str_time) { 166 int64_t ExtratorSRT::str_to_time(string str_time) {
150 167
extrator/src/extratorVTT.cpp 0 → 100644
@@ -0,0 +1,148 @@ @@ -0,0 +1,148 @@
  1 +#include "extratorVTT.h"
  2 +
  3 +ExtratorVTT::ExtratorVTT() {
  4 + listeners = new list<ListenerSub*>();
  5 + seekPos = 0;
  6 + this->finish = false;
  7 + hasNextCue = true;
  8 + PRINTL(util::_DEBUG, "ExtratorVTT Done!\n");
  9 +}
  10 +
  11 +ExtratorVTT::~ExtratorVTT() {
  12 + listeners->clear();
  13 + delete listeners;
  14 + if (bff_reader) delete bff_reader;
  15 + if (file_io) delete file_io;
  16 + PRINTL(util::_DEBUG, "ExtratorVTT finalized!\n");
  17 +}
  18 +
  19 +void ExtratorVTT::setFilePath(char* path) {
  20 + this->filePath = path;
  21 +}
  22 +
  23 +bool ExtratorVTT::isFinished() {
  24 + return this->finish;
  25 +}
  26 +
  27 +void ExtratorVTT::addListener(ListenerSub* listener){
  28 + listeners->push_back(listener);
  29 +}
  30 +
  31 +void ExtratorVTT::notifyListeners(unsigned char* subtitle, uint64_t pts) {
  32 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  33 + (*it)->notifySubtitle(subtitle, pts);
  34 + }
  35 +}
  36 +
  37 +void ExtratorVTT::notifyEndExtraction(int size) {
  38 + PRINTL(util::_DEBUG, "Extrator webVTT concluiu a extração: %d legendas.\n", size);
  39 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  40 + (*it)->notifyEnd(size);
  41 + }
  42 +}
  43 +
  44 +void ExtratorVTT::initialize() {
  45 + file = new lavidlib::File(this->filePath);
  46 +
  47 + try{
  48 + file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  49 + bff_reader = new BufferedReader(file_io);
  50 + }catch(Exception &ex){
  51 + finish = true;
  52 + Logging::instance()->writeLog("extratorVTT.cpp <Error>: Arquivo de legenda não encontrado.");
  53 + throw lavidlib::RuntimeException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
  54 + }
  55 + this->Start();
  56 +}
  57 +
  58 +Subtitle* ExtratorVTT::nextCue() {
  59 + string line;
  60 + string cueText = "";
  61 + int target_pos;
  62 + int64_t time_in;
  63 +
  64 + Subtitle* cue = new Subtitle();
  65 +
  66 + try{
  67 + do{
  68 + line = bff_reader->readLine();
  69 + seekPos += line.size() + SIZE_SCAPE;
  70 + }while(line.find(TARGET_TIME) == string::npos);
  71 +
  72 + target_pos = line.find(TARGET_TIME);
  73 + time_in = str_to_time(line.substr(0, target_pos));
  74 + cue->setTimeIn(time_in);
  75 +
  76 + while((line = bff_reader->readLine()) != ""){
  77 + cueText += line;
  78 + cueText += " ";
  79 + }
  80 +
  81 + }catch(lavidlib::EOFException &ex){
  82 + cue->setSubtitleText(formatText(cueText));
  83 + seekPos += (int64_t) cueText.size() + SIZE_SCAPE;
  84 + hasNextCue =false;
  85 + return cue;
  86 + }
  87 +
  88 + cue->setSubtitleText(formatText(cueText));
  89 + seekPos += (int64_t) cueText.size() + SIZE_SCAPE;
  90 + return cue;
  91 +}
  92 +
  93 +string ExtratorVTT::formatText(string line){
  94 + int lessThanPos;
  95 + int moreThanPos;
  96 + string f_line = line;
  97 +
  98 + lessThanPos = f_line.find_first_of(LESS_THAN); //pega a posição do simbolo '<'
  99 + moreThanPos = f_line.find_first_of(MORE_THAN); //pega a posição do simbolo '>'
  100 +
  101 + while(lessThanPos != string::npos && moreThanPos != string::npos){
  102 + f_line = f_line.erase(lessThanPos, moreThanPos - (lessThanPos-1)); //remove o trecho '<string>'
  103 + lessThanPos = f_line.find_first_of(LESS_THAN);
  104 + moreThanPos = f_line.find_first_of(MORE_THAN);
  105 + }
  106 +
  107 + return f_line;
  108 +}
  109 +
  110 +int64_t ExtratorVTT::str_to_time(string str_time) {
  111 + int64_t ttime = 0;
  112 + char* tokens = new char[4]; // hh, mm, ss, ms
  113 + strcpy(tokens, (char*)str_time.c_str());
  114 +
  115 + int index = 0;
  116 + int values [4]; // hh, mm, ss, ms
  117 + char * str = strtok(tokens, ":,.");
  118 + while (str != NULL) {
  119 + values[index] = atoi(str);
  120 + str = strtok(NULL, ":,.");
  121 + index++;
  122 + }
  123 + delete(tokens);
  124 +
  125 + /* calculate time */
  126 + ttime = /*hour to sec*/((((values[0] * 60) * 60) +
  127 + /*min to sec*/(values[1] * 60) +/*sec*/values[2])*1000) + values[3];
  128 +
  129 + return ttime;
  130 +}
  131 +
  132 +void ExtratorVTT::Run() {
  133 + PRINTL(util::_INFO, "Extraindo Legendas...\n");
  134 +
  135 + int sub_index = 0;
  136 + string cue_text = "";
  137 + while(hasNextCue){
  138 + subtitle = nextCue();
  139 + cue_text = subtitle->getSubtitleText();
  140 + notifyListeners((unsigned char*)cue_text.c_str(), (uint64_t) subtitle->getTimeIn());
  141 + sub_index++;
  142 + free(subtitle);
  143 + }
  144 + if(sub_index == 0)
  145 + notifyListeners((unsigned char*)"ARQUIVO_INVALIDO", 0);
  146 + this->finish = true;
  147 + notifyEndExtraction(sub_index);
  148 +}
0 \ No newline at end of file 149 \ No newline at end of file
extrator/src/include/extrator.h
@@ -33,10 +33,7 @@ protected: @@ -33,10 +33,7 @@ protected:
33 BufferedReader* bff_reader; 33 BufferedReader* bff_reader;
34 34
35 public: 35 public:
36 - enum ExtratorType {  
37 - SRT,  
38 - TXT  
39 - }; 36 + enum ExtratorType {SRT, TXT, VTT};
40 37
41 /** Notifica o fim da extração do conteúdo do arquivo. 38 /** Notifica o fim da extração do conteúdo do arquivo.
42 * 39 *
extrator/src/include/extratorFactory.h
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 #include "extrator.h" 10 #include "extrator.h"
11 #include "extratorSRT.h" 11 #include "extratorSRT.h"
12 #include "extratorTXT.h" 12 #include "extratorTXT.h"
  13 +#include "extratorVTT.h"
13 14
14 /** \brief Classe que implementa o factory pattern. */ 15 /** \brief Classe que implementa o factory pattern. */
15 class ExtratorFactory{ 16 class ExtratorFactory{
extrator/src/include/extratorSRT.h
@@ -16,11 +16,13 @@ @@ -16,11 +16,13 @@
16 #include "jthread.h" 16 #include "jthread.h"
17 #include "extrator.h" 17 #include "extrator.h"
18 #include "subtitle.h" 18 #include "subtitle.h"
19 -#include "listenerSRT.h" 19 +#include "listenerSub.h"
20 #include "extratorException.h" 20 #include "extratorException.h"
21 21
22 #define SIZE_CSCAPE 1 22 #define SIZE_CSCAPE 1
23 #define TARGET_TIME "-->" 23 #define TARGET_TIME "-->"
  24 +#define LESS_THAN "<"
  25 +#define MORE_THAN ">"
24 #define INPUT_SRT "vlibras_user/inputSRT.srt" 26 #define INPUT_SRT "vlibras_user/inputSRT.srt"
25 //#define MAX_LINE 1024 27 //#define MAX_LINE 1024
26 28
@@ -48,7 +50,7 @@ public: @@ -48,7 +50,7 @@ public:
48 * 50 *
49 * \param listener O ouvinte a ser registrado. 51 * \param listener O ouvinte a ser registrado.
50 */ 52 */
51 - void addListener(ListenerSRT* listener); 53 + void addListener(ListenerSub* listener);
52 54
53 /** Notifica os ouvintes sobre novas extrações realizadas. 55 /** Notifica os ouvintes sobre novas extrações realizadas.
54 * 56 *
@@ -98,12 +100,13 @@ public: @@ -98,12 +100,13 @@ public:
98 void Run(); 100 void Run();
99 101
100 private: 102 private:
101 - list<ListenerSRT*> *listeners; 103 + list<ListenerSub*> *listeners;
102 104
103 Subtitle *subtitle; 105 Subtitle *subtitle;
104 int64_t seek_pos; 106 int64_t seek_pos;
105 bool hasNextSub; 107 bool hasNextSub;
106 - 108 +
  109 + string formatText(string line);
107 uint64_t calcula_pts(double msec); 110 uint64_t calcula_pts(double msec);
108 int64_t str_to_time(std::string str_time); 111 int64_t str_to_time(std::string str_time);
109 }; 112 };
extrator/src/include/extratorVTT.h 0 → 100644
@@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
  1 +#ifndef EXTRATORVTT_H
  2 +#define EXTRATORVTT_H
  3 +
  4 +#include <list>
  5 +#include <string.h>
  6 +#include <stdlib.h>
  7 +#include <stdio.h>
  8 +#include "jthread.h"
  9 +#include "extrator.h"
  10 +#include "subtitle.h"
  11 +#include "listenerSub.h"
  12 +#include <iostream>
  13 +
  14 +#define SIGNATURE "WEBVTT"
  15 +#define TARGET_TIME "-->"
  16 +#define LESS_THAN "<"
  17 +#define MORE_THAN ">"
  18 +#define SIZE_SCAPE 1
  19 +
  20 +using namespace std;
  21 +using namespace sndesc;
  22 +using namespace jthread;
  23 +
  24 +class ExtratorVTT: public Extrator, public Thread {
  25 +
  26 +public:
  27 + ExtratorVTT();
  28 + ~ExtratorVTT();
  29 +
  30 + void setFilePath(char* path);
  31 + void addListener(ListenerSub* listener);
  32 +
  33 + void initialize();
  34 + bool isFinished();
  35 + void Run();
  36 +
  37 +private:
  38 + Subtitle* subtitle;
  39 + list<ListenerSub*> *listeners;
  40 +
  41 + int64_t seekPos;
  42 + bool hasNextCue;
  43 +
  44 + void notifyEndExtraction(int size);
  45 + void notifyListeners(unsigned char* subtitle, uint64_t pts);
  46 +
  47 + Subtitle* nextCue();
  48 + string formatText(string line);
  49 + int64_t str_to_time(string str_time);
  50 +};
  51 +
  52 +#endif /* EXTRATORVTT_H */
0 \ No newline at end of file 53 \ No newline at end of file
extrator/src/include/listenerSRT.h
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -/**  
2 - * \file listenerSRT.h  
3 - */  
4 -  
5 -#ifndef LISTENERSRT_H  
6 -#define LISTENERSRT_H  
7 -  
8 -#include <stdint.h>  
9 -  
10 -class ListenerSRT{  
11 -  
12 -public:  
13 - virtual void notifySubtitle(unsigned char* subtitle, int64_t pts) = 0;  
14 - virtual void notifyEnd(int sub_size) = 0;  
15 -};  
16 -  
17 -#endif /* LISTENEREXTRATOR_H */  
18 \ No newline at end of file 0 \ No newline at end of file
extrator/src/include/listenerSub.h 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +/**
  2 + * \file listenerSRT.h
  3 + */
  4 +
  5 +#ifndef LISTENERSUB_H
  6 +#define LISTENERSUB_H
  7 +
  8 +#include <stdint.h>
  9 +
  10 +class ListenerSub{
  11 +
  12 +public:
  13 + virtual void notifySubtitle(unsigned char* subtitle, uint64_t pts) = 0;
  14 + virtual void notifyEnd(int sub_size) = 0;
  15 +};
  16 +
  17 +#endif /* LISTENERSUB_H */
0 \ No newline at end of file 18 \ No newline at end of file
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 #include "argParser.h" 18 #include "argParser.h"
19 #include "serviceTester.h" 19 #include "serviceTester.h"
20 #include "serviceException.h" 20 #include "serviceException.h"
21 -#include "serviceWindowGenerationFromSRT.h" 21 +#include "serviceWindowGenerationFromSubtitle.h"
22 #include "serviceWindowGenerationFromRec.h" 22 #include "serviceWindowGenerationFromRec.h"
23 #include "serviceWindowGenerationFromText.h" 23 #include "serviceWindowGenerationFromText.h"
24 #include <lavidlib/base/RuntimeException.h> 24 #include <lavidlib/base/RuntimeException.h>
@@ -184,8 +184,8 @@ void serviceSRT(int service, string path_video, string path_srt, int language, i @@ -184,8 +184,8 @@ void serviceSRT(int service, string path_video, string path_srt, int language, i
184 184
185 setPathContents(mode, id); 185 setPathContents(mode, id);
186 186
187 - ServiceWindowGenerationFromSRT* service_srt;  
188 - service_srt = new ServiceWindowGenerationFromSRT(video, srt, language, position, size, background, name, mode, service); 187 + ServiceWindowGenerationFromSubtitle* service_srt;
  188 + service_srt = new ServiceWindowGenerationFromSubtitle(video, srt, language, position, size, background, name, mode, service);
189 189
190 try{ 190 try{
191 service_srt->initialize(); 191 service_srt->initialize();
@@ -270,8 +270,8 @@ void serviceOnlySRT(int service, string path_srt, int language, int background, @@ -270,8 +270,8 @@ void serviceOnlySRT(int service, string path_srt, int language, int background,
270 270
271 setPathContents(mode, id); 271 setPathContents(mode, id);
272 272
273 - ServiceWindowGenerationFromSRT* service_srt;  
274 - service_srt = new ServiceWindowGenerationFromSRT(srt, language, background, name, mode, service); 273 + ServiceWindowGenerationFromSubtitle* service_srt;
  274 + service_srt = new ServiceWindowGenerationFromSubtitle(srt, language, background, name, mode, service);
275 try{ 275 try{
276 service_srt->initialize(); 276 service_srt->initialize();
277 }catch(ServiceException ex){ 277 }catch(ServiceException ex){
renderer/src/include/renderer.h
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 #include <lavidlib/net/SocketException.h> 22 #include <lavidlib/net/SocketException.h>
23 #include <lavidlib/base/RuntimeException.h> 23 #include <lavidlib/base/RuntimeException.h>
24 #include <lavidlib/net/UnknownHostException.h> 24 #include <lavidlib/net/UnknownHostException.h>
  25 + #include <iostream>
25 26
26 #define HOST "0.0.0.0" 27 #define HOST "0.0.0.0"
27 #define PORT 5555 28 #define PORT 5555
renderer/src/renderer.cpp
@@ -56,7 +56,7 @@ void Renderer::connectToUnityPlayer() { @@ -56,7 +56,7 @@ void Renderer::connectToUnityPlayer() {
56 i++; 56 i++;
57 sleep(1); 57 sleep(1);
58 }catch(lavidlib::SocketException &ex){ 58 }catch(lavidlib::SocketException &ex){
59 - if(i == 7){ // Numeros de tentativas (pode ser alterado) 59 + if(i == 10){ // Numeros de tentativas (pode ser alterado)
60 PRINTL(util::_ERROR, "Número de tentativas de conexão excedido!\n"); 60 PRINTL(util::_ERROR, "Número de tentativas de conexão excedido!\n");
61 throw lavidlib::RuntimeException(ex.getMessage().c_str()); 61 throw lavidlib::RuntimeException(ex.getMessage().c_str());
62 } 62 }
@@ -73,7 +73,7 @@ void Renderer::receiveGlosa(string glosa, int64_t pts) { @@ -73,7 +73,7 @@ void Renderer::receiveGlosa(string glosa, int64_t pts) {
73 string formatedGlosa; //Formato da glosa que será enviada para o player: "glosa#pts" 73 string formatedGlosa; //Formato da glosa que será enviada para o player: "glosa#pts"
74 74
75 if(glosa == BADSENTENCE || glosa == BADTEXT) 75 if(glosa == BADSENTENCE || glosa == BADTEXT)
76 - formatedGlosa = "_DEFAULT"; //O player entende "#pts" como pose neutra 76 + formatedGlosa = ""; //O player entende "#pts" como pose neutra
77 else 77 else
78 formatedGlosa = glosa; 78 formatedGlosa = glosa;
79 79
@@ -95,6 +95,8 @@ void Renderer::exportGlosa() { @@ -95,6 +95,8 @@ void Renderer::exportGlosa() {
95 glosaBff = new char[glosaSize]; 95 glosaBff = new char[glosaSize];
96 strcpy(glosaBff, glosaCpy.c_str()); 96 strcpy(glosaBff, glosaCpy.c_str());
97 97
  98 + cout << "glosa: " << glosaBff << endl;
  99 +
98 try { 100 try {
99 cSocket->write(glosaBff, glosaSize); //Envia a glosa formatada p/ o player 101 cSocket->write(glosaBff, glosaSize); //Envia a glosa formatada p/ o player
100 }catch(lavidlib::IOException &ex){ 102 }catch(lavidlib::IOException &ex){
servico/src/include/serviceTester.h
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 #include <lavidlib/io/FileIO.h> 13 #include <lavidlib/io/FileIO.h>
14 #include "serviceException.h" 14 #include "serviceException.h"
15 #include "serviceWindowGenerationFromRec.h" 15 #include "serviceWindowGenerationFromRec.h"
16 -#include "serviceWindowGenerationFromSRT.h" 16 +#include "serviceWindowGenerationFromSubtitle.h"
17 #include "serviceWindowGenerationFromText.h" 17 #include "serviceWindowGenerationFromText.h"
18 18
19 #define MODE_TEST 3 19 #define MODE_TEST 3
@@ -69,7 +69,7 @@ private: @@ -69,7 +69,7 @@ private:
69 FileIO* fIO_out; 69 FileIO* fIO_out;
70 70
71 ServiceWindowGenerationFromRec* service_rec; 71 ServiceWindowGenerationFromRec* service_rec;
72 - ServiceWindowGenerationFromSRT* service_srt; 72 + ServiceWindowGenerationFromSubtitle* service_srt;
73 ServiceWindowGenerationFromText* service_text; 73 ServiceWindowGenerationFromText* service_text;
74 74
75 /** Checa o serviço de vídeo com legendas */ 75 /** Checa o serviço de vídeo com legendas */
servico/src/include/serviceWindowGenerationFromSRT.h
@@ -1,136 +0,0 @@ @@ -1,136 +0,0 @@
1 -/**  
2 - * \file serviceWindowGenerationFromSRT.h  
3 - */  
4 -  
5 -#ifndef SERVICEWINDOWGENERATIONFROMSRT_H  
6 -#define SERVICEWINDOWGENERATIONFROMSRT_H  
7 -  
8 -#include "listenerSRT.h"  
9 -#include "extratorFactory.h"  
10 -#include "serviceWindowGeneration.h"  
11 -  
12 -#define SERVICE_TYPE_SRT 1  
13 -#define SERVICE_TYPE_SRT_ONLY 4  
14 -  
15 -/** \brief Classe que implementa o serviço de extração de legendas.  
16 - *  
17 - * \headerfile servico/src/include/serviceWindowGenerationFromSRT.h  
18 - */  
19 -class ServiceWindowGenerationFromSRT : public ServiceWindowGeneration, public ListenerSRT, public ListenerTradutor, public ListenerRenderer, public Thread {  
20 -  
21 -private:  
22 - ExtratorFactory* extrator_factory;  
23 - ExtratorSRT* extratorSRT;  
24 -  
25 - char* path_srt;  
26 -  
27 - /** Adiciona a etiqueta de tempo.  
28 - *  
29 - * Cada sentença conterá sua respectiva de tempo.  
30 - * \param pts A etiqueta de tempo.  
31 - */  
32 - void addPTS(int64_t pts);  
33 -  
34 - /** Seta o número de legendas.  
35 - *  
36 - * \param A quantidade de legendas.  
37 - * \exception ServiceException Se houver algum erro durante a execução.  
38 - */  
39 - void setSizeOfSubtitles(int sub_size);  
40 -  
41 - /** Define o path do vídeo de LIBRAS. */  
42 - void setPathLibras();  
43 -  
44 - /** Define o path dos arquivos de saída.  
45 - *  
46 - * \exception RuntimeException Se houver algum erro durante a execução.  
47 - */  
48 - void setPathContents();  
49 -  
50 - /** Indica se o serviço está sendo executado.  
51 - *  
52 - * \return O status do serviço.  
53 - */  
54 - bool isRunning();  
55 -public:  
56 - /** Construtor do serviço de vídeo com legendas.  
57 - *  
58 - * \param pathVideo Path do vídeo de entrada.  
59 - * \param pathSRT Path do arquivo de legendas.  
60 - * \param sublanguage Linguagem das legendas do arquivo.  
61 - * \param pos Posição do vídeo de LIBRAS em relação ao vídeo original.  
62 - * \param size Tamanho do vídeo de LIBRAS.  
63 - * \param transp Transparência do plano de fundo do vídeo.  
64 - * \param id Identificação do cliente.  
65 - * \param mode Modo de execução.  
66 - * \param serviceType Tipo do serviço.  
67 - */  
68 - ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage, int pos,  
69 - int size, int transp, char* id, int mode, int serviceType);  
70 -  
71 - /** Construtor do serviço de legendas.  
72 - *  
73 - * \param pathSRT Path do arquivo de legendas.  
74 - * \param sublanguage Linguagem das legendas do arquivo.  
75 - * \param transparency Transparência do plano de fundo do vídeo.  
76 - * \param id Identificação do cliente.  
77 - * \param mode Modo de execução.  
78 - * \param serviceType Tipo do serviço.  
79 - */  
80 - ServiceWindowGenerationFromSRT(char* pathSRT, int sublanguage, int transparency, char* id, int mode, int serviceType);  
81 -  
82 - /** Destrutor */  
83 - ~ServiceWindowGenerationFromSRT();  
84 -  
85 - /** Notifica novas legendas extraídas.  
86 - *  
87 - * \param subtitle A legenda extraída.  
88 - * \param pts A etiqueta de tempo da legenda.  
89 - */  
90 - void notifySubtitle(unsigned char* subtitle, int64_t pts);  
91 -  
92 - /** Recebe a notificação do fim da renderização do vídeo */  
93 - void notifyEndOfRenderization();  
94 -  
95 - /** Recebe a notificação do fim da tradução da legenda.  
96 - *  
97 - * \param glosa A legenda traduzida.  
98 - */  
99 - void notifyTranslation(char* glosas);  
100 -  
101 - /** Envia para a tradução a legenda obtida.  
102 - *  
103 - * \param text A legenda obtida.  
104 - */  
105 - void notifyTranslator(unsigned char* text);  
106 -  
107 - /** Envia a glosa para o renderizador.  
108 - *  
109 - * \param glosa A glosa obtida.  
110 - * \exception ServiceException Se houver algum erro durante a execução.  
111 - */  
112 - void notifyRenderer(string glosa);  
113 -  
114 - /** Notifica o fim da extração de legendas.  
115 - *  
116 - * \param sub_size O número de legendas extraídas.  
117 - */  
118 - void notifyEnd(int sub_size);  
119 -  
120 - /** Inicia o serviço de extração de legendas.  
121 - *  
122 - * \exception ServiceException Se houver algum erro durante a execução.  
123 - */  
124 - void initialize();  
125 -  
126 - /** Indica o fim do processo do serviço.  
127 - *  
128 - * \return O status do processo.  
129 - */  
130 - bool isFinished();  
131 -  
132 - /** Este método é chamado quando a Thread for iniciada. */  
133 - void Run();  
134 -};  
135 -  
136 -#endif /* SERVICEWINDOWGENERATIONFROMSRT_H_ */  
137 \ No newline at end of file 0 \ No newline at end of file
servico/src/include/serviceWindowGenerationFromSubtitle.h 0 → 100644
@@ -0,0 +1,150 @@ @@ -0,0 +1,150 @@
  1 +/**
  2 + * \file ServiceWindowGenerationFromSubtitle.h
  3 + */
  4 +
  5 +#ifndef SERVICEWINDOWGENERATIONFROMSUB_H
  6 +#define SERVICEWINDOWGENERATIONFROMSUB_H
  7 +
  8 +#include "listenerSub.h"
  9 +#include "extratorFactory.h"
  10 +#include "serviceWindowGeneration.h"
  11 +#include <lavidlib/io/File.h>
  12 +#include <lavidlib/io/FileIO.h>
  13 +#include <lavidlib/io/BufferedReader.h>
  14 +#include <lavidlib/io/IOException.h>
  15 +#include <lavidlib/io/EOFException.h>
  16 +
  17 +#define SIGNATURE "WEBVTT"
  18 +#define SERVICE_TYPE_SRT 1
  19 +#define SERVICE_TYPE_SRT_ONLY 4
  20 +
  21 +/** \brief Classe que implementa o serviço de extração de legendas.
  22 + *
  23 + * \headerfile servico/src/include/ServiceWindowGenerationFromSubtitle.h
  24 + */
  25 +class ServiceWindowGenerationFromSubtitle : public ServiceWindowGeneration, public ListenerSub, public ListenerTradutor, public ListenerRenderer, public Thread {
  26 +
  27 +private:
  28 + char* path_srt;
  29 +
  30 + ExtratorFactory* extrator_factory;
  31 + ExtratorSRT* extratorSRT;
  32 + ExtratorVTT* extratorVTT;
  33 +
  34 + File* file;
  35 + FileIO* fileIO;
  36 + BufferedReader* bffReader;
  37 +
  38 + /** Adiciona a etiqueta de tempo.
  39 + *
  40 + * Cada sentença conterá sua respectiva de tempo.
  41 + * \param pts A etiqueta de tempo.
  42 + */
  43 + void addPTS(int64_t pts);
  44 +
  45 + /** Seta o número de legendas.
  46 + *
  47 + * \param A quantidade de legendas.
  48 + * \exception ServiceException Se houver algum erro durante a execução.
  49 + */
  50 + void setSizeOfSubtitles(int sub_size);
  51 +
  52 + /** Define o path do vídeo de LIBRAS. */
  53 + void setPathLibras();
  54 +
  55 + /** Define o path dos arquivos de saída.
  56 + *
  57 + * \exception RuntimeException Se houver algum erro durante a execução.
  58 + */
  59 + void setPathContents();
  60 +
  61 + /** Retorna o extrator espefifico do arquivo de legenda. */
  62 + Extrator::ExtratorType getExtratorType();
  63 +
  64 + /** Indica se o serviço está sendo executado.
  65 + *
  66 + * \return O status do serviço.
  67 + */
  68 + bool isRunning();
  69 +public:
  70 + /** Construtor do serviço de vídeo com legendas.
  71 + *
  72 + * \param pathVideo Path do vídeo de entrada.
  73 + * \param pathSRT Path do arquivo de legendas.
  74 + * \param sublanguage Linguagem das legendas do arquivo.
  75 + * \param pos Posição do vídeo de LIBRAS em relação ao vídeo original.
  76 + * \param size Tamanho do vídeo de LIBRAS.
  77 + * \param transp Transparência do plano de fundo do vídeo.
  78 + * \param id Identificação do cliente.
  79 + * \param mode Modo de execução.
  80 + * \param serviceType Tipo do serviço.
  81 + */
  82 + ServiceWindowGenerationFromSubtitle(char* pathVideo, char* pathSRT, int sublanguage, int pos,
  83 + int size, int transp, char* id, int mode, int serviceType);
  84 +
  85 + /** Construtor do serviço de legendas.
  86 + *
  87 + * \param pathSRT Path do arquivo de legendas.
  88 + * \param sublanguage Linguagem das legendas do arquivo.
  89 + * \param transparency Transparência do plano de fundo do vídeo.
  90 + * \param id Identificação do cliente.
  91 + * \param mode Modo de execução.
  92 + * \param serviceType Tipo do serviço.
  93 + */
  94 + ServiceWindowGenerationFromSubtitle(char* pathSRT, int sublanguage, int transparency, char* id, int mode, int serviceType);
  95 +
  96 + /** Destrutor */
  97 + ~ServiceWindowGenerationFromSubtitle();
  98 +
  99 + /** Notifica novas legendas extraídas.
  100 + *
  101 + * \param subtitle A legenda extraída.
  102 + * \param pts A etiqueta de tempo da legenda.
  103 + */
  104 + void notifySubtitle(unsigned char* subtitle, uint64_t pts);
  105 +
  106 + /** Recebe a notificação do fim da renderização do vídeo */
  107 + void notifyEndOfRenderization();
  108 +
  109 + /** Recebe a notificação do fim da tradução da legenda.
  110 + *
  111 + * \param glosa A legenda traduzida.
  112 + */
  113 + void notifyTranslation(char* glosas);
  114 +
  115 + /** Envia para a tradução a legenda obtida.
  116 + *
  117 + * \param text A legenda obtida.
  118 + */
  119 + void notifyTranslator(unsigned char* text);
  120 +
  121 + /** Envia a glosa para o renderizador.
  122 + *
  123 + * \param glosa A glosa obtida.
  124 + * \exception ServiceException Se houver algum erro durante a execução.
  125 + */
  126 + void notifyRenderer(string glosa);
  127 +
  128 + /** Notifica o fim da extração de legendas.
  129 + *
  130 + * \param sub_size O número de legendas extraídas.
  131 + */
  132 + void notifyEnd(int sub_size);
  133 +
  134 + /** Inicia o serviço de extração de legendas.
  135 + *
  136 + * \exception ServiceException Se houver algum erro durante a execução.
  137 + */
  138 + void initialize();
  139 +
  140 + /** Indica o fim do processo do serviço.
  141 + *
  142 + * \return O status do processo.
  143 + */
  144 + bool isFinished();
  145 +
  146 + /** Este método é chamado quando a Thread for iniciada. */
  147 + void Run();
  148 +};
  149 +
  150 +#endif /* SERVICEWINDOWGENERATIONFROMSUB_H_ */
0 \ No newline at end of file 151 \ No newline at end of file
servico/src/serviceTester.cpp
@@ -26,7 +26,7 @@ void ServiceTester::checkServiceSRT() { @@ -26,7 +26,7 @@ void ServiceTester::checkServiceSRT() {
26 PRINTL(util::_DEBUG, "Checando extração de legenda...\n"); 26 PRINTL(util::_DEBUG, "Checando extração de legenda...\n");
27 setPathContents(); 27 setPathContents();
28 28
29 - service_srt = new ServiceWindowGenerationFromSRT((char*)VID_FILE, (char*)SRT_FILE, 1, position, 29 + service_srt = new ServiceWindowGenerationFromSubtitle((char*)VID_FILE, (char*)SRT_FILE, 1, position,
30 resolution, background, (char*)TESTER_ID, MODE_TEST, 1); 30 resolution, background, (char*)TESTER_ID, MODE_TEST, 1);
31 31
32 try{ 32 try{
servico/src/serviceWindowGenerationFromSRT.cpp
@@ -1,223 +0,0 @@ @@ -1,223 +0,0 @@
1 -#include "serviceWindowGenerationFromSRT.h"  
2 -  
3 -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage,  
4 - int pos, int size, int transp, char* id, int mode, 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->exec_mode = mode;  
14 - this->service_type = serviceType;  
15 - numero_legendas = INT_MAX;  
16 - legendas_enviadas = 0;  
17 - vetor_pts = new vector<int64_t >();  
18 - extrator_factory = new ExtratorFactory();  
19 - try{  
20 - setPathContents();  
21 - }catch(RuntimeException ex){  
22 - throw ServiceException(ex.getMessage());  
23 - }  
24 - running = true;  
25 - finish = false;  
26 - PRINTL(util::_DEBUG, "Service SRT Done!\n");  
27 -}  
28 -  
29 -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathSRT, int sublanguage, int transp, char* id, int mode, int serviceType) {  
30 - this->path_srt = pathSRT;  
31 - this->sub_language = sublanguage;  
32 - this->transparency = transp;  
33 - this->user_id = id;  
34 - this->exec_mode = mode;  
35 - this->service_type = serviceType;  
36 - numero_legendas = INT_MAX;  
37 - legendas_enviadas = 0;  
38 - vetor_pts = new vector<int64_t >();  
39 - extrator_factory = new ExtratorFactory();  
40 - try{  
41 - setPathContents();  
42 - }catch(RuntimeException ex){  
43 - throw ServiceException(ex.getMessage());  
44 - }  
45 - running = true;  
46 - finish = false;  
47 - PRINTL(util::_DEBUG, "Service SRT Done!\n");  
48 -}  
49 -  
50 -ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() {  
51 - free(vetor_pts);  
52 - if (tradutor) delete tradutor;  
53 - // if (mixer) delete mixer;  
54 - if (renderer) delete renderer;  
55 - if (extratorSRT)delete extratorSRT;  
56 - if (extrator_factory) delete extrator_factory;  
57 - PRINTL(util::_DEBUG, "Service SRT finalized!\n");  
58 -}  
59 -  
60 -void ServiceWindowGenerationFromSRT::setPathContents() {  
61 - switch(exec_mode) {  
62 - case DEVELOPER:  
63 - {  
64 - char* vStorage;  
65 - char* vUploads;  
66 - vStorage = getenv("VLSTORAGE");  
67 - vUploads = getenv("VLUPLOADS");  
68 -  
69 - if(vStorage != NULL && vUploads != NULL){  
70 - this->path_contents = vStorage;  
71 - this->path_uploads = vUploads;  
72 - PRINTL(util::_DEBUG, "Paths definidos pelo desenvolvedor:\n %s\n%s\n", path_contents, path_uploads);  
73 - }else{  
74 - this->path_contents = (char*) PATH_DEVEL_CONTENTS;  
75 - this->path_uploads = (char*) PATH_DEVEL_UPLOADS;  
76 - }  
77 - }break;  
78 -  
79 - case PRODUCTION:  
80 - {  
81 - ifstream conf_file(PATH_CONF_FILE, ifstream::binary);  
82 - parsingSuccessful = reader.parse(conf_file, root);  
83 -  
84 - if(parsingSuccessful) {  
85 - string attr = "vlibras_user/";  
86 - attr += root.get("storage", PATH_VBOX_UPLOADS).asString();  
87 - this->path_contents = new char[MAX_SIZE_PATH];  
88 - strcpy(this->path_contents, attr.c_str());  
89 - this->path_uploads = (char*) PATH_VBOX_UPLOADS;  
90 - }else{  
91 - conf_file.close();  
92 - Logging::instance()->writeLog("Erro com a leitura do arquivo params.json");  
93 - throw new RuntimeException("Fail to parsing params.json");  
94 - }  
95 - conf_file.close();  
96 - }break;  
97 -  
98 - case TESTER:  
99 - {  
100 - this->path_contents = (char*) PATH_TESTER_CONTENTS;  
101 - this->path_uploads = (char*) PATH_TESTER_UPLOADS;  
102 - }break;  
103 -  
104 - default:  
105 - throw ServiceException("Invalid execution mode!");  
106 - }  
107 -}  
108 -  
109 -void ServiceWindowGenerationFromSRT::setPathLibras() {  
110 - string final_path = "";  
111 - path_libras = new char[MAX_SIZE_PATH];  
112 -  
113 - if(this->service_type == SERVICE_TYPE_SRT)  
114 - final_path.append(this->path_uploads).append("/").append(this->user_id);  
115 - else  
116 - final_path.append(this->path_contents);  
117 -  
118 - final_path.append("/").append(this->user_id).append(".mp4");  
119 - strcpy(this->path_libras, final_path.c_str());  
120 -}  
121 -  
122 -void ServiceWindowGenerationFromSRT::setSizeOfSubtitles(int sub_size) {  
123 - numero_legendas = sub_size;  
124 - if (legendas_enviadas >= numero_legendas){  
125 - try{  
126 - renderer->initialize();  
127 - }catch(lavidlib::RuntimeException &ex){  
128 - throw ServiceException(ex.getMessage().c_str());  
129 - }  
130 - }  
131 -}  
132 -  
133 -void ServiceWindowGenerationFromSRT::addPTS(int64_t pts){  
134 - vetor_pts->push_back(pts);  
135 -}  
136 -  
137 -void ServiceWindowGenerationFromSRT::notifyTranslator(unsigned char* subtitle) {  
138 - const char* constchar = (const char*) subtitle;  
139 - char* legenda_copy = new char[strlen(constchar)+1];  
140 - strcpy(legenda_copy, constchar);  
141 - tradutor->traduz((unsigned char*) legenda_copy);  
142 - free(legenda_copy);  
143 -}  
144 -  
145 -void ServiceWindowGenerationFromSRT::notifySubtitle(unsigned char *subtitle, int64_t pts){  
146 - addPTS(pts);  
147 - if (sub_language == 1)  
148 - notifyTranslator(subtitle);  
149 - else{  
150 - string glosa(reinterpret_cast<char*>(subtitle));  
151 - notifyRenderer(glosa);  
152 - }  
153 -}  
154 -  
155 -void ServiceWindowGenerationFromSRT::notifyTranslation(char* glosa) {  
156 - string sGlosa(glosa);  
157 - notifyRenderer(sGlosa);  
158 -}  
159 -  
160 -void ServiceWindowGenerationFromSRT::notifyRenderer(string glosa) {  
161 - try{  
162 - renderer->receiveGlosa(glosa, vetor_pts->front());  
163 - legendas_enviadas++;  
164 - }catch(lavidlib::RuntimeException &ex){  
165 - throw ServiceException(ex.getMessage().c_str());  
166 - }  
167 - vetor_pts->erase(vetor_pts->begin());  
168 -}  
169 -  
170 -void ServiceWindowGenerationFromSRT::notifyEndOfRenderization() {  
171 - if(this->service_type == SERVICE_TYPE_SRT){  
172 - mixer = new Mixer(this->path_input, this->path_libras, this->size, this->position,  
173 - this->transparency, this->user_id, this->path_uploads, this->path_contents);  
174 - mixer->initialize();  
175 - delete mixer;  
176 - }  
177 - this->running = false;  
178 -}  
179 -  
180 -void ServiceWindowGenerationFromSRT::notifyEnd(int sub_size) {  
181 - PRINTL(util::_DEBUG, "Service SRT recebeu: %d legendas.\n", sub_size);  
182 - setSizeOfSubtitles(sub_size);  
183 -}  
184 -  
185 -bool ServiceWindowGenerationFromSRT::isRunning() {  
186 - return this->running;  
187 -}  
188 -  
189 -bool ServiceWindowGenerationFromSRT::isFinished() {  
190 - return this->finish;  
191 -}  
192 -  
193 -void ServiceWindowGenerationFromSRT::initialize() {  
194 - PRINTL(util::_DEBUG, "Service SRT Initialize.\n");  
195 - setPathLibras();  
196 - extratorSRT = (ExtratorSRT*) extrator_factory->getExtrator(Extrator::SRT);  
197 - extratorSRT->addListener(this);  
198 - extratorSRT->setFilePath(path_srt);  
199 -  
200 - tradutor = new TradutorPortGlosa();  
201 - if (this->sub_language == 1) {  
202 - tradutor->addListener(this);  
203 - }  
204 -  
205 - renderer = new Renderer(this->path_libras ,this->user_id);  
206 - renderer->addListener(this);  
207 -  
208 - try{  
209 - extratorSRT->initialize();  
210 - }catch(ExtratorException ex){  
211 - throw ServiceException(ex.getMessage());  
212 - }catch(RuntimeException &ex){  
213 - throw ServiceException(ex.getMessage().c_str());  
214 - }  
215 - this->Start();  
216 -}  
217 -  
218 -void ServiceWindowGenerationFromSRT::Run() {  
219 - while(isRunning()){  
220 - usleep(200000);  
221 - }  
222 - finish = true;  
223 -}  
224 \ No newline at end of file 0 \ No newline at end of file
servico/src/serviceWindowGenerationFromSubtitle.cpp 0 → 100644
@@ -0,0 +1,276 @@ @@ -0,0 +1,276 @@
  1 +#include "serviceWindowGenerationFromSubtitle.h"
  2 +
  3 +ServiceWindowGenerationFromSubtitle::ServiceWindowGenerationFromSubtitle(char* pathVideo, char* pathSRT, int sublanguage,
  4 + int pos, int size, int transp, char* id, int mode, 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->exec_mode = mode;
  14 + this->service_type = serviceType;
  15 + numero_legendas = INT_MAX;
  16 + legendas_enviadas = 0;
  17 + vetor_pts = new vector<int64_t >();
  18 + extrator_factory = new ExtratorFactory();
  19 + try{
  20 + setPathContents();
  21 + }catch(RuntimeException ex){
  22 + throw ServiceException(ex.getMessage());
  23 + }
  24 + running = true;
  25 + finish = false;
  26 + PRINTL(util::_DEBUG, "Service SRT Done!\n");
  27 +}
  28 +
  29 +ServiceWindowGenerationFromSubtitle::ServiceWindowGenerationFromSubtitle(char* pathSRT, int sublanguage, int transp, char* id, int mode, int serviceType) {
  30 + this->path_srt = pathSRT;
  31 + this->sub_language = sublanguage;
  32 + this->transparency = transp;
  33 + this->user_id = id;
  34 + this->exec_mode = mode;
  35 + this->service_type = serviceType;
  36 + numero_legendas = INT_MAX;
  37 + legendas_enviadas = 0;
  38 + vetor_pts = new vector<int64_t >();
  39 + extrator_factory = new ExtratorFactory();
  40 + try{
  41 + setPathContents();
  42 + }catch(RuntimeException ex){
  43 + throw ServiceException(ex.getMessage());
  44 + }
  45 + running = true;
  46 + finish = false;
  47 + PRINTL(util::_DEBUG, "Service SRT Done!\n");
  48 +}
  49 +
  50 +ServiceWindowGenerationFromSubtitle::~ServiceWindowGenerationFromSubtitle() {
  51 + free(vetor_pts);
  52 + if (tradutor) delete tradutor;
  53 + // if (mixer) delete mixer;
  54 + if (renderer) delete renderer;
  55 + if (extratorVTT)delete extratorVTT;
  56 + if (extrator_factory) delete extrator_factory;
  57 + PRINTL(util::_DEBUG, "Service SRT finalized!\n");
  58 +}
  59 +
  60 +void ServiceWindowGenerationFromSubtitle::setPathContents() {
  61 + switch(exec_mode) {
  62 + case DEVELOPER:
  63 + {
  64 + char* vStorage;
  65 + char* vUploads;
  66 + vStorage = getenv("VLSTORAGE");
  67 + vUploads = getenv("VLUPLOADS");
  68 +
  69 + if(vStorage != NULL && vUploads != NULL){
  70 + this->path_contents = vStorage;
  71 + this->path_uploads = vUploads;
  72 + PRINTL(util::_DEBUG, "Paths definidos pelo desenvolvedor:\n %s\n%s\n", path_contents, path_uploads);
  73 + }else{
  74 + this->path_contents = (char*) PATH_DEVEL_CONTENTS;
  75 + this->path_uploads = (char*) PATH_DEVEL_UPLOADS;
  76 + }
  77 + }break;
  78 +
  79 + case PRODUCTION:
  80 + {
  81 + ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
  82 + parsingSuccessful = reader.parse(conf_file, root);
  83 +
  84 + if(parsingSuccessful) {
  85 + string attr = "vlibras_user/";
  86 + attr += root.get("storage", PATH_VBOX_UPLOADS).asString();
  87 + this->path_contents = new char[MAX_SIZE_PATH];
  88 + strcpy(this->path_contents, attr.c_str());
  89 + this->path_uploads = (char*) PATH_VBOX_UPLOADS;
  90 + }else{
  91 + conf_file.close();
  92 + Logging::instance()->writeLog("Erro com a leitura do arquivo params.json");
  93 + throw new RuntimeException("Fail to parsing params.json");
  94 + }
  95 + conf_file.close();
  96 + }break;
  97 +
  98 + case TESTER:
  99 + {
  100 + this->path_contents = (char*) PATH_TESTER_CONTENTS;
  101 + this->path_uploads = (char*) PATH_TESTER_UPLOADS;
  102 + }break;
  103 +
  104 + default:
  105 + throw ServiceException("Invalid execution mode!");
  106 + }
  107 +}
  108 +
  109 +Extrator::ExtratorType ServiceWindowGenerationFromSubtitle::getExtratorType(){
  110 + this->file = new lavidlib::File(this->path_srt);
  111 + try{
  112 + this->fileIO = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  113 + this->bffReader = new BufferedReader(fileIO);
  114 + }catch(Exception &ex){
  115 + Logging::instance()->writeLog("ServiceWindowGenerationFromSubtitle.cpp <Error>: Arquivo de legenda não encontrado.");
  116 + throw ServiceException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
  117 + }
  118 +
  119 + string signature;
  120 + try{
  121 + signature = bffReader->readLine();
  122 + }catch(lavidlib::EOFException &ex){
  123 + throw ServiceException("Arquivo sem conteúdo.");
  124 + }
  125 +
  126 + /* As verificações a seguir estão de acordo com o padrão
  127 + * definido pelo W3C Community Group.
  128 + */
  129 + if(signature.size() < 6){
  130 + return Extrator::SRT;
  131 + }
  132 +
  133 + if(signature.size() == 6 && strcmp(SIGNATURE, signature.c_str()) == 0){
  134 + return Extrator::VTT;
  135 + }
  136 +
  137 + if(signature.size() > 6 && signature.find(SIGNATURE) == string::npos){
  138 + return Extrator::SRT;
  139 +
  140 + }else if(!isspace(signature.at(6))){
  141 + return Extrator::SRT;
  142 + }
  143 +
  144 + delete bffReader;
  145 + delete fileIO;
  146 +
  147 + return Extrator::VTT;
  148 +}
  149 +
  150 +void ServiceWindowGenerationFromSubtitle::setPathLibras() {
  151 + string final_path = "";
  152 + path_libras = new char[MAX_SIZE_PATH];
  153 +
  154 + if(this->service_type == SERVICE_TYPE_SRT)
  155 + final_path.append(this->path_uploads).append("/").append(this->user_id);
  156 + else
  157 + final_path.append(this->path_contents);
  158 +
  159 + final_path.append("/").append(this->user_id).append(".mp4");
  160 + strcpy(this->path_libras, final_path.c_str());
  161 +}
  162 +
  163 +void ServiceWindowGenerationFromSubtitle::setSizeOfSubtitles(int sub_size) {
  164 + numero_legendas = sub_size;
  165 + if (legendas_enviadas >= numero_legendas){
  166 + try{
  167 + renderer->initialize();
  168 + }catch(lavidlib::RuntimeException &ex){
  169 + throw ServiceException(ex.getMessage().c_str());
  170 + }
  171 + }
  172 +}
  173 +
  174 +void ServiceWindowGenerationFromSubtitle::addPTS(int64_t pts){
  175 + vetor_pts->push_back(pts);
  176 +}
  177 +
  178 +void ServiceWindowGenerationFromSubtitle::notifyTranslator(unsigned char* subtitle) {
  179 + const char* constchar = (const char*) subtitle;
  180 + char* legenda_copy = new char[strlen(constchar)+1];
  181 + strcpy(legenda_copy, constchar);
  182 + tradutor->traduz((unsigned char*) legenda_copy);
  183 + free(legenda_copy);
  184 +}
  185 +
  186 +void ServiceWindowGenerationFromSubtitle::notifySubtitle(unsigned char *subtitle, uint64_t pts){
  187 + addPTS(pts);
  188 + if (sub_language == 1)
  189 + notifyTranslator(subtitle);
  190 + else{
  191 + string glosa(reinterpret_cast<char*>(subtitle));
  192 + notifyRenderer(glosa);
  193 + }
  194 +}
  195 +
  196 +void ServiceWindowGenerationFromSubtitle::notifyTranslation(char* glosa) {
  197 + string sGlosa(glosa);
  198 + notifyRenderer(sGlosa);
  199 +}
  200 +
  201 +void ServiceWindowGenerationFromSubtitle::notifyRenderer(string glosa) {
  202 + try{
  203 + renderer->receiveGlosa(glosa, vetor_pts->front());
  204 + legendas_enviadas++;
  205 + }catch(lavidlib::RuntimeException &ex){
  206 + throw ServiceException(ex.getMessage().c_str());
  207 + }
  208 + vetor_pts->erase(vetor_pts->begin());
  209 +}
  210 +
  211 +void ServiceWindowGenerationFromSubtitle::notifyEndOfRenderization() {
  212 + if(this->service_type == SERVICE_TYPE_SRT){
  213 + mixer = new Mixer(this->path_input, this->path_libras, this->size, this->position,
  214 + this->transparency, this->user_id, this->path_uploads, this->path_contents);
  215 + mixer->initialize();
  216 + delete mixer;
  217 + }
  218 + this->running = false;
  219 +}
  220 +
  221 +void ServiceWindowGenerationFromSubtitle::notifyEnd(int sub_size) {
  222 + PRINTL(util::_DEBUG, "Service SRT recebeu: %d legendas.\n", sub_size);
  223 + setSizeOfSubtitles(sub_size);
  224 +}
  225 +
  226 +bool ServiceWindowGenerationFromSubtitle::isRunning() {
  227 + return this->running;
  228 +}
  229 +
  230 +bool ServiceWindowGenerationFromSubtitle::isFinished() {
  231 + return this->finish;
  232 +}
  233 +
  234 +void ServiceWindowGenerationFromSubtitle::initialize() {
  235 + PRINTL(util::_DEBUG, "Service SRT Initialize.\n");
  236 + setPathLibras();
  237 +
  238 + Extrator::ExtratorType extrator_t = getExtratorType();
  239 +
  240 + if(extrator_t == Extrator::SRT){
  241 + extratorSRT = (ExtratorSRT*) extrator_factory->getExtrator(Extrator::SRT);
  242 + extratorSRT->addListener(this);
  243 + extratorSRT->setFilePath(path_srt);
  244 + }else{
  245 + extratorVTT = (ExtratorVTT*) extrator_factory->getExtrator(Extrator::VTT);
  246 + extratorVTT->addListener(this);
  247 + extratorVTT->setFilePath(path_srt);
  248 + }
  249 +
  250 + tradutor = new TradutorPortGlosa();
  251 + if (this->sub_language == 1) {
  252 + tradutor->addListener(this);
  253 + }
  254 +
  255 + renderer = new Renderer(this->path_libras ,this->user_id);
  256 + renderer->addListener(this);
  257 +
  258 + try{
  259 + if(extrator_t == Extrator::SRT)
  260 + extratorSRT->initialize();
  261 + else
  262 + extratorVTT->initialize();
  263 + }catch(ExtratorException ex){
  264 + throw ServiceException(ex.getMessage());
  265 + }catch(RuntimeException &ex){
  266 + throw ServiceException(ex.getMessage().c_str());
  267 + }
  268 + this->Start();
  269 +}
  270 +
  271 +void ServiceWindowGenerationFromSubtitle::Run() {
  272 + while(isRunning()){
  273 + usleep(200000);
  274 + }
  275 + finish = true;
  276 +}
0 \ No newline at end of file 277 \ No newline at end of file