forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |