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 "cmmlstream.h"
00037
00038 CMMLStream::CMMLStream(OggPage* inBOSPage, OggDemuxSourceFilter* inOwningFilter, bool inAllowSeek)
00039 : OggStream(inBOSPage, inOwningFilter, inAllowSeek)
00040 , mCMMLFormatBlock(NULL)
00041 {
00042 InitCodec(inBOSPage->getStampedPacket(0));
00043
00044 }
00045
00046 CMMLStream::~CMMLStream(void)
00047 {
00048 delete mCMMLFormatBlock;
00049 }
00050
00051 bool CMMLStream::AddPin() {
00052 createFormatBlock();
00053 CMediaType* locMediaType = createMediaType( getMajorTypeGUID(),
00054 getSubtypeGUID(),
00055 getFormatGUID(),
00056 getFormatBlockSize(),
00057 getFormatBlock());
00058
00059
00060 OggDemuxSourcePin* locSourcePin = new CMMLSourcePin( NAME("Ogg Source Pin"),
00061 mOwningFilter,
00062 mOwningFilter->theLock(),
00063 mCodecHeaders,
00064 locMediaType,
00065 getPinName(),
00066 getNumBuffers(),
00067 getBufferSize());
00068 mStreamReady = true;
00069 mSourcePin = locSourcePin;
00070
00071 return true;
00072
00073 }
00074 bool CMMLStream::InitCodec(StampedOggPacket* inOggPacket) {
00075 mCodecHeaders = new StreamHeaders;
00076 mCodecHeaders->mCodecType = StreamHeaders::CMML;
00077 mAnxDataPacket = inOggPacket->clone();
00078
00079 mNumHeadersNeeded = 1;
00080 return true;
00081 }
00082
00083 BYTE* CMMLStream::getFormatBlock() {
00084
00085 return (BYTE*)mCMMLFormatBlock;
00086
00087 }
00088 bool CMMLStream::createFormatBlock() {
00089
00090 mCMMLFormatBlock = new sCMMLFormatBlock;
00091 mCMMLFormatBlock->granuleNumerator = iLE_Math::charArrToULong(mAnxDataPacket->packetData() + 8) + ((iLE_Math::charArrToULong(mAnxDataPacket->packetData() + 12)) << 32);
00092 mCMMLFormatBlock->granuleDenominator = iLE_Math::charArrToULong(mAnxDataPacket->packetData() + 16) + ((iLE_Math::charArrToULong(mAnxDataPacket->packetData() + 20)) << 32);
00093
00094 return true;
00095 }
00096
00097 void CMMLStream::setLastEndGranPos(__int64 inPos) {
00098
00099
00100 mLastEndGranulePos = ((inPos * mCMMLFormatBlock->granuleNumerator) / mCMMLFormatBlock->granuleDenominator)/ UNITS;
00101
00102
00103 }
00104 unsigned long CMMLStream::getFormatBlockSize() {
00105 return sizeof(sCMMLFormatBlock);
00106 }
00107 GUID CMMLStream::getFormatGUID() {
00108 return FORMAT_CMML;
00109 }
00110 GUID CMMLStream::getSubtypeGUID() {
00111 return MEDIASUBTYPE_CMML;
00112 }
00113 wstring CMMLStream::getPinName() {
00114 wstring retName = L"CMML Out";
00115 return retName;
00116 }
00117 GUID CMMLStream::getMajorTypeGUID() {
00118 return MEDIATYPE_Text;
00119 }
00120
00121 LONGLONG CMMLStream::getCurrentPos() {
00122 return (mLastEndGranulePos * UNITS * mCMMLFormatBlock->granuleDenominator) / mCMMLFormatBlock->granuleNumerator;
00123 }
00124
00125 unsigned long CMMLStream::getNumBuffers() {
00126 return CMML_NUM_BUFFERS;
00127 }
00128 unsigned long CMMLStream::getBufferSize() {
00129 return CMML_BUFFER_SIZE;
00130 }