#include "serviceWindowGenerationFromText.h" ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile, int transp, char* id, char* client) { this->path_input = pathFile; this->transparency = transp; this->user_id = id; client_type = client; running = true; finish = false; numero_legendas = INT_MAX; legendas_enviadas = 0; vetor_pts = new vector(); tradutor = new TradutorPortGlosa(); extrator_factory = new ExtratorFactory(); try{ setPathContents(); }catch(RuntimeException ex){ throw ServiceException(ex.getMessage()); } running = true; finish = false; DPRINTF("Done!\n"); } ServiceWindowGenerationFromText::~ServiceWindowGenerationFromText() { free(vetor_pts); if (tradutor) delete tradutor; //if (sincronizador) delete sincronizador; if (extratorTXT)delete extratorTXT; if (extrator_factory) delete extrator_factory; DDDPRINTF("Service Text finalized!\n"); } void ServiceWindowGenerationFromText::setPathContents() { if(strcmp(client_type,DEVELOPER) == 0){ this->path_contents = PATH_DEVEL; this->path_uploads = PATH_DEVEL_UPLOADS; }else if(strcmp(client_type, PRODUCTION) == 0){ ifstream conf_file(PATH_CONF_FILE, ifstream::binary); parsingSuccessful = reader.parse(conf_file, root); if(!parsingSuccessful){ throw new RuntimeException("Fail to parsing param.json"); } string attr = root.get("storage", PATH_VBOX_UPLOADS).asString(); this->path_contents = new char[MAX_SIZE_PATH]; strcpy(this->path_contents, attr.c_str()); this->path_uploads = PATH_VBOX_UPLOADS; }else{ throw ServiceException("Invalid client!"); } } void ServiceWindowGenerationFromText::setPathLibras() { char* final_path = new char[MAX_SIZE_PATH]; strcpy(final_path, this->path_uploads); strcat(final_path, this->user_id); strcat(final_path, "/video_libras.ts"); this->path_libras = final_path; } // void ServiceWindowGenerationFromText::setBackground() { // if(this->transparency == 0) { //pega dicionario com BackGround opaco // char* dicPath; // dicPath = getenv("DIC_LIBRAS"); // if(dicPath != NULL) // sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); // else // sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); // } else if(this->transparency == 1) { //pega dicionario com BackGround transparente // char* dicTPath; // dicTPath = getenv("DICTRANSP_LIBRAS"); // if(dicTPath != NULL) // sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); // else{ // sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); // } // } // } void ServiceWindowGenerationFromText::setSizeOfSubtitles(int sub_size) { numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas){ sendGlosa(END_NOTIFICATION); waitVideoGeneration(); //sincronizador->stop(); } } void ServiceWindowGenerationFromText::notifyTranslator(unsigned char* text) { tradutor->traduz(text); } void ServiceWindowGenerationFromText::notifyLine(unsigned char* line) { notifyTranslator(line); } // void ServiceWindowGenerationFromText::notifyEndOfSynchronization() { // transcodeVideoToMp4(); // this->running = false; // } void ServiceWindowGenerationFromText::notifyTranslation(vector * glosas) { for (int i = 0; i < glosas->size(); i++) { locale loc; string glosa_lower = ""; for (int k = 0; k < glosas->at(i).length(); k++){ glosa_lower += std::tolower(glosas->at(i).at(k), loc); } sendGlosa(glosa_lower); //sincronizador->recebeglosa(glosa_lower, 1000); } legendas_enviadas++; } void ServiceWindowGenerationFromText::notifyEnd(int line_size) { DPRINTF("Service Text recebeu: %d linhas.\n", line_size); setSizeOfSubtitles(line_size); } bool ServiceWindowGenerationFromText::isRunning() { return this->running; } bool ServiceWindowGenerationFromText::isFinished() { return this->finish; } void ServiceWindowGenerationFromText::initialize() { DPRINTF("Service Text Initialize.\n"); extratorTXT = (ExtratorTXT*) extrator_factory->getExtrator(Extrator::TXT); extratorTXT->addListener(this); extratorTXT->setFilePath(path_input); setPathLibras(); tradutor->addListener(this); connectToUnity(); //setBackground(); // uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro // sincronizador->setPCRBase(pcr_base); // sincronizador->addListener(this); // sincronizador->Start(); try{ extratorTXT->initialize(); }catch(ExtratorException ex){ throw ServiceException(ex.getMessage()); } this->Start(); } void ServiceWindowGenerationFromText::sendGlosa(string glosa) { char* glosa_buffer = new char[strlen(glosa.c_str())+1]; strcpy(glosa_buffer, glosa.c_str()); int tamanho = strlen(glosa_buffer)+1; //cout << "Enviando glosa: " << glosa_buffer << endl; core_socket->write(glosa_buffer, tamanho); delete [] glosa_buffer; char* ok_core = new char[3]; core_socket->read(ok_core, 3); //aguarda o unity confirmar o recebimento da glosa //cout << "Recebi: " << ok_core << endl; delete [] ok_core; } void ServiceWindowGenerationFromText::connectToUnity() { core_socket = new StreamSocket(); try{ static InetAddress* addr = InetAddress::createByName(HOST); core_socket->connect(addr, PORTNO); }catch(UnknownHostException ex){ throw ServiceException(ex.getMessage()); }catch(SocketException ex){ throw ServiceException(ex.getMessage()); } } void ServiceWindowGenerationFromText::waitVideoGeneration() { char* endgeneration = new char[strlen(END_NOTIFICATION) + 1]; try{ do{ core_socket->read(endgeneration, sizeof(endgeneration)); //usleep(500000); }while(strcmp(endgeneration, END_NOTIFICATION) != 0); core_socket->close(); this->running = false; }catch(IOException ex){ throw ServiceException(ex.getMessage()); } } void ServiceWindowGenerationFromText::transcodeVideoToMp4(){ DPRINTF("[AGUARDE] Transcodificando o vĂ­deo de Libras...\n"); string command = "ffmpeg -i "; command.append(path_libras) .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ") .append(path_contents).append(user_id).append(".mp4"); //printf("[INFO]: Transcodification command -> %s\n", command.c_str()); system(command.c_str()); } void ServiceWindowGenerationFromText::Run(){ while(isRunning()){ usleep(200000); } finish = true; }