mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-04 15:36:35 +00:00
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;
|
||
|
}
|
||
|
|