/* 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; } */