📄 ctlutil.cpp
字号:
CheckPointer(ppv,E_POINTER);
*ppv = NULL;
if (riid == IID_IMediaSeeking) {
return GetInterface( static_cast<IMediaSeeking *>(this), ppv);
}
return CMediaPosition::NonDelegatingQueryInterface(riid,ppv);
}
// Return the IMediaPosition interface from our peer
HRESULT
CPosPassThru::GetPeer(IMediaPosition ** ppMP)
{
*ppMP = NULL;
IPin *pConnected;
HRESULT hr = m_pPin->ConnectedTo(&pConnected);
if (FAILED(hr)) {
return E_NOTIMPL;
}
IMediaPosition * pMP;
hr = pConnected->QueryInterface(IID_IMediaPosition, (void **) &pMP);
pConnected->Release();
if (FAILED(hr)) {
return E_NOTIMPL;
}
*ppMP = pMP;
return S_OK;
}
// Return the IMediaSeeking interface from our peer
HRESULT
CPosPassThru::GetPeerSeeking(IMediaSeeking ** ppMS)
{
*ppMS = NULL;
IPin *pConnected;
HRESULT hr = m_pPin->ConnectedTo(&pConnected);
if (FAILED(hr)) {
return E_NOTIMPL;
}
IMediaSeeking * pMS;
hr = pConnected->QueryInterface(IID_IMediaSeeking, (void **) &pMS);
pConnected->Release();
if (FAILED(hr)) {
return E_NOTIMPL;
}
*ppMS = pMS;
return S_OK;
}
// --- IMediaSeeking methods ----------
STDMETHODIMP
CPosPassThru::GetCapabilities(DWORD * pCaps)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->GetCapabilities(pCaps);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::CheckCapabilities(DWORD * pCaps)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->CheckCapabilities(pCaps);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::IsFormatSupported(const GUID * pFormat)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->IsFormatSupported(pFormat);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::QueryPreferredFormat(GUID *pFormat)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->QueryPreferredFormat(pFormat);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::SetTimeFormat(const GUID * pFormat)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->SetTimeFormat(pFormat);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::GetTimeFormat(GUID *pFormat)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->GetTimeFormat(pFormat);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::IsUsingTimeFormat(const GUID * pFormat)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->IsUsingTimeFormat(pFormat);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::ConvertTimeFormat(LONGLONG * pTarget, const GUID * pTargetFormat,
LONGLONG Source, const GUID * pSourceFormat )
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat );
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::SetPositions( LONGLONG * pCurrent, DWORD CurrentFlags
, LONGLONG * pStop, DWORD StopFlags )
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->SetPositions(pCurrent, CurrentFlags, pStop, StopFlags );
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::GetPositions(LONGLONG *pCurrent, LONGLONG * pStop)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->GetPositions(pCurrent,pStop);
pMS->Release();
return hr;
}
HRESULT
CPosPassThru::GetSeekingLongLong
( HRESULT (__stdcall IMediaSeeking::*pMethod)( LONGLONG * )
, LONGLONG * pll
)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (SUCCEEDED(hr))
{
hr = (pMS->*pMethod)(pll);
pMS->Release();
}
return hr;
}
// If we don't have a current position then ask upstream
STDMETHODIMP
CPosPassThru::GetCurrentPosition(LONGLONG *pCurrent)
{
// Can we report the current position
HRESULT hr = GetMediaTime(pCurrent,NULL);
if (SUCCEEDED(hr)) hr = NOERROR;
else hr = GetSeekingLongLong( &IMediaSeeking::GetCurrentPosition, pCurrent );
return hr;
}
STDMETHODIMP
CPosPassThru::GetStopPosition(LONGLONG *pStop)
{
return GetSeekingLongLong( &IMediaSeeking::GetStopPosition, pStop );;
}
STDMETHODIMP
CPosPassThru::GetDuration(LONGLONG *pDuration)
{
return GetSeekingLongLong( &IMediaSeeking::GetDuration, pDuration );;
}
STDMETHODIMP
CPosPassThru::GetPreroll(LONGLONG *pllPreroll)
{
return GetSeekingLongLong( &IMediaSeeking::GetPreroll, pllPreroll );;
}
STDMETHODIMP
CPosPassThru::GetAvailable( LONGLONG *pEarliest, LONGLONG *pLatest )
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->GetAvailable( pEarliest, pLatest );
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::GetRate(double * pdRate)
{
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->GetRate(pdRate);
pMS->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::SetRate(double dRate)
{
if (0.0 == dRate) {
return E_INVALIDARG;
}
IMediaSeeking* pMS;
HRESULT hr = GetPeerSeeking(&pMS);
if (FAILED(hr)) {
return hr;
}
hr = pMS->SetRate(dRate);
pMS->Release();
return hr;
}
// --- IMediaPosition methods ----------
STDMETHODIMP
CPosPassThru::get_Duration(REFTIME * plength)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->get_Duration(plength);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::get_CurrentPosition(REFTIME * pllTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->get_CurrentPosition(pllTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::put_CurrentPosition(REFTIME llTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->put_CurrentPosition(llTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::get_StopTime(REFTIME * pllTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->get_StopTime(pllTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::put_StopTime(REFTIME llTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->put_StopTime(llTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::get_PrerollTime(REFTIME * pllTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->get_PrerollTime(pllTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::put_PrerollTime(REFTIME llTime)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->put_PrerollTime(llTime);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::get_Rate(double * pdRate)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->get_Rate(pdRate);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::put_Rate(double dRate)
{
if (0.0 == dRate) {
return E_INVALIDARG;
}
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->put_Rate(dRate);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::CanSeekForward(LONG *pCanSeekForward)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->CanSeekForward(pCanSeekForward);
pMP->Release();
return hr;
}
STDMETHODIMP
CPosPassThru::CanSeekBackward(LONG *pCanSeekBackward)
{
IMediaPosition* pMP;
HRESULT hr = GetPeer(&pMP);
if (FAILED(hr)) {
return hr;
}
hr = pMP->CanSeekBackward(pCanSeekBackward);
pMP->Release();
return hr;
}
// --- Implements the CRendererPosPassThru class ----------
// Media times (eg current frame, field, sample etc) are passed through the
// filtergraph in media samples. When a renderer gets a sample with media
// times in it, it will call one of the RegisterMediaTime methods we expose
// (one takes an IMediaSample, the other takes the media times direct). We
// store the media times internally and return them in GetCurrentPosition.
CRendererPosPassThru::CRendererPosPassThru(const TCHAR *pName,
LPUNKNOWN pUnk,
HRESULT *phr,
IPin *pPin) :
CPosPassThru(pName,pUnk,phr,pPin),
m_StartMedia(0),
m_EndMedia(0),
m_bReset(TRUE)
{
}
// Sets the media times the object should report
HRESULT
CRendererPosPassThru::RegisterMediaTime(IMediaSample *pMediaSample)
{
ASSERT(pMediaSample);
LONGLONG StartMedia;
LONGLONG EndMedia;
CAutoLock cAutoLock(&m_PositionLock);
// Get the media times from the sample
HRESULT hr = pMediaSample->GetTime(&StartMedia,&EndMedia);
if (FAILED(hr))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -