Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy * FILE: dll/directx/ksproxy/mediasample.cpp * PURPOSE: IMediaSample interface * * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) */#include "precomp.h"
class CMediaSample : public IMediaSample{public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef() { InterlockedIncrement(&m_Ref); return m_Ref; } STDMETHODIMP_(ULONG) Release() { InterlockedDecrement(&m_Ref); if (!m_Ref) { if (m_Allocator) { m_Allocator->ReleaseBuffer((IMediaSample*)this); return 0; } delete this; return 0; } return m_Ref; }
HRESULT STDMETHODCALLTYPE GetPointer(BYTE **ppBuffer); long STDMETHODCALLTYPE GetSize(void); HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); HRESULT STDMETHODCALLTYPE SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); HRESULT STDMETHODCALLTYPE IsSyncPoint(); HRESULT STDMETHODCALLTYPE SetSyncPoint(BOOL bIsSyncPoint); HRESULT STDMETHODCALLTYPE IsPreroll(); HRESULT STDMETHODCALLTYPE SetPreroll(BOOL bIsPreroll); long STDMETHODCALLTYPE GetActualDataLength(); HRESULT STDMETHODCALLTYPE SetActualDataLength(long Length); HRESULT STDMETHODCALLTYPE GetMediaType(AM_MEDIA_TYPE **ppMediaType); HRESULT STDMETHODCALLTYPE SetMediaType(AM_MEDIA_TYPE *pMediaType); HRESULT STDMETHODCALLTYPE IsDiscontinuity(); HRESULT STDMETHODCALLTYPE SetDiscontinuity(BOOL bDiscontinuity); HRESULT STDMETHODCALLTYPE GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd); HRESULT STDMETHODCALLTYPE SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd);
CMediaSample(IMemAllocator * Allocator, BYTE * Buffer, LONG BufferSize); virtual ~CMediaSample(){}
protected: ULONG m_Flags; ULONG m_TypeFlags; BYTE * m_Buffer; LONG m_ActualLength; LONG m_BufferSize; IMemAllocator * m_Allocator; CMediaSample * m_Next; REFERENCE_TIME m_StartTime; REFERENCE_TIME m_StopTime; LONGLONG m_MediaStart; LONGLONG m_MediaStop; AM_MEDIA_TYPE * m_MediaType; ULONG m_StreamId;
public: LONG m_Ref;
BOOL m_bMediaTimeValid;
};
CMediaSample::CMediaSample( IMemAllocator * Allocator, BYTE * Buffer, LONG BufferSize) : m_Flags(0), m_TypeFlags(0), m_Buffer(Buffer), m_ActualLength(BufferSize), m_BufferSize(BufferSize), m_Allocator(Allocator), m_Next(0), m_StartTime(0), m_StopTime(0), m_MediaStart(0), m_MediaStop(0), m_MediaType(0), m_StreamId(0), m_Ref(0), m_bMediaTimeValid(0){}
HRESULTSTDMETHODCALLTYPECMediaSample::QueryInterface( IN REFIID refiid, OUT PVOID* Output){ if (IsEqualGUID(refiid, IID_IUnknown) || IsEqualGUID(refiid, IID_IMediaSample)) { *Output = PVOID(this); reinterpret_cast<IMediaSample*>(*Output)->AddRef(); return NOERROR; } if (IsEqualGUID(refiid, IID_IMediaSample2)) {#if 0 *Output = (IMediaSample2*)(this); reinterpret_cast<IMediaSample2*>(*Output)->AddRef(); return NOERROR;#endif }
return E_NOINTERFACE;}
//-------------------------------------------------------------------// IMediaSample interface//HRESULTSTDMETHODCALLTYPECMediaSample::GetPointer( BYTE **ppBuffer){ if (!ppBuffer) return E_POINTER;
*ppBuffer = m_Buffer; return S_OK;}
longSTDMETHODCALLTYPECMediaSample::GetSize(){ return m_BufferSize;}
HRESULTSTDMETHODCALLTYPECMediaSample::GetTime( REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd){ HRESULT hr;
if (!pTimeStart || !pTimeEnd) return E_POINTER;
if (!(m_Flags & (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID))) { // no time is set return VFW_E_SAMPLE_TIME_NOT_SET; }
*pTimeStart = m_StartTime;
if (m_Flags & AM_SAMPLE_STOPVALID) { *pTimeEnd = m_StopTime; hr = NOERROR; } else { *pTimeEnd = m_StartTime + 1; hr = VFW_S_NO_STOP_TIME; } return hr;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd){ if (!pTimeStart) { m_Flags &= ~(AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); return NOERROR; }
if (!pTimeEnd) { m_Flags &= ~(AM_SAMPLE_STOPVALID); m_Flags |= AM_SAMPLE_TIMEVALID; m_StartTime = *pTimeStart; return NOERROR; }
m_Flags |= (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); m_StartTime = *pTimeStart; m_StopTime = *pTimeEnd;
return NOERROR;}
HRESULTSTDMETHODCALLTYPECMediaSample::IsSyncPoint(){ return (m_Flags & AM_SAMPLE_SPLICEPOINT) ? S_OK : S_FALSE;}HRESULTSTDMETHODCALLTYPECMediaSample::SetSyncPoint(BOOL bIsSyncPoint){ if (bIsSyncPoint) m_Flags |= AM_SAMPLE_SPLICEPOINT; else m_Flags &= ~AM_SAMPLE_SPLICEPOINT;
return NOERROR;}
HRESULTSTDMETHODCALLTYPECMediaSample::IsPreroll(){ return (m_Flags & AM_SAMPLE_PREROLL) ? S_OK : S_FALSE;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetPreroll(BOOL bIsPreroll){ if (bIsPreroll) m_Flags |= AM_SAMPLE_PREROLL; else m_Flags &= ~AM_SAMPLE_PREROLL;
return NOERROR;}
longSTDMETHODCALLTYPECMediaSample::GetActualDataLength(){ return m_ActualLength;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetActualDataLength(long Length){ if (Length > m_BufferSize) return VFW_E_BUFFER_OVERFLOW;
m_ActualLength = Length; return NOERROR;}
HRESULTSTDMETHODCALLTYPECMediaSample::GetMediaType(AM_MEDIA_TYPE **ppMediaType){ if (!m_MediaType) { *ppMediaType = NULL; return S_FALSE; }
assert(0); return E_NOTIMPL;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType){ OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n"); return E_NOTIMPL;}
HRESULTSTDMETHODCALLTYPECMediaSample::IsDiscontinuity(){ return (m_Flags & AM_SAMPLE_DATADISCONTINUITY) ? S_OK : S_FALSE;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetDiscontinuity(BOOL bDiscontinuity){ if (bDiscontinuity) m_Flags |= AM_SAMPLE_DATADISCONTINUITY; else m_Flags &= ~AM_SAMPLE_DATADISCONTINUITY;
return NOERROR;}
HRESULTSTDMETHODCALLTYPECMediaSample::GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd){ if (!pTimeStart || !pTimeEnd) return E_POINTER;
if (!m_bMediaTimeValid) return VFW_E_MEDIA_TIME_NOT_SET;
m_MediaStart = *pTimeStart; m_MediaStop = *pTimeEnd;
return NOERROR;}
HRESULTSTDMETHODCALLTYPECMediaSample::SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd){ if (!pTimeStart || !pTimeEnd) { m_bMediaTimeValid = false; return NOERROR; }
m_MediaStart = *pTimeStart; m_MediaStop = *pTimeEnd;
return NOERROR;}
HRESULTWINAPICMediaSample_Constructor( IMemAllocator* Allocator, BYTE* pBuffer, ULONG BufferSize, REFIID riid, LPVOID * ppv){#ifdef KSPROXY_TRACE OutputDebugStringW(L"CMediaSample_Constructor\n");#endif
CMediaSample * handler = new CMediaSample(Allocator, pBuffer, BufferSize);
if (!handler) return E_OUTOFMEMORY;
if (FAILED(handler->QueryInterface(riid, ppv))) { /* not supported */ delete handler; return E_NOINTERFACE; }
return NOERROR;}