2009-02-09 21:15:56 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// File: AMExtra.cpp
|
|
|
|
//
|
|
|
|
// Desc: DirectShow base classes - implements CRenderedInputPin class.
|
|
|
|
//
|
2018-04-28 16:52:15 +00:00
|
|
|
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
2009-02-09 21:15:56 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
2018-04-28 16:52:15 +00:00
|
|
|
#include <streams.h> // DirectShow base class definitions
|
2009-02-09 21:15:56 +00:00
|
|
|
#include <mmsystem.h> // Needed for definition of timeGetTime
|
|
|
|
#include <limits.h> // Standard data type limit definitions
|
2018-04-28 16:52:15 +00:00
|
|
|
#include <measure.h> // Used for time critical log functions
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
#include "amextra.h"
|
|
|
|
|
|
|
|
#pragma warning(disable:4355)
|
|
|
|
|
|
|
|
// Implements CRenderedInputPin class
|
|
|
|
|
2018-04-28 16:52:15 +00:00
|
|
|
CRenderedInputPin::CRenderedInputPin(__in_opt LPCTSTR pObjectName,
|
|
|
|
__in CBaseFilter *pFilter,
|
|
|
|
__in CCritSec *pLock,
|
|
|
|
__inout HRESULT *phr,
|
|
|
|
__in_opt LPCWSTR pName) :
|
2009-02-09 21:15:56 +00:00
|
|
|
CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
|
|
|
|
m_bAtEndOfStream(FALSE),
|
|
|
|
m_bCompleteNotified(FALSE)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#ifdef UNICODE
|
2018-04-28 16:52:15 +00:00
|
|
|
CRenderedInputPin::CRenderedInputPin(__in_opt LPCSTR pObjectName,
|
|
|
|
__in CBaseFilter *pFilter,
|
|
|
|
__in CCritSec *pLock,
|
|
|
|
__inout HRESULT *phr,
|
|
|
|
__in_opt LPCWSTR pName) :
|
2009-02-09 21:15:56 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|