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