HRESULT CAnalyzerWriterFilter::GetMediaPositionInterface(REFIID riid, __deref_out void **ppv) { CAutoLock cObjectCreationLock(&m_ObjectCreationLock); if (m_pPosition) { return m_pPosition->NonDelegatingQueryInterface(riid,ppv); } CBasePin *pPin = GetPin(0); if (NULL == pPin) { return E_OUTOFMEMORY; } HRESULT hr = NOERROR; // Create implementation of this dynamically since sometimes we may // never try and do a seek. The helper object implements a position // control interface (IMediaPosition) which in fact simply takes the // calls normally from the filter graph and passes them upstream m_pPosition = new CAnalyzerPosPassThru(NAME("Renderer CPosPassThru"), CBaseFilter::GetOwner(), (HRESULT *) &hr, pPin, m_analyzer); if (m_pPosition == NULL) { return E_OUTOFMEMORY; } if (FAILED(hr)) { delete m_pPosition; m_pPosition = NULL; return E_NOINTERFACE; } return GetMediaPositionInterface(riid,ppv); }
CBasePin * DBaseVideoRenderer::GetPin(int n) { // copied from __super, and changed only the input pin creation class CAutoLock cObjectCreationLock(&m_ObjectCreationLock); // Should only ever be called with zero ASSERT(n == 0); if (n != 0) { return NULL; } // Create the input pin if not already done so if (m_pInputPin == NULL) { // hr must be initialized to NOERROR because // CRendererInputPin's constructor only changes // hr's value if an error occurs. HRESULT hr = NOERROR; m_pInputPin = new DRendererInputPin(this,&hr,L"In"); if (NULL == m_pInputPin) { return NULL; } if (FAILED(hr)) { delete m_pInputPin; m_pInputPin = NULL; return NULL; } } return m_pInputPin; }
CBasePin* CAnalyzerWriterFilter::GetPin(int n) { CAutoLock cObjectCreationLock(&m_ObjectCreationLock); // Should only ever be called with zero ASSERT(n == 0); if (n != 0) { return NULL; } // Create the input pin if not already done so if (m_pInputPin == NULL) { // hr must be initialized to NOERROR because // CRendererInputPin's constructor only changes // hr's value if an error occurs. HRESULT hr = NOERROR; m_pInputPin = new CAnalyzerWriterInput(this, &hr, L"In", &m_file, m_szFileName, m_analyzer); if (NULL == m_pInputPin) { return NULL; } if (FAILED(hr)) { delete m_pInputPin; m_pInputPin = NULL; return NULL; } } return m_pInputPin; }
HRESULT CMPEGFilter::GetMediaPositionInterface(REFIID riid, void **ppv) { CAutoLock cObjectCreationLock(&m_ObjectCreationLock); if (m_pPosition) { return m_pPosition->NonDelegatingQueryInterface(riid,ppv); } HRESULT hr = NOERROR; // Create implementation of this dynamically since sometimes we may // never try and do a seek. The helper object implements a position // control interface (IMediaPosition) which in fact simply takes the // calls normally from the filter graph and passes them upstream /* m_pPosition = new CRendererPosPassThru(NAME("Renderer CPosPassThru"), CBaseFilter::GetOwner(), (HRESULT *) &hr, GetPin(0));*/ m_pPosition = new CMPEGSeeking(NAME("Renderer CPosPassThru"), CBaseFilter::GetOwner(), (HRESULT *) &hr, GetPin(0), GetPin(1), m_pMPEGObj); if (m_pPosition == NULL) { return E_OUTOFMEMORY; } if (FAILED(hr)) { delete m_pPosition; m_pPosition = NULL; return E_NOINTERFACE; } m_pPosition->AddRef(); *ppv = m_pPosition; return S_OK; }