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(){}
64 IMemAllocator
* m_Allocator
;
65 CMediaSample
* m_Next
;
66 REFERENCE_TIME m_StartTime
;
67 REFERENCE_TIME m_StopTime
;
68 LONGLONG m_MediaStart
;
70 AM_MEDIA_TYPE
* m_MediaType
;
76 BOOL m_bMediaTimeValid
;
81 CMediaSample::CMediaSample(
82 IMemAllocator
* Allocator
,
88 m_ActualLength(BufferSize
),
89 m_BufferSize(BufferSize
),
90 m_Allocator(Allocator
),
106 CMediaSample::QueryInterface(
110 if (IsEqualGUID(refiid
, IID_IUnknown
) ||
111 IsEqualGUID(refiid
, IID_IMediaSample
))
113 *Output
= PVOID(this);
114 reinterpret_cast<IMediaSample
*>(*Output
)->AddRef();
117 if (IsEqualGUID(refiid
, IID_IMediaSample2
))
120 OutputDebugStringW(L
"CMediaSample::QueryInterface requested IMediaSample2 interface\n");
122 *Output
= (IMediaSample2
*)(this);
123 reinterpret_cast<IMediaSample2
*>(*Output
)->AddRef();
128 return E_NOINTERFACE
;
131 //-------------------------------------------------------------------
132 // IMediaSample interface
136 CMediaSample::GetPointer(
142 *ppBuffer
= m_Buffer
;
148 CMediaSample::GetSize()
155 CMediaSample::GetTime(
156 REFERENCE_TIME
*pTimeStart
,
157 REFERENCE_TIME
*pTimeEnd
)
161 if (!pTimeStart
|| !pTimeEnd
)
164 if (!(m_Flags
& (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
)))
167 return VFW_E_SAMPLE_TIME_NOT_SET
;
170 *pTimeStart
= m_StartTime
;
172 if (m_Flags
& AM_SAMPLE_STOPVALID
)
174 *pTimeEnd
= m_StopTime
;
179 *pTimeEnd
= m_StartTime
+ 1;
180 hr
= VFW_S_NO_STOP_TIME
;
187 CMediaSample::SetTime(REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
)
191 m_Flags
&= ~(AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
197 m_Flags
&= ~(AM_SAMPLE_STOPVALID
);
198 m_Flags
|= AM_SAMPLE_TIMEVALID
;
199 m_StartTime
= *pTimeStart
;
204 m_Flags
|= (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
205 m_StartTime
= *pTimeStart
;
206 m_StopTime
= *pTimeEnd
;
213 CMediaSample::IsSyncPoint()
215 return (m_Flags
& AM_SAMPLE_SPLICEPOINT
) ? S_OK
: S_FALSE
;
219 CMediaSample::SetSyncPoint(BOOL bIsSyncPoint
)
222 m_Flags
|= AM_SAMPLE_SPLICEPOINT
;
224 m_Flags
&= ~AM_SAMPLE_SPLICEPOINT
;
231 CMediaSample::IsPreroll()
233 return (m_Flags
& AM_SAMPLE_PREROLL
) ? S_OK
: S_FALSE
;
238 CMediaSample::SetPreroll(BOOL bIsPreroll
)
241 m_Flags
|= AM_SAMPLE_PREROLL
;
243 m_Flags
&= ~AM_SAMPLE_PREROLL
;
250 CMediaSample::GetActualDataLength()
252 return m_ActualLength
;
257 CMediaSample::SetActualDataLength(long Length
)
259 if (Length
> m_BufferSize
)
260 return VFW_E_BUFFER_OVERFLOW
;
262 m_ActualLength
= Length
;
268 CMediaSample::GetMediaType(AM_MEDIA_TYPE
**ppMediaType
)
270 OutputDebugStringW(L
"CMediaSample::GetMediaType\n");
284 CMediaSample::SetMediaType(AM_MEDIA_TYPE
*pMediaType
)
286 OutputDebugStringW(L
"CMediaSample::SetMediaType NotImplemented\n");
294 CMediaSample::IsDiscontinuity()
296 return (m_Flags
& AM_SAMPLE_DATADISCONTINUITY
) ? S_OK
: S_FALSE
;
301 CMediaSample::SetDiscontinuity(BOOL bDiscontinuity
)
304 m_Flags
|= AM_SAMPLE_DATADISCONTINUITY
;
306 m_Flags
&= ~AM_SAMPLE_DATADISCONTINUITY
;
313 CMediaSample::GetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
315 if (!pTimeStart
|| !pTimeEnd
)
318 if (!m_bMediaTimeValid
)
319 return VFW_E_MEDIA_TIME_NOT_SET
;
321 m_MediaStart
= *pTimeStart
;
322 m_MediaStop
= *pTimeEnd
;
329 CMediaSample::SetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
331 if (!pTimeStart
|| !pTimeEnd
)
333 m_bMediaTimeValid
= false;
337 m_MediaStart
= *pTimeStart
;
338 m_MediaStop
= *pTimeEnd
;
348 CMediaSample_Constructor(
349 IMemAllocator
* Allocator
,
355 OutputDebugStringW(L
"CMediaSample_Constructor\n");
357 CMediaSample
* handler
= new CMediaSample(Allocator
, pBuffer
, BufferSize
);
360 return E_OUTOFMEMORY
;
362 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
366 return E_NOINTERFACE
;