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