AutoAnxSeekTable.cpp

Go to the documentation of this file.
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 //IOggCallback interface
00031 bool AutoAnxSeekTable::acceptOggPage(OggPage* inOggPage) {
00032         //FIX::: This is serious mess !
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                 // Empty page: skip it
00041                 mFilePos += inOggPage->pageSize();
00042                 delete inOggPage;
00043                 return true;
00044         }
00045 
00046         if (mSeenAnything == false) {
00047 
00048                 // Scan for Annodex v2 header
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                         //Need to grab other info here.
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         // If we got up to this point, either the Annodex header (v2) or fishead (v2)
00079         // has been seen.  What we do now depends on whether we're dealing with a v2
00080         // or v3 file ...
00081 
00082         if (mAnnodexMajorVersion == 2) {
00083 
00084                 if (    (mAnnodexSerialNo == inOggPage->header()->StreamSerialNo())
00085                         && ((inOggPage->header()->HeaderFlags() & 4) != 0)) {
00086                         //This is the EOS of the annodex section... everything that follows is ogg like
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                         // FIXME: Should we be skipping all CMML packets up to the <head> packet?
00098 
00099                         if (mSkippedCMML == false) {
00100                                 mSkippedCMML = true;
00101                                 mFilePos += inOggPage->pageSize();
00102                         } else {
00103                                 return AutoOggSeekTable::acceptOggPage(inOggPage);              //Gives away page.
00104                         }
00105                 } else {
00106                         mFilePos += inOggPage->pageSize();
00107                 }
00108 
00109         } else if (mAnnodexMajorVersion == 3) {
00110 
00111                 if (mAnnodexSerialNo == inOggPage->header()->StreamSerialNo()) {
00112                         // We found a page with the Annodex serialno, but no EOS flag set on it.
00113                         // This is impossible for an Annodex v2 file (since the Annodex track
00114                         // consists of only the "Annodex" header packet and an EOS packet), but
00115                         // can be true for an Annodex v3 track.  Skip all pages in this track,
00116                         // otherwise we'll confuse AutoOggSeekTable.
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                         // Found the CMML track: remember it since we need to skip the header packets
00124                         mCMMLSerialNo = inOggPage->header()->StreamSerialNo();
00125                         // We should really get this value from the fisbone packets, but what the hell!
00126                         mCMMLPacketsToSkip = 2;
00127                         mFilePos += inOggPage->pageSize();
00128                 } else if (mCMMLPacketsToSkip > 0 && mCMMLSerialNo == inOggPage->header()->StreamSerialNo()) {
00129                         // Found a CMML header page: ignore it
00130                         mCMMLPacketsToSkip--;
00131                         mFilePos += inOggPage->pageSize();
00132                 } else {
00133                         return AutoOggSeekTable::acceptOggPage(inOggPage);
00134                 }
00135 
00136         } else {
00137                 // Encountered non-v2 and non-v3 file: we should never get here!
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 }

Generated on Tue Feb 15 14:54:21 2005 for oggdsf by  doxygen 1.3.9