mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-09-08 05:42:54 +02:00
Update it to the version found at https://github.com/Microsoft/Windows-classic-samples , which is in an MIT licensed repo, and add the LICENSE file (edited to remove the SIL Open Font LICENSE part since that doesn't apply). Some modifications have been made to reduce the diff/stop git complaining (not including any file that wasn't in the previous version and removing the related header includes in streams.h, and fixing some but not all of the whitespace issues).
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);
|
|
}
|
|
}
|
|
|