#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(this); } else if (iid == __uuidof(IMarker)) { *ppv = static_cast(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); }