2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy
4 * FILE: dll/directx/ksproxy/mediasample.cpp
5 * PURPOSE: IMediaSample interface
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
11 class CMediaSample
: public IMediaSample
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
29 m_Allocator
->ReleaseBuffer((IMediaSample
*)this);
38 HRESULT STDMETHODCALLTYPE
GetPointer(BYTE
**ppBuffer
);
39 long STDMETHODCALLTYPE
GetSize(void);
40 HRESULT STDMETHODCALLTYPE
GetTime(REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
);
41 HRESULT STDMETHODCALLTYPE
SetTime(REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
);
42 HRESULT STDMETHODCALLTYPE
IsSyncPoint();
43 HRESULT STDMETHODCALLTYPE
SetSyncPoint(BOOL bIsSyncPoint
);
44 HRESULT STDMETHODCALLTYPE
IsPreroll();
45 HRESULT STDMETHODCALLTYPE
SetPreroll(BOOL bIsPreroll
);
46 long STDMETHODCALLTYPE
GetActualDataLength();
47 HRESULT STDMETHODCALLTYPE
SetActualDataLength(long Length
);
48 HRESULT STDMETHODCALLTYPE
GetMediaType(AM_MEDIA_TYPE
**ppMediaType
);
49 HRESULT STDMETHODCALLTYPE
SetMediaType(AM_MEDIA_TYPE
*pMediaType
);
50 HRESULT STDMETHODCALLTYPE
IsDiscontinuity();
51 HRESULT STDMETHODCALLTYPE
SetDiscontinuity(BOOL bDiscontinuity
);
52 HRESULT STDMETHODCALLTYPE
GetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
);
53 HRESULT STDMETHODCALLTYPE
SetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
);
55 CMediaSample(IMemAllocator
* Allocator
, BYTE
* Buffer
, LONG BufferSize
);
56 virtual ~CMediaSample(){}
60 IMemAllocator
* m_Allocator
;
64 REFERENCE_TIME m_StartTime
;
65 REFERENCE_TIME m_StopTime
;
67 BOOL m_bMediaTimeValid
;
68 LONGLONG m_MediaStart
;
73 CMediaSample::CMediaSample(
74 IMemAllocator
* Allocator
,
76 LONG BufferSize
) : m_Ref(0),
77 m_Allocator(Allocator
),
79 m_BufferSize(BufferSize
),
80 m_ActualLength(BufferSize
),
93 CMediaSample::QueryInterface(
97 if (IsEqualGUID(refiid
, IID_IUnknown
) ||
98 IsEqualGUID(refiid
, IID_IMediaSample
))
100 *Output
= PVOID(this);
101 reinterpret_cast<IMediaSample
*>(*Output
)->AddRef();
104 if (IsEqualGUID(refiid
, IID_IMediaSample2
))
107 OutputDebugStringW(L
"CMediaSample::QueryInterface requested IMediaSample2 interface\n");
109 *Output
= (IMediaSample2
*)(this);
110 reinterpret_cast<IMediaSample2
*>(*Output
)->AddRef();
115 return E_NOINTERFACE
;
118 //-------------------------------------------------------------------
119 // IMediaSample interface
123 CMediaSample::GetPointer(
129 *ppBuffer
= m_Buffer
;
135 CMediaSample::GetSize()
142 CMediaSample::GetTime(
143 REFERENCE_TIME
*pTimeStart
,
144 REFERENCE_TIME
*pTimeEnd
)
148 if (!pTimeStart
|| !pTimeEnd
)
151 if (!(m_Flags
& (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
)))
154 return VFW_E_SAMPLE_TIME_NOT_SET
;
157 *pTimeStart
= m_StartTime
;
159 if (m_Flags
& AM_SAMPLE_STOPVALID
)
161 *pTimeEnd
= m_StopTime
;
166 *pTimeEnd
= m_StartTime
+ 1;
167 hr
= VFW_S_NO_STOP_TIME
;
174 CMediaSample::SetTime(REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
)
178 m_Flags
&= ~(AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
184 m_Flags
&= ~(AM_SAMPLE_STOPVALID
);
185 m_Flags
|= AM_SAMPLE_TIMEVALID
;
186 m_StartTime
= *pTimeStart
;
191 m_Flags
|= (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
192 m_StartTime
= *pTimeStart
;
193 m_StopTime
= *pTimeEnd
;
200 CMediaSample::IsSyncPoint()
202 return (m_Flags
& AM_SAMPLE_SPLICEPOINT
) ? S_OK
: S_FALSE
;
206 CMediaSample::SetSyncPoint(BOOL bIsSyncPoint
)
209 m_Flags
|= AM_SAMPLE_SPLICEPOINT
;
211 m_Flags
&= ~AM_SAMPLE_SPLICEPOINT
;
218 CMediaSample::IsPreroll()
220 return (m_Flags
& AM_SAMPLE_PREROLL
) ? S_OK
: S_FALSE
;
225 CMediaSample::SetPreroll(BOOL bIsPreroll
)
228 m_Flags
|= AM_SAMPLE_PREROLL
;
230 m_Flags
&= ~AM_SAMPLE_PREROLL
;
237 CMediaSample::GetActualDataLength()
239 return m_ActualLength
;
244 CMediaSample::SetActualDataLength(long Length
)
246 if (Length
> m_BufferSize
)
247 return VFW_E_BUFFER_OVERFLOW
;
249 m_ActualLength
= Length
;
255 CMediaSample::GetMediaType(AM_MEDIA_TYPE
**ppMediaType
)
257 OutputDebugStringW(L
"CMediaSample::GetMediaType NotImplemented\n");
264 CMediaSample::SetMediaType(AM_MEDIA_TYPE
*pMediaType
)
266 OutputDebugStringW(L
"CMediaSample::SetMediaType NotImplemented\n");
274 CMediaSample::IsDiscontinuity()
276 return (m_Flags
& AM_SAMPLE_DATADISCONTINUITY
) ? S_OK
: S_FALSE
;
281 CMediaSample::SetDiscontinuity(BOOL bDiscontinuity
)
284 m_Flags
|= AM_SAMPLE_DATADISCONTINUITY
;
286 m_Flags
&= ~AM_SAMPLE_DATADISCONTINUITY
;
293 CMediaSample::GetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
295 if (!pTimeStart
|| !pTimeEnd
)
298 if (!m_bMediaTimeValid
)
299 return VFW_E_MEDIA_TIME_NOT_SET
;
301 m_MediaStart
= *pTimeStart
;
302 m_MediaStop
= *pTimeEnd
;
309 CMediaSample::SetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
311 if (!pTimeStart
|| !pTimeEnd
)
313 m_bMediaTimeValid
= false;
317 m_MediaStart
= *pTimeStart
;
318 m_MediaStop
= *pTimeEnd
;
328 CMediaSample_Constructor(
329 IMemAllocator
* Allocator
,
335 OutputDebugStringW(L
"CMediaSample_Constructor\n");
337 CMediaSample
* handler
= new CMediaSample(Allocator
, pBuffer
, BufferSize
);
340 return E_OUTOFMEMORY
;
342 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
346 return E_NOINTERFACE
;