HRESULT CDXFilter::Receive( IMediaSample * pms ) { CheckPointer(pms,E_POINTER); HRESULT hr; AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); if (pProps->dwStreamId != AM_STREAM_MEDIA) { if( m_pOutput->IsConnected() ) return m_pOutput->Deliver(pms); else return NOERROR; } #if !defined(_WIN32_WCE) if (UsingDifferentAllocators()) { // We have to copy the data. pms = Copy(pms); if (pms == NULL) { return E_UNEXPECTED; } } #endif // have the derived class transform the data hr = Transform(pms); if (FAILED(hr)) { //DbgLog((LOG_TRACE, 1, TEXT("Error from TransInPlace"))); #if !defined(_WIN32_WCE) if (UsingDifferentAllocators()) { pms->Release(); } #endif return hr; } if (hr == NOERROR) { hr = m_pOutput->Deliver(pms); } // release the output buffer. If the connected pin still needs it, // it will have addrefed it itself. #if !defined(_WIN32_WCE) if (UsingDifferentAllocators()) { pms->Release(); } #endif return hr; }
HRESULT CTransInPlaceFilter::Receive(IMediaSample *pSample) { /* Check for other streams and pass them on */ AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); if (pProps->dwStreamId != AM_STREAM_MEDIA) { return m_pOutput->Deliver(pSample); } HRESULT hr; // Start timing the TransInPlace (if PERF is defined) MSR_START(m_idTransInPlace); if (UsingDifferentAllocators()) { // We have to copy the data. pSample = Copy(pSample); if (pSample==NULL) { MSR_STOP(m_idTransInPlace); return E_UNEXPECTED; } } // have the derived class transform the data hr = Transform(pSample); // Stop the clock and log it (if PERF is defined) MSR_STOP(m_idTransInPlace); if (FAILED(hr)) { DbgLog((LOG_TRACE, 1, TEXT("Error from TransInPlace"))); if (UsingDifferentAllocators()) { pSample->Release(); } return hr; } // the Transform() function can return S_FALSE to indicate that the // sample should not be delivered; we only deliver the sample if it's // really S_OK (same as NOERROR, of course.) if (hr == NOERROR) { hr = m_pOutput->Deliver(pSample); } else { // But it would be an error to return this private workaround // to the caller ... if (S_FALSE == hr) { // S_FALSE returned from Transform is a PRIVATE agreement // We should return NOERROR from Receive() in this cause because // returning S_FALSE from Receive() means that this is the end // of the stream and no more data should be sent. m_bSampleSkipped = TRUE; if (!m_bQualityChanged) { NotifyEvent(EC_QUALITY_CHANGE,0,0); m_bQualityChanged = TRUE; } hr = NOERROR; } } // release the output buffer. If the connected pin still needs it, // it will have addrefed it itself. if (UsingDifferentAllocators()) { pSample->Release(); } return hr; } // Receive