topical media & game development

talk show tell print

hush-src-multi-BaseClasses-amextra.cpp / cpp



  //------------------------------------------------------------------------------
  // File: AMExtra.cpp
  //
  // Desc: DirectShow base classes - implements CRenderedInputPin class.
  //
  // Copyright (c) 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(TCHAR *pObjectName,
                                       CBaseFilter *pFilter,
                                       CCritSec *pLock,
                                       HRESULT *phr,
                                       LPCWSTR pName) :
      CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
      m_bAtEndOfStream(FALSE),
      m_bCompleteNotified(FALSE)
  {
  }
  ifdef UNICODE
  CRenderedInputPin::CRenderedInputPin(CHAR *pObjectName,
                                       CBaseFilter *pFilter,
                                       CCritSec *pLock,
                                       HRESULT *phr,
                                       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);
      }
  }
  
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.