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 *Output
= (IMediaSample2
*)(this);
121 reinterpret_cast<IMediaSample2
*>(*Output
)->AddRef();
126 return E_NOINTERFACE
;
129 //-------------------------------------------------------------------
130 // IMediaSample interface
134 CMediaSample::GetPointer(
140 *ppBuffer
= m_Buffer
;
146 CMediaSample::GetSize()
153 CMediaSample::GetTime(
154 REFERENCE_TIME
*pTimeStart
,
155 REFERENCE_TIME
*pTimeEnd
)
159 if (!pTimeStart
|| !pTimeEnd
)
162 if (!(m_Flags
& (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
)))
165 return VFW_E_SAMPLE_TIME_NOT_SET
;
168 *pTimeStart
= m_StartTime
;
170 if (m_Flags
& AM_SAMPLE_STOPVALID
)
172 *pTimeEnd
= m_StopTime
;
177 *pTimeEnd
= m_StartTime
+ 1;
178 hr
= VFW_S_NO_STOP_TIME
;
185 CMediaSample::SetTime(REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
)
189 m_Flags
&= ~(AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
195 m_Flags
&= ~(AM_SAMPLE_STOPVALID
);
196 m_Flags
|= AM_SAMPLE_TIMEVALID
;
197 m_StartTime
= *pTimeStart
;
202 m_Flags
|= (AM_SAMPLE_TIMEVALID
| AM_SAMPLE_STOPVALID
);
203 m_StartTime
= *pTimeStart
;
204 m_StopTime
= *pTimeEnd
;
211 CMediaSample::IsSyncPoint()
213 return (m_Flags
& AM_SAMPLE_SPLICEPOINT
) ? S_OK
: S_FALSE
;
217 CMediaSample::SetSyncPoint(BOOL bIsSyncPoint
)
220 m_Flags
|= AM_SAMPLE_SPLICEPOINT
;
222 m_Flags
&= ~AM_SAMPLE_SPLICEPOINT
;
229 CMediaSample::IsPreroll()
231 return (m_Flags
& AM_SAMPLE_PREROLL
) ? S_OK
: S_FALSE
;
236 CMediaSample::SetPreroll(BOOL bIsPreroll
)
239 m_Flags
|= AM_SAMPLE_PREROLL
;
241 m_Flags
&= ~AM_SAMPLE_PREROLL
;
248 CMediaSample::GetActualDataLength()
250 return m_ActualLength
;
255 CMediaSample::SetActualDataLength(long Length
)
257 if (Length
> m_BufferSize
)
258 return VFW_E_BUFFER_OVERFLOW
;
260 m_ActualLength
= Length
;
266 CMediaSample::GetMediaType(AM_MEDIA_TYPE
**ppMediaType
)
280 CMediaSample::SetMediaType(AM_MEDIA_TYPE
*pMediaType
)
282 OutputDebugStringW(L
"CMediaSample::SetMediaType NotImplemented\n");
290 CMediaSample::IsDiscontinuity()
292 return (m_Flags
& AM_SAMPLE_DATADISCONTINUITY
) ? S_OK
: S_FALSE
;
297 CMediaSample::SetDiscontinuity(BOOL bDiscontinuity
)
300 m_Flags
|= AM_SAMPLE_DATADISCONTINUITY
;
302 m_Flags
&= ~AM_SAMPLE_DATADISCONTINUITY
;
309 CMediaSample::GetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
311 if (!pTimeStart
|| !pTimeEnd
)
314 if (!m_bMediaTimeValid
)
315 return VFW_E_MEDIA_TIME_NOT_SET
;
317 m_MediaStart
= *pTimeStart
;
318 m_MediaStop
= *pTimeEnd
;
325 CMediaSample::SetMediaTime(LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
327 if (!pTimeStart
|| !pTimeEnd
)
329 m_bMediaTimeValid
= false;
333 m_MediaStart
= *pTimeStart
;
334 m_MediaStop
= *pTimeEnd
;
344 CMediaSample_Constructor(
345 IMemAllocator
* Allocator
,
352 OutputDebugStringW(L
"CMediaSample_Constructor\n");
355 CMediaSample
* handler
= new CMediaSample(Allocator
, pBuffer
, BufferSize
);
358 return E_OUTOFMEMORY
;
360 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
364 return E_NOINTERFACE
;