/*
Libre Media Server - A Media Server Sotfware for stage and performing
Copyright (C) 2012-2013 Santiago Noreña puremediaserver@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "PacketCreator.h"
//#include "PureMediaServer.h"
//#include "MediaServer.h"
#include "CITPDefines.h"
#include "MSEXDefines.h"
#include
#include
#include
#include
PacketCreator::PacketCreator(QObject *parent)
: QObject(parent)
{
}
PacketCreator::~PacketCreator()
{
}
unsigned char * PacketCreator::createPLocPacket(
const QString &name,
const QString &state,
int &bufferLen)
{
qDebug() << "createPLOC" << name << state;
QString plocType = "MediaServer";
// figure out the packet size, all strings need to be NULL terminated
bufferLen = sizeof(struct CITP_PINF_PLoc) + plocType.size() + 1 + name.size() + 1 + state.size() + 1;
unsigned char *buffer = new unsigned char[bufferLen];
memset(buffer, 0, bufferLen);
CITP_PINF_PLoc *packet = (CITP_PINF_PLoc*)buffer;
// CITP header
packet->CITPPINFHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPPINFHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPPINFHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPPINFHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPPINFHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPPINFHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPPINFHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPPINFHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPPINFHeader.CITPHeader.ContentType = COOKIE_PINF;
// PINF header
packet->CITPPINFHeader.ContentType = COOKIE_PINF_PLOC;
// PLoc data
packet->ListeningTCPPort = LISTENTCPPORT;
// type
int offset = sizeof(struct CITP_PINF_PLoc);
memcpy(buffer + offset, plocType.toAscii().constData(), plocType.size());
// name
offset += plocType.size() + 1;
memcpy(buffer + offset, name.toAscii().constData(), name.size());
// state
offset += name.size() + 1;
memcpy(buffer + offset, state.toAscii().constData(), state.size());
return buffer;
}
// Paquetes MSEX
unsigned char * PacketCreator::createSINFPacket(int &bufferLen)
{
// figure out the packet size
QString name = NAME;
bufferLen = 2*name.size() + 3 + sizeof(struct CITP_MSEX_10_SINF);
// create the buffer
unsigned char *buffer = new unsigned char[bufferLen];
memset(buffer, 0, bufferLen);
CITP_MSEX_10_SINF *packet = (CITP_MSEX_10_SINF *)buffer;
// CITP header
packet->CITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_SINF;
// SInf content
int offset = sizeof(struct CITP_MSEX_Header);
const ushort * namei = name.utf16();
memcpy((buffer+offset), namei, 2*(name.size()));
offset = offset + 2*name.size() +2;
memset ((buffer+offset), 0x01,1);
offset++;
memset((buffer+offset), 0x00, 3);
return buffer;
}
unsigned char * PacketCreator::createLSTAPacket(layerList layerp,int &bufferLen)
{
// figure out the packet size
const quint8 layerCount = layerp.size();
int layerslen = 0;
LayerStatus layeri;
for (int i=0; iCITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00;
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_LSTA;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
//LSTA
packet->LayerCount = layerCount;
// Convertimos las estructuras a unsigned char
unsigned char * buffer2 = new unsigned char[layerslen];
LayerStatus packet2;
for (int i=0; i medialib, int&bufferLen)
{
// Vemos el tamaño total de la estructurta
MediaLibrary mediai;
int medialen = 0;
int size = 0;
int i;
for (i=0; iCITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_ELIN;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
// ELin Content
packet->LibraryType = 0x01;
packet->LibraryCount = medialib.size();
// Element Library Information
unsigned char *buffer2 = new unsigned char[medialen];
for (i=0; i mediainflist = mediai.m_MediaInformation;
MediaInformation mediainf;
int medialen = 0;
int size = 0;
int i;
for (i=0; iCITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_MEIN;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
// MEIn Header
packet->LibraryId = mediai.m_Id;
packet->ElementCount = mediainflist.size();
// MEIn Data
unsigned char * buffer2 = new unsigned char[medialen];
for (i=0; i elementnumber){
fileInfo = filelist.at(elementnumber);
}
else {
return NULL;
}
QFile file(fileInfo.filePath());
if (!file.open(QIODevice::ReadOnly)){
qDebug() << "Cannot open the file"<CITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// Mandamos el paquete
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_ETHN;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
//ETHN Content
packet->LibraryType = 0x01;
packet->LibraryId = medialib.m_Id;
packet->ElementNumber = elementnumber;
packet->ThumbnailFormat = 0x4745504A; // JPEG
packet->ThumbnailWidth = 60;
packet->ThumbnailHeight = 46;
packet->ThumbnailBufferSize = file.size();
// Thumbnail
int offset = sizeof(struct CITP_MSEX_10_ETHN);
memcpy((buffer+offset), bufferthumb, file.size());
file.close();
return buffer;
}
unsigned char * PacketCreator::createNACKPacket(quint32 cookie, int &bufferLen)
{
bufferLen = sizeof(struct CITP_MSEX_Nack);
unsigned char *buffer = new unsigned char[bufferLen];
memset(buffer, 0, bufferLen);
CITP_MSEX_Nack *packet;
packet = (CITP_MSEX_Nack *)buffer;
packet->ReceivedContentType = cookie;
return buffer;
}
// Video Stream
const char * PacketCreator::createVSRCPacket(int &bufferLen)
{
QString name("Output 1");
bufferLen = sizeof(struct CITP_MSEX_VSRC) + 2*name.size() + 10;
// create the buffer
char *buffer = new char[bufferLen];
memset(buffer, 0, bufferLen);
CITP_MSEX_VSRC *packet = (CITP_MSEX_VSRC *)buffer;
// CITP header
packet->CITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLen;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_VSRC;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
packet->SourceCount = 0x01;
// VSRC Information
packet->SourceIdentifier = 0x01;
int offset = sizeof(struct CITP_MSEX_VSRC);
const ushort * namei = name.utf16();
memcpy((buffer+offset), namei, 2*(name.size()));
offset = offset + 2*name.size() +2;
QByteArray post;
post[0] = 0xFF; // Physical Ouput uint8
post[1] = 0xFF; // Layer Number uint8
post[2] = 0x00; // Flags uint16
post[3] = 0x00;
post[4] = 0x00; // Width uint16
post[5] = 0x40;
post[6] = 0x00; // Height uint16
post[7] = 0x2E;
memcpy((buffer+offset), post, post.size());
return buffer;
}
/* This will be the send frme for CITP/MSEx 1.1 in the CITP Socket. 1.0 uses the TCP Socket in msex class
const char * PacketCreator::createFrame(uchar *frame, int &bufferLen)
{
int bufferLenTot = sizeof(struct CITP_MSEX_10_StFr ) + bufferLen;
char * buffer = new char[bufferLen];
memset(buffer, 0, bufferLen);
CITP_MSEX_10_StFr *packet = (CITP_MSEX_10_StFr *)buffer;
// CITP header
packet->CITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLenTot;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_STFR;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
//STFR Content
packet->FrameBufferSize = bufferLen;
packet->FrameFormat = 943867730;
packet->FrameHeight = 64;
packet->FrameWidth = 88;
packet->SourceIdentifier = 0x0001;
// Copiamos los datos del thumbnail
int offset = sizeof(struct CITP_MSEX_10_StFr);
memcpy((buffer+offset), frame, bufferLen);
bufferLen = bufferLenTot;
return buffer;
}
*/