summaryrefslogtreecommitdiff
path: root/third_party/BaseClasses/amextra.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/BaseClasses/amextra.cpp')
-rw-r--r--third_party/BaseClasses/amextra.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/third_party/BaseClasses/amextra.cpp b/third_party/BaseClasses/amextra.cpp
new file mode 100644
index 00000000..af0de96d
--- /dev/null
+++ b/third_party/BaseClasses/amextra.cpp
@@ -0,0 +1,111 @@
+//------------------------------------------------------------------------------
+// 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);
+ }
+}
+