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
00033
00034
00035 #include "stdafx.h"
00036 #include "anxstreammapper.h"
00037
00038 AnxStreamMapper::AnxStreamMapper(OggDemuxSourceFilter* inOwningFilter)
00039 : OggStreamMapper(inOwningFilter)
00040 , mAnnodexSerial(0)
00041 , mSeenAnnodexBOS(false)
00042 , mReadyForCodecs(false)
00043 , mSeenCMML(false)
00044 , mDemuxState(eAnxDemuxState::SEEN_NOTHING)
00045 , mAnxVersion(0)
00046 , mAnnodexHeader(NULL)
00047 {
00048 #ifdef OGGCODECS_LOGGING
00049 debugLog.open("G:\\logs\\anxmapper.log", ios_base::out);
00050 #endif
00051 }
00052
00053 AnxStreamMapper::~AnxStreamMapper(void)
00054 {
00055 debugLog.close();
00056 }
00057
00058 bool AnxStreamMapper::isReady() {
00059 bool retVal = true;
00060 bool locWasAny = false;
00061
00062
00063
00064
00065
00066
00067
00068 if (mSeenStreams.size() == 0) {
00069 retVal = true;
00070 } else {
00071 retVal = false;
00072 }
00073
00074 for (unsigned long i = 1; i < mStreamList.size(); i++) {
00075 locWasAny = true;
00076 retVal = retVal && mStreamList[i]->streamReady();
00077
00078 if (retVal) {
00079
00080 } else {
00081
00082 }
00083 }
00084
00085 if (locWasAny && retVal) {
00086 debugLog<<"Streams READY"<<endl;
00087 } else {
00088 debugLog<<"Streams NOT READY"<<endl;
00089 }
00090 return locWasAny && retVal;
00091 }
00092
00093 bool AnxStreamMapper::isAnnodexEOS(OggPage* inOggPage) {
00094 if ((inOggPage->header()->StreamSerialNo() == mAnnodexSerial) &&
00095 (inOggPage->header()->isEOS())) {
00096 return true;
00097 } else {
00098 return false;
00099 }
00100
00101 }
00102 bool AnxStreamMapper::isAnnodexBOS(OggPage* inOggPage) {
00103 if ((inOggPage->numPackets() != 1) ||
00104 (inOggPage->getPacket(0)->packetSize() < 12) ||
00105 (strncmp((const char*)inOggPage->getPacket(0)->packetData(), "Annodex\0", 8) != 0) ||
00106 (!inOggPage->header()->isBOS())) {
00107 return false;
00108 } else {
00109 return true;
00110 }
00111 }
00112
00113 bool AnxStreamMapper::isAnxDataPage(OggPage* inOggPage, bool inAnxDataAreBOS) {
00114
00115
00116
00117
00118
00119
00120
00121 if ((inOggPage->numPackets() != 1) ||
00122 (inOggPage->getPacket(0)->packetSize() < 12) ||
00123 (strncmp((const char*)inOggPage->getPacket(0)->packetData(), "AnxData\0", 8) != 0) ||
00124
00125 ( (inOggPage->header()->isBOS()) != inAnxDataAreBOS )) {
00126 return false;
00127 } else {
00128 return true;
00129 }
00130 }
00134 unsigned long AnxStreamMapper::getAnxVersion(OggPage* inOggPage) {
00135 if (isAnnodexBOS(inOggPage)) {
00136
00137 return ((iLE_Math::charArrToUShort(inOggPage->getPacket(0)->packetData() + 8)) << 16) + iLE_Math::charArrToUShort(inOggPage->getPacket(0)->packetData() + 10);
00138 } else {
00139 return 0;
00140 }
00141
00142
00143
00144 }
00145
00146 bool AnxStreamMapper::handleAnxVersion_2_0(OggPage* inOggPage) {
00147
00148 const bool ANXDATA_ARE_BOS = true;
00149
00150 bool locTemp = false;
00151
00152 vector<unsigned long>::iterator it;
00153 int i = 0;
00154 debugLog<<"handleAnxVersion_2_0 : State = "<<mDemuxState<<endl;
00155 switch (mDemuxState) {
00156 case SEEN_NOTHING:
00157
00158
00159 if (!isAnnodexBOS(inOggPage)) {
00160 mDemuxState = INVALID_STATE;
00161 delete inOggPage;
00162 return false;
00163 } else {
00164 delete mAnnodexHeader;
00165 mAnnodexHeader = inOggPage->getPacket(0)->clone();
00166 mAnnodexSerial = inOggPage->header()->StreamSerialNo();
00167 mDemuxState = SEEN_ANNODEX_BOS;
00168 return true;
00169 }
00170 break;
00171
00172 case SEEN_ANNODEX_BOS:
00173
00174
00175 if (!isAnxDataPage(inOggPage, ANXDATA_ARE_BOS)) {
00176 mDemuxState = INVALID_STATE;
00177 return false;
00178 } else {
00179
00180 mSeenStreams.clear();
00181 mAnxDataHeaders.clear();
00182
00183 mAnxDataHeaders.push_back(inOggPage->getPacket(0)->clone());
00184 mDemuxState = SEEN_AN_ANXDATA;
00185
00186
00187
00188 OggStream* locStream = new CMMLStream(inOggPage, mOwningFilter, true);
00189 if (locStream != NULL) {
00190
00191 mStreamList.push_back(locStream);
00192 }
00193
00194 return true;
00195 }
00196
00197
00198 break;
00199
00200 case SEEN_AN_ANXDATA:
00201
00202 if (isAnnodexEOS(inOggPage)) {
00203
00204 mDemuxState = OGG_STATE;
00205
00206 return true;
00207 } else if (isAnxDataPage(inOggPage, ANXDATA_ARE_BOS)) {
00208
00209
00210 mSeenStreams.push_back(inOggPage->header()->StreamSerialNo());
00211 mAnxDataHeaders.push_back(inOggPage->getPacket(0)->clone());
00212 mDemuxState = SEEN_AN_ANXDATA;
00213 return true;
00214 } else {
00215 mDemuxState = INVALID_STATE;
00216 return false;
00217
00218 }
00219 break;
00220 case OGG_STATE:
00221
00222
00223
00224
00225 for(i = 0, it = mSeenStreams.begin(); it != mSeenStreams.end(); i++, ++it) {
00226 debugLog<<"handleAnxVersion_2_0 : Checking seen stream "<<i<<endl;
00227 if (mSeenStreams[i] == inOggPage->header()->StreamSerialNo()) {
00228
00229 const bool ALLOW_OTHERS_TO_SEEK = true;
00230 debugLog<<"handleAnxVersion_2_0 : Creating stream "<<endl;
00231 OggStream* locStream = OggStreamFactory::CreateStream(inOggPage, mOwningFilter, ALLOW_OTHERS_TO_SEEK);
00232
00233 if (locStream != NULL) {
00234 debugLog<<"handleAnxVersion_2_0 : Stream Created "<<endl;
00235 mStreamList.push_back(locStream);
00236 } else {
00237 debugLog<<"handleAnxVersion_2_0 : ***** Stream NOT Created *****"<<endl;
00238 }
00239 mSeenStreams.erase(it);
00240 delete inOggPage;
00241 return true;
00242 }
00243 }
00244
00245
00246
00247 debugLog<<"handleAnxVersion_2_0 : Dispatching page "<<endl;
00248
00249 locTemp = dispatchPage(inOggPage);
00250 if (locTemp) {
00251 debugLog<<"handleAnxVersion_2_0 : Sispatch oK "<<endl;
00252 } else {
00253 debugLog<<"handleAnxVersion_2_0 : Dispatch faild "<<endl;
00254 }
00255 return locTemp;
00256 break;
00257 case INVALID_STATE:
00258 default:
00259 debugLog<<"handleAnxVersion_2_0 : INVALID STATE "<<endl;
00260 return false;
00261 break;
00262
00263
00264
00265 }
00266 }
00267
00268 bool AnxStreamMapper::handleAnxVersion_3_0(OggPage* inOggPage) {
00269 switch (mDemuxState) {
00270 case SEEN_NOTHING:
00271
00272 break;
00273 case SEEN_ANNODEX_BOS:
00274 break;
00275 case SEEN_AN_ANXDATA:
00276 break;
00277 case OGG_STATE:
00278 break;
00279 case INVALID_STATE:
00280 default:
00281 break;
00282
00283
00284
00285 }
00286 return false;
00287 }
00288
00289 bool AnxStreamMapper::acceptOggPage(OggPage* inOggPage)
00290 {
00291
00292 if (mDemuxState == SEEN_NOTHING) {
00293 mAnxVersion = getAnxVersion(inOggPage);
00294
00295 }
00296
00297 switch (mAnxVersion) {
00298 case ANX_VERSION_2_0:
00299
00300
00301 return handleAnxVersion_2_0(inOggPage);
00302 break;
00303 case ANX_VERSION_3_0:
00304 return handleAnxVersion_3_0(inOggPage);
00305 default:
00306 mDemuxState = INVALID_STATE;
00307 return false;
00308
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381 }
00382
00383 bool AnxStreamMapper::toStartOfData() {
00384 debugLog<<"toStartOfData : S "<<endl;
00385
00386
00387
00388 if (isReady()) {
00389 for (unsigned long i = 0; i < mStreamList.size(); i++) {
00390
00391 if (mAnxVersion == ANX_VERSION_2_0) {
00392
00393 mStreamList[i]->flush((unsigned short)(mStreamList[i]->numCodecHeaders() + 1));
00394 } else {
00395 mStreamList[i]->flush((unsigned short)(mStreamList[i]->numCodecHeaders()));
00396 }
00397 }
00398 return true;
00399 } else {
00400
00401 return false;
00402 }
00403 }