Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members
PacketizationLayer.cpp
00001 /*********************************************************************** 00002 * * 00003 * ViTooKi * 00004 * * 00005 * title: PacketizationLayer.cpp * 00006 * * 00007 * * 00008 * * 00009 * ITEC institute of the University of Klagenfurt (Austria) * 00010 * http://www.itec.uni-klu.ac.at * 00011 * * 00012 * * 00013 * For more information visit the ViTooKi homepage: * 00014 * http://ViTooKi.sourceforge.net * 00015 * vitooki-user@lists.sourceforge.net * 00016 * vitooki-devel@lists.sourceforge.net * 00017 * * 00018 * This file is part of ViTooKi, a free video toolkit. * 00019 * ViTooKi is free software; you can redistribute it and/or * 00020 * modify it under the terms of the GNU General Public License * 00021 * as published by the Free Software Foundation; either version 2 * 00022 * of the License, or (at your option) any later version. * 00023 * * 00024 * This program is distributed in the hope that it will be useful, * 00025 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00027 * GNU General Public License for more details. * 00028 * * 00029 * You should have received a copy of the GNU General Public License * 00030 * along with this program; if not, write to the Free Software * 00031 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * 00032 * MA 02111-1307, USA. * 00033 * * 00034 ***********************************************************************/ 00035 00036 /*********************************************************************** 00037 * * 00038 * REVISION HISTORY: * 00039 * * 00040 * * 00041 * * 00042 ***********************************************************************/ 00043 00044 #include "PacketizationLayer.hpp" 00045 00046 PacketizationLayer::PacketizationLayer():packetSeqNumber(0) { 00047 } 00048 00049 00050 PacketizationLayer::~PacketizationLayer() { 00051 } 00052 00053 00054 SLPacket * PacketizationLayer::createSLPacket(u8 * payload, size_t size, bool unused1, u32 unused2) { 00055 return new SLPacket(SLPacketHeader(packetSeqNumber++), payload, size); 00056 }; 00057 00058 00060 SLPacketList PacketizationLayer::createSLPacketList(AU * au) { 00061 SLPacketList slpl; 00062 // copied and adapted from MOH 00063 u32 unitSize = au->size; 00064 /*frag_offset is RFC2250 specific info 00065 * It is irrelevant for RFC3016 */ 00066 if (au->size <= getMaxPacketPayloadSize()) { 00067 SLPacket *packet = createSLPacket(au->payload, unitSize, false, 0); 00068 SLPacketHeader & slph = packet->getSLPacketHeader(); 00069 slph.accessUnitStartFlag = true; 00070 slph.accessUnitEndFlag = true; 00071 00072 // FIXME: how to know if this is true? 00073 slph.randomAccessPointFlag = true; 00074 slph.decodingTimeStampFlag = true; 00075 slph.decodingTimeStamp = au->dts; 00076 slph.compositionTimeStamp = au->cts; 00077 slph.compositionTimeStampFlag = true; 00078 slpl.push_back(packet); 00079 // pLayer->sendSLPackets(slpl); 00080 } else { 00081 u32 maxsize = getMaxPacketPayloadSize(); 00082 u8 * payload = au->payload; 00083 bool first = true; 00084 int currentSize = 0; 00085 while (unitSize) { 00086 if (unitSize <= maxsize) { // last packet 00087 currentSize = unitSize; 00088 } else { // first or intermediate packet 00089 currentSize = maxsize; 00090 } 00091 SLPacket * packet = createSLPacket(payload, currentSize, true, 0); 00092 SLPacketHeader & slph = packet->getSLPacketHeader(); 00093 if (unitSize <= maxsize) { // last packet 00094 slph.accessUnitEndFlag = true; 00095 slph.accessUnitStartFlag = false; 00096 slph.randomAccessPointFlag = false; 00097 slph.decodingTimeStampFlag = false; 00098 slph.compositionTimeStampFlag = false; 00099 } 00100 else { // first or intermediate packet 00101 if (first) { 00102 slph.accessUnitStartFlag = true; 00103 00104 // FIXME: how to know if this is true? 00105 slph.randomAccessPointFlag = true; 00106 slph.decodingTimeStampFlag = true; 00107 slph.compositionTimeStampFlag = true; 00108 first = false; 00109 } 00110 else { // intermediate packet 00111 slph.accessUnitStartFlag = false; 00112 slph.randomAccessPointFlag = false; 00113 slph.decodingTimeStampFlag = false; 00114 slph.compositionTimeStampFlag = false; 00115 } 00116 slph.accessUnitEndFlag = false; 00117 } 00118 slph.decodingTimeStamp = au->dts; 00119 slph.compositionTimeStamp = au->cts; 00120 slpl.push_back(packet); 00121 00122 // pLayer->sendSLPackets(slpl); 00123 unitSize -= currentSize; 00124 payload += currentSize; 00125 } // while unitSize 00126 } 00127 return slpl; 00128 }