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 #include "stdafx.h"
00033 #include "OggRawAudioExtractorInputPin.h"
00034
00035 OggRawAudioExtractorInputPin::OggRawAudioExtractorInputPin(OggRawAudioExtractorFilter* inParentFilter, HRESULT* outHR)
00036 : CTransformInputPin(NAME("OggAudioExtractorInputPin"), inParentFilter, outHR, L"Ogg Raw Audio In")
00037
00038 , mSetupState(VSS_SEEN_NOTHING)
00039 {
00040
00041 }
00042
00043 OggRawAudioExtractorInputPin::~OggRawAudioExtractorInputPin(void)
00044 {
00045
00046 }
00047
00048 STDMETHODIMP OggRawAudioExtractorInputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
00049 {
00050 if (riid == IID_IMediaSeeking) {
00051 *ppv = (IMediaSeeking*)this;
00052 ((IUnknown*)*ppv)->AddRef();
00053 return NOERROR;
00054 } else if (riid == IID_IOggDecoder) {
00055 *ppv = (IOggDecoder*)this;
00056
00057 return NOERROR;
00058
00059 }
00060
00061 return CBaseInputPin::NonDelegatingQueryInterface(riid, ppv);
00062 }
00063
00064 HRESULT OggRawAudioExtractorInputPin::SetMediaType(const CMediaType* inMediaType)
00065 {
00066
00067
00068 if (CheckMediaType(inMediaType) == S_OK) {
00069
00070
00071 } else {
00072 throw 0;
00073 }
00074 return CBaseInputPin::SetMediaType(inMediaType);
00075
00076 }
00077
00078 HRESULT OggRawAudioExtractorInputPin::CheckMediaType(const CMediaType *inMediaType)
00079 {
00080 if ( (inMediaType->majortype == MEDIATYPE_OggPacketStream)
00081 && (inMediaType->subtype == MEDIASUBTYPE_None)
00082 && (inMediaType->formattype == FORMAT_OggIdentHeader)) {
00083 if (inMediaType->cbFormat == OGG_RAW_AUDIO_IDENT_HEADER_SIZE) {
00084 if (strncmp((char*)inMediaType->pbFormat, "PCM ", 8) == 0) {
00085
00086 return S_OK;
00087 }
00088 }
00089 }
00090 return S_FALSE;
00091
00092 }
00093 HRESULT OggRawAudioExtractorInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *outRequestedProps)
00094 {
00095 outRequestedProps->cbBuffer = 65536;
00096 outRequestedProps->cBuffers = OGG_RAW_AUDIO_NUM_BUFFERS;
00097 outRequestedProps->cbAlign = 1;
00098 outRequestedProps->cbPrefix = 0;
00099
00100 return S_OK;
00101 }
00102 LOOG_INT64 OggRawAudioExtractorInputPin::convertGranuleToTime(LOOG_INT64 inGranule)
00103 {
00104 return (inGranule * UNITS) / mFormatBlock.samplesPerSec;
00105 }
00106
00107 LOOG_INT64 OggRawAudioExtractorInputPin::mustSeekBefore(LOOG_INT64 inGranule)
00108 {
00109
00110 return inGranule;
00111 }
00112 IOggDecoder::eAcceptHeaderResult OggRawAudioExtractorInputPin::showHeaderPacket(OggPacket* inCodecHeaderPacket)
00113 {
00114 switch (mSetupState) {
00115 case VSS_SEEN_NOTHING:
00116 if (strncmp((char*)inCodecHeaderPacket->packetData(), "PCM ", 8) == 0) {
00117 handleHeaderPacket(inCodecHeaderPacket);
00118 mSetupState = VSS_SEEN_BOS;
00119 return IOggDecoder::AHR_MORE_HEADERS_TO_COME;
00120 }
00121 mSetupState = VSS_ERROR;
00122 return IOggDecoder::AHR_INVALID_HEADER;
00123
00124 case VSS_SEEN_BOS:
00125
00126 mSetupState = VSS_ALL_HEADERS_SEEN;
00127 return IOggDecoder::AHR_ALL_HEADERS_RECEIVED;
00128
00129
00130
00131
00132 case VSS_ALL_HEADERS_SEEN:
00133 case VSS_ERROR:
00134 default:
00135 return IOggDecoder::AHR_UNEXPECTED;
00136 }
00137 }
00138
00139
00140
00141 bool OggRawAudioExtractorInputPin::handleHeaderPacket(OggPacket* inHeaderPack)
00142 {
00143
00144
00145
00146 mFormatBlock.samplesPerSec = iBE_Math::charArrToULong(inHeaderPack->packetData() + 16);
00147 mFormatBlock.maxFramesPerPacket = iBE_Math::charArrToULong(inHeaderPack->packetData() + 22) >> 16;
00148 mFormatBlock.numChannels = inHeaderPack->packetData()[21];
00149 mFormatBlock.numHeaders = iBE_Math::charArrToULong(inHeaderPack->packetData() + 24);
00150
00151 switch(iBE_Math::charArrToULong(inHeaderPack->packetData() + 12)) {
00152 case FMT_S8:
00153 case FMT_U8:
00154 mFormatBlock.bitsPerSample = 8;
00155 break;
00156 case FMT_S16_LE:
00157 case FMT_S16_BE:
00158 mFormatBlock.bitsPerSample = 16;
00159 break;
00160
00161 default:
00162 throw 0;
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 }
00178
00179
00180
00181 return true;
00182 }
00183 string OggRawAudioExtractorInputPin::getCodecShortName()
00184 {
00185 return "Ogg Raw Audio";
00186 }
00187 string OggRawAudioExtractorInputPin::getCodecIdentString()
00188 {
00189
00190 return "Ogg Raw Audio";
00191 }
00192