ReactOS 0.4.17-dev-934-g091855f
multimedia.c File Reference
#include "wine/debug.h"
#include "winbase.h"
#include "wingdi.h"
#include "amstream_private.h"
Include dependency graph for multimedia.c:

Go to the source code of this file.

Classes

struct  multimedia_stream
 

Macros

#define COBJMACROS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (quartz)
 
static struct multimedia_stream * impl_from_IAMMultiMediaStream (IAMMultiMediaStream *iface)
 
static HRESULT WINAPI multimedia_stream_QueryInterface (IAMMultiMediaStream *iface, REFIID riid, void **ppvObject)
 
static ULONG WINAPI multimedia_stream_AddRef (IAMMultiMediaStream *iface)
 
static ULONG WINAPI multimedia_stream_Release (IAMMultiMediaStream *iface)
 
static HRESULT WINAPI multimedia_stream_GetInformation (IAMMultiMediaStream *iface, DWORD *pdwFlags, STREAM_TYPE *pStreamType)
 
static HRESULT WINAPI multimedia_stream_GetMediaStream (IAMMultiMediaStream *iface, REFMSPID id, IMediaStream **stream)
 
static HRESULT WINAPI multimedia_stream_EnumMediaStreams (IAMMultiMediaStream *iface, LONG index, IMediaStream **stream)
 
static HRESULT WINAPI multimedia_stream_GetState (IAMMultiMediaStream *iface, STREAM_STATE *state)
 
static HRESULT WINAPI multimedia_stream_SetState (IAMMultiMediaStream *iface, STREAM_STATE new_state)
 
static HRESULT WINAPI multimedia_stream_GetTime (IAMMultiMediaStream *iface, STREAM_TIME *time)
 
static HRESULT WINAPI multimedia_stream_GetDuration (IAMMultiMediaStream *iface, STREAM_TIME *duration)
 
static HRESULT WINAPI multimedia_stream_Seek (IAMMultiMediaStream *iface, STREAM_TIME seek_time)
 
static HRESULT WINAPI multimedia_stream_GetEndOfStream (IAMMultiMediaStream *iface, HANDLE *eos)
 
static HRESULT create_graph (struct multimedia_stream *mmstream, IGraphBuilder *graph)
 
static HRESULT WINAPI multimedia_stream_Initialize (IAMMultiMediaStream *iface, STREAM_TYPE type, DWORD flags, IGraphBuilder *graph)
 
static HRESULT WINAPI multimedia_stream_GetFilterGraph (IAMMultiMediaStream *iface, IGraphBuilder **graph)
 
static HRESULT WINAPI multimedia_stream_GetFilter (IAMMultiMediaStream *iface, IMediaStreamFilter **filter)
 
static void add_stream (struct multimedia_stream *mmstream, IAMMediaStream *stream, IMediaStream **ret_stream)
 
static HRESULT WINAPI multimedia_stream_AddMediaStream (IAMMultiMediaStream *iface, IUnknown *stream_object, const MSPID *PurposeId, DWORD dwFlags, IMediaStream **ret_stream)
 
static HRESULT WINAPI multimedia_stream_OpenFile (IAMMultiMediaStream *iface, const WCHAR *filename, DWORD flags)
 
static HRESULT WINAPI multimedia_stream_OpenMoniker (IAMMultiMediaStream *iface, IBindCtx *pCtx, IMoniker *pMoniker, DWORD dwFlags)
 
static HRESULT WINAPI multimedia_stream_Render (IAMMultiMediaStream *iface, DWORD dwFlags)
 
HRESULT multimedia_stream_create (IUnknown *outer, void **out)
 

Variables

static const IAMMultiMediaStreamVtbl multimedia_stream_vtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 24 of file multimedia.c.

Function Documentation

◆ add_stream()

static void add_stream ( struct multimedia_stream *  mmstream,
IAMMediaStream *  stream,
IMediaStream **  ret_stream 
)
static

Definition at line 327 of file multimedia.c.

328{
329 IMediaStreamFilter_AddMediaStream(mmstream->filter, stream);
330 IAMMediaStream_JoinAMMultiMediaStream(stream, &mmstream->IAMMultiMediaStream_iface);
331 if (ret_stream)
332 {
333 *ret_stream = (IMediaStream *)stream;
334 IMediaStream_AddRef(*ret_stream);
335 }
336}
IMediaStreamFilter * filter
Definition: multimedia.c:40
IAMMultiMediaStream IAMMultiMediaStream_iface
Definition: multimedia.c:35
Definition: parse.h:23

Referenced by multimedia_stream_AddMediaStream().

◆ create_graph()

static HRESULT create_graph ( struct multimedia_stream *  mmstream,
IGraphBuilder *  graph 
)
static

Definition at line 224 of file multimedia.c.

225{
226 IMediaEventEx *eventsrc;
227 HRESULT hr;
228
229 if (graph)
230 IGraphBuilder_AddRef(mmstream->graph = graph);
231 else if (FAILED(hr = CoCreateInstance(&CLSID_FilterGraph, NULL,
232 CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **)&mmstream->graph)))
233 return hr;
234
235 hr = IGraphBuilder_QueryInterface(mmstream->graph, &IID_IMediaSeeking, (void **)&mmstream->media_seeking);
236 if (SUCCEEDED(hr))
237 hr = IGraphBuilder_QueryInterface(mmstream->graph, &IID_IMediaControl, (void **)&mmstream->media_control);
238 if (SUCCEEDED(hr))
239 hr = IGraphBuilder_AddFilter(mmstream->graph, (IBaseFilter *)mmstream->filter, L"MediaStreamFilter");
240 if (SUCCEEDED(hr))
241 hr = IGraphBuilder_QueryInterface(mmstream->graph, &IID_IMediaEventEx, (void **)&eventsrc);
242 if (SUCCEEDED(hr))
243 {
244 hr = IMediaEventEx_GetEventHandle(eventsrc, &mmstream->event);
245 if (SUCCEEDED(hr))
246 hr = IMediaEventEx_SetNotifyFlags(eventsrc, AM_MEDIAEVENT_NONOTIFY);
247 IMediaEventEx_Release(eventsrc);
248 }
249
250 if (FAILED(hr))
251 {
252 if (mmstream->media_seeking)
253 IMediaSeeking_Release(mmstream->media_seeking);
254 mmstream->media_seeking = NULL;
255 if (mmstream->media_control)
256 IMediaControl_Release(mmstream->media_control);
257 mmstream->media_control = NULL;
258 if (mmstream->graph)
259 IGraphBuilder_Release(mmstream->graph);
260 mmstream->graph = NULL;
261 }
262
263 return hr;
264}
@ AM_MEDIAEVENT_NONOTIFY
Definition: axcore.idl:670
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define L(x)
Definition: resources.c:13
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
Definition: graph.c:32
IGraphBuilder * graph
Definition: multimedia.c:37
IMediaControl * media_control
Definition: multimedia.c:39
IMediaSeeking * media_seeking
Definition: multimedia.c:38

◆ impl_from_IAMMultiMediaStream()

◆ multimedia_stream_AddMediaStream()

static HRESULT WINAPI multimedia_stream_AddMediaStream ( IAMMultiMediaStream *  iface,
IUnknown *  stream_object,
const MSPID *  PurposeId,
DWORD  dwFlags,
IMediaStream **  ret_stream 
)
static

Definition at line 338 of file multimedia.c.

340{
342 HRESULT hr;
343 IAMMediaStream* pStream;
345
346 TRACE("mmstream %p, stream_object %p, id %s, flags %#lx, ret_stream %p.\n",
347 This, stream_object, debugstr_guid(PurposeId), dwFlags, ret_stream);
348
349 if (IMediaStreamFilter_GetMediaStream(This->filter, PurposeId, &stream) == S_OK)
350 {
351 IMediaStream_Release(stream);
352 return MS_E_PURPOSEID;
353 }
354
355 if (!This->graph && FAILED(hr = create_graph(This, NULL)))
356 return hr;
357
359 {
361
362 if (ret_stream)
363 return E_INVALIDARG;
364
365 if (!IsEqualGUID(PurposeId, &MSPID_PrimaryAudio))
366 {
367 WARN("AMMSF_ADDDEFAULTRENDERER requested with id %s, returning MS_E_PURPOSEID.\n", debugstr_guid(PurposeId));
368 return MS_E_PURPOSEID;
369 }
370
371 if (SUCCEEDED(hr = CoCreateInstance(&CLSID_DSoundRender, NULL,
372 CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&dsound_render)))
373 {
374 hr = IGraphBuilder_AddFilter(This->graph, dsound_render, NULL);
375 IBaseFilter_Release(dsound_render);
376 }
377 return hr;
378 }
379
380 if (stream_object)
381 {
382 hr = IUnknown_QueryInterface(stream_object, &IID_IAMMediaStream, (void **)&pStream);
383 if (SUCCEEDED(hr))
384 {
385 MSPID stream_id;
386 hr = IAMMediaStream_GetInformation(pStream, &stream_id, NULL);
387 if (SUCCEEDED(hr))
388 {
389 if (IsEqualGUID(PurposeId, &stream_id))
390 {
391 add_stream(This, pStream, ret_stream);
392 hr = S_OK;
393 }
394 else
395 {
396 hr = MS_E_PURPOSEID;
397 }
398 }
399
400 IAMMediaStream_Release(pStream);
401
402 return hr;
403 }
404 }
405
406 if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo))
407 hr = ddraw_stream_create(NULL, (void **)&pStream);
408 else if (IsEqualGUID(PurposeId, &MSPID_PrimaryAudio))
409 hr = audio_stream_create(NULL, (void **)&pStream);
410 else
411 return MS_E_PURPOSEID;
412
413 if (FAILED(hr))
414 return hr;
415
416 hr = IAMMediaStream_Initialize(pStream, stream_object, dwFlags, PurposeId, This->type);
417 if (FAILED(hr))
418 {
419 IAMMediaStream_Release(pStream);
420 return hr;
421 }
422
423 add_stream(This, pStream, ret_stream);
424 IAMMediaStream_Release(pStream);
425
426 return S_OK;
427}
HRESULT audio_stream_create(IUnknown *outer, void **out)
Definition: audiostream.c:1389
HRESULT ddraw_stream_create(IUnknown *outer, void **out)
Definition: ddrawstream.c:1473
#define WARN(fmt,...)
Definition: precomp.h:61
#define E_INVALIDARG
Definition: ddrawi.h:101
const GUID IID_IBaseFilter
@ AMMSF_ADDDEFAULTRENDERER
Definition: amstream.idl:45
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
static IFilterGraph2 * create_graph(void)
Definition: nullrenderer.c:35
static void add_stream(struct multimedia_stream *mmstream, IAMMediaStream *stream, IMediaStream **ret_stream)
Definition: multimedia.c:327
static struct multimedia_stream * impl_from_IAMMultiMediaStream(IAMMultiMediaStream *iface)
Definition: multimedia.c:48
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define TRACE(s)
Definition: solgame.cpp:4

◆ multimedia_stream_AddRef()

static ULONG WINAPI multimedia_stream_AddRef ( IAMMultiMediaStream *  iface)
static

Definition at line 75 of file multimedia.c.

76{
78
79 TRACE("(%p/%p)\n", iface, This);
80
81 return InterlockedIncrement(&This->ref);
82}
#define InterlockedIncrement
Definition: armddk.h:53

◆ multimedia_stream_create()

HRESULT multimedia_stream_create ( IUnknown *  outer,
void **  out 
)

Definition at line 557 of file multimedia.c.

558{
560 HRESULT hr;
561
562 if (outer)
564
565 if (!(object = calloc(1, sizeof(*object))))
566 return E_OUTOFMEMORY;
567
568 object->IAMMultiMediaStream_iface.lpVtbl = &multimedia_stream_vtbl;
569 object->ref = 1;
570
571 if (FAILED(hr = CoCreateInstance(&CLSID_MediaStreamFilter, NULL,
572 CLSCTX_INPROC_SERVER, &IID_IMediaStreamFilter, (void **)&object->filter)))
573 {
574 ERR("Failed to create stream filter, hr %#lx.\n", hr);
575 free(object);
576 return hr;
577 }
578
579 /* The stream takes an additional reference to the filter. */
580 IMediaStreamFilter_AddRef(object->filter);
581
582 TRACE("Created multimedia stream %p.\n", object);
583 *out = &object->IAMMultiMediaStream_iface;
584
585 return S_OK;
586}
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
static IUnknown * outer
Definition: compobj.c:82
static const IAMMultiMediaStreamVtbl multimedia_stream_vtbl
Definition: multimedia.c:534
#define calloc
Definition: rosglue.h:14
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771

◆ multimedia_stream_EnumMediaStreams()

static HRESULT WINAPI multimedia_stream_EnumMediaStreams ( IAMMultiMediaStream *  iface,
LONG  index,
IMediaStream **  stream 
)
static

Definition at line 130 of file multimedia.c.

132{
133 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
134
135 TRACE("mmstream %p, index %ld, stream %p.\n", mmstream, index, stream);
136
137 return IMediaStreamFilter_EnumMediaStreams(mmstream->filter, index, stream);
138}
GLuint index
Definition: glext.h:6031

◆ multimedia_stream_GetDuration()

static HRESULT WINAPI multimedia_stream_GetDuration ( IAMMultiMediaStream *  iface,
STREAM_TIME *  duration 
)
static

Definition at line 186 of file multimedia.c.

187{
188 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
189
190 TRACE("mmstream %p, duration %p.\n", mmstream, duration);
191
192 if (!mmstream->media_seeking)
193 return E_NOINTERFACE;
194
195 if (IMediaSeeking_GetDuration(mmstream->media_seeking, duration) != S_OK)
196 return S_FALSE;
197
198 return S_OK;
199}
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ multimedia_stream_GetEndOfStream()

static HRESULT WINAPI multimedia_stream_GetEndOfStream ( IAMMultiMediaStream *  iface,
HANDLE *  eos 
)
static

Definition at line 210 of file multimedia.c.

211{
212 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
213
214 TRACE("mmstream %p, eos %p.\n", mmstream, eos);
215
216 if (!eos)
217 return E_POINTER;
218
219 *eos = (HANDLE)mmstream->event;
220
221 return S_OK;
222}
PVOID HANDLE
Definition: typedefs.h:73
#define E_POINTER
Definition: winerror.h:3480

◆ multimedia_stream_GetFilter()

static HRESULT WINAPI multimedia_stream_GetFilter ( IAMMultiMediaStream *  iface,
IMediaStreamFilter **  filter 
)
static

Definition at line 312 of file multimedia.c.

314{
315 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
316
317 TRACE("mmstream %p, filter %p.\n", mmstream, filter);
318
319 if (!filter)
320 return E_POINTER;
321
322 IMediaStreamFilter_AddRef(*filter = mmstream->filter);
323
324 return S_OK;
325}
Definition: filter.c:165

◆ multimedia_stream_GetFilterGraph()

static HRESULT WINAPI multimedia_stream_GetFilterGraph ( IAMMultiMediaStream *  iface,
IGraphBuilder **  graph 
)
static

Definition at line 295 of file multimedia.c.

296{
297 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
298
299 TRACE("mmstream %p, graph %p.\n", mmstream, graph);
300
301 if (!graph)
302 return E_POINTER;
303
304 if (mmstream->graph)
305 IGraphBuilder_AddRef(*graph = mmstream->graph);
306 else
307 *graph = NULL;
308
309 return S_OK;
310}

◆ multimedia_stream_GetInformation()

static HRESULT WINAPI multimedia_stream_GetInformation ( IAMMultiMediaStream *  iface,
DWORD *  pdwFlags,
STREAM_TYPE *  pStreamType 
)
static

Definition at line 110 of file multimedia.c.

112{
114
115 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pdwFlags, pStreamType);
116
117 return E_NOTIMPL;
118}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ multimedia_stream_GetMediaStream()

static HRESULT WINAPI multimedia_stream_GetMediaStream ( IAMMultiMediaStream *  iface,
REFMSPID  id,
IMediaStream **  stream 
)
static

Definition at line 120 of file multimedia.c.

122{
123 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
124
125 TRACE("mmstream %p, id %s, stream %p.\n", mmstream, debugstr_guid(id), stream);
126
127 return IMediaStreamFilter_GetMediaStream(mmstream->filter, id, stream);
128}

◆ multimedia_stream_GetState()

static HRESULT WINAPI multimedia_stream_GetState ( IAMMultiMediaStream *  iface,
STREAM_STATE *  state 
)
static

Definition at line 140 of file multimedia.c.

141{
142 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
143
144 TRACE("mmstream %p, state %p.\n", mmstream, state);
145
146 *state = mmstream->state;
147
148 return S_OK;
149}
static int state
Definition: maze.c:121
STREAM_STATE state
Definition: multimedia.c:45

◆ multimedia_stream_GetTime()

static HRESULT WINAPI multimedia_stream_GetTime ( IAMMultiMediaStream *  iface,
STREAM_TIME *  time 
)
static

Definition at line 177 of file multimedia.c.

178{
180
181 TRACE("stream %p, time %p.\n", stream, time);
182
183 return IMediaStreamFilter_GetCurrentStreamTime(stream->filter, time);
184}
__u16 time
Definition: mkdosfs.c:8

◆ multimedia_stream_Initialize()

static HRESULT WINAPI multimedia_stream_Initialize ( IAMMultiMediaStream *  iface,
STREAM_TYPE  type,
DWORD  flags,
IGraphBuilder *  graph 
)
static

Definition at line 266 of file multimedia.c.

268{
269 struct multimedia_stream *mmstream = impl_from_IAMMultiMediaStream(iface);
270 HRESULT hr;
271
272 TRACE("mmstream %p, type %u, flags %#lx, graph %p.\n", mmstream, type, flags, graph);
273
274 if (graph && mmstream->graph)
275 {
276 WARN("Graph already initialized, returning E_INVALIDARG.\n");
277 return E_INVALIDARG;
278 }
279
280 if (mmstream->initialized && type != mmstream->type)
281 {
282 WARN("Attempt to change type from %u, returning E_INVALIDARG.\n", mmstream->type);
283 return E_INVALIDARG;
284 }
285
286 if (graph && FAILED(hr = create_graph(mmstream, graph)))
287 return hr;
288
289 mmstream->type = type;
290 mmstream->initialized = TRUE;
291
292 return S_OK;
293}
#define TRUE
Definition: types.h:120
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
STREAM_TYPE type
Definition: multimedia.c:43

◆ multimedia_stream_OpenFile()

static HRESULT WINAPI multimedia_stream_OpenFile ( IAMMultiMediaStream *  iface,
const WCHAR *  filename,
DWORD  flags 
)
static

Definition at line 429 of file multimedia.c.

431{
433 HRESULT ret = S_OK;
434 IBaseFilter *BaseFilter = NULL;
435 IEnumPins *EnumPins = NULL;
436 IPin *ipin;
437 PIN_DIRECTION pin_direction;
438
439 TRACE("(%p/%p)->(%s,%lx)\n", This, iface, debugstr_w(filename), flags);
440
441 if (!filename)
442 return E_POINTER;
443
444 /* If Initialize was not called before, we do it here */
445 if (!This->graph)
446 {
447 ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL);
448 if (SUCCEEDED(ret))
450 }
451
452 if (SUCCEEDED(ret))
453 ret = IGraphBuilder_AddSourceFilter(This->graph, filename, L"Source", &BaseFilter);
454
455 if (SUCCEEDED(ret))
456 ret = IBaseFilter_EnumPins(BaseFilter, &EnumPins);
457
458 if (SUCCEEDED(ret))
459 ret = IEnumPins_Next(EnumPins, 1, &ipin, NULL);
460
461 if (SUCCEEDED(ret))
462 {
463 ret = IPin_QueryDirection(ipin, &pin_direction);
464 if (ret == S_OK && pin_direction == PINDIR_OUTPUT)
465 This->ipin = ipin;
466 }
467
468 if (SUCCEEDED(ret) && !(flags & AMMSF_NORENDER))
469 {
471
472 if (SUCCEEDED(ret = IGraphBuilder_QueryInterface(This->graph, &IID_IFilterGraph2, (void **)&graph)))
473 {
475
476 ret = IFilterGraph2_RenderEx(graph, This->ipin, renderflags, NULL);
478 else if (ret == VFW_S_PARTIAL_RENDER) ret = S_OK;
479
480 IFilterGraph2_Release(graph);
481 }
482 else
483 {
484 FIXME("Failed to get IFilterGraph2 interface, hr %#lx.\n", ret);
485 ret = IGraphBuilder_Render(This->graph, This->ipin);
486 }
487 }
488
489 if (SUCCEEDED(ret) && (flags & AMMSF_NOCLOCK))
490 {
491 IMediaFilter *media_filter;
492
493 if (SUCCEEDED(ret = IGraphBuilder_QueryInterface(This->graph, &IID_IMediaFilter, (void **)&media_filter)))
494 {
495 ret = IMediaFilter_SetSyncSource(media_filter, NULL);
496 IMediaFilter_Release(media_filter);
497 }
498 }
499
500 IMediaStreamFilter_SupportSeeking(This->filter, This->type == STREAMTYPE_READ);
501
502 if (SUCCEEDED(ret) && (flags & AMMSF_RUN))
503 ret = IAMMultiMediaStream_SetState(iface, STREAMSTATE_RUN);
504
505 if (EnumPins)
506 IEnumPins_Release(EnumPins);
507 if (BaseFilter)
508 IBaseFilter_Release(BaseFilter);
509 return ret;
510}
enum _PinDirection PIN_DIRECTION
@ PINDIR_OUTPUT
Definition: axcore.idl:42
@ AM_RENDEREX_RENDERTOEXISTINGRENDERERS
Definition: axextend.idl:860
return ret
Definition: mutex.c:147
@ AMMSF_RUN
Definition: amstream.idl:57
@ AMMSF_NOCLOCK
Definition: amstream.idl:56
@ AMMSF_NORENDER
Definition: amstream.idl:55
@ AMMSF_RENDERALLSTREAMS
Definition: amstream.idl:54
unsigned long DWORD
Definition: ntddk_ex.h:95
Definition: axcore.idl:92
const char * filename
Definition: ioapi.h:137
#define debugstr_w
Definition: kernel32.h:32
@ STREAMSTATE_RUN
Definition: mmstream.idl:58
@ STREAMTYPE_READ
Definition: mmstream.idl:51
#define VFW_S_PARTIAL_RENDER
Definition: vfwmsgs.h:22
#define VFW_E_CANNOT_CONNECT
Definition: vfwmsgs.h:62
#define VFW_E_CANNOT_RENDER
Definition: vfwmsgs.h:63

◆ multimedia_stream_OpenMoniker()

static HRESULT WINAPI multimedia_stream_OpenMoniker ( IAMMultiMediaStream *  iface,
IBindCtx *  pCtx,
IMoniker *  pMoniker,
DWORD  dwFlags 
)
static

Definition at line 512 of file multimedia.c.

514{
516
517 FIXME("(%p/%p)->(%p,%p,%lx) stub!\n", This, iface, pCtx, pMoniker, dwFlags);
518
519 return E_NOTIMPL;
520}

◆ multimedia_stream_QueryInterface()

static HRESULT WINAPI multimedia_stream_QueryInterface ( IAMMultiMediaStream *  iface,
REFIID  riid,
void **  ppvObject 
)
static

Definition at line 54 of file multimedia.c.

56{
58
59 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
60
62 IsEqualGUID(riid, &IID_IMultiMediaStream) ||
63 IsEqualGUID(riid, &IID_IAMMultiMediaStream))
64 {
65 IAMMultiMediaStream_AddRef(iface);
66 *ppvObject = iface;
67 return S_OK;
68 }
69
70 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
71
72 return E_NOINTERFACE;
73}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39

◆ multimedia_stream_Release()

static ULONG WINAPI multimedia_stream_Release ( IAMMultiMediaStream *  iface)
static

Definition at line 84 of file multimedia.c.

85{
88
89 TRACE("(%p/%p)\n", iface, This);
90
91 if (!ref)
92 {
93 if (This->ipin)
94 IPin_Release(This->ipin);
95 IMediaStreamFilter_Release(This->filter);
96 IMediaStreamFilter_Release(This->filter);
97 if (This->media_seeking)
98 IMediaSeeking_Release(This->media_seeking);
99 if (This->media_control)
100 IMediaControl_Release(This->media_control);
101 if (This->graph)
102 IGraphBuilder_Release(This->graph);
103 free(This);
104 }
105
106 return ref;
107}
#define InterlockedDecrement
Definition: armddk.h:52
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ multimedia_stream_Render()

static HRESULT WINAPI multimedia_stream_Render ( IAMMultiMediaStream *  iface,
DWORD  dwFlags 
)
static

Definition at line 522 of file multimedia.c.

523{
525
526 FIXME("(%p/%p)->(%lx) partial stub!\n", This, iface, dwFlags);
527
529 return E_INVALIDARG;
530
531 return IGraphBuilder_Render(This->graph, This->ipin);
532}

◆ multimedia_stream_Seek()

static HRESULT WINAPI multimedia_stream_Seek ( IAMMultiMediaStream *  iface,
STREAM_TIME  seek_time 
)
static

Definition at line 201 of file multimedia.c.

202{
204
205 TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(seek_time));
206
207 return IMediaSeeking_SetPositions(This->media_seeking, &seek_time, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning);
208}
@ AM_SEEKING_NoPositioning
Definition: axcore.idl:591
@ AM_SEEKING_AbsolutePositioning
Definition: axcore.idl:592
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49

◆ multimedia_stream_SetState()

static HRESULT WINAPI multimedia_stream_SetState ( IAMMultiMediaStream *  iface,
STREAM_STATE  new_state 
)
static

Definition at line 151 of file multimedia.c.

152{
155
156 TRACE("(%p/%p)->(%u)\n", This, iface, new_state);
157
158 if (new_state == STREAMSTATE_RUN)
159 {
160 hr = IMediaControl_Run(This->media_control);
161 if (SUCCEEDED(hr))
162 {
163 FILTER_STATE state;
164 IMediaControl_GetState(This->media_control, INFINITE, (OAFilterState *)&state);
165 hr = S_OK;
166 }
167 }
168 else if (new_state == STREAMSTATE_STOP)
169 hr = IMediaControl_Stop(This->media_control);
170
171 if (SUCCEEDED(hr))
172 This->state = new_state;
173
174 return hr;
175}
#define INFINITE
Definition: serial.h:102
@ STREAMSTATE_STOP
Definition: mmstream.idl:57

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( quartz  )

Variable Documentation

◆ multimedia_stream_vtbl

const IAMMultiMediaStreamVtbl multimedia_stream_vtbl
static
Initial value:
=
{
}
static ULONG WINAPI multimedia_stream_Release(IAMMultiMediaStream *iface)
Definition: multimedia.c:84
static HRESULT WINAPI multimedia_stream_GetFilterGraph(IAMMultiMediaStream *iface, IGraphBuilder **graph)
Definition: multimedia.c:295
static HRESULT WINAPI multimedia_stream_GetMediaStream(IAMMultiMediaStream *iface, REFMSPID id, IMediaStream **stream)
Definition: multimedia.c:120
static HRESULT WINAPI multimedia_stream_AddMediaStream(IAMMultiMediaStream *iface, IUnknown *stream_object, const MSPID *PurposeId, DWORD dwFlags, IMediaStream **ret_stream)
Definition: multimedia.c:338
static HRESULT WINAPI multimedia_stream_Render(IAMMultiMediaStream *iface, DWORD dwFlags)
Definition: multimedia.c:522
static HRESULT WINAPI multimedia_stream_GetDuration(IAMMultiMediaStream *iface, STREAM_TIME *duration)
Definition: multimedia.c:186
static HRESULT WINAPI multimedia_stream_GetInformation(IAMMultiMediaStream *iface, DWORD *pdwFlags, STREAM_TYPE *pStreamType)
Definition: multimedia.c:110
static HRESULT WINAPI multimedia_stream_GetTime(IAMMultiMediaStream *iface, STREAM_TIME *time)
Definition: multimedia.c:177
static HRESULT WINAPI multimedia_stream_Seek(IAMMultiMediaStream *iface, STREAM_TIME seek_time)
Definition: multimedia.c:201
static HRESULT WINAPI multimedia_stream_EnumMediaStreams(IAMMultiMediaStream *iface, LONG index, IMediaStream **stream)
Definition: multimedia.c:130
static HRESULT WINAPI multimedia_stream_QueryInterface(IAMMultiMediaStream *iface, REFIID riid, void **ppvObject)
Definition: multimedia.c:54
static HRESULT WINAPI multimedia_stream_GetEndOfStream(IAMMultiMediaStream *iface, HANDLE *eos)
Definition: multimedia.c:210
static HRESULT WINAPI multimedia_stream_GetFilter(IAMMultiMediaStream *iface, IMediaStreamFilter **filter)
Definition: multimedia.c:312
static ULONG WINAPI multimedia_stream_AddRef(IAMMultiMediaStream *iface)
Definition: multimedia.c:75
static HRESULT WINAPI multimedia_stream_SetState(IAMMultiMediaStream *iface, STREAM_STATE new_state)
Definition: multimedia.c:151
static HRESULT WINAPI multimedia_stream_GetState(IAMMultiMediaStream *iface, STREAM_STATE *state)
Definition: multimedia.c:140
static HRESULT WINAPI multimedia_stream_OpenFile(IAMMultiMediaStream *iface, const WCHAR *filename, DWORD flags)
Definition: multimedia.c:429
static HRESULT WINAPI multimedia_stream_Initialize(IAMMultiMediaStream *iface, STREAM_TYPE type, DWORD flags, IGraphBuilder *graph)
Definition: multimedia.c:266
static HRESULT WINAPI multimedia_stream_OpenMoniker(IAMMultiMediaStream *iface, IBindCtx *pCtx, IMoniker *pMoniker, DWORD dwFlags)
Definition: multimedia.c:512

Definition at line 534 of file multimedia.c.

Referenced by multimedia_stream_create().