00001 #include "stdafx.h"
00002 #include <libOOOggSeek/AutoAnxSeekTable.h>
00003
00004 #undef DEBUG
00005
00006 AutoAnxSeekTable::AutoAnxSeekTable(string inFileName)
00007 : AutoOggSeekTable(inFileName)
00008 , mAnxPackets(0)
00009 , mSeenAnything(false)
00010 , mAnnodexMajorVersion(0)
00011 , mAnnodexSerialNo(0)
00012 , mReadyForOgg(false)
00013 , mSkippedCMML(false)
00014 {
00015 #ifdef DEBUG
00016 mDebugFile.open("G:\\Logs\\AutoAnxSeekTable.log", ios_base::out);
00017 mDebugFile << "AutoAnxSeekTable 1" << endl;
00018 #endif
00019 }
00020
00021 AutoAnxSeekTable::~AutoAnxSeekTable(void)
00022 {
00023 mFile.close();
00024
00025 #ifdef DEBUG
00026 mDebugFile.close();
00027 #endif
00028 }
00029
00030
00031 bool AutoAnxSeekTable::acceptOggPage(OggPage* inOggPage) {
00032
00033
00034 unsigned char* locPacketData;
00035 if ( inOggPage != NULL
00036 && inOggPage->getPacket(0) != NULL
00037 && inOggPage->getPacket(0)->packetData() != NULL) {
00038 locPacketData = inOggPage->getPacket(0)->packetData();
00039 } else {
00040
00041 mFilePos += inOggPage->pageSize();
00042 delete inOggPage;
00043 return true;
00044 }
00045
00046 if (mSeenAnything == false) {
00047
00048
00049 if (strncmp((const char*)locPacketData, "Annodex", 7) == 0) {
00050 mAnnodexSerialNo = inOggPage->header()->StreamSerialNo();
00051 mSeenAnything = true;
00052 mAnnodexMajorVersion = 2;
00053 mFilePos += inOggPage->pageSize();
00054 #ifdef DEBUG
00055 mDebugFile << "Found Annodex: serialno is " << mAnnodexSerialNo << endl;
00056 #endif
00057 delete inOggPage;
00058 return true;
00059
00060 } else if (strncmp((const char*)locPacketData, "fishead", 7) == 0) {
00061 mAnnodexSerialNo = inOggPage->header()->StreamSerialNo();
00062 mSeenAnything = true;
00063 mAnnodexMajorVersion = 3;
00064 mFilePos += inOggPage->pageSize();
00065 mReadyForOgg = true;
00066 #ifdef DEBUG
00067 mDebugFile << "Found fishead: serialno is " << mAnnodexSerialNo << endl;
00068 #endif
00069 delete inOggPage;
00070 return true;
00071 } else {
00072 mFilePos += inOggPage->pageSize();
00073 delete inOggPage;
00074 return false;
00075 }
00076 }
00077
00078
00079
00080
00081
00082 if (mAnnodexMajorVersion == 2) {
00083
00084 if ( (mAnnodexSerialNo == inOggPage->header()->StreamSerialNo())
00085 && ((inOggPage->header()->HeaderFlags() & 4) != 0)) {
00086
00087 #ifdef DEBUG
00088 mDebugFile << "Found Annodex EOS" << endl;
00089 #endif
00090 mReadyForOgg = true;
00091 mFilePos += inOggPage->pageSize();
00092 delete inOggPage;
00093 return true;
00094 }
00095
00096 if (mReadyForOgg) {
00097
00098
00099 if (mSkippedCMML == false) {
00100 mSkippedCMML = true;
00101 mFilePos += inOggPage->pageSize();
00102 } else {
00103 return AutoOggSeekTable::acceptOggPage(inOggPage);
00104 }
00105 } else {
00106 mFilePos += inOggPage->pageSize();
00107 }
00108
00109 } else if (mAnnodexMajorVersion == 3) {
00110
00111 if (mAnnodexSerialNo == inOggPage->header()->StreamSerialNo()) {
00112
00113
00114
00115
00116
00117 #ifdef DEBUG
00118 mDebugFile << "Found page belonging to Annodex v3 skeleton; skipping" << endl;
00119 #endif
00120 mFilePos += inOggPage->pageSize();
00121 } else if ( locPacketData != NULL
00122 && memcmp((const char*)locPacketData, "CMML\0\0\0\0", 8) == 0) {
00123
00124 mCMMLSerialNo = inOggPage->header()->StreamSerialNo();
00125
00126 mCMMLPacketsToSkip = 2;
00127 mFilePos += inOggPage->pageSize();
00128 } else if (mCMMLPacketsToSkip > 0 && mCMMLSerialNo == inOggPage->header()->StreamSerialNo()) {
00129
00130 mCMMLPacketsToSkip--;
00131 mFilePos += inOggPage->pageSize();
00132 } else {
00133 return AutoOggSeekTable::acceptOggPage(inOggPage);
00134 }
00135
00136 } else {
00137
00138 #ifdef DEBUG
00139 mDebugFile << "Annodex major version number " << mAnnodexMajorVersion << "?" << endl;
00140 #endif
00141 delete inOggPage;
00142 return false;
00143 }
00144
00145 delete inOggPage;
00146 return true;
00147 }