packet.cpp 3.03 KB
/* Modificado por: @Felipe Lacet
 * Ultima Atualização: 08/10/2008
 *
 * Packet.cpp
 * 
 */
#include "bitutil_hal.h"
#include "packet.h"
//#include "dprintf.h"
#include <iostream>
int TS_PACKET_SIZE = 188;

//static int payloadIndex;
using namespace std;

Packet::Packet(unsigned char* packet) {

    this->packet = packet;

}

Packet::~Packet() {
};

unsigned char* Packet::getPayloadBeginingAtUnitStarted() {

    int payloadIndex = 4 + (hasAdaptationField() ? 1 : 0) + getAdaptationFieldLength();
    return (&packet[payloadIndex]);

}

BOOL Packet::hasPointerField() {
    return ( getBitAt(packet, 9));
}

BOOL Packet::hasPayload() {
    unsigned int adaptationFieldControl = getByteAtBits(packet, 26, 2);

    if ((adaptationFieldControl == 0x1) || (adaptationFieldControl == 0x3)) {
        return (1);
    } else {
        return (0);
    }
}

U8 Packet::getPayloadLength() {
    if (!hasPayload()) {
        return (0);
    } else {
        return (TS_PACKET_SIZE - (hasAdaptationField() ? 1 : 0) - getAdaptationFieldLength() - 4);
    }
}

unsigned char* Packet::getPayloadCopy() {
    int payloadIndex = 4 + (hasAdaptationField() ? 1 : 0) + getAdaptationFieldLength();

    if (hasPayload()) {
        int size = getPayloadLength();

        /*unsigned char * payload =(unsigned char *) malloc(sizeof(unsigned char)*size);*/
        return (&packet[payloadIndex]);

        /*memcpy(payload, &packet[payloadIndex], size);*/
        /*return payload;*/
        /*return &packet[payloadIndex];*/
    } else {
        return (NULL);
    }
}

U8 Packet::getPayloadBeginingAtUnitStartedLength() {
    int payloadIndex = 4 + (hasAdaptationField() ? 1 : 0) + getAdaptationFieldLength();
    return TS_PACKET_SIZE - payloadIndex - 1;
}

U8 Packet::getPointerField() {
    int payloadIndex = 4 + (hasAdaptationField() ? 1 : 0) + getAdaptationFieldLength();

    if (hasPointerField()) {
        unsigned char pf = getByteAt(packet, payloadIndex);
        //cout << "Poiter Field: " << pf << endl;
        //printf("Poiter Field: %x\n", pf);
        return ( getByteAt(packet, payloadIndex));
    } else {
        return (0);
    }
}

U16 Packet::getPid() {
    return ( getIntAtBits(packet, 11, 13));
}

U8 Packet::getAdaptationFieldLength() {
    if (hasAdaptationField()) {
        return ( getByteAt(packet, 4));
    } else {
        return (0);
    }
}

unsigned int Packet::getContinuityCounter() {
    return ( getIntAtBits(packet, 28, 4));
}

BOOL Packet::hasAdaptationField() {
    unsigned int adaptationFieldControl = getByteAtBits(packet, 26, 2);

    if ((adaptationFieldControl == 0x2) || (adaptationFieldControl == 0x3)) {
        return TRUE;
    } else {
        return FALSE;
    }
}

BOOL Packet::parser() {
    //		DPRINTF("PACOTE %X\n",packet[0]);
    if (getByteAt(packet, 0) != 0x47) {
        //      DPRINTF("NAO PACOTE");
        return FALSE;
    }

    if (getBitAt(packet, 8)) {
        //      DPRINTF("NAO PACOTE 2");

        return FALSE;
    }
    //      payloadIndex = 4 + (hasAdaptationField(packet) ? 1 : 0) + getAdaptationFieldLength(packet);
    return TRUE;
}