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
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
00041 case STRMAP_PARSING_BOS_PAGES:
00042
00043 if (!allStreamsReady()) {
00044 if (inOggPage->header()->isBOS()) {
00045 return addNewPin(inOggPage);
00046 } else {
00047 mStreamState = STRMAP_DATA;
00048 }
00049 }
00050
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
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
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
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
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 }