2 * Implementation of IMediaStream Interfaces
4 * Copyright 2005, 2008, 2012 Christian Costa
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define NONAMELESSUNION
22 #define NONAMELESSSTRUCT
31 #include "wine/strmbase.h"
33 #include "amstream_private.h"
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(amstream
);
40 static HRESULT
ddrawstreamsample_create(IDirectDrawMediaStream
*parent
, IDirectDrawSurface
*surface
,
41 const RECT
*rect
, IDirectDrawStreamSample
**ddraw_stream_sample
);
42 static HRESULT
audiostreamsample_create(IAudioMediaStream
*parent
, IAudioData
*audio_data
, IAudioStreamSample
**audio_stream_sample
);
44 struct DirectDrawMediaStreamImpl
;
48 struct DirectDrawMediaStreamImpl
*parent
;
49 } DirectDrawMediaStreamInputPin
;
51 typedef struct DirectDrawMediaStreamImpl
{
52 IAMMediaStream IAMMediaStream_iface
;
53 IDirectDrawMediaStream IDirectDrawMediaStream_iface
;
55 IMultiMediaStream
* parent
;
57 STREAM_TYPE stream_type
;
59 DirectDrawMediaStreamInputPin
*input_pin
;
60 CRITICAL_SECTION critical_section
;
61 } DirectDrawMediaStreamImpl
;
63 static inline DirectDrawMediaStreamImpl
*impl_from_DirectDrawMediaStream_IAMMediaStream(IAMMediaStream
*iface
)
65 return CONTAINING_RECORD(iface
, DirectDrawMediaStreamImpl
, IAMMediaStream_iface
);
68 /*** IUnknown methods ***/
69 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream
*iface
,
70 REFIID riid
, void **ret_iface
)
72 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
74 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
76 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
77 IsEqualGUID(riid
, &IID_IMediaStream
) ||
78 IsEqualGUID(riid
, &IID_IAMMediaStream
))
80 IAMMediaStream_AddRef(iface
);
84 else if (IsEqualGUID(riid
, &IID_IDirectDrawMediaStream
))
86 IAMMediaStream_AddRef(iface
);
87 *ret_iface
= &This
->IDirectDrawMediaStream_iface
;
90 else if (IsEqualGUID(riid
, &IID_IPin
))
92 IAMMediaStream_AddRef(iface
);
93 *ret_iface
= &This
->input_pin
->pin
.pin
.IPin_iface
;
96 else if (IsEqualGUID(riid
, &IID_IMemInputPin
))
98 IAMMediaStream_AddRef(iface
);
99 *ret_iface
= &This
->input_pin
->pin
.IMemInputPin_iface
;
103 ERR("(%p)->(%s,%p),not found\n", This
, debugstr_guid(riid
), ret_iface
);
104 return E_NOINTERFACE
;
107 static ULONG WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream
*iface
)
109 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
110 ULONG ref
= InterlockedIncrement(&This
->ref
);
112 TRACE("(%p/%p)->(): new ref = %u\n", iface
, This
, ref
);
117 static ULONG WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream
*iface
)
119 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
120 ULONG ref
= InterlockedDecrement(&This
->ref
);
122 TRACE("(%p/%p)->(): new ref = %u\n", iface
, This
, ref
);
126 BaseInputPin_Destroy((BaseInputPin
*)This
->input_pin
);
127 DeleteCriticalSection(&This
->critical_section
);
129 IDirectDraw7_Release(This
->ddraw
);
130 HeapFree(GetProcessHeap(), 0, This
);
136 /*** IMediaStream methods ***/
137 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream
*iface
,
138 IMultiMediaStream
** multi_media_stream
)
140 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
142 TRACE("(%p/%p)->(%p)\n", This
, iface
, multi_media_stream
);
144 if (!multi_media_stream
)
147 IMultiMediaStream_AddRef(This
->parent
);
148 *multi_media_stream
= This
->parent
;
153 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream
*iface
,
154 MSPID
*purpose_id
, STREAM_TYPE
*type
)
156 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
158 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, purpose_id
, type
);
161 *purpose_id
= This
->purpose_id
;
163 *type
= This
->stream_type
;
168 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream
*iface
,
169 IMediaStream
*pStreamThatHasDesiredFormat
, DWORD flags
)
171 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
173 FIXME("(%p/%p)->(%p,%x) stub!\n", This
, iface
, pStreamThatHasDesiredFormat
, flags
);
178 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream
*iface
,
179 DWORD flags
, IStreamSample
**sample
)
181 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
183 FIXME("(%p/%p)->(%x,%p) stub!\n", This
, iface
, flags
, sample
);
188 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream
*iface
,
189 IStreamSample
*existing_sample
, DWORD flags
, IStreamSample
**sample
)
191 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
193 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, existing_sample
, flags
, sample
);
198 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream
*iface
, DWORD flags
)
200 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
202 FIXME("(%p/%p)->(%x) stub!\n", This
, iface
, flags
);
207 /*** IAMMediaStream methods ***/
208 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream
*iface
, IUnknown
*source_object
, DWORD flags
,
209 REFMSPID purpose_id
, const STREAM_TYPE stream_type
)
211 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
213 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This
, iface
, source_object
, flags
, purpose_id
, stream_type
);
218 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream
*iface
, FILTER_STATE state
)
220 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
222 FIXME("(%p/%p)->(%u) stub!\n", This
, iface
, state
);
227 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream
*iface
, IAMMultiMediaStream
*am_multi_media_stream
)
229 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
231 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, am_multi_media_stream
);
236 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream
*iface
, IMediaStreamFilter
*media_stream_filter
)
238 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
240 TRACE("(%p/%p)->(%p)\n", This
, iface
, media_stream_filter
);
242 This
->input_pin
->pin
.pin
.pinInfo
.pFilter
= (IBaseFilter
*)media_stream_filter
;
247 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream
*iface
, IFilterGraph
*filtergraph
)
249 DirectDrawMediaStreamImpl
*This
= impl_from_DirectDrawMediaStream_IAMMediaStream(iface
);
251 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, filtergraph
);
256 static const struct IAMMediaStreamVtbl DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl
=
258 /*** IUnknown methods ***/
259 DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface
,
260 DirectDrawMediaStreamImpl_IAMMediaStream_AddRef
,
261 DirectDrawMediaStreamImpl_IAMMediaStream_Release
,
262 /*** IMediaStream methods ***/
263 DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream
,
264 DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation
,
265 DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat
,
266 DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample
,
267 DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample
,
268 DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream
,
269 /*** IAMMediaStream methods ***/
270 DirectDrawMediaStreamImpl_IAMMediaStream_Initialize
,
271 DirectDrawMediaStreamImpl_IAMMediaStream_SetState
,
272 DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream
,
273 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter
,
274 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph
277 static inline DirectDrawMediaStreamImpl
*impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream
*iface
)
279 return CONTAINING_RECORD(iface
, DirectDrawMediaStreamImpl
, IDirectDrawMediaStream_iface
);
282 /*** IUnknown methods ***/
283 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream
*iface
,
284 REFIID riid
, void **ret_iface
)
286 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
287 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
288 return IAMMediaStream_QueryInterface(&This
->IAMMediaStream_iface
, riid
, ret_iface
);
291 static ULONG WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream
*iface
)
293 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
294 TRACE("(%p/%p)\n", iface
, This
);
295 return IAMMediaStream_AddRef(&This
->IAMMediaStream_iface
);
298 static ULONG WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release(IDirectDrawMediaStream
*iface
)
300 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
301 TRACE("(%p/%p)\n", iface
, This
);
302 return IAMMediaStream_Release(&This
->IAMMediaStream_iface
);
305 /*** IMediaStream methods ***/
306 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream
*iface
,
307 IMultiMediaStream
**multi_media_stream
)
309 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
311 TRACE("(%p/%p)->(%p)\n", This
, iface
, multi_media_stream
);
313 if (!multi_media_stream
)
316 IMultiMediaStream_AddRef(This
->parent
);
317 *multi_media_stream
= This
->parent
;
322 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream
*iface
,
323 MSPID
*purpose_id
, STREAM_TYPE
*type
)
325 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
327 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, purpose_id
, type
);
330 *purpose_id
= This
->purpose_id
;
332 *type
= This
->stream_type
;
337 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream
*iface
,
338 IMediaStream
*pStreamThatHasDesiredFormat
, DWORD dwFlags
)
340 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
342 FIXME("(%p/%p)->(%p,%x) stub!\n", This
, iface
, pStreamThatHasDesiredFormat
, dwFlags
);
347 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream
*iface
,
348 DWORD dwFlags
, IStreamSample
**ppSample
)
350 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
352 FIXME("(%p/%p)->(%x,%p) stub!\n", This
, iface
, dwFlags
, ppSample
);
357 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream
*iface
,
358 IStreamSample
*pExistingSample
, DWORD dwFlags
, IStreamSample
**ppSample
)
360 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
362 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, pExistingSample
, dwFlags
, ppSample
);
367 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream
*iface
,
370 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
372 FIXME("(%p/%p)->(%x) stub!\n", This
, iface
, dwFlags
);
377 /*** IDirectDrawMediaStream methods ***/
378 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream
*iface
,
379 DDSURFACEDESC
*current_format
, IDirectDrawPalette
**palette
,
380 DDSURFACEDESC
*desired_format
, DWORD
*flags
)
382 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface
, current_format
, palette
, desired_format
,
385 return MS_E_NOSTREAM
;
389 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream
*iface
,
390 const DDSURFACEDESC
*pDDSurfaceDesc
, IDirectDrawPalette
*pDirectDrawPalette
)
392 FIXME("(%p)->(%p,%p) stub!\n", iface
, pDDSurfaceDesc
, pDirectDrawPalette
);
397 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream
*iface
,
400 DirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
402 TRACE("(%p)->(%p)\n", iface
, ddraw
);
407 HRESULT hr
= DirectDrawCreateEx(NULL
, (void**)&This
->ddraw
, &IID_IDirectDraw7
, NULL
);
410 IDirectDraw7_SetCooperativeLevel(This
->ddraw
, NULL
, DDSCL_NORMAL
);
413 return IDirectDraw7_QueryInterface(This
->ddraw
, &IID_IDirectDraw
, (void**)ddraw
);
416 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream
*iface
,
417 IDirectDraw
*pDirectDraw
)
419 FIXME("(%p)->(%p) stub!\n", iface
, pDirectDraw
);
424 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream
*iface
,
425 IDirectDrawSurface
*surface
, const RECT
*rect
, DWORD dwFlags
,
426 IDirectDrawStreamSample
**ppSample
)
428 TRACE("(%p)->(%p,%s,%x,%p)\n", iface
, surface
, wine_dbgstr_rect(rect
), dwFlags
, ppSample
);
430 return ddrawstreamsample_create(iface
, surface
, rect
, ppSample
);
433 static HRESULT WINAPI
DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream
*iface
,
434 STREAM_TIME
*pFrameTime
)
436 FIXME("(%p)->(%p) stub!\n", iface
, pFrameTime
);
441 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl
=
443 /*** IUnknown methods ***/
444 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface
,
445 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef
,
446 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release
,
447 /*** IMediaStream methods ***/
448 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream
,
449 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation
,
450 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat
,
451 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample
,
452 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample
,
453 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream
,
454 /*** IDirectDrawMediaStream methods ***/
455 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat
,
456 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat
,
457 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw
,
458 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw
,
459 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample
,
460 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame
463 static inline DirectDrawMediaStreamInputPin
*impl_from_DirectDrawMediaStreamInputPin_IPin(IPin
*iface
)
465 return CONTAINING_RECORD(iface
, DirectDrawMediaStreamInputPin
, pin
.pin
.IPin_iface
);
468 /*** IUnknown methods ***/
469 static HRESULT WINAPI
DirectDrawMediaStreamInputPin_IPin_QueryInterface(IPin
*iface
, REFIID riid
, void **ret_iface
)
471 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(iface
);
473 return IAMMediaStream_QueryInterface(&This
->parent
->IAMMediaStream_iface
, riid
, ret_iface
);
476 static ULONG WINAPI
DirectDrawMediaStreamInputPin_IPin_AddRef(IPin
*iface
)
478 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(iface
);
480 return IAMMediaStream_AddRef(&This
->parent
->IAMMediaStream_iface
);
483 static ULONG WINAPI
DirectDrawMediaStreamInputPin_IPin_Release(IPin
*iface
)
485 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(iface
);
487 return IAMMediaStream_Release(&This
->parent
->IAMMediaStream_iface
);
490 static const IPinVtbl DirectDrawMediaStreamInputPin_IPin_Vtbl
=
492 DirectDrawMediaStreamInputPin_IPin_QueryInterface
,
493 DirectDrawMediaStreamInputPin_IPin_AddRef
,
494 DirectDrawMediaStreamInputPin_IPin_Release
,
495 BaseInputPinImpl_Connect
,
496 BaseInputPinImpl_ReceiveConnection
,
497 BasePinImpl_Disconnect
,
498 BasePinImpl_ConnectedTo
,
499 BasePinImpl_ConnectionMediaType
,
500 BasePinImpl_QueryPinInfo
,
501 BasePinImpl_QueryDirection
,
503 BaseInputPinImpl_QueryAccept
,
504 BasePinImpl_EnumMediaTypes
,
505 BasePinImpl_QueryInternalConnections
,
506 BaseInputPinImpl_EndOfStream
,
507 BaseInputPinImpl_BeginFlush
,
508 BaseInputPinImpl_EndFlush
,
509 BaseInputPinImpl_NewSegment
,
512 static HRESULT WINAPI
DirectDrawMediaStreamInputPin_CheckMediaType(BasePin
*base
, const AM_MEDIA_TYPE
*media_type
)
514 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(&base
->IPin_iface
);
516 TRACE("(%p)->(%p)\n", This
, media_type
);
518 if (IsEqualGUID(&media_type
->majortype
, &MEDIATYPE_Video
))
520 if (IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB1
) ||
521 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB4
) ||
522 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB8
) ||
523 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB565
) ||
524 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB555
) ||
525 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB24
) ||
526 IsEqualGUID(&media_type
->subtype
, &MEDIASUBTYPE_RGB32
))
528 TRACE("Video sub-type %s matches\n", debugstr_guid(&media_type
->subtype
));
536 static LONG WINAPI
DirectDrawMediaStreamInputPin_GetMediaTypeVersion(BasePin
*base
)
541 static HRESULT WINAPI
DirectDrawMediaStreamInputPin_GetMediaType(BasePin
*base
, int index
, AM_MEDIA_TYPE
*media_type
)
543 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(&base
->IPin_iface
);
545 TRACE("(%p)->(%d,%p)\n", This
, index
, media_type
);
547 /* FIXME: Reset structure as we only fill majortype and minortype for now */
548 ZeroMemory(media_type
, sizeof(*media_type
));
550 media_type
->majortype
= MEDIATYPE_Video
;
555 media_type
->subtype
= MEDIASUBTYPE_RGB1
;
558 media_type
->subtype
= MEDIASUBTYPE_RGB4
;
561 media_type
->subtype
= MEDIASUBTYPE_RGB8
;
564 media_type
->subtype
= MEDIASUBTYPE_RGB565
;
567 media_type
->subtype
= MEDIASUBTYPE_RGB555
;
570 media_type
->subtype
= MEDIASUBTYPE_RGB24
;
573 media_type
->subtype
= MEDIASUBTYPE_RGB32
;
582 static HRESULT WINAPI
DirectDrawMediaStreamInputPin_Receive(BaseInputPin
*base
, IMediaSample
*sample
)
584 DirectDrawMediaStreamInputPin
*This
= impl_from_DirectDrawMediaStreamInputPin_IPin(&base
->pin
.IPin_iface
);
586 FIXME("(%p)->(%p) stub!\n", This
, sample
);
591 static const BaseInputPinFuncTable DirectDrawMediaStreamInputPin_FuncTable
=
594 DirectDrawMediaStreamInputPin_CheckMediaType
,
596 DirectDrawMediaStreamInputPin_GetMediaTypeVersion
,
597 DirectDrawMediaStreamInputPin_GetMediaType
,
599 DirectDrawMediaStreamInputPin_Receive
,
602 HRESULT
ddrawmediastream_create(IMultiMediaStream
*parent
, const MSPID
*purpose_id
,
603 STREAM_TYPE stream_type
, IAMMediaStream
**media_stream
)
605 DirectDrawMediaStreamImpl
*object
;
609 TRACE("(%p,%s,%p)\n", parent
, debugstr_guid(purpose_id
), media_stream
);
611 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(DirectDrawMediaStreamImpl
));
613 return E_OUTOFMEMORY
;
615 object
->IAMMediaStream_iface
.lpVtbl
= &DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl
;
616 object
->IDirectDrawMediaStream_iface
.lpVtbl
= &DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl
;
619 InitializeCriticalSection(&object
->critical_section
);
621 pin_info
.pFilter
= NULL
;
622 pin_info
.dir
= PINDIR_INPUT
;
623 pin_info
.achName
[0] = 'I';
624 StringFromGUID2(purpose_id
, pin_info
.achName
+ 1, MAX_PIN_NAME
- 1);
625 hr
= BaseInputPin_Construct(&DirectDrawMediaStreamInputPin_IPin_Vtbl
,
626 sizeof(DirectDrawMediaStreamInputPin
), &pin_info
, &DirectDrawMediaStreamInputPin_FuncTable
,
627 &object
->critical_section
, NULL
, (IPin
**)&object
->input_pin
);
631 object
->input_pin
->parent
= object
;
633 object
->parent
= parent
;
634 object
->purpose_id
= *purpose_id
;
635 object
->stream_type
= stream_type
;
637 *media_stream
= &object
->IAMMediaStream_iface
;
642 HeapFree(GetProcessHeap(), 0, object
);
647 struct AudioMediaStreamImpl
;
651 struct AudioMediaStreamImpl
*parent
;
652 } AudioMediaStreamInputPin
;
654 typedef struct AudioMediaStreamImpl
{
655 IAMMediaStream IAMMediaStream_iface
;
656 IAudioMediaStream IAudioMediaStream_iface
;
658 IMultiMediaStream
* parent
;
660 STREAM_TYPE stream_type
;
661 AudioMediaStreamInputPin
*input_pin
;
662 CRITICAL_SECTION critical_section
;
663 } AudioMediaStreamImpl
;
665 static inline AudioMediaStreamImpl
*impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream
*iface
)
667 return CONTAINING_RECORD(iface
, AudioMediaStreamImpl
, IAMMediaStream_iface
);
670 /*** IUnknown methods ***/
671 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream
*iface
,
672 REFIID riid
, void **ret_iface
)
674 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
676 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
678 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
679 IsEqualGUID(riid
, &IID_IMediaStream
) ||
680 IsEqualGUID(riid
, &IID_IAMMediaStream
))
682 IAMMediaStream_AddRef(iface
);
686 else if (IsEqualGUID(riid
, &IID_IAudioMediaStream
))
688 IAMMediaStream_AddRef(iface
);
689 *ret_iface
= &This
->IAudioMediaStream_iface
;
692 else if (IsEqualGUID(riid
, &IID_IPin
))
694 IAMMediaStream_AddRef(iface
);
695 *ret_iface
= &This
->input_pin
->pin
.pin
.IPin_iface
;
698 else if (IsEqualGUID(riid
, &IID_IMemInputPin
))
700 IAMMediaStream_AddRef(iface
);
701 *ret_iface
= &This
->input_pin
->pin
.IMemInputPin_iface
;
705 ERR("(%p)->(%s,%p),not found\n", This
, debugstr_guid(riid
), ret_iface
);
706 return E_NOINTERFACE
;
709 static ULONG WINAPI
AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream
*iface
)
711 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
712 ULONG ref
= InterlockedIncrement(&This
->ref
);
714 TRACE("(%p/%p)->(): new ref = %u\n", iface
, This
, ref
);
719 static ULONG WINAPI
AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream
*iface
)
721 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
722 ULONG ref
= InterlockedDecrement(&This
->ref
);
724 TRACE("(%p/%p)->(): new ref = %u\n", iface
, This
, ref
);
728 BaseInputPin_Destroy((BaseInputPin
*)This
->input_pin
);
729 DeleteCriticalSection(&This
->critical_section
);
730 HeapFree(GetProcessHeap(), 0, This
);
736 /*** IMediaStream methods ***/
737 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream
*iface
,
738 IMultiMediaStream
** multi_media_stream
)
740 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
742 TRACE("(%p/%p)->(%p)\n", This
, iface
, multi_media_stream
);
744 if (!multi_media_stream
)
747 IMultiMediaStream_AddRef(This
->parent
);
748 *multi_media_stream
= This
->parent
;
753 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream
*iface
,
754 MSPID
*purpose_id
, STREAM_TYPE
*type
)
756 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
758 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, purpose_id
, type
);
761 *purpose_id
= This
->purpose_id
;
763 *type
= This
->stream_type
;
768 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream
*iface
,
769 IMediaStream
*pStreamThatHasDesiredFormat
, DWORD flags
)
771 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
773 FIXME("(%p/%p)->(%p,%x) stub!\n", This
, iface
, pStreamThatHasDesiredFormat
, flags
);
778 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream
*iface
,
779 DWORD flags
, IStreamSample
**sample
)
781 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
783 FIXME("(%p/%p)->(%x,%p) stub!\n", This
, iface
, flags
, sample
);
788 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream
*iface
,
789 IStreamSample
*existing_sample
, DWORD flags
, IStreamSample
**sample
)
791 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
793 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, existing_sample
, flags
, sample
);
798 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream
*iface
, DWORD flags
)
800 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
802 FIXME("(%p/%p)->(%x) stub!\n", This
, iface
, flags
);
807 /*** IAMMediaStream methods ***/
808 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream
*iface
, IUnknown
*source_object
, DWORD flags
,
809 REFMSPID purpose_id
, const STREAM_TYPE stream_type
)
811 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
813 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This
, iface
, source_object
, flags
, purpose_id
, stream_type
);
818 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream
*iface
, FILTER_STATE state
)
820 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
822 FIXME("(%p/%p)->(%u) stub!\n", This
, iface
, state
);
827 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream
*iface
, IAMMultiMediaStream
*am_multi_media_stream
)
829 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
831 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, am_multi_media_stream
);
836 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream
*iface
, IMediaStreamFilter
*media_stream_filter
)
838 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
840 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, media_stream_filter
);
845 static HRESULT WINAPI
AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream
*iface
, IFilterGraph
*filtergraph
)
847 AudioMediaStreamImpl
*This
= impl_from_AudioMediaStream_IAMMediaStream(iface
);
849 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, filtergraph
);
854 static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl
=
856 /*** IUnknown methods ***/
857 AudioMediaStreamImpl_IAMMediaStream_QueryInterface
,
858 AudioMediaStreamImpl_IAMMediaStream_AddRef
,
859 AudioMediaStreamImpl_IAMMediaStream_Release
,
860 /*** IMediaStream methods ***/
861 AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream
,
862 AudioMediaStreamImpl_IAMMediaStream_GetInformation
,
863 AudioMediaStreamImpl_IAMMediaStream_SetSameFormat
,
864 AudioMediaStreamImpl_IAMMediaStream_AllocateSample
,
865 AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample
,
866 AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream
,
867 /*** IAMMediaStream methods ***/
868 AudioMediaStreamImpl_IAMMediaStream_Initialize
,
869 AudioMediaStreamImpl_IAMMediaStream_SetState
,
870 AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream
,
871 AudioMediaStreamImpl_IAMMediaStream_JoinFilter
,
872 AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
875 static inline AudioMediaStreamImpl
*impl_from_IAudioMediaStream(IAudioMediaStream
*iface
)
877 return CONTAINING_RECORD(iface
, AudioMediaStreamImpl
, IAudioMediaStream_iface
);
880 /*** IUnknown methods ***/
881 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAudioMediaStream
*iface
,
882 REFIID riid
, void **ret_iface
)
884 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
885 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
886 return IAMMediaStream_QueryInterface(&This
->IAMMediaStream_iface
, riid
, ret_iface
);
889 static ULONG WINAPI
AudioMediaStreamImpl_IAudioMediaStream_AddRef(IAudioMediaStream
*iface
)
891 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
892 TRACE("(%p/%p)\n", iface
, This
);
893 return IAMMediaStream_AddRef(&This
->IAMMediaStream_iface
);
896 static ULONG WINAPI
AudioMediaStreamImpl_IAudioMediaStream_Release(IAudioMediaStream
*iface
)
898 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
899 TRACE("(%p/%p)\n", iface
, This
);
900 return IAMMediaStream_Release(&This
->IAMMediaStream_iface
);
903 /*** IMediaStream methods ***/
904 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream(IAudioMediaStream
*iface
,
905 IMultiMediaStream
**multi_media_stream
)
907 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
909 TRACE("(%p/%p)->(%p)\n", iface
, This
, multi_media_stream
);
911 if (!multi_media_stream
)
914 IMultiMediaStream_AddRef(This
->parent
);
915 *multi_media_stream
= This
->parent
;
920 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_GetInformation(IAudioMediaStream
*iface
,
921 MSPID
*purpose_id
, STREAM_TYPE
*type
)
923 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
925 TRACE("(%p/%p)->(%p,%p)\n", iface
, This
, purpose_id
, type
);
928 *purpose_id
= This
->purpose_id
;
930 *type
= This
->stream_type
;
935 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat(IAudioMediaStream
*iface
,
936 IMediaStream
*stream_format
, DWORD flags
)
938 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
940 FIXME("(%p/%p)->(%p,%x) stub!\n", iface
, This
, stream_format
, flags
);
945 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_AllocateSample(IAudioMediaStream
*iface
,
946 DWORD flags
, IStreamSample
**sample
)
948 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
950 FIXME("(%p/%p)->(%x,%p) stub!\n", iface
, This
, flags
, sample
);
955 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample(IAudioMediaStream
*iface
,
956 IStreamSample
*existing_sample
, DWORD flags
, IStreamSample
**sample
)
958 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
960 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface
, This
, existing_sample
, flags
, sample
);
965 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream(IAudioMediaStream
*iface
,
968 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
970 FIXME("(%p/%p)->(%x) stub!\n", iface
, This
, flags
);
975 /*** IAudioMediaStream methods ***/
976 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_GetFormat(IAudioMediaStream
*iface
, WAVEFORMATEX
*wave_format_current
)
978 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
980 FIXME("(%p/%p)->(%p) stub!\n", iface
, This
, wave_format_current
);
982 if (!wave_format_current
)
985 return MS_E_NOSTREAM
;
989 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_SetFormat(IAudioMediaStream
*iface
, const WAVEFORMATEX
*wave_format
)
991 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
993 FIXME("(%p/%p)->(%p) stub!\n", iface
, This
, wave_format
);
998 static HRESULT WINAPI
AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudioMediaStream
*iface
, IAudioData
*audio_data
,
999 DWORD flags
, IAudioStreamSample
**sample
)
1001 AudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
1003 TRACE("(%p/%p)->(%p,%u,%p)\n", iface
, This
, audio_data
, flags
, sample
);
1008 return audiostreamsample_create(iface
, audio_data
, sample
);
1011 static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl
=
1013 /*** IUnknown methods ***/
1014 AudioMediaStreamImpl_IAudioMediaStream_QueryInterface
,
1015 AudioMediaStreamImpl_IAudioMediaStream_AddRef
,
1016 AudioMediaStreamImpl_IAudioMediaStream_Release
,
1017 /*** IMediaStream methods ***/
1018 AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream
,
1019 AudioMediaStreamImpl_IAudioMediaStream_GetInformation
,
1020 AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat
,
1021 AudioMediaStreamImpl_IAudioMediaStream_AllocateSample
,
1022 AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample
,
1023 AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream
,
1024 /*** IAudioMediaStream methods ***/
1025 AudioMediaStreamImpl_IAudioMediaStream_GetFormat
,
1026 AudioMediaStreamImpl_IAudioMediaStream_SetFormat
,
1027 AudioMediaStreamImpl_IAudioMediaStream_CreateSample
1030 static inline AudioMediaStreamInputPin
*impl_from_AudioMediaStreamInputPin_IPin(IPin
*iface
)
1032 return CONTAINING_RECORD(iface
, AudioMediaStreamInputPin
, pin
.pin
.IPin_iface
);
1035 /*** IUnknown methods ***/
1036 static HRESULT WINAPI
AudioMediaStreamInputPin_IPin_QueryInterface(IPin
*iface
, REFIID riid
, void **ret_iface
)
1038 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(iface
);
1040 return IAMMediaStream_QueryInterface(&This
->parent
->IAMMediaStream_iface
, riid
, ret_iface
);
1043 static ULONG WINAPI
AudioMediaStreamInputPin_IPin_AddRef(IPin
*iface
)
1045 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(iface
);
1047 return IAMMediaStream_AddRef(&This
->parent
->IAMMediaStream_iface
);
1050 static ULONG WINAPI
AudioMediaStreamInputPin_IPin_Release(IPin
*iface
)
1052 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(iface
);
1054 return IAMMediaStream_Release(&This
->parent
->IAMMediaStream_iface
);
1057 static const IPinVtbl AudioMediaStreamInputPin_IPin_Vtbl
=
1059 AudioMediaStreamInputPin_IPin_QueryInterface
,
1060 AudioMediaStreamInputPin_IPin_AddRef
,
1061 AudioMediaStreamInputPin_IPin_Release
,
1062 BaseInputPinImpl_Connect
,
1063 BaseInputPinImpl_ReceiveConnection
,
1064 BasePinImpl_Disconnect
,
1065 BasePinImpl_ConnectedTo
,
1066 BasePinImpl_ConnectionMediaType
,
1067 BasePinImpl_QueryPinInfo
,
1068 BasePinImpl_QueryDirection
,
1069 BasePinImpl_QueryId
,
1070 BaseInputPinImpl_QueryAccept
,
1071 BasePinImpl_EnumMediaTypes
,
1072 BasePinImpl_QueryInternalConnections
,
1073 BaseInputPinImpl_EndOfStream
,
1074 BaseInputPinImpl_BeginFlush
,
1075 BaseInputPinImpl_EndFlush
,
1076 BaseInputPinImpl_NewSegment
,
1079 static HRESULT WINAPI
AudioMediaStreamInputPin_CheckMediaType(BasePin
*base
, const AM_MEDIA_TYPE
*media_type
)
1081 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(&base
->IPin_iface
);
1083 FIXME("(%p)->(%p) stub!\n", This
, media_type
);
1088 static LONG WINAPI
AudioMediaStreamInputPin_GetMediaTypeVersion(BasePin
*base
)
1093 static HRESULT WINAPI
AudioMediaStreamInputPin_GetMediaType(BasePin
*base
, int index
, AM_MEDIA_TYPE
*media_type
)
1095 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(&base
->IPin_iface
);
1097 FIXME("(%p)->(%d,%p) stub!\n", This
, index
, media_type
);
1102 static HRESULT WINAPI
AudioMediaStreamInputPin_Receive(BaseInputPin
*base
, IMediaSample
*sample
)
1104 AudioMediaStreamInputPin
*This
= impl_from_AudioMediaStreamInputPin_IPin(&base
->pin
.IPin_iface
);
1106 FIXME("(%p)->(%p) stub!\n", This
, sample
);
1111 static const BaseInputPinFuncTable AudioMediaStreamInputPin_FuncTable
=
1114 AudioMediaStreamInputPin_CheckMediaType
,
1116 AudioMediaStreamInputPin_GetMediaTypeVersion
,
1117 AudioMediaStreamInputPin_GetMediaType
,
1119 AudioMediaStreamInputPin_Receive
,
1122 HRESULT
audiomediastream_create(IMultiMediaStream
*parent
, const MSPID
*purpose_id
,
1123 STREAM_TYPE stream_type
, IAMMediaStream
**media_stream
)
1125 AudioMediaStreamImpl
*object
;
1129 TRACE("(%p,%s,%p)\n", parent
, debugstr_guid(purpose_id
), media_stream
);
1131 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(AudioMediaStreamImpl
));
1133 return E_OUTOFMEMORY
;
1135 object
->IAMMediaStream_iface
.lpVtbl
= &AudioMediaStreamImpl_IAMMediaStream_Vtbl
;
1136 object
->IAudioMediaStream_iface
.lpVtbl
= &AudioMediaStreamImpl_IAudioMediaStream_Vtbl
;
1139 InitializeCriticalSection(&object
->critical_section
);
1141 pin_info
.pFilter
= NULL
;
1142 pin_info
.dir
= PINDIR_INPUT
;
1143 pin_info
.achName
[0] = 'I';
1144 StringFromGUID2(purpose_id
, pin_info
.achName
+ 1, MAX_PIN_NAME
- 1);
1145 hr
= BaseInputPin_Construct(&AudioMediaStreamInputPin_IPin_Vtbl
,
1146 sizeof(AudioMediaStreamInputPin
), &pin_info
, &AudioMediaStreamInputPin_FuncTable
,
1147 &object
->critical_section
, NULL
, (IPin
**)&object
->input_pin
);
1151 object
->input_pin
->parent
= object
;
1153 object
->parent
= parent
;
1154 object
->purpose_id
= *purpose_id
;
1155 object
->stream_type
= stream_type
;
1157 *media_stream
= &object
->IAMMediaStream_iface
;
1162 HeapFree(GetProcessHeap(), 0, object
);
1168 IDirectDrawStreamSample IDirectDrawStreamSample_iface
;
1170 IMediaStream
*parent
;
1171 IDirectDrawSurface
*surface
;
1173 } IDirectDrawStreamSampleImpl
;
1175 static inline IDirectDrawStreamSampleImpl
*impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample
*iface
)
1177 return CONTAINING_RECORD(iface
, IDirectDrawStreamSampleImpl
, IDirectDrawStreamSample_iface
);
1180 /*** IUnknown methods ***/
1181 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample
*iface
,
1182 REFIID riid
, void **ret_iface
)
1184 TRACE("(%p)->(%s,%p)\n", iface
, debugstr_guid(riid
), ret_iface
);
1186 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
1187 IsEqualGUID(riid
, &IID_IStreamSample
) ||
1188 IsEqualGUID(riid
, &IID_IDirectDrawStreamSample
))
1190 IDirectDrawStreamSample_AddRef(iface
);
1197 ERR("(%p)->(%s,%p),not found\n", iface
, debugstr_guid(riid
), ret_iface
);
1198 return E_NOINTERFACE
;
1201 static ULONG WINAPI
IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample
*iface
)
1203 IDirectDrawStreamSampleImpl
*This
= impl_from_IDirectDrawStreamSample(iface
);
1204 ULONG ref
= InterlockedIncrement(&This
->ref
);
1206 TRACE("(%p)->(): new ref = %u\n", iface
, ref
);
1211 static ULONG WINAPI
IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample
*iface
)
1213 IDirectDrawStreamSampleImpl
*This
= impl_from_IDirectDrawStreamSample(iface
);
1214 ULONG ref
= InterlockedDecrement(&This
->ref
);
1216 TRACE("(%p)->(): new ref = %u\n", iface
, ref
);
1221 IDirectDrawSurface_Release(This
->surface
);
1222 IMediaStream_Release(This
->parent
);
1223 HeapFree(GetProcessHeap(), 0, This
);
1229 /*** IStreamSample methods ***/
1230 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample
*iface
, IMediaStream
**media_stream
)
1232 FIXME("(%p)->(%p): stub\n", iface
, media_stream
);
1237 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample
*iface
, STREAM_TIME
*start_time
,
1238 STREAM_TIME
*end_time
, STREAM_TIME
*current_time
)
1240 FIXME("(%p)->(%p,%p,%p): stub\n", iface
, start_time
, end_time
, current_time
);
1245 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample
*iface
, const STREAM_TIME
*start_time
,
1246 const STREAM_TIME
*end_time
)
1248 FIXME("(%p)->(%p,%p): stub\n", iface
, start_time
, end_time
);
1253 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample
*iface
, DWORD flags
, HANDLE event
,
1254 PAPCFUNC func_APC
, DWORD APC_data
)
1256 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface
, flags
, event
, func_APC
, APC_data
);
1261 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample
*iface
, DWORD flags
, DWORD milliseconds
)
1263 FIXME("(%p)->(%x,%u): stub\n", iface
, flags
, milliseconds
);
1268 /*** IDirectDrawStreamSample methods ***/
1269 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample
*iface
, IDirectDrawSurface
**ddraw_surface
,
1272 IDirectDrawStreamSampleImpl
*This
= impl_from_IDirectDrawStreamSample(iface
);
1274 TRACE("(%p)->(%p,%p)\n", iface
, ddraw_surface
, rect
);
1278 *ddraw_surface
= This
->surface
;
1280 IDirectDrawSurface_AddRef(*ddraw_surface
);
1289 static HRESULT WINAPI
IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample
*iface
, const RECT
*rect
)
1291 FIXME("(%p)->(%p): stub\n", iface
, rect
);
1296 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl
=
1298 /*** IUnknown methods ***/
1299 IDirectDrawStreamSampleImpl_QueryInterface
,
1300 IDirectDrawStreamSampleImpl_AddRef
,
1301 IDirectDrawStreamSampleImpl_Release
,
1302 /*** IStreamSample methods ***/
1303 IDirectDrawStreamSampleImpl_GetMediaStream
,
1304 IDirectDrawStreamSampleImpl_GetSampleTimes
,
1305 IDirectDrawStreamSampleImpl_SetSampleTimes
,
1306 IDirectDrawStreamSampleImpl_Update
,
1307 IDirectDrawStreamSampleImpl_CompletionStatus
,
1308 /*** IDirectDrawStreamSample methods ***/
1309 IDirectDrawStreamSampleImpl_GetSurface
,
1310 IDirectDrawStreamSampleImpl_SetRect
1313 static HRESULT
ddrawstreamsample_create(IDirectDrawMediaStream
*parent
, IDirectDrawSurface
*surface
,
1314 const RECT
*rect
, IDirectDrawStreamSample
**ddraw_stream_sample
)
1316 IDirectDrawStreamSampleImpl
*object
;
1319 TRACE("(%p)\n", ddraw_stream_sample
);
1321 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
));
1323 return E_OUTOFMEMORY
;
1325 object
->IDirectDrawStreamSample_iface
.lpVtbl
= &DirectDrawStreamSample_Vtbl
;
1327 object
->parent
= (IMediaStream
*)parent
;
1328 IMediaStream_AddRef(object
->parent
);
1332 object
->surface
= surface
;
1333 IDirectDrawSurface_AddRef(surface
);
1340 hr
= IDirectDrawMediaStream_GetDirectDraw(parent
, &ddraw
);
1343 IDirectDrawStreamSample_Release(&object
->IDirectDrawStreamSample_iface
);
1347 desc
.dwSize
= sizeof(desc
);
1348 desc
.dwFlags
= DDSD_CAPS
|DDSD_HEIGHT
|DDSD_WIDTH
|DDSD_PIXELFORMAT
;
1349 desc
.dwHeight
= 100;
1351 desc
.ddpfPixelFormat
.dwSize
= sizeof(desc
.ddpfPixelFormat
);
1352 desc
.ddpfPixelFormat
.dwFlags
= DDPF_RGB
;
1353 desc
.ddpfPixelFormat
.u1
.dwRGBBitCount
= 32;
1354 desc
.ddpfPixelFormat
.u2
.dwRBitMask
= 0xff0000;
1355 desc
.ddpfPixelFormat
.u3
.dwGBitMask
= 0x00ff00;
1356 desc
.ddpfPixelFormat
.u4
.dwBBitMask
= 0x0000ff;
1357 desc
.ddpfPixelFormat
.u5
.dwRGBAlphaBitMask
= 0;
1358 desc
.ddsCaps
.dwCaps
= DDSCAPS_SYSTEMMEMORY
|DDSCAPS_OFFSCREENPLAIN
;
1359 desc
.lpSurface
= NULL
;
1361 hr
= IDirectDraw_CreateSurface(ddraw
, &desc
, &object
->surface
, NULL
);
1362 IDirectDraw_Release(ddraw
);
1365 ERR("failed to create surface, 0x%08x\n", hr
);
1366 IDirectDrawStreamSample_Release(&object
->IDirectDrawStreamSample_iface
);
1372 object
->rect
= *rect
;
1373 else if (object
->surface
)
1375 DDSURFACEDESC desc
= { sizeof(desc
) };
1376 hr
= IDirectDrawSurface_GetSurfaceDesc(object
->surface
, &desc
);
1378 SetRect(&object
->rect
, 0, 0, desc
.dwWidth
, desc
.dwHeight
);
1381 *ddraw_stream_sample
= &object
->IDirectDrawStreamSample_iface
;
1387 IAudioStreamSample IAudioStreamSample_iface
;
1389 IMediaStream
*parent
;
1390 IAudioData
*audio_data
;
1391 } IAudioStreamSampleImpl
;
1393 static inline IAudioStreamSampleImpl
*impl_from_IAudioStreamSample(IAudioStreamSample
*iface
)
1395 return CONTAINING_RECORD(iface
, IAudioStreamSampleImpl
, IAudioStreamSample_iface
);
1398 /*** IUnknown methods ***/
1399 static HRESULT WINAPI
IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample
*iface
,
1400 REFIID riid
, void **ret_iface
)
1402 TRACE("(%p)->(%s,%p)\n", iface
, debugstr_guid(riid
), ret_iface
);
1404 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
1405 IsEqualGUID(riid
, &IID_IStreamSample
) ||
1406 IsEqualGUID(riid
, &IID_IAudioStreamSample
))
1408 IAudioStreamSample_AddRef(iface
);
1415 ERR("(%p)->(%s,%p),not found\n", iface
, debugstr_guid(riid
), ret_iface
);
1416 return E_NOINTERFACE
;
1419 static ULONG WINAPI
IAudioStreamSampleImpl_AddRef(IAudioStreamSample
*iface
)
1421 IAudioStreamSampleImpl
*This
= impl_from_IAudioStreamSample(iface
);
1422 ULONG ref
= InterlockedIncrement(&This
->ref
);
1424 TRACE("(%p)->(): new ref = %u\n", iface
, ref
);
1429 static ULONG WINAPI
IAudioStreamSampleImpl_Release(IAudioStreamSample
*iface
)
1431 IAudioStreamSampleImpl
*This
= impl_from_IAudioStreamSample(iface
);
1432 ULONG ref
= InterlockedDecrement(&This
->ref
);
1434 TRACE("(%p)->(): new ref = %u\n", iface
, ref
);
1437 HeapFree(GetProcessHeap(), 0, This
);
1442 /*** IStreamSample methods ***/
1443 static HRESULT WINAPI
IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample
*iface
, IMediaStream
**media_stream
)
1445 FIXME("(%p)->(%p): stub\n", iface
, media_stream
);
1450 static HRESULT WINAPI
IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample
*iface
, STREAM_TIME
*start_time
,
1451 STREAM_TIME
*end_time
, STREAM_TIME
*current_time
)
1453 FIXME("(%p)->(%p,%p,%p): stub\n", iface
, start_time
, end_time
, current_time
);
1458 static HRESULT WINAPI
IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample
*iface
, const STREAM_TIME
*start_time
,
1459 const STREAM_TIME
*end_time
)
1461 FIXME("(%p)->(%p,%p): stub\n", iface
, start_time
, end_time
);
1466 static HRESULT WINAPI
IAudioStreamSampleImpl_Update(IAudioStreamSample
*iface
, DWORD flags
, HANDLE event
,
1467 PAPCFUNC func_APC
, DWORD APC_data
)
1469 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface
, flags
, event
, func_APC
, APC_data
);
1474 static HRESULT WINAPI
IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample
*iface
, DWORD flags
, DWORD milliseconds
)
1476 FIXME("(%p)->(%x,%u): stub\n", iface
, flags
, milliseconds
);
1481 /*** IAudioStreamSample methods ***/
1482 static HRESULT WINAPI
IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample
*iface
, IAudioData
**audio_data
)
1484 FIXME("(%p)->(%p): stub\n", iface
, audio_data
);
1489 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl
=
1491 /*** IUnknown methods ***/
1492 IAudioStreamSampleImpl_QueryInterface
,
1493 IAudioStreamSampleImpl_AddRef
,
1494 IAudioStreamSampleImpl_Release
,
1495 /*** IStreamSample methods ***/
1496 IAudioStreamSampleImpl_GetMediaStream
,
1497 IAudioStreamSampleImpl_GetSampleTimes
,
1498 IAudioStreamSampleImpl_SetSampleTimes
,
1499 IAudioStreamSampleImpl_Update
,
1500 IAudioStreamSampleImpl_CompletionStatus
,
1501 /*** IAudioStreamSample methods ***/
1502 IAudioStreamSampleImpl_GetAudioData
1505 static HRESULT
audiostreamsample_create(IAudioMediaStream
*parent
, IAudioData
*audio_data
, IAudioStreamSample
**audio_stream_sample
)
1507 IAudioStreamSampleImpl
*object
;
1509 TRACE("(%p)\n", audio_stream_sample
);
1511 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IAudioStreamSampleImpl
));
1513 return E_OUTOFMEMORY
;
1515 object
->IAudioStreamSample_iface
.lpVtbl
= &AudioStreamSample_Vtbl
;
1517 object
->parent
= (IMediaStream
*)parent
;
1518 object
->audio_data
= audio_data
;
1520 *audio_stream_sample
= (IAudioStreamSample
*)&object
->IAudioStreamSample_iface
;