112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | //------------------------------------------------------------------------------
 | ||
|  | // 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); | ||
|  |     } | ||
|  | } | ||
|  | 
 |