123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974 |
- #include <streams.h>
- #include <measure.h>
- #include <transip.h>
- CTransInPlaceFilter::CTransInPlaceFilter
- ( __in_opt LPCTSTR pName,
- __inout_opt LPUNKNOWN pUnk,
- REFCLSID clsid,
- __inout HRESULT *phr,
- bool bModifiesData
- )
- : CTransformFilter(pName, pUnk, clsid),
- m_bModifiesData(bModifiesData)
- {
- #ifdef PERF
- RegisterPerfId();
- #endif
- }
- #ifdef UNICODE
- CTransInPlaceFilter::CTransInPlaceFilter
- ( __in_opt LPCSTR pName,
- __inout_opt LPUNKNOWN pUnk,
- REFCLSID clsid,
- __inout HRESULT *phr,
- bool bModifiesData
- )
- : CTransformFilter(pName, pUnk, clsid),
- m_bModifiesData(bModifiesData)
- {
- #ifdef PERF
- RegisterPerfId();
- #endif
- }
- #endif
- CBasePin *
- CTransInPlaceFilter::GetPin(int n)
- {
- HRESULT hr = S_OK;
-
- if (m_pInput == NULL) {
- m_pInput = new CTransInPlaceInputPin( NAME("TransInPlace input pin")
- , this
- , &hr
- , L"Input"
- );
-
- ASSERT(SUCCEEDED(hr));
- }
-
- if (m_pInput!=NULL && m_pOutput == NULL) {
- m_pOutput = new CTransInPlaceOutputPin( NAME("TransInPlace output pin")
- , this
- , &hr
- , L"Output"
- );
-
- ASSERT(SUCCEEDED(hr));
- if (m_pOutput == NULL) {
- delete m_pInput;
- m_pInput = NULL;
- }
- }
-
- ASSERT (n>=0 && n<=1);
- if (n == 0) {
- return m_pInput;
- } else if (n==1) {
- return m_pOutput;
- } else {
- return NULL;
- }
- }
- HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir, IPin *pReceivePin)
- {
- UNREFERENCED_PARAMETER(pReceivePin);
- ASSERT(m_pInput);
- ASSERT(m_pOutput);
-
-
- if (!m_pGraph) {
- return VFW_E_NOT_IN_GRAPH;
- }
-
-
-
-
-
-
-
-
-
- if (dir == PINDIR_OUTPUT) {
- if( m_pInput->IsConnected() ) {
- return ReconnectPin( m_pInput, &m_pOutput->CurrentMediaType() );
- }
- return NOERROR;
- }
- ASSERT(dir == PINDIR_INPUT);
-
- if( m_pOutput->IsConnected() ) {
- if ( m_pInput->CurrentMediaType()
- != m_pOutput->CurrentMediaType()
- ) {
- return ReconnectPin( m_pOutput, &m_pInput->CurrentMediaType() );
- }
- }
- return NOERROR;
- }
- HRESULT CTransInPlaceFilter::DecideBufferSize
- ( IMemAllocator *pAlloc
- , __inout ALLOCATOR_PROPERTIES *pProperties
- )
- {
- ALLOCATOR_PROPERTIES Request, Actual;
- HRESULT hr;
-
- if (m_pInput->IsConnected()) {
-
-
- hr = InputPin()->PeekAllocator()->GetProperties(&Request);
- if (FAILED(hr)) {
-
- return hr;
- }
- } else {
-
-
-
- ZeroMemory(&Request, sizeof(Request));
- Request.cBuffers = 1;
- Request.cbBuffer = 1;
- }
- DbgLog((LOG_MEMORY,1,TEXT("Setting Allocator Requirements")));
- DbgLog((LOG_MEMORY,1,TEXT("Count %d, Size %d"),
- Request.cBuffers, Request.cbBuffer));
-
-
-
- pProperties->cBuffers = Request.cBuffers;
- pProperties->cbBuffer = Request.cbBuffer;
- pProperties->cbAlign = Request.cbAlign;
- if (pProperties->cBuffers<=0) {pProperties->cBuffers = 1; }
- if (pProperties->cbBuffer<=0) {pProperties->cbBuffer = 1; }
- hr = pAlloc->SetProperties(pProperties, &Actual);
- if (FAILED(hr)) {
- return hr;
- }
- DbgLog((LOG_MEMORY,1,TEXT("Obtained Allocator Requirements")));
- DbgLog((LOG_MEMORY,1,TEXT("Count %d, Size %d, Alignment %d"),
- Actual.cBuffers, Actual.cbBuffer, Actual.cbAlign));
-
- if ( (Request.cBuffers > Actual.cBuffers)
- || (Request.cbBuffer > Actual.cbBuffer)
- || (Request.cbAlign > Actual.cbAlign)
- ) {
- return E_FAIL;
- }
- return NOERROR;
- }
- __out_opt IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
- {
- IMediaSample * pDest;
- HRESULT hr;
- REFERENCE_TIME tStart, tStop;
- const BOOL bTime = S_OK == pSource->GetTime( &tStart, &tStop);
-
- hr = OutputPin()->PeekAllocator()->GetBuffer(
- &pDest
- , bTime ? &tStart : NULL
- , bTime ? &tStop : NULL
- , m_bSampleSkipped ? AM_GBF_PREVFRAMESKIPPED : 0
- );
- if (FAILED(hr)) {
- return NULL;
- }
- ASSERT(pDest);
- IMediaSample2 *pSample2;
- if (SUCCEEDED(pDest->QueryInterface(IID_IMediaSample2, (void **)&pSample2))) {
- HRESULT hrProps = pSample2->SetProperties(
- FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, pbBuffer),
- (PBYTE)m_pInput->SampleProps());
- pSample2->Release();
- if (FAILED(hrProps)) {
- pDest->Release();
- return NULL;
- }
- } else {
- if (bTime) {
- pDest->SetTime(&tStart, &tStop);
- }
- if (S_OK == pSource->IsSyncPoint()) {
- pDest->SetSyncPoint(TRUE);
- }
- if (S_OK == pSource->IsDiscontinuity() || m_bSampleSkipped) {
- pDest->SetDiscontinuity(TRUE);
- }
- if (S_OK == pSource->IsPreroll()) {
- pDest->SetPreroll(TRUE);
- }
-
- AM_MEDIA_TYPE *pMediaType;
- if (S_OK == pSource->GetMediaType(&pMediaType)) {
- pDest->SetMediaType(pMediaType);
- DeleteMediaType( pMediaType );
- }
- }
- m_bSampleSkipped = FALSE;
-
- REFERENCE_TIME TimeStart, TimeEnd;
- if (pSource->GetMediaTime(&TimeStart,&TimeEnd) == NOERROR) {
- pDest->SetMediaTime(&TimeStart,&TimeEnd);
- }
-
- {
- const long lDataLength = pSource->GetActualDataLength();
- if (FAILED(pDest->SetActualDataLength(lDataLength))) {
- pDest->Release();
- return NULL;
- }
-
- {
- BYTE *pSourceBuffer, *pDestBuffer;
- long lSourceSize = pSource->GetSize();
- long lDestSize = pDest->GetSize();
- ASSERT(lDestSize >= lSourceSize && lDestSize >= lDataLength);
- if (FAILED(pSource->GetPointer(&pSourceBuffer)) ||
- FAILED(pDest->GetPointer(&pDestBuffer)) ||
- lDestSize < lDataLength ||
- lDataLength < 0) {
- pDest->Release();
- return NULL;
- }
- ASSERT(lDestSize == 0 || pSourceBuffer != NULL && pDestBuffer != NULL);
- CopyMemory( (PVOID) pDestBuffer, (PVOID) pSourceBuffer, lDataLength );
- }
- }
- return pDest;
- }
- HRESULT
- CTransInPlaceFilter::Receive(IMediaSample *pSample)
- {
-
- AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps();
- if (pProps->dwStreamId != AM_STREAM_MEDIA) {
- return m_pOutput->Deliver(pSample);
- }
- HRESULT hr;
-
- MSR_START(m_idTransInPlace);
- if (UsingDifferentAllocators()) {
-
- pSample = Copy(pSample);
- if (pSample==NULL) {
- MSR_STOP(m_idTransInPlace);
- return E_UNEXPECTED;
- }
- }
-
- hr = Transform(pSample);
-
- MSR_STOP(m_idTransInPlace);
- if (FAILED(hr)) {
- DbgLog((LOG_TRACE, 1, TEXT("Error from TransInPlace")));
- if (UsingDifferentAllocators()) {
- pSample->Release();
- }
- return hr;
- }
-
-
-
- if (hr == NOERROR) {
- hr = m_pOutput->Deliver(pSample);
- } else {
-
-
- if (S_FALSE == hr) {
-
-
-
-
- m_bSampleSkipped = TRUE;
- if (!m_bQualityChanged) {
- NotifyEvent(EC_QUALITY_CHANGE,0,0);
- m_bQualityChanged = TRUE;
- }
- hr = NOERROR;
- }
- }
-
-
- if (UsingDifferentAllocators()) {
- pSample->Release();
- }
- return hr;
- }
- CTransInPlaceInputPin::CTransInPlaceInputPin
- ( __in_opt LPCTSTR pObjectName
- , __inout CTransInPlaceFilter *pFilter
- , __inout HRESULT *phr
- , __in_opt LPCWSTR pName
- )
- : CTransformInputPin(pObjectName,
- pFilter,
- phr,
- pName)
- , m_bReadOnly(FALSE)
- , m_pTIPFilter(pFilter)
- {
- DbgLog((LOG_TRACE, 2
- , TEXT("CTransInPlaceInputPin::CTransInPlaceInputPin")));
- }
- STDMETHODIMP CTransInPlaceInputPin::GetAllocator(__deref_out IMemAllocator ** ppAllocator)
- {
- CheckPointer(ppAllocator,E_POINTER);
- ValidateReadWritePtr(ppAllocator,sizeof(IMemAllocator *));
- CAutoLock cObjectLock(m_pLock);
- HRESULT hr;
- if ( m_pTIPFilter->m_pOutput->IsConnected() ) {
-
- hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin()
- ->GetAllocator( ppAllocator );
- if (SUCCEEDED(hr)) {
- m_pTIPFilter->OutputPin()->SetAllocator( *ppAllocator );
- }
- }
- else {
-
-
-
-
- hr = CTransformInputPin::GetAllocator( ppAllocator );
- }
- return hr;
- }
- STDMETHODIMP
- CTransInPlaceInputPin::NotifyAllocator(
- IMemAllocator * pAllocator,
- BOOL bReadOnly)
- {
- HRESULT hr = S_OK;
- CheckPointer(pAllocator,E_POINTER);
- ValidateReadPtr(pAllocator,sizeof(IMemAllocator));
- CAutoLock cObjectLock(m_pLock);
- m_bReadOnly = bReadOnly;
-
-
-
-
-
- if (!m_pTIPFilter->OutputPin()->IsConnected()) {
- return CTransformInputPin::NotifyAllocator(pAllocator, bReadOnly);
- }
-
-
-
- if (bReadOnly && m_pTIPFilter->m_bModifiesData) {
- IMemAllocator *pOutputAllocator =
- m_pTIPFilter->OutputPin()->PeekAllocator();
-
- if (pOutputAllocator == NULL) {
- hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin()->
- GetAllocator(&pOutputAllocator);
- if(FAILED(hr)) {
- hr = CreateMemoryAllocator(&pOutputAllocator);
- }
- if (SUCCEEDED(hr)) {
- m_pTIPFilter->OutputPin()->SetAllocator(pOutputAllocator);
- pOutputAllocator->Release();
- }
- }
- if (pAllocator == pOutputAllocator) {
- hr = E_FAIL;
- } else if(SUCCEEDED(hr)) {
-
- ALLOCATOR_PROPERTIES Props, Actual;
- hr = pAllocator->GetProperties(&Props);
- if (SUCCEEDED(hr)) {
- hr = pOutputAllocator->SetProperties(&Props, &Actual);
- }
- if (SUCCEEDED(hr)) {
- if ( (Props.cBuffers > Actual.cBuffers)
- || (Props.cbBuffer > Actual.cbBuffer)
- || (Props.cbAlign > Actual.cbAlign)
- ) {
- hr = E_FAIL;
- }
- }
-
- if (SUCCEEDED(hr)) {
- hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin()
- ->NotifyAllocator( pOutputAllocator, FALSE );
- }
- }
- } else {
- hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin()
- ->NotifyAllocator( pAllocator, bReadOnly );
- if (SUCCEEDED(hr)) {
- m_pTIPFilter->OutputPin()->SetAllocator( pAllocator );
- }
- }
- if (SUCCEEDED(hr)) {
-
-
- pAllocator->AddRef();
- if( m_pAllocator != NULL )
- m_pAllocator->Release();
- m_pAllocator = pAllocator;
- }
- return hr;
- }
- STDMETHODIMP CTransInPlaceInputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum )
- {
-
- if( !m_pTIPFilter->m_pOutput->IsConnected() )
- return VFW_E_NOT_CONNECTED;
- return m_pTIPFilter->m_pOutput->GetConnected()->EnumMediaTypes( ppEnum );
- }
- HRESULT CTransInPlaceInputPin::CheckMediaType(const CMediaType *pmt )
- {
- HRESULT hr = m_pTIPFilter->CheckInputType(pmt);
- if (hr!=S_OK) return hr;
- if( m_pTIPFilter->m_pOutput->IsConnected() )
- return m_pTIPFilter->m_pOutput->GetConnected()->QueryAccept( pmt );
- else
- return S_OK;
- }
- STDMETHODIMP
- CTransInPlaceInputPin::GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES *pProps)
- {
- if( m_pTIPFilter->m_pOutput->IsConnected() )
- return m_pTIPFilter->OutputPin()
- ->ConnectedIMemInputPin()->GetAllocatorRequirements( pProps );
- else
- return E_NOTIMPL;
- }
- HRESULT
- CTransInPlaceInputPin::CompleteConnect(IPin *pReceivePin)
- {
- HRESULT hr = CBaseInputPin::CompleteConnect(pReceivePin);
- if (FAILED(hr)) {
- return hr;
- }
- return m_pTransformFilter->CompleteConnect(PINDIR_INPUT,pReceivePin);
- }
- CTransInPlaceOutputPin::CTransInPlaceOutputPin(
- __in_opt LPCTSTR pObjectName,
- __inout CTransInPlaceFilter *pFilter,
- __inout HRESULT * phr,
- __in_opt LPCWSTR pPinName)
- : CTransformOutputPin( pObjectName
- , pFilter
- , phr
- , pPinName),
- m_pTIPFilter(pFilter)
- {
- DbgLog(( LOG_TRACE, 2
- , TEXT("CTransInPlaceOutputPin::CTransInPlaceOutputPin")));
- }
- STDMETHODIMP CTransInPlaceOutputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum )
- {
-
- if( ! m_pTIPFilter->m_pInput->IsConnected() )
- return VFW_E_NOT_CONNECTED;
- return m_pTIPFilter->m_pInput->GetConnected()->EnumMediaTypes( ppEnum );
- }
- HRESULT CTransInPlaceOutputPin::CheckMediaType(const CMediaType *pmt )
- {
-
-
-
- if (m_pTIPFilter->UsingDifferentAllocators() && !m_pFilter->IsStopped()) {
- if (*pmt == m_mt) {
- return S_OK;
- } else {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
-
- HRESULT hr = m_pTIPFilter->CheckInputType(pmt);
- if (hr!=S_OK) return hr;
- if( m_pTIPFilter->m_pInput->IsConnected() )
- return m_pTIPFilter->m_pInput->GetConnected()->QueryAccept( pmt );
- else
- return S_OK;
- }
- void
- CTransInPlaceOutputPin::SetAllocator(IMemAllocator * pAllocator)
- {
- pAllocator->AddRef();
- if (m_pAllocator) {
- m_pAllocator->Release();
- }
- m_pAllocator = pAllocator;
- }
- HRESULT
- CTransInPlaceOutputPin::CompleteConnect(IPin *pReceivePin)
- {
- HRESULT hr = CBaseOutputPin::CompleteConnect(pReceivePin);
- if (FAILED(hr)) {
- return hr;
- }
- return m_pTransformFilter->CompleteConnect(PINDIR_OUTPUT,pReceivePin);
- }
|