2025-11-28 00:35:46 +09:00

143 lines
2.8 KiB
C++

#include "Marker.h"
//////////////////////
// CMarker class
// Holds information from IMFStreamSink::PlaceMarker
//
DX11VideoRenderer::CMarker::CMarker(MFSTREAMSINK_MARKER_TYPE eMarkerType) :
m_nRefCount(1),
m_eMarkerType(eMarkerType)
{
PropVariantInit(&m_varMarkerValue);
PropVariantInit(&m_varContextValue);
}
DX11VideoRenderer::CMarker::~CMarker(void)
{
assert(m_nRefCount == 0);
PropVariantClear(&m_varMarkerValue);
PropVariantClear(&m_varContextValue);
}
/* static */
HRESULT DX11VideoRenderer::CMarker::Create(
MFSTREAMSINK_MARKER_TYPE eMarkerType,
const PROPVARIANT* pvarMarkerValue, // Can be NULL.
const PROPVARIANT* pvarContextValue, // Can be NULL.
IMarker** ppMarker
)
{
if (ppMarker == NULL)
{
return E_POINTER;
}
HRESULT hr = S_OK;
CMarker* pMarker = new CMarker(eMarkerType);
if (pMarker == NULL)
{
hr = E_OUTOFMEMORY;
}
// Copy the marker data.
if (SUCCEEDED(hr))
{
if (pvarMarkerValue)
{
hr = PropVariantCopy(&pMarker->m_varMarkerValue, pvarMarkerValue);
}
}
if (SUCCEEDED(hr))
{
if (pvarContextValue)
{
hr = PropVariantCopy(&pMarker->m_varContextValue, pvarContextValue);
}
}
if (SUCCEEDED(hr))
{
*ppMarker = pMarker;
(*ppMarker)->AddRef();
}
SafeRelease(pMarker);
return hr;
}
// IUnknown methods.
ULONG DX11VideoRenderer::CMarker::AddRef(void)
{
return InterlockedIncrement(&m_nRefCount);
}
ULONG DX11VideoRenderer::CMarker::Release(void)
{
ULONG uCount = InterlockedDecrement(&m_nRefCount);
if (uCount == 0)
{
delete this;
}
// For thread safety, return a temporary variable.
return uCount;
}
HRESULT DX11VideoRenderer::CMarker::QueryInterface(REFIID iid, __RPC__deref_out _Result_nullonfailure_ void** ppv)
{
if (!ppv)
{
return E_POINTER;
}
if (iid == IID_IUnknown)
{
*ppv = static_cast<IUnknown*>(this);
}
else if (iid == __uuidof(IMarker))
{
*ppv = static_cast<IMarker*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
// IMarker methods
HRESULT DX11VideoRenderer::CMarker::GetMarkerType(MFSTREAMSINK_MARKER_TYPE* pType)
{
if (pType == NULL)
{
return E_POINTER;
}
*pType = m_eMarkerType;
return S_OK;
}
HRESULT DX11VideoRenderer::CMarker::GetMarkerValue(PROPVARIANT* pvar)
{
if (pvar == NULL)
{
return E_POINTER;
}
return PropVariantCopy(pvar, &m_varMarkerValue);
}
HRESULT DX11VideoRenderer::CMarker::GetContext(PROPVARIANT* pvar)
{
if (pvar == NULL)
{
return E_POINTER;
}
return PropVariantCopy(pvar, &m_varContextValue);
}