00001
00002
00003
00004
00005
00006 #include <streams.h>
00007 #include <mmsystem.h>
00008 #include <limits.h>
00009 #include <measure.h>
00010
00011 #include "amextra.h"
00012
00013 #pragma warning(disable:4355)
00014
00015 CRenderedInputPin::CRenderedInputPin(TCHAR *pObjectName,
00016 CBaseFilter *pFilter,
00017 CCritSec *pLock,
00018 HRESULT *phr,
00019 LPCWSTR pName) :
00020 CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
00021 m_bAtEndOfStream(FALSE),
00022 m_bCompleteNotified(FALSE)
00023 {
00024 }
00025 #ifdef UNICODE
00026 CRenderedInputPin::CRenderedInputPin(CHAR *pObjectName,
00027 CBaseFilter *pFilter,
00028 CCritSec *pLock,
00029 HRESULT *phr,
00030 LPCWSTR pName) :
00031 CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
00032 m_bAtEndOfStream(FALSE),
00033 m_bCompleteNotified(FALSE)
00034 {
00035 }
00036 #endif
00037
00038 STDMETHODIMP CRenderedInputPin::EndOfStream()
00039 {
00040 HRESULT hr = CheckStreaming();
00041
00042
00043 if (S_OK == hr && !m_bAtEndOfStream) {
00044 m_bAtEndOfStream = TRUE;
00045 FILTER_STATE fs;
00046 EXECUTE_ASSERT(SUCCEEDED(m_pFilter->GetState(0, &fs)));
00047 if (fs == State_Running) {
00048 DoCompleteHandling();
00049 }
00050 }
00051 return hr;
00052 }
00053
00054 STDMETHODIMP CRenderedInputPin::EndFlush()
00055 {
00056 CAutoLock lck(m_pLock);
00057
00058
00059 m_bAtEndOfStream = FALSE;
00060 m_bCompleteNotified = FALSE;
00061
00062 return CBaseInputPin::EndFlush();
00063 }
00064
00065 HRESULT CRenderedInputPin::Run(REFERENCE_TIME tStart)
00066 {
00067 UNREFERENCED_PARAMETER(tStart);
00068 m_bCompleteNotified = FALSE;
00069 if (m_bAtEndOfStream) {
00070 DoCompleteHandling();
00071 }
00072 return S_OK;
00073 }
00074
00075 HRESULT CRenderedInputPin::Active()
00076 {
00077 m_bAtEndOfStream = FALSE;
00078 m_bCompleteNotified = FALSE;
00079 return CBaseInputPin::Active();
00080 }
00081
00082 void CRenderedInputPin::DoCompleteHandling()
00083 {
00084 ASSERT(m_bAtEndOfStream);
00085 if (!m_bCompleteNotified) {
00086 m_bCompleteNotified = TRUE;
00087 m_pFilter->NotifyEvent(EC_COMPLETE, S_OK, (LONG_PTR)(IBaseFilter *)m_pFilter);
00088 }
00089 }
00090