00001 //=========================================================================== 00002 //Copyright (C) 2003, 2004 Zentaro Kavanagh 00003 // 00004 //Redistribution and use in source and binary forms, with or without 00005 //modification, are permitted provided that the following conditions 00006 //are met: 00007 // 00008 //- Redistributions of source code must retain the above copyright 00009 // notice, this list of conditions and the following disclaimer. 00010 // 00011 //- Redistributions in binary form must reproduce the above copyright 00012 // notice, this list of conditions and the following disclaimer in the 00013 // documentation and/or other materials provided with the distribution. 00014 // 00015 //- Neither the name of Zentaro Kavanagh nor the names of contributors 00016 // may be used to endorse or promote products derived from this software 00017 // without specific prior written permission. 00018 // 00019 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00020 //``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00021 //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00022 //PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR 00023 //CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00024 //EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00025 //PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00026 //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00027 //LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00028 //NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00029 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 //=========================================================================== 00031 00032 #include "stdafx.h" 00033 #include "Vorbisdecodeoutputpin.h" 00034 00035 VorbisDecodeOutputPin::VorbisDecodeOutputPin(VorbisDecodeFilter* inParentFilter, CCritSec* inFilterLock, vector<CMediaType*> inAcceptableMediaTypes) 00036 : AbstractTransformOutputPin(inParentFilter, inFilterLock,NAME("VorbisDecodeOutputPin"), L"PCM Out", 65536, 20, inAcceptableMediaTypes) 00037 { 00038 00039 00040 } 00041 VorbisDecodeOutputPin::~VorbisDecodeOutputPin(void) 00042 { 00043 00044 00045 } 00046 00047 STDMETHODIMP VorbisDecodeOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv) 00048 { 00049 if (riid == IID_IMediaSeeking) { 00050 *ppv = (IMediaSeeking*)this; 00051 ((IUnknown*)*ppv)->AddRef(); 00052 return NOERROR; 00053 } 00054 00055 return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv); 00056 } 00057 00058 HRESULT VorbisDecodeOutputPin::CreateAndFillFormatBuffer(CMediaType* outMediaType, int inPosition) 00059 { 00060 if (inPosition == 0) { 00061 WAVEFORMATEX* locWaveFormat = (WAVEFORMATEX*)outMediaType->AllocFormatBuffer(sizeof(WAVEFORMATEX)); 00062 //TODO::: Check for null ? 00063 00064 locWaveFormat->wFormatTag = WAVE_FORMAT_PCM; 00065 locWaveFormat->nChannels = ((VorbisDecodeFilter*)m_pFilter)->mVorbisFormatInfo->numChannels; 00066 locWaveFormat->nSamplesPerSec = ((VorbisDecodeFilter*)m_pFilter)->mVorbisFormatInfo->samplesPerSec; 00067 locWaveFormat->wBitsPerSample = 16; 00068 locWaveFormat->nBlockAlign = (locWaveFormat->nChannels) * (locWaveFormat->wBitsPerSample >> 3); 00069 locWaveFormat->nAvgBytesPerSec = ((locWaveFormat->nChannels) * (locWaveFormat->wBitsPerSample >> 3)) * locWaveFormat->nSamplesPerSec; 00070 locWaveFormat->cbSize = 0; 00071 return S_OK; 00072 } else { 00073 return S_FALSE; 00074 } 00075 } 00076 00077 00078 //Old imp 00079 //**************************************************** 00080 //#include "stdafx.h" 00081 //#include "Vorbisdecodeoutputpin.h" 00082 // 00083 //VorbisDecodeOutputPin::VorbisDecodeOutputPin(VorbisDecodeFilter* inParentFilter, CCritSec* inFilterLock) 00084 // : AbstractAudioDecodeOutputPin(inParentFilter, inFilterLock,NAME("VorbisDecodeOutputPin"), L"PCM Out") 00085 //{ 00086 // 00087 // 00088 //} 00089 //VorbisDecodeOutputPin::~VorbisDecodeOutputPin(void) 00090 //{ 00091 // 00092 // 00093 //} 00094 // 00095 //STDMETHODIMP VorbisDecodeOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv) 00096 //{ 00097 // if (riid == IID_IMediaSeeking) { 00098 // *ppv = (IMediaSeeking*)this; 00099 // ((IUnknown*)*ppv)->AddRef(); 00100 // return NOERROR; 00101 // } 00102 // 00103 // return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv); 00104 //} 00105 // 00106 //bool VorbisDecodeOutputPin::FillWaveFormatExBuffer(WAVEFORMATEX* inFormatBuffer) { 00107 // inFormatBuffer->wFormatTag = WAVE_FORMAT_PCM; 00108 // inFormatBuffer->nChannels = ((VorbisDecodeFilter*)m_pFilter)->mVorbisFormatInfo->numChannels; 00109 // inFormatBuffer->nSamplesPerSec = ((VorbisDecodeFilter*)m_pFilter)->mVorbisFormatInfo->samplesPerSec; 00110 // inFormatBuffer->wBitsPerSample = 16; 00111 // inFormatBuffer->nBlockAlign = (inFormatBuffer->nChannels) * (inFormatBuffer->wBitsPerSample >> 3); 00112 // inFormatBuffer->nAvgBytesPerSec = ((inFormatBuffer->nChannels) * (inFormatBuffer->wBitsPerSample >> 3)) * inFormatBuffer->nSamplesPerSec; 00113 // inFormatBuffer->cbSize = 0; 00114 // return true; 00115 //}