serviceWindowGenerationFromSRT.cpp 4.98 KB
#include "serviceWindowGenerationFromSRT.h"
#include "dprintf.h"

#define PATH_LIBRAS "libras/video/"

using namespace std;

ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(
			char* path_video, char* path_srt, int sublanguage, int position, int size, int transparency, int _serviceType) {
    DPRINTF("Done!\n");
	setPathInput(path_video, path_srt);
    setPosition(position);
    setSize(size);
    setTransparency(transparency);
    setSubLanguage(sublanguage);
	setServiceType(_serviceType);
    //numero_legendas = 0;
    this->finish = false;
    //initialize();

}

/* Eduardo */
ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* path_srt, char* _video_path_file, int transparency, int _serviceType){    
    DPRINTF("Done!\n");
	setPathInput(path_srt);
	setTransparency(transparency);
	setServiceType(_serviceType);

	string new_path_libras = PATH_LIBRAS;
	new_path_libras.append((string) _video_path_file).append(".ts");
	char* pathl = new char[strlen(new_path_libras.c_str()) + 1];
	strcpy(pathl, (char*)new_path_libras.c_str());
	setPathLibras(pathl);
	finish_srt = false;
}

ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() {
	    DDDPRINTF("Service SRT finalized!\n");
}

void ServiceWindowGenerationFromSRT::setPathInput(char* path_video, char* path_srt) {
    this->path_input = path_video;
    this->path_srt = path_srt;
}

void ServiceWindowGenerationFromSRT::setPathInput(char* path_srt){
    this->path_srt = path_srt;
}


void ServiceWindowGenerationFromSRT::notifyEnd(int sub_size) {
    DDPRINTF("Service SRT recebeu: %d legendas.\n", sub_size);
    setSizeOfSubtitles(sub_size);
    //finalizouSincronizacao();
}


void ServiceWindowGenerationFromSRT::notifySubtitle(unsigned char *legenda, int64_t pts){
    //printf("Service from SRT received the subtitle: %s\n", legenda);
    char op = this->getRunningOption();
    if (op == '3') {
        notificaSincronizadorSemTradutor(legenda, pts);
    } else {	
        adicionaPTS(pts);
        notificaTradutor(legenda);
    }
}


void ServiceWindowGenerationFromSRT::notificaSincronizadorSemTradutor(unsigned char * legenda, int64_t pts) {
    
    char* pch = strtok((char*) legenda, " ");

    while (pch != NULL) {
        string pch_string = (string) pch;
        sincronizador->recebeglosa(pch_string, pts);
        printf("%s\n", pch);
        pch = strtok(NULL, " ");
    }

}

void ServiceWindowGenerationFromSRT::notificaTradutor(unsigned char* legenda) {

    const char* constchar = (const char*) legenda;
    char* legenda_copy = new char[strlen(constchar)+1];
    strcpy(legenda_copy, constchar);
    //printf("ServiceFromSRT notifying Tradutor: text = %s\n", legenda_copy);
    tradutor->traduz((unsigned char*) legenda_copy);

}

void ServiceWindowGenerationFromSRT::initialize() {

    DDPRINTF("Service SRT Initialize.\n");
    //printf("*1-path_libras: %s\n", this->path_libras);
    
    if(serviceType == 2){

        /*
            Este serviço utiliza o arquivo de vídeo (em formato TS) do usuário para
            capturar as informações referente ao relógio (PCR) para calcular as
            etiquetas de apresentação (PTS) dos sinais em Libras.
        */

	    inputfile = new InputFile(this->path_input);	    
	    extratorSRT = new ExtratorSRT();	    
	    monitor_pcr_base = new MonitorPCR();

	    monitor_pcr_base->addListenerPCRBase(extratorSRT);
		
	    inputfile->registraOuvinte(monitor_pcr_base);
	    extratorSRT->addListener(this);

        //printf("ServiceSRT::initialize() enviando o caminho do arquivo: %s\n", path_srt);
	    extratorSRT->setFilePath((char*) path_srt);
	    
	    ServiceWindowGeneration::initialize();
	    
	    extratorSRT->initialize();
        extratorSRT->Start();
	    
	    this->inputfile->initialize();
	    this->Start();

    } else if(serviceType == 5) {

        /**
            Este serviço utiliza apenas o arquivo de legendas (SRT) como entrada,
            portanto, não é preciso monitorar as informações do PCR a partir do
            objeto InputFile().
        */
	    
	    extratorSRT = new ExtratorSRT();	    
	    monitor_pcr_base = new MonitorPCR();
	    monitor_pcr_base->addListenerPCRBase(extratorSRT);		
	    extratorSRT->addListener(this);
	    extratorSRT->setFilePath((char*) path_srt);
	    
	    ServiceWindowGeneration::initialize();

        //FIXME: adicionar um PCR base!
	    uint64_t pcr_base = (uint64_t) 1000; 

	    extratorSRT->notifyPCRBase(pcr_base);
	    extratorSRT->Start();
    	
    }

}

bool ServiceWindowGenerationFromSRT::finished() {
    return finish_srt;
}

void ServiceWindowGenerationFromSRT::Run() {
    //while (true) {
    while (isRunning()) {
        //if (extratorSRT->isFinished()) {
        //    finish = true;            
        //    if (getRunningOption() == '3' || serviceType == 5) {
                //sincronizador->encerrouLegendas();
	//	break;
        //    }
        //}
        usleep(200000); //200ms
    }
    finish_srt = true;
    //sincronizador->encerrouLegendas();
    DDDPRINTF("Service STR finalized!\n");
}