#include "serviceWindowGeneration.h" #define VIDEO_POSE_NEUTRA "poseneutra" #define BASEDIR "../dicionario_libras/" #define BASEDIRTRANSP "../dicionarioTransp_libras/" #define EXTENSAO_DICIONARIO ".ts" #define PTS_DEFAULT = 1000 int contt = 0; ServiceWindowGeneration::ServiceWindowGeneration() { char op2 = this->getRunningOption(); if (op2 != '3') { tradutor = new TradutorPortGlosa(); } vetor_pts = new vector(); mixer = new Mixer(); numero_legendas = INT_MAX; legendas_enviadas = 0; this->running = true; serviceType = 0; DPRINTF("Done!\n"); } ServiceWindowGeneration::~ServiceWindowGeneration() { /**free(vetor_pts); free(path_input); free(path_libras); if (tradutor) delete tradutor; if (sincronizador) delete sincronizador; if (mixer) delete mixer; if (monitor_pcr_base) delete monitor_pcr_base;**/ DDDPRINTF("Service finalized!\n"); } void ServiceWindowGeneration::adicionaPTS(int64_t pts) { vetor_pts->push_back(pts); } /* Checado pela subclasse para saber quando o sincronizador terminar. */ bool ServiceWindowGeneration::isRunning() { return this->running; } /* Quando o sincronizador termina, ele invoca esse método para avisar! */ void ServiceWindowGeneration::finalizouSincronizacao() { //printf("Alguem chamou finalizouSincronizacao!\n"); char op = this->getRunningOption(); if (op != '2' && serviceType != SERVICE_TYPE_TEXT && serviceType!= SERVICE_TYPE_SRT_ONLY) { mixer->initialize(this->path_input, this->path_libras,this->position,this->size,this->transparency); } this->running = false; //printf("\nFinalizando a mixagem...\n\n"); } char ServiceWindowGeneration::getRunningOption() { //TODO CORRIGIR problema abaixo /*Quando é executado direto da interface do GTAAAS_WEB, ela perde o caminho relativo e não encontra o arquivo runningoption.xml*/ int file_d = open("../gtaaas/data/runningoption.xml", O_RDONLY); char option; int cont = read(file_d, &option, 1); close(file_d); return option; //return '3'; } void ServiceWindowGeneration::setSizeOfSubtitles(int sub_size) { numero_legendas = sub_size; if (legendas_enviadas >= numero_legendas) { //DPRINTF("Enviando sinalização para o sincronizador... os serviços foram concluídos!\n"); sincronizador->stop(); } } void ServiceWindowGeneration::setPathLibras(char* _path_libras) { this->path_libras = _path_libras; DDPRINTF("Path TS File: %s\n", _path_libras); } void ServiceWindowGeneration::initialize() { this->finish = false; char opt = getRunningOption(); if (opt != '3' && this->sublanguage == 1) { //printf("No ServiceWindowGeneration::initialize(), se registrou como ouvinte do Tradutor\n"); tradutor->registraOuvinte(this); } // o path do arquivo só poderá conter um "."(ponto), esse identifica a extensão. vector tokens; /* Se for texto não é necessário vídeo de entrada (path_input) */ if (serviceType != SERVICE_TYPE_TEXT && serviceType != SERVICE_TYPE_SRT_ONLY && serviceType != SERVICE_TYPE_REC_ONLY_LIBRAS) { //printf("No ServiceWindowGeneration::initialize(), iniciou o serviceType = %d\n",serviceType); char * pathtmp = this->path_input; int size = strlen(pathtmp); char vtemp [size]; strcpy(vtemp, pathtmp); pathtmp = strtok(vtemp, "."); while (pathtmp != NULL) { tokens.push_back(string(pathtmp)); pathtmp = strtok(NULL, "."); } string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO; this->path_libras = new char[buildstrpath.size()]; strcpy(this->path_libras, buildstrpath.c_str()); //printf("O ServiceWGeneration montou o seguinte path para o vídeo de Libras: %s\n", path_libras); } else { tradutor->registraOuvinte(this); } if(this->transparency == 0) { //pega dicionario com BackGround opaco sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency); } else { if(this->transparency == 1) { //pega dicionario com BackGround transparente sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras,this->transparency); } } /* Se for SERVICE_TYPE_REC (Recognized) não é necessário usar o monitor_pcr_base */ if (serviceType == SERVICE_TYPE_CC || serviceType == SERVICE_TYPE_SRT) { char* extensao = (char*) tokens[1].c_str(); this->monitor_pcr_base->extvideo = new char[strlen(extensao)]; strcpy(this->monitor_pcr_base->extvideo, extensao); monitor_pcr_base->addListenerPCRBase(sincronizador); } else { uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro sincronizador->setPCRBase(pcr_base); if (serviceType == SERVICE_TYPE_SRT_ONLY) { monitor_pcr_base->addListenerPCRBase(sincronizador); } } sincronizador->registraOuvinte(this); sincronizador->Start(); } char* ServiceWindowGeneration::getPathLibras() { return path_libras; } /* Método utilizado pelo Tradutor para notificar o texto traduzido. */ void ServiceWindowGeneration::codifica(vector * glosas) { legendas_enviadas++; if (serviceType != SERVICE_TYPE_TEXT) { for (int i = 0; i < glosas->size(); i++) { std::locale loc; std::string glosa_lower = ""; for (int k = 0; k < glosas->at(i).length(); k++) glosa_lower += std::tolower(glosas->at(i).at(k), loc); //cout << "__Glosa [" << i << "] = " << glosa_lower << endl; int64_t pts_notificado = vetor_pts->front(); sincronizador->recebeglosa(glosa_lower, pts_notificado); } /* O 'numero_legendas' é informado pela subclasse através do método setSizeOfSubtitles. Então, inicialmente, seu valor corresponde a um número inteiro máximo. */ /*printf("numero_legendas = %d\nlegendas_enviadas = %d\n", numero_legendas, legendas_enviadas); if (legendas_enviadas >= numero_legendas) { sincronizador->stop(); }*/ vetor_pts->erase(vetor_pts->begin()); } else { //Nova versão! for (int i = 0; i < glosas->size(); i++) { std::locale loc; std::string glosa_lower = ""; for (int k = 0; k < glosas->at(i).length(); k++) glosa_lower += std::tolower(glosas->at(i).at(k), loc); //cout << "__Glosa [" << i << "] = " << glosa_lower << endl; sincronizador->recebeglosa(glosa_lower, 1000); } sincronizador->stop(); //FIXME: especificar um PTS default /*printf("Service processando glosas para o ServiceFromText...\n"); int pts_notificado = 100; for (int i = 0; i < glosas->size(); i++) { cout << "__Glosa [" << i << "] = " << glosas->at(i) << endl; string glosa_bytes = glosas->at(i); sincronizador->recebeglosa(glosa_bytes, pts_notificado); } sincronizador->recebeglosa(VIDEO_POSE_NEUTRA, pts_notificado); */ } } void ServiceWindowGeneration::stopServiceText() { sincronizador->hasText(false); } void ServiceWindowGeneration::setServiceType(int type) { serviceType = type; } bool ServiceWindowGeneration::mustFinish(){ return this->finish; } TradutorPortGlosa* ServiceWindowGeneration::getTradutor() { return this->tradutor; } void ServiceWindowGeneration::setSize(int size){ this->size = size; } void ServiceWindowGeneration::setPosition(int position){ this->position = position; } void ServiceWindowGeneration::setTransparency(int transparency){ this->transparency = transparency; } void ServiceWindowGeneration::setSubLanguage(int sublang){ this->sublanguage = sublang; }