codificadormanager.cpp 4.43 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <iostream>

#include "codificadormanager.h"

#include "librasdatamessage.h"
#include "librascontrolmessage.h"
#include "librassection.h"
#include "tspacket.h"
#include "jdatagramsocket.h"

using namespace std;
using namespace jsocket;

namespace Codificador {

    CodificadorManager* CodificadorManager::ccmanager = 0;

    CodificadorManager::CodificadorManager() {
        cc = 0;
        packets = new unsigned char[70000];
        //pid = 0x63;
        version_number = 1;
    }

    CodificadorManager* CodificadorManager::getInstance() {
        if (ccmanager == NULL)
            ccmanager = new CodificadorManager();
        return ccmanager;
    }

    CodificadorManager::~CodificadorManager() {
        printf("Deletando ccManager1... \n");
        if (packets) {
            delete []packets;
            packets = NULL;
        }

        printf("Deletando ccManager2... \n");
        ccmanager == NULL;
    }

    int CodificadorManager::getPid() {
        return this->pid;
    }

    void CodificadorManager::setPid(int pid) {
        this->pid = pid;
    }

    void CodificadorManager::setResolution(string resolution) {
        this->resolution = resolution;
    }

    void CodificadorManager::setDictionaryVersion(int dictionaryversion) {
        this->dictionaryversion = dictionaryversion;
    }

    void CodificadorManager::setDPH(int dph) {
        this->dph = dph;
    }

    void CodificadorManager::setDPV(int dpv) {
        this->dpv = dpv;
    }

    void CodificadorManager::setDFW(int dfw) {
        this->dfw = dfw;
    }

    void CodificadorManager::setDFH(int dfh) {
        this->dfh = dfh;
    }

    void CodificadorManager::setPortaOut(int porta) {
        this->portaOut = porta;
    }

    void CodificadorManager::setIp(string ip) {
        this->ip = ip;
    }

    unsigned char *CodificadorManager::generateSection(unsigned int type, unsigned char *msg, int n, int *numPackets) {
        unsigned short len;
        unsigned char *pesBytes;
        LibrasSection *librSection = NULL;

        if (type == LibrasDataMessage::LIBRAS_DATA_TYPE) {
            if(version_number == 32)
                version_number = 1;
            
            LibrasDataMessage *librData = new LibrasDataMessage((unsigned char *) msg, (unsigned short) n);

            librSection = new LibrasSection(librData, type, version_number);

            pesBytes = librSection->generateBytes(&len);

            *numPackets = generateTsPacket(packets, pid, pesBytes);
            

            delete librData;
        } else if (type == LibrasControlMessage::LIBRAS_MGM_TYPE) {
            if(version_number == 32)
                version_number = 1;
            
            LibrasControlMessage *librctrMess = new LibrasControlMessage();
            librctrMess->setResolution(resolution);
            librctrMess->setDictionaryVersion((unsigned char)dictionaryversion);
            librctrMess->setDPH((unsigned short)dph);
            librctrMess->setDPV((unsigned short)dpv);
            librctrMess->setDFH((unsigned short)dfh);
            librctrMess->setDFW((unsigned short)dfw);

            librSection = new LibrasSection(librctrMess, type, version_number);

            pesBytes = librSection->generateBytes(&len);

            /*printf("PES Packet... \n");
            for (int j = 0; j < len; j++){
                    printf("%x ", pesBytes[j]);
            }
            printf("\n");*/

            *numPackets = generateTsPacket(packets, pid, pesBytes);

            delete librctrMess;
        } else {
            return NULL;
        }
        version_number++;

        delete []pesBytes;
        delete librSection;
        return packets;
    }

    int CodificadorManager::sendToOutput(unsigned char *pes, int numPackets) {
        //ip do MUX

        unsigned char *pack;
        pack = (unsigned char*) malloc (188);
        create_ts_null_packet(pack);

        for (int i = 1; i < 7; i++) {
            memcpy(pes + (i * 188), pack, 188);
        }

        DatagramSocket * w_socket = NULL;

        try {
            w_socket = new DatagramSocket(ip, portaOut);

        } catch (...) {
            printf("\nERRO ao abrir o socket.\n");
            return 1;
        }
        
        //for (int i = 0; i < numPackets; i++)
            //w_socket->Send((char *) pes + (i * 188), 188);
        w_socket->Send((char *) pes, 1316);

        w_socket->Close();
        delete w_socket;

        return 0;


    }
}