00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "stdafx.h"
00033 #include <libOOOgg/OggPage.h>
00034
00035
00036
00037
00038 static unsigned long crc_lookup[256]={
00039 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9,
00040 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005,
00041 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61,
00042 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd,
00043 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9,
00044 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75,
00045 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011,
00046 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd,
00047 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039,
00048 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5,
00049 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81,
00050 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d,
00051 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49,
00052 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95,
00053 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1,
00054 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d,
00055 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae,
00056 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072,
00057 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16,
00058 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca,
00059 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde,
00060 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02,
00061 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066,
00062 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba,
00063 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e,
00064 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692,
00065 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6,
00066 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a,
00067 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e,
00068 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2,
00069 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686,
00070 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a,
00071 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637,
00072 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb,
00073 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f,
00074 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53,
00075 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47,
00076 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b,
00077 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff,
00078 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623,
00079 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7,
00080 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b,
00081 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f,
00082 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3,
00083 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7,
00084 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b,
00085 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f,
00086 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3,
00087 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640,
00088 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c,
00089 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8,
00090 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24,
00091 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30,
00092 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec,
00093 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088,
00094 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654,
00095 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0,
00096 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c,
00097 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18,
00098 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4,
00099 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0,
00100 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c,
00101 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668,
00102 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4
00103 };
00104
00105
00106
00107
00108 OggPage::OggPage(void)
00109 {
00110 mHeader = new OggPageHeader;
00111 }
00112
00113 OggPage::~OggPage(void)
00114 {
00115 delete mHeader;
00116 for (unsigned long i = 0; i < mPacketList.size(); i++) {
00117 delete mPacketList[i];
00118 }
00119 }
00120
00121
00122 OggPageHeader* OggPage::header() {
00123 return mHeader;
00124 }
00125
00126
00127 OggPacket* OggPage::getPacket(unsigned long inPacketNo) {
00128 if (inPacketNo < numPackets()) {
00129 return mPacketList[inPacketNo];
00130 } else {
00131 return NULL;
00132 }
00133 }
00134
00135 StampedOggPacket* OggPage::getStampedPacket(unsigned long inPacketNo) {
00136 if (inPacketNo < numPackets()) {
00137 return mPacketList[inPacketNo];
00138 } else {
00139 return NULL;
00140 }
00141 }
00142
00143
00144 OggPage* OggPage::clone() {
00145 OggPage* retClone = new OggPage;
00146 retClone->mHeader = mHeader->clone();
00147 for (size_t i = 0; i < mPacketList.size(); i++) {
00148 retClone->mPacketList.push_back((StampedOggPacket*)mPacketList[i]->clone());
00149 }
00150
00151 return retClone;
00152 }
00153
00154 unsigned long OggPage::numPackets() {
00155 return (unsigned long)mPacketList.size();
00156 }
00157
00158
00159 unsigned char* OggPage::createRawPageData() {
00160 unsigned char* locPage = new unsigned char[mHeader->pageSize()];
00161 mHeader->rawData(locPage, mHeader->pageSize());
00162
00163 unsigned long locOffset = mHeader->headerSize();
00164 for (size_t i = 0; i < mPacketList.size(); i++) {
00165 OggPacket* locPack = mPacketList[i];
00166 memcpy((void*)(locPage + locOffset), (const void*)(locPack->packetData()), locPack->packetSize());
00167 locOffset += locPack->packetSize();
00168 }
00169 return locPage;
00170 }
00171
00172 bool OggPage::addPacket(StampedOggPacket* inPacket) {
00173 if (inPacket != NULL) {
00174 mPacketList.push_back(inPacket);
00175 return true;
00176 } else {
00177 return false;
00178 }
00179 }
00180
00181
00182
00183
00184
00185 void OggPage::computeAndSetCRCChecksum()
00186 {
00187 unsigned long locChecksum = 0;
00188 unsigned long locTemp = 0;
00189 unsigned char* locHeaderBuff = new unsigned char[300];
00190
00191
00192 header()->setCRCChecksum((unsigned long)0);
00193 header()->rawData(locHeaderBuff, 300);
00194
00195 for(unsigned long i = 0; i < headerSize(); i++) {
00196
00197 locTemp = ((locChecksum >> 24) & 0xff) ^ locHeaderBuff[i];
00198
00199 locChecksum=(locChecksum << 8) ^ crc_lookup[locTemp];
00200 }
00201
00202 unsigned char* locBuff = NULL;
00203 for(unsigned long i = 0; i < numPackets(); i++) {
00204 locBuff = getPacket(i)->packetData();
00205
00206 for (unsigned long j = 0; j < getPacket(i)->packetSize(); j++) {
00207 locTemp = ((locChecksum >> 24) & 0xff) ^ locBuff[j];
00208 locChecksum = (locChecksum << 8) ^ crc_lookup[locTemp];
00209 }
00210 }
00211
00212 header()->setCRCChecksum(locChecksum);
00213 }
00214
00215
00216 unsigned long OggPage::pageSize()
00217 {
00218 return mHeader->pageSize();
00219 }
00220 unsigned long OggPage::headerSize()
00221 {
00222 return mHeader->headerSize();
00223 }
00224 unsigned long OggPage::dataSize()
00225 {
00226 return mHeader->dataSize();
00227 }