84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// File: SeekPT.cpp
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Desc: DirectShow base classes.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 1992-2001 Microsoft Corporation.  All rights reserved.
							 | 
						||
| 
								 | 
							
								//------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <streams.h>
							 | 
						||
| 
								 | 
							
								#include "seekpt.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//==================================================================
							 | 
						||
| 
								 | 
							
								// CreateInstance
							 | 
						||
| 
								 | 
							
								// This goes in the factory template table to create new instances
							 | 
						||
| 
								 | 
							
								// If there is already a mapper instance - return that, else make one
							 | 
						||
| 
								 | 
							
								// and save it in a static variable so that forever after we can return that.
							 | 
						||
| 
								 | 
							
								//==================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CUnknown * CSeekingPassThru::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return new CSeekingPassThru(NAME("Seeking PassThru"),pUnk, phr);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (riid == IID_ISeekingPassThru) {
							 | 
						||
| 
								 | 
							
								        return GetInterface((ISeekingPassThru *) this, ppv);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        if (m_pPosPassThru &&
							 | 
						||
| 
								 | 
							
								            (riid == IID_IMediaSeeking ||
							 | 
						||
| 
								 | 
							
								             riid == IID_IMediaPosition)) {
							 | 
						||
| 
								 | 
							
								            return m_pPosPassThru->NonDelegatingQueryInterface(riid,ppv);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            return CUnknown::NonDelegatingQueryInterface(riid, ppv);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CSeekingPassThru::CSeekingPassThru( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr )
							 | 
						||
| 
								 | 
							
								                            : CUnknown(pName, pUnk, phr),
							 | 
						||
| 
								 | 
							
								                            m_pPosPassThru(NULL)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CSeekingPassThru::~CSeekingPassThru()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    delete m_pPosPassThru;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDMETHODIMP CSeekingPassThru::Init(BOOL bRendererSeeking, IPin *pPin)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    HRESULT hr = NOERROR;
							 | 
						||
| 
								 | 
							
								    if (m_pPosPassThru) {
							 | 
						||
| 
								 | 
							
								        hr = E_FAIL;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        m_pPosPassThru =
							 | 
						||
| 
								 | 
							
								            bRendererSeeking ?
							 | 
						||
| 
								 | 
							
								                new CRendererPosPassThru(
							 | 
						||
| 
								 | 
							
								                    NAME("Render Seeking COM object"),
							 | 
						||
| 
								 | 
							
								                    (IUnknown *)this,
							 | 
						||
| 
								 | 
							
								                    &hr,
							 | 
						||
| 
								 | 
							
								                    pPin) :
							 | 
						||
| 
								 | 
							
								                new CPosPassThru(
							 | 
						||
| 
								 | 
							
								                    NAME("Render Seeking COM object"),
							 | 
						||
| 
								 | 
							
								                    (IUnknown *)this,
							 | 
						||
| 
								 | 
							
								                    &hr,
							 | 
						||
| 
								 | 
							
								                    pPin);
							 | 
						||
| 
								 | 
							
								        if (!m_pPosPassThru) {
							 | 
						||
| 
								 | 
							
								            hr = E_OUTOFMEMORY;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            if (FAILED(hr)) {
							 | 
						||
| 
								 | 
							
								                delete m_pPosPassThru;
							 | 
						||
| 
								 | 
							
								                m_pPosPassThru = NULL;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return hr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |