2 * Implements IMediaSample2 for CMemMediaSample.
4 * hidenori@a2.ctktv.ne.jp
14 #include "wine/obj_base.h"
18 #include "debugtools.h"
19 DEFAULT_DEBUG_CHANNEL(quartz);
21 #include "quartz_private.h"
27 IMediaSample2_fnQueryInterface(IMediaSample2* iface,REFIID riid,void** ppobj)
29 ICOM_THIS(CMemMediaSample,iface);
31 TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj);
36 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
37 IsEqualGUID( riid, &IID_IMediaSample ) ||
38 IsEqualGUID( riid, &IID_IMediaSample2 ) )
41 IMediaSample2_AddRef(iface);
49 IMediaSample2_fnAddRef(IMediaSample2* iface)
51 ICOM_THIS(CMemMediaSample,iface);
53 TRACE("(%p)->()\n",This);
55 return InterlockedExchangeAdd(&(This->ref),1) + 1;
59 IMediaSample2_fnRelease(IMediaSample2* iface)
61 ICOM_THIS(CMemMediaSample,iface);
64 TRACE("(%p)->()\n",This);
66 ref = InterlockedExchangeAdd(&(This->ref),-1) - 1;
70 IMemAllocator_ReleaseBuffer(This->pOwner,(IMediaSample*)iface);
78 IMediaSample2_fnGetPointer(IMediaSample2* iface,BYTE** ppData)
80 ICOM_THIS(CMemMediaSample,iface);
82 TRACE("(%p)->()\n",This);
87 *ppData = This->prop.pbBuffer;
92 IMediaSample2_fnGetSize(IMediaSample2* iface)
94 ICOM_THIS(CMemMediaSample,iface);
96 TRACE("(%p)->()\n",This);
98 return This->prop.cbBuffer;
101 static HRESULT WINAPI
102 IMediaSample2_fnGetTime(IMediaSample2* iface,REFERENCE_TIME* prtStart,REFERENCE_TIME* prtEnd)
104 ICOM_THIS(CMemMediaSample,iface);
106 TRACE("(%p)->(%p,%p)\n",This,prtStart,prtEnd);
108 if ( prtStart == NULL || prtEnd == NULL )
111 if ( ( This->prop.dwSampleFlags & AM_SAMPLE_TIMEVALID ) &&
112 ( This->prop.dwSampleFlags & AM_SAMPLE_STOPVALID ) )
114 *prtStart = This->prop.tStart;
115 *prtEnd = This->prop.tStop;
119 return VFW_E_MEDIA_TIME_NOT_SET;
122 static HRESULT WINAPI
123 IMediaSample2_fnSetTime(IMediaSample2* iface,REFERENCE_TIME* prtStart,REFERENCE_TIME* prtEnd)
125 ICOM_THIS(CMemMediaSample,iface);
127 TRACE("(%p)->(%p,%p) stub!\n",This,prtStart,prtEnd);
129 This->prop.dwSampleFlags &= ~(AM_SAMPLE_TIMEVALID|AM_SAMPLE_STOPVALID);
130 if ( prtStart != NULL )
132 This->prop.dwSampleFlags |= AM_SAMPLE_TIMEVALID;
133 This->prop.tStart = *prtStart;
135 if ( prtEnd != NULL )
137 This->prop.dwSampleFlags |= AM_SAMPLE_STOPVALID;
138 This->prop.tStop = *prtEnd;
144 static HRESULT WINAPI
145 IMediaSample2_fnIsSyncPoint(IMediaSample2* iface)
147 ICOM_THIS(CMemMediaSample,iface);
149 TRACE("(%p)->()\n",This);
151 return ( This->prop.dwSampleFlags & AM_SAMPLE_SPLICEPOINT ) ?
155 static HRESULT WINAPI
156 IMediaSample2_fnSetSyncPoint(IMediaSample2* iface,BOOL bSync)
158 ICOM_THIS(CMemMediaSample,iface);
160 TRACE("(%p)->(%d)\n",This,bSync);
163 This->prop.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT;
165 This->prop.dwSampleFlags &= ~AM_SAMPLE_SPLICEPOINT;
170 static HRESULT WINAPI
171 IMediaSample2_fnIsPreroll(IMediaSample2* iface)
173 ICOM_THIS(CMemMediaSample,iface);
175 TRACE("(%p)->()\n",This);
177 return ( This->prop.dwSampleFlags & AM_SAMPLE_PREROLL ) ?
181 static HRESULT WINAPI
182 IMediaSample2_fnSetPreroll(IMediaSample2* iface,BOOL bPreroll)
184 ICOM_THIS(CMemMediaSample,iface);
186 TRACE("(%p)->(%d)\n",This,bPreroll);
189 This->prop.dwSampleFlags |= AM_SAMPLE_PREROLL;
191 This->prop.dwSampleFlags &= ~AM_SAMPLE_PREROLL;
197 IMediaSample2_fnGetActualDataLength(IMediaSample2* iface)
199 ICOM_THIS(CMemMediaSample,iface);
201 TRACE("(%p)->()\n",This);
203 return This->prop.lActual;
206 static HRESULT WINAPI
207 IMediaSample2_fnSetActualDataLength(IMediaSample2* iface,long lLength)
209 ICOM_THIS(CMemMediaSample,iface);
211 TRACE("(%p)->(%ld)\n",This,lLength);
213 if ( This->prop.cbBuffer > lLength )
216 This->prop.lActual = lLength;
220 static HRESULT WINAPI
221 IMediaSample2_fnGetMediaType(IMediaSample2* iface,AM_MEDIA_TYPE** ppmt)
223 ICOM_THIS(CMemMediaSample,iface);
225 TRACE("(%p)->(%p)\n",This,ppmt);
229 if ( !(This->prop.dwSampleFlags & AM_SAMPLE_TYPECHANGED) )
232 /* FIXME - not implemented! */
234 FIXME("(%p)->(%p) not implemented!\n",This,ppmt);
236 /* return CoTaskMemAlloc-ed memory. */
241 static HRESULT WINAPI
242 IMediaSample2_fnSetMediaType(IMediaSample2* iface,AM_MEDIA_TYPE* pmt)
244 ICOM_THIS(CMemMediaSample,iface);
246 FIXME("(%p)->() stub!\n",This);
248 /* FIXME - not implemented! */
253 static HRESULT WINAPI
254 IMediaSample2_fnIsDiscontinuity(IMediaSample2* iface)
256 ICOM_THIS(CMemMediaSample,iface);
258 TRACE("(%p)->()\n",This);
260 return ( This->prop.dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY ) ?
264 static HRESULT WINAPI
265 IMediaSample2_fnSetDiscontinuity(IMediaSample2* iface,BOOL bDiscontinuity)
267 ICOM_THIS(CMemMediaSample,iface);
269 TRACE("(%p)->(%d)\n",This,bDiscontinuity);
271 if ( bDiscontinuity )
272 This->prop.dwSampleFlags |= AM_SAMPLE_DATADISCONTINUITY;
274 This->prop.dwSampleFlags &= ~AM_SAMPLE_DATADISCONTINUITY;
279 static HRESULT WINAPI
280 IMediaSample2_fnGetMediaTime(IMediaSample2* iface,LONGLONG* pTimeStart,LONGLONG* pTimeEnd)
282 ICOM_THIS(CMemMediaSample,iface);
284 FIXME("(%p)->() stub!\n",This);
286 if ( pTimeStart == NULL || pTimeEnd == NULL )
289 if ( !This->fMediaTimeIsValid )
290 return VFW_E_MEDIA_TIME_NOT_SET;
292 *pTimeStart = This->llMediaTimeStart;
293 *pTimeEnd = This->llMediaTimeEnd;
300 static HRESULT WINAPI
301 IMediaSample2_fnSetMediaTime(IMediaSample2* iface,LONGLONG* pTimeStart,LONGLONG* pTimeEnd)
303 ICOM_THIS(CMemMediaSample,iface);
305 TRACE("(%p)->()\n",This);
306 if ( pTimeStart == NULL || pTimeEnd == NULL )
308 This->fMediaTimeIsValid = FALSE;
312 This->fMediaTimeIsValid = TRUE;
313 This->llMediaTimeStart = *pTimeStart;
314 This->llMediaTimeEnd = *pTimeEnd;
321 static HRESULT WINAPI
322 IMediaSample2_fnGetProperties(IMediaSample2* iface,DWORD cbProp,BYTE* pbProp)
324 ICOM_THIS(CMemMediaSample,iface);
326 TRACE("(%p)->(%lu,%p)\n",This,cbProp,pbProp);
328 if ( cbProp < 0 || cbProp > sizeof(AM_SAMPLE2_PROPERTIES) )
330 memcpy( pbProp, &This->prop, cbProp );
335 static HRESULT WINAPI
336 IMediaSample2_fnSetProperties(IMediaSample2* iface,DWORD cbProp,const BYTE* pbProp)
338 ICOM_THIS(CMemMediaSample,iface);
340 FIXME("(%p)->() stub!\n",This);
347 static ICOM_VTABLE(IMediaSample2) imediasample2 =
349 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
350 /* IUnknown fields */
351 IMediaSample2_fnQueryInterface,
352 IMediaSample2_fnAddRef,
353 IMediaSample2_fnRelease,
354 /* IMediaSample fields */
355 IMediaSample2_fnGetPointer,
356 IMediaSample2_fnGetSize,
357 IMediaSample2_fnGetTime,
358 IMediaSample2_fnSetTime,
359 IMediaSample2_fnIsSyncPoint,
360 IMediaSample2_fnSetSyncPoint,
361 IMediaSample2_fnIsPreroll,
362 IMediaSample2_fnSetPreroll,
363 IMediaSample2_fnGetActualDataLength,
364 IMediaSample2_fnSetActualDataLength,
365 IMediaSample2_fnGetMediaType,
366 IMediaSample2_fnSetMediaType,
367 IMediaSample2_fnIsDiscontinuity,
368 IMediaSample2_fnSetDiscontinuity,
369 IMediaSample2_fnGetMediaTime,
370 IMediaSample2_fnSetMediaTime,
371 /* IMediaSample2 fields */
372 IMediaSample2_fnGetProperties,
373 IMediaSample2_fnSetProperties,
378 HRESULT QUARTZ_CreateMemMediaSample(
379 BYTE* pbData, DWORD dwDataLength,
380 IMemAllocator* pOwner,
381 CMemMediaSample** ppSample )
383 CMemMediaSample* pms;
385 TRACE("(%p,%08lx,%p,%p)\n",pbData,dwDataLength,pOwner,ppSample);
386 pms = (CMemMediaSample*)QUARTZ_AllocObj( sizeof(CMemMediaSample) );
388 return E_OUTOFMEMORY;
390 ICOM_VTBL(pms) = &imediasample2;
392 pms->pOwner = pOwner;
393 pms->fMediaTimeIsValid = FALSE;
394 pms->llMediaTimeStart = 0;
395 pms->llMediaTimeEnd = 0;
396 ZeroMemory( &(pms->prop), sizeof(pms->prop) );
397 pms->prop.cbData = sizeof(pms->prop);
398 pms->prop.dwTypeSpecificFlags = 0;
399 pms->prop.dwSampleFlags = 0;
400 pms->prop.pbBuffer = pbData;
401 pms->prop.cbBuffer = (LONG)dwDataLength;
402 pms->prop.lActual = (LONG)dwDataLength;
409 void QUARTZ_DestroyMemMediaSample(
410 CMemMediaSample* pSample )
412 QUARTZ_FreeObj( pSample );