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