123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- //------------------------------------------------------------------------------
- // 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);
- }
- }
|