OggStreamMapper.cpp

Go to the documentation of this file.
00001 #include "StdAfx.h"
00002 #include ".\oggstreammapper.h"
00003 
00004 OggStreamMapper::OggStreamMapper(OggDemuxPacketSourceFilter* inParentFilter, CCritSec* inParentFilterLock)
00005         :       mStreamState(eStreamState::STRMAP_READY)
00006         ,       mParentFilter(inParentFilter)
00007         ,       mParentFilterLock(inParentFilterLock)
00008         ,       mFishHeadPacket(NULL)
00009         ,       mSkeletonSerialNo(0)
00010 {
00011 }
00012 
00013 OggStreamMapper::~OggStreamMapper(void)
00014 {
00015         for (size_t i = 0; i < mPins.size(); i++) {
00016                 delete mPins[i];
00017         }
00018 }
00019 OggDemuxPacketSourcePin* OggStreamMapper::getPinByIndex(unsigned long inIndex)
00020 {
00021         if (inIndex < mPins.size()) {
00022                 return mPins[inIndex];
00023         } else {
00024                 return NULL;
00025         }
00026 }
00027 bool OggStreamMapper::acceptOggPage(OggPage* inOggPage)
00028 {
00029         
00030         switch (mStreamState) {
00031                 case STRMAP_READY:
00032                         //WARNING::: Partial fall through
00033                         if (inOggPage->header()->isBOS()) {
00034                                 mStreamState = STRMAP_PARSING_BOS_PAGES;
00035                         } else {
00036                                 mStreamState = STRMAP_ERROR;
00037                                 delete inOggPage;
00038                                 return false;
00039                         }
00040                         //Partial fall through
00041                 case STRMAP_PARSING_BOS_PAGES:
00042                         //WARNING::: Partial fall through
00043                         if (!allStreamsReady()) {
00044                                 if (inOggPage->header()->isBOS()) {
00045                                         return addNewPin(inOggPage);
00046                                 } else {
00047                                         mStreamState = STRMAP_DATA;
00048                                 }
00049                         }
00050                         //Partial fall through
00051                 case STRMAP_DATA:
00052                         {
00053                                 if (mFishHeadPacket != NULL) {
00054                                         if (inOggPage->header()->StreamSerialNo() == mSkeletonSerialNo) {
00055                                                 int x= 2;
00056                                         }
00057                                 }
00058                                 OggDemuxPacketSourcePin* locPin = getMatchingPin(inOggPage->header()->StreamSerialNo());
00059                                 if (locPin != NULL) {
00060                                         return locPin->acceptOggPage(inOggPage);
00061                                 } else {
00062                                         //Ignore unknown streams
00063                                         delete inOggPage;
00064                                         return true;
00065                                 }
00066                                 
00067                         }
00068                         break;
00069                 case STRMAP_FINISHED:
00070                         return false;
00071                 case STRMAP_ERROR:
00072                         return false;
00073                         
00074         }
00075         
00076 
00077 }
00078 
00079 bool OggStreamMapper::allStreamsReady()
00080 {
00081         bool locAllReady = true;
00082         //OggDemuxPacketSourcePin* locPin = NULL;
00083         for (size_t i = 0; i < mPins.size(); i++) {
00084                 locAllReady = locAllReady && (mPins[i]->isStreamReady());
00085         }       
00086 
00087         return locAllReady && (mPins.size() > 0);
00088 }
00089 
00090 bool OggStreamMapper::isFishHead(OggPage* inOggPage)
00091 {
00092         StampedOggPacket* locPacket = inOggPage->getStampedPacket(0);
00093 
00094         if (locPacket == NULL) {
00095                 return false;
00096         } else {
00097                 if ((strncmp((const char*)locPacket->packetData(), "fishead\0", 8)) == 0) {
00098                         return true;
00099                 }
00100         }
00101         return false;
00102 }
00103 
00104 bool OggStreamMapper::handleFishHead(OggPage* inOggPage)
00105 {
00106         mFishHeadPacket = inOggPage->getStampedPacket(0)->clone();
00107         mSkeletonSerialNo = inOggPage->header()->StreamSerialNo();
00108         delete inOggPage;
00109         return true;
00110 }
00111 bool OggStreamMapper::addNewPin(OggPage* inOggPage)
00112 {
00113         //FISH::: Catch the fishead here.
00114 
00115         if (isFishHead(inOggPage)) {
00116                 return handleFishHead(inOggPage);
00117         } else {
00118                 OggDemuxPacketSourcePin* locNewPin = new OggDemuxPacketSourcePin(NAME("OggPageSourcePin"), mParentFilter, mParentFilterLock, inOggPage->getPacket(0)->clone(), inOggPage->header()->StreamSerialNo());
00119                 //locNewPin->AddRef();
00120                 delete inOggPage;
00121                 mPins.push_back(locNewPin);
00122                 return true;
00123         }
00124 }
00125 
00126 OggDemuxPacketSourcePin* OggStreamMapper::getMatchingPin(unsigned long inSerialNo)
00127 {
00128         OggDemuxPacketSourcePin* locPin = NULL;
00129         for (size_t i = 0; i < mPins.size(); i++) {
00130                 locPin = mPins[i];
00131                 if (locPin->getSerialNo() == inSerialNo) {
00132                         return locPin;
00133                 }
00134         }
00135         return NULL;
00136 }

Generated on Thu Feb 16 23:48:13 2006 for oggdsf by  doxygen 1.3.9