//------------------------------------------------------------------------------ | |
// File: AMExtra.cpp | |
// | |
// Desc: DirectShow base classes - implements CRenderedInputPin class. | |
// | |
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. | |
//------------------------------------------------------------------------------ | |
#include <streams.h> // DirectShow base class definitions | |
#include <mmsystem.h> // Needed for definition of timeGetTime | |
#include <limits.h> // Standard data type limit definitions | |
#include <measure.h> // Used for time critical log functions | |
#include "amextra.h" | |
#pragma warning(disable:4355) | |
// Implements CRenderedInputPin class | |
CRenderedInputPin::CRenderedInputPin(__in_opt LPCTSTR pObjectName, | |
__in CBaseFilter *pFilter, | |
__in CCritSec *pLock, | |
__inout HRESULT *phr, | |
__in_opt LPCWSTR pName) : | |
CBaseInputPin(pObjectName, pFilter, pLock, phr, pName), | |
m_bAtEndOfStream(FALSE), | |
m_bCompleteNotified(FALSE) | |
{ | |
} | |
#ifdef UNICODE | |
CRenderedInputPin::CRenderedInputPin(__in_opt LPCSTR pObjectName, | |
__in CBaseFilter *pFilter, | |
__in CCritSec *pLock, | |
__inout HRESULT *phr, | |
__in_opt LPCWSTR pName) : | |
CBaseInputPin(pObjectName, pFilter, pLock, phr, pName), | |
m_bAtEndOfStream(FALSE), | |
m_bCompleteNotified(FALSE) | |
{ | |
} | |
#endif | |
// Flush end of stream condition - caller should do any | |
// necessary stream level locking before calling this | |
STDMETHODIMP CRenderedInputPin::EndOfStream() | |
{ | |
HRESULT hr = CheckStreaming(); | |
// Do EC_COMPLETE handling for rendered pins | |
if (S_OK == hr && !m_bAtEndOfStream) { | |
m_bAtEndOfStream = TRUE; | |
FILTER_STATE fs; | |
EXECUTE_ASSERT(SUCCEEDED(m_pFilter->GetState(0, &fs))); | |
if (fs == State_Running) { | |
DoCompleteHandling(); | |
} | |
} | |
return hr; | |
} | |
// Called to complete the flush | |
STDMETHODIMP CRenderedInputPin::EndFlush() | |
{ | |
CAutoLock lck(m_pLock); | |
// Clean up renderer state | |
m_bAtEndOfStream = FALSE; | |
m_bCompleteNotified = FALSE; | |
return CBaseInputPin::EndFlush(); | |
} | |
// Notify of Run() from filter | |
HRESULT CRenderedInputPin::Run(REFERENCE_TIME tStart) | |
{ | |
UNREFERENCED_PARAMETER(tStart); | |
m_bCompleteNotified = FALSE; | |
if (m_bAtEndOfStream) { | |
DoCompleteHandling(); | |
} | |
return S_OK; | |
} | |
// Clear status on going into paused state | |
HRESULT CRenderedInputPin::Active() | |
{ | |
m_bAtEndOfStream = FALSE; | |
m_bCompleteNotified = FALSE; | |
return CBaseInputPin::Active(); | |
} | |
// Do stuff to deliver end of stream | |
void CRenderedInputPin::DoCompleteHandling() | |
{ | |
ASSERT(m_bAtEndOfStream); | |
if (!m_bCompleteNotified) { | |
m_bCompleteNotified = TRUE; | |
m_pFilter->NotifyEvent(EC_COMPLETE, S_OK, (LONG_PTR)(IBaseFilter *)m_pFilter); | |
} | |
} | |