#include "serviceWindowGenerationFromRec.h" ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec( char* pathVideo, int pos, int size, int transp, char* id, char* client, int serviceType, char* rate){ this->path_input = pathVideo; this->position = pos; this->size = size; this->transparency = transp; this->user_id = id; this->client_type = client; this->service_type = serviceType; numero_legendas = INT_MAX; legendas_enviadas = 0; vetor_pts = new vector(); rec = new Recognize(pathVideo, id, rate); tradutor = new TradutorPortGlosa(); running = true; finish = false; DPRINTF("Done!\n"); } ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec( char* pathVideo, int pos, int size, int transp, char* id, char* client, int serviceType){ this->path_input = pathVideo; this->position = pos; this->size = size; this->transparency = transp; this->user_id = id; this->client_type = client; this->service_type = serviceType; numero_legendas = INT_MAX; legendas_enviadas = 0; vetor_pts = new vector(); rec = new Recognize(path_input, id); tradutor = new TradutorPortGlosa(); try{ setPathContents(); }catch(RuntimeException ex){ throw ServiceException(ex.getMessage()); } running = true; finish = false; DPRINTF("Done!\n"); } ServiceWindowGenerationFromRec::~ServiceWindowGenerationFromRec(){ free(vetor_pts); if (tradutor) delete tradutor; if (renderer) delete renderer; if (rec) delete rec; if (mixer) delete mixer; DDDPRINTF("Service Rec finished!\n"); } void ServiceWindowGenerationFromRec::setPathContents(){ if(strcmp(client_type,DEVELOPER) == 0){ this->path_contents = PATH_DEVEL_CONTENTS; this->path_uploads = PATH_DEVEL_UPLOADS; rec->setPathAudioContents(path_uploads); }else if(strcmp(client_type, PRODUCTION) == 0){ ifstream conf_file(PATH_CONF_FILE, ifstream::binary); parsingSuccessful = reader.parse(conf_file, root); if(!parsingSuccessful){ conf_file.close(); throw ServiceException("Fail to parsing param.json"); } string attr = "vlibras_user/"; 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; rec->setPathAudioContents(path_uploads); conf_file.close(); }else{ throw ServiceException("Invalid client!"); } } void ServiceWindowGenerationFromRec::setPathLibras() { string final_path = ""; path_libras = new char[MAX_SIZE_PATH]; if(this->service_type == SERVICE_TYPE_REC) final_path.append(this->path_uploads).append("/").append(this->user_id); else final_path.append(this->path_contents); final_path.append("/").append(this->user_id).append(".mp4"); strcpy(this->path_libras, final_path.c_str()); } void ServiceWindowGenerationFromRec::setSizeOfSubtitles(int sub_size){ numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas){ try{ renderer->finalize(); }catch(lavidlib::RuntimeException &ex){ throw ServiceException(ex.getMessage().c_str()); } } } void ServiceWindowGenerationFromRec::addPTS(int64_t pts){ vetor_pts->push_back(pts); } void ServiceWindowGenerationFromRec::notifyTranslator(unsigned char* text){ tradutor->traduz(text); } //Metodo utilizado pelo reconhecedor para avisar sobre novas sentenças reconhecidas void ServiceWindowGenerationFromRec::notifyTextRecognized(unsigned char* text, int64_t pts){ addPTS(pts); notifyTranslator(text); } void ServiceWindowGenerationFromRec::notifyTranslation(char* glosa) { string sGlosa(reinterpret_cast(glosa)); while(renderer->isSending()) usleep(10000); try{ renderer->receiveGlosa(sGlosa, vetor_pts->front()); legendas_enviadas++; }catch(lavidlib::RuntimeException &ex){ throw ServiceException(ex.getMessage().c_str()); } vetor_pts->erase(vetor_pts->begin()); } void ServiceWindowGenerationFromRec::notifyEndOfRenderization() { mixer = new Mixer(); if(this->service_type == SERVICE_TYPE_REC){ mixer->initialize(this->path_input, this->path_libras, this->position, this->size, this->transparency, this->user_id, this->path_uploads, this->path_contents); } running = false; } void ServiceWindowGenerationFromRec::notifyEnd(int sentences_size){ DPRINTF("Service REC recebeu: %d sentenças.\n", sentences_size); setSizeOfSubtitles(sentences_size); } bool ServiceWindowGenerationFromRec::isRunning(){ return this->running; } bool ServiceWindowGenerationFromRec::isFinished(){ return this->finish; } void ServiceWindowGenerationFromRec::initialize(){ DPRINTF("Service REC Initialize.\n"); setPathLibras(); rec->addListener(this); tradutor->addListener(this); renderer = new Renderer(this->path_libras ,this->user_id); renderer->addListener(this); try{ renderer->Start(); rec->initialize(); } catch(RecognizeException ex){ throw ServiceException(ex.getMessage()); } catch(RuntimeException &ex){ throw ServiceException(ex.getMessage().c_str()); } this->Start(); } void ServiceWindowGenerationFromRec::Run(){ while(isRunning()){ usleep(200000); } finish = true; }