ReactOS 0.4.17-dev-966-gf06eace
mediadet.c File Reference
#include <assert.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "ole2.h"
#include "qedit_private.h"
#include "wine/debug.h"
Include dependency graph for mediadet.c:

Go to the source code of this file.

Classes

struct  MediaDetImpl
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct MediaDetImpl MediaDetImpl
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (quartz)
 
static MediaDetImpl * impl_from_IUnknown (IUnknown *iface)
 
static MediaDetImpl * impl_from_IMediaDet (IMediaDet *iface)
 
static void MD_cleanup (MediaDetImpl *This)
 
static HRESULT get_filter_info (IMoniker *moniker, GUID *clsid, VARIANT *var)
 
static HRESULT get_pin_media_type (IPin *pin, AM_MEDIA_TYPE *out)
 
static HRESULT find_splitter (MediaDetImpl *detector)
 
static HRESULT WINAPI MediaDet_inner_QueryInterface (IUnknown *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI MediaDet_inner_AddRef (IUnknown *iface)
 
static ULONG WINAPI MediaDet_inner_Release (IUnknown *iface)
 
static HRESULT WINAPI MediaDet_QueryInterface (IMediaDet *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI MediaDet_AddRef (IMediaDet *iface)
 
static ULONG WINAPI MediaDet_Release (IMediaDet *iface)
 
static HRESULT WINAPI MediaDet_get_Filter (IMediaDet *iface, IUnknown **filter)
 
static HRESULT WINAPI MediaDet_put_Filter (IMediaDet *iface, IUnknown *unk)
 
static HRESULT WINAPI MediaDet_get_OutputStreams (IMediaDet *iface, LONG *pVal)
 
static HRESULT WINAPI MediaDet_get_CurrentStream (IMediaDet *iface, LONG *pVal)
 
static HRESULT SetCurPin (MediaDetImpl *This, LONG strm)
 
static HRESULT WINAPI MediaDet_put_CurrentStream (IMediaDet *iface, LONG newVal)
 
static HRESULT WINAPI MediaDet_get_StreamType (IMediaDet *iface, GUID *majortype)
 
static HRESULT WINAPI MediaDet_get_StreamTypeB (IMediaDet *iface, BSTR *bstr)
 
static HRESULT WINAPI MediaDet_get_StreamLength (IMediaDet *iface, double *length)
 
static HRESULT WINAPI MediaDet_get_Filename (IMediaDet *iface, BSTR *pVal)
 
static HRESULT WINAPI MediaDet_put_Filename (IMediaDet *iface, BSTR filename)
 
static HRESULT WINAPI MediaDet_GetBitmapBits (IMediaDet *iface, double StreamTime, LONG *pBufferSize, char *pBuffer, LONG Width, LONG Height)
 
static HRESULT WINAPI MediaDet_WriteBitmapBits (IMediaDet *iface, double StreamTime, LONG Width, LONG Height, BSTR Filename)
 
static HRESULT WINAPI MediaDet_get_StreamMediaType (IMediaDet *iface, AM_MEDIA_TYPE *pVal)
 
static HRESULT WINAPI MediaDet_GetSampleGrabber (IMediaDet *iface, ISampleGrabber **ppVal)
 
static HRESULT WINAPI MediaDet_get_FrameRate (IMediaDet *iface, double *pVal)
 
static HRESULT WINAPI MediaDet_EnterBitmapGrabMode (IMediaDet *iface, double SeekTime)
 
HRESULT media_detector_create (IUnknown *pUnkOuter, IUnknown **ppv)
 

Variables

static const IUnknownVtbl mediadet_vtbl
 
static const IMediaDetVtbl IMediaDet_VTable
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 23 of file mediadet.c.

Typedef Documentation

◆ MediaDetImpl

Function Documentation

◆ find_splitter()

static HRESULT find_splitter ( MediaDetImpl *  detector)
static

Definition at line 122 of file mediadet.c.

123{
124 IPin *source_pin, *splitter_pin;
126 IFilterMapper2 *mapper;
127 IBaseFilter *splitter;
129 AM_MEDIA_TYPE mt;
130 IMoniker *mon;
131 GUID type[2];
132 VARIANT var;
133 HRESULT hr;
134 GUID clsid;
135
136 if (FAILED(hr = IBaseFilter_EnumPins(detector->source, &enum_pins)))
137 {
138 ERR("Failed to enumerate source pins, hr %#lx.\n", hr);
139 return hr;
140 }
141 hr = IEnumPins_Next(enum_pins, 1, &source_pin, NULL);
142 IEnumPins_Release(enum_pins);
143 if (hr != S_OK)
144 {
145 ERR("Failed to get source pin, hr %#lx.\n", hr);
146 return hr;
147 }
148
149 if (FAILED(hr = get_pin_media_type(source_pin, &mt)))
150 {
151 ERR("Failed to get media type, hr %#lx.\n", hr);
152 IPin_Release(source_pin);
153 return hr;
154 }
155
156 type[0] = mt.majortype;
157 type[1] = mt.subtype;
158 FreeMediaType(&mt);
159
160 if (FAILED(hr = CoCreateInstance(&CLSID_FilterMapper2, NULL,
161 CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (void **)&mapper)))
162 {
163 IPin_Release(source_pin);
164 return hr;
165 }
166
167 hr = IFilterMapper2_EnumMatchingFilters(mapper, &enum_moniker, 0, TRUE,
168 MERIT_UNLIKELY, FALSE, 1, type, NULL, NULL, FALSE, TRUE, 0, NULL, NULL, NULL);
169 IFilterMapper2_Release(mapper);
170 if (FAILED(hr))
171 {
172 IPin_Release(source_pin);
173 return hr;
174 }
175
177 while (IEnumMoniker_Next(enum_moniker, 1, &mon, NULL) == S_OK)
178 {
179 hr = get_filter_info(mon, &clsid, &var);
180 IMoniker_Release(mon);
181 if (FAILED(hr))
182 continue;
183
184 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
185 &IID_IBaseFilter, (void **)&splitter);
186 if (FAILED(hr))
187 {
189 continue;
190 }
191
192 hr = IGraphBuilder_AddFilter(detector->graph, splitter, V_BSTR(&var));
194 if (FAILED(hr))
195 {
196 IBaseFilter_Release(splitter);
197 continue;
198 }
199
200 hr = IBaseFilter_EnumPins(splitter, &enum_pins);
201 if (FAILED(hr))
202 goto next;
203
204 hr = IEnumPins_Next(enum_pins, 1, &splitter_pin, NULL);
205 IEnumPins_Release(enum_pins);
206 if (hr != S_OK)
207 goto next;
208
209 hr = IPin_Connect(source_pin, splitter_pin, NULL);
210 IPin_Release(splitter_pin);
211 if (SUCCEEDED(hr))
212 {
213 detector->splitter = splitter;
214 break;
215 }
216
217next:
218 IGraphBuilder_RemoveFilter(detector->graph, splitter);
219 IBaseFilter_Release(splitter);
220 }
221
222 IEnumMoniker_Release(enum_moniker);
223 IPin_Release(source_pin);
224 return hr;
225}
#define ERR(fmt,...)
Definition: precomp.h:57
HRESULT hr
Definition: delayimp.cpp:582
const GUID IID_IBaseFilter
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static HRESULT get_pin_media_type(IPin *pin, AM_MEDIA_TYPE *out)
Definition: mediadet.c:104
static HRESULT get_filter_info(IMoniker *moniker, GUID *clsid, VARIANT *var)
Definition: mediadet.c:75
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
Definition: axcore.idl:92
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * var
Definition: shader.c:5879
const CLSID * clsid
Definition: msctf.cpp:50
#define V_BSTR(A)
Definition: oleauto.h:226
static unsigned __int64 next
Definition: rand_nt.c:6
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
Definition: mediatype.c:165
IBaseFilter * source
Definition: mediadet.c:41
IBaseFilter * splitter
Definition: mediadet.c:42
IGraphBuilder * graph
Definition: mediadet.c:40
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
#define E_NOINTERFACE
Definition: winerror.h:3479

Referenced by MediaDet_put_Filename(), and MediaDet_put_Filter().

◆ get_filter_info()

static HRESULT get_filter_info ( IMoniker *  moniker,
GUID *  clsid,
VARIANT *  var 
)
static

Definition at line 75 of file mediadet.c.

76{
77 IPropertyBag *prop_bag;
78 HRESULT hr;
79
80 if (FAILED(hr = IMoniker_BindToStorage(moniker, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag)))
81 {
82 ERR("Failed to get property bag, hr %#lx.\n", hr);
83 return hr;
84 }
85
87 V_VT(var) = VT_BSTR;
88 if (FAILED(hr = IPropertyBag_Read(prop_bag, L"CLSID", var, NULL)))
89 {
90 ERR("Failed to get CLSID, hr %#lx.\n", hr);
91 IPropertyBag_Release(prop_bag);
92 return hr;
93 }
96
97 if (FAILED(hr = IPropertyBag_Read(prop_bag, L"FriendlyName", var, NULL)))
98 ERR("Failed to get name, hr %#lx.\n", hr);
99
100 IPropertyBag_Release(prop_bag);
101 return hr;
102}
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
@ VT_BSTR
Definition: compat.h:2303
#define L(x)
Definition: resources.c:13
#define V_VT(A)
Definition: oleauto.h:211
const GUID IID_IPropertyBag
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547

Referenced by find_splitter().

◆ get_pin_media_type()

static HRESULT get_pin_media_type ( IPin *  pin,
AM_MEDIA_TYPE *  out 
)
static

Definition at line 104 of file mediadet.c.

105{
106 IEnumMediaTypes *enummt;
107 AM_MEDIA_TYPE *pmt;
108 HRESULT hr;
109
110 if (FAILED(hr = IPin_EnumMediaTypes(pin, &enummt)))
111 return hr;
112 hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL);
113 IEnumMediaTypes_Release(enummt);
114 if (hr != S_OK)
115 return E_NOINTERFACE;
116
117 *out = *pmt;
118 CoTaskMemFree(pmt);
119 return S_OK;
120}
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by find_splitter(), and MediaDet_get_StreamMediaType().

◆ impl_from_IMediaDet()

◆ impl_from_IUnknown()

static MediaDetImpl * impl_from_IUnknown ( IUnknown *  iface)
inlinestatic

Definition at line 49 of file mediadet.c.

50{
51 return CONTAINING_RECORD(iface, MediaDetImpl, IUnknown_inner);
52}

Referenced by MediaDet_inner_AddRef(), MediaDet_inner_QueryInterface(), and MediaDet_inner_Release().

◆ MD_cleanup()

static void MD_cleanup ( MediaDetImpl *  This)
static

Definition at line 59 of file mediadet.c.

60{
61 if (This->cur_pin) IPin_Release(This->cur_pin);
62 This->cur_pin = NULL;
63 if (This->source) IBaseFilter_Release(This->source);
64 This->source = NULL;
65 if (This->splitter) IBaseFilter_Release(This->splitter);
66 This->splitter = NULL;
67 if (This->graph) IGraphBuilder_Release(This->graph);
68 This->graph = NULL;
69 free(This->filename);
70 This->filename = NULL;
71 This->num_streams = -1;
72 This->cur_stream = 0;
73}
#define free
Definition: debug_ros.c:5

Referenced by MediaDet_inner_Release(), MediaDet_put_Filename(), and MediaDet_put_Filter().

◆ media_detector_create()

HRESULT media_detector_create ( IUnknown *  pUnkOuter,
IUnknown **  ppv 
)

Definition at line 724 of file mediadet.c.

725{
727
728 TRACE("(%p,%p)\n", pUnkOuter, ppv);
729
731 if (NULL == obj) {
732 *ppv = NULL;
733 return E_OUTOFMEMORY;
734 }
735 ZeroMemory(obj, sizeof(MediaDetImpl));
736
737 obj->ref = 1;
738 obj->IUnknown_inner.lpVtbl = &mediadet_vtbl;
739 obj->IMediaDet_iface.lpVtbl = &IMediaDet_VTable;
740 obj->graph = NULL;
741 obj->source = NULL;
742 obj->splitter = NULL;
743 obj->cur_pin = NULL;
744 obj->num_streams = -1;
745 obj->cur_stream = 0;
746
747 if (pUnkOuter)
748 obj->outer_unk = pUnkOuter;
749 else
750 obj->outer_unk = &obj->IUnknown_inner;
751
752 *ppv = &obj->IUnknown_inner;
753 return S_OK;
754}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static const IMediaDetVtbl IMediaDet_VTable
Definition: mediadet.c:701
static const IUnknownVtbl mediadet_vtbl
Definition: mediadet.c:275
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define ZeroMemory
Definition: minwinbase.h:31
#define TRACE(s)
Definition: solgame.cpp:4

◆ MediaDet_AddRef()

static ULONG WINAPI MediaDet_AddRef ( IMediaDet *  iface)
static

Definition at line 289 of file mediadet.c.

290{
292 return IUnknown_AddRef(This->outer_unk);
293}
static MediaDetImpl * impl_from_IMediaDet(IMediaDet *iface)
Definition: mediadet.c:54

◆ MediaDet_EnterBitmapGrabMode()

static HRESULT WINAPI MediaDet_EnterBitmapGrabMode ( IMediaDet *  iface,
double  SeekTime 
)
static

Definition at line 693 of file mediadet.c.

695{
697 FIXME("(%p)->(%f): not implemented!\n", This, SeekTime);
698 return E_NOTIMPL;
699}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ MediaDet_get_CurrentStream()

static HRESULT WINAPI MediaDet_get_CurrentStream ( IMediaDet *  iface,
LONG *  pVal 
)
static

Definition at line 409 of file mediadet.c.

410{
412 TRACE("(%p)\n", This);
413
414 if (!pVal)
415 return E_POINTER;
416
417 *pVal = This->cur_stream;
418 return S_OK;
419}
#define E_POINTER
Definition: winerror.h:3480

◆ MediaDet_get_Filename()

static HRESULT WINAPI MediaDet_get_Filename ( IMediaDet *  iface,
BSTR *  pVal 
)
static

Definition at line 556 of file mediadet.c.

557{
559
560 TRACE("(%p)\n", This);
561
562 if (!pVal)
563 return E_POINTER;
564
565 *pVal = NULL;
566 /* MSDN says it should return E_FAIL if no file is open, but tests
567 show otherwise. */
568 if (!This->filename)
569 return S_OK;
570
571 *pVal = SysAllocString(This->filename);
572 if (!*pVal)
573 return E_OUTOFMEMORY;
574
575 return S_OK;
576}
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240

◆ MediaDet_get_Filter()

static HRESULT WINAPI MediaDet_get_Filter ( IMediaDet *  iface,
IUnknown **  filter 
)
static

Definition at line 301 of file mediadet.c.

302{
303 MediaDetImpl *detector = impl_from_IMediaDet(iface);
304
305 TRACE("detector %p, filter %p.\n", detector, filter);
306
307 if (!filter)
308 return E_POINTER;
309
310 *filter = (IUnknown *)detector->source;
311 if (*filter)
312 IUnknown_AddRef(*filter);
313 else
314 return S_FALSE;
315
316 return S_OK;
317}
if(dx< 0)
Definition: linetemp.h:194
Definition: filter.c:165
#define S_FALSE
Definition: winerror.h:3451

◆ MediaDet_get_FrameRate()

static HRESULT WINAPI MediaDet_get_FrameRate ( IMediaDet *  iface,
double *  pVal 
)
static

Definition at line 664 of file mediadet.c.

665{
667 AM_MEDIA_TYPE mt;
668 VIDEOINFOHEADER *vh;
669 HRESULT hr;
670
671 TRACE("(%p)\n", This);
672
673 if (!pVal)
674 return E_POINTER;
675
676 hr = MediaDet_get_StreamMediaType(iface, &mt);
677 if (FAILED(hr))
678 return hr;
679
680 if (!IsEqualGUID(&mt.majortype, &MEDIATYPE_Video))
681 {
682 CoTaskMemFree(mt.pbFormat);
684 }
685
686 vh = (VIDEOINFOHEADER *) mt.pbFormat;
687 *pVal = 1.0e7 / (double) vh->AvgTimePerFrame;
688
689 CoTaskMemFree(mt.pbFormat);
690 return S_OK;
691}
static HRESULT WINAPI MediaDet_get_StreamMediaType(IMediaDet *iface, AM_MEDIA_TYPE *pVal)
Definition: mediadet.c:640
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
REFERENCE_TIME AvgTimePerFrame
Definition: amvideo.idl:187
#define VFW_E_INVALIDMEDIATYPE
Definition: vfwmsgs.h:39

◆ MediaDet_get_OutputStreams()

static HRESULT WINAPI MediaDet_get_OutputStreams ( IMediaDet *  iface,
LONG *  pVal 
)
static

Definition at line 365 of file mediadet.c.

366{
368 IEnumPins *pins;
369 IPin *pin;
370 HRESULT hr;
371
372 TRACE("(%p)\n", This);
373
374 if (!This->splitter)
375 return E_INVALIDARG;
376
377 if (This->num_streams != -1)
378 {
379 *pVal = This->num_streams;
380 return S_OK;
381 }
382
383 *pVal = 0;
384
385 hr = IBaseFilter_EnumPins(This->splitter, &pins);
386 if (FAILED(hr))
387 return hr;
388
389 while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK)
390 {
392 hr = IPin_QueryDirection(pin, &dir);
393 IPin_Release(pin);
394 if (FAILED(hr))
395 {
396 IEnumPins_Release(pins);
397 return hr;
398 }
399
400 if (dir == PINDIR_OUTPUT)
401 ++*pVal;
402 }
403 IEnumPins_Release(pins);
404
405 This->num_streams = *pVal;
406 return S_OK;
407}
unsigned int dir
Definition: maze.c:112
enum _PinDirection PIN_DIRECTION
@ PINDIR_OUTPUT
Definition: axcore.idl:42
#define E_INVALIDARG
Definition: ddrawi.h:101

Referenced by MediaDet_put_CurrentStream().

◆ MediaDet_get_StreamLength()

static HRESULT WINAPI MediaDet_get_StreamLength ( IMediaDet *  iface,
double *  length 
)
static

Definition at line 525 of file mediadet.c.

526{
527 MediaDetImpl *detector = impl_from_IMediaDet(iface);
528 IMediaSeeking *seeking;
529 HRESULT hr;
530
531 TRACE("detector %p, length %p.\n", detector, length);
532
533 if (!length)
534 return E_POINTER;
535
536 if (!detector->cur_pin)
537 return E_INVALIDARG;
538
539 if (SUCCEEDED(hr = IPin_QueryInterface(detector->cur_pin,
540 &IID_IMediaSeeking, (void **)&seeking)))
541 {
542 LONGLONG duration;
543
544 if (SUCCEEDED(hr = IMediaSeeking_GetDuration(seeking, &duration)))
545 {
546 /* Windows assumes the time format is TIME_FORMAT_MEDIA_TIME
547 and does not check it nor convert it, as tests show. */
548 *length = (REFTIME)duration / 10000000;
549 }
550 IMediaSeeking_Release(seeking);
551 }
552
553 return hr;
554}
DOUBLE REFTIME
Definition: axcore.idl:57
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
IPin * cur_pin
Definition: mediadet.c:46
int64_t LONGLONG
Definition: typedefs.h:68

◆ MediaDet_get_StreamMediaType()

static HRESULT WINAPI MediaDet_get_StreamMediaType ( IMediaDet *  iface,
AM_MEDIA_TYPE *  pVal 
)
static

Definition at line 640 of file mediadet.c.

642{
644
645 TRACE("(%p)\n", This);
646
647 if (!pVal)
648 return E_POINTER;
649
650 if (!This->cur_pin)
651 return E_INVALIDARG;
652
653 return get_pin_media_type(This->cur_pin, pVal);
654}

Referenced by MediaDet_get_FrameRate().

◆ MediaDet_get_StreamType()

static HRESULT WINAPI MediaDet_get_StreamType ( IMediaDet *  iface,
GUID *  majortype 
)
static

Definition at line 488 of file mediadet.c.

489{
490 MediaDetImpl *detector = impl_from_IMediaDet(iface);
491 AM_MEDIA_TYPE mt;
492 HRESULT hr;
493
494 TRACE("detector %p, majortype %p.\n", detector, majortype);
495
496 if (!majortype)
497 return E_POINTER;
498
499 if (SUCCEEDED(hr = IMediaDet_get_StreamMediaType(iface, &mt)))
500 {
501 *majortype = mt.majortype;
502 FreeMediaType(&mt);
503 }
504
505 return hr;
506}

◆ MediaDet_get_StreamTypeB()

static HRESULT WINAPI MediaDet_get_StreamTypeB ( IMediaDet *  iface,
BSTR *  bstr 
)
static

Definition at line 508 of file mediadet.c.

509{
510 MediaDetImpl *detector = impl_from_IMediaDet(iface);
511 HRESULT hr;
512 GUID guid;
513
514 TRACE("detector %p, bstr %p.\n", detector, bstr);
515
516 if (SUCCEEDED(hr = IMediaDet_get_StreamType(iface, &guid)))
517 {
518 if (!(*bstr = SysAllocStringLen(NULL, CHARS_IN_GUID - 1)))
519 return E_OUTOFMEMORY;
521 }
522 return hr;
523}
#define CHARS_IN_GUID
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
GUID guid
Definition: version.c:147
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:341

◆ MediaDet_GetBitmapBits()

static HRESULT WINAPI MediaDet_GetBitmapBits ( IMediaDet *  iface,
double  StreamTime,
LONG *  pBufferSize,
char *  pBuffer,
LONG  Width,
LONG  Height 
)
static

Definition at line 620 of file mediadet.c.

624{
626 FIXME("(%p)->(%.16e %p %p %ld %ld): not implemented!\n", This, StreamTime, pBufferSize, pBuffer,
627 Width, Height);
628 return E_NOTIMPL;
629}
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT _Out_ UINT * Height
Definition: dispmprt.h:1445
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT * Width
Definition: dispmprt.h:1444
_Must_inspect_result_ _In_ ULONG _Out_writes_bytes_ pBufferSize PVOID _Inout_ PULONG pBufferSize
Definition: fsrtlfuncs.h:1165
PVOID pBuffer

◆ MediaDet_GetSampleGrabber()

static HRESULT WINAPI MediaDet_GetSampleGrabber ( IMediaDet *  iface,
ISampleGrabber **  ppVal 
)
static

Definition at line 656 of file mediadet.c.

658{
660 FIXME("(%p)->(%p): not implemented!\n", This, ppVal);
661 return E_NOTIMPL;
662}

◆ MediaDet_inner_AddRef()

static ULONG WINAPI MediaDet_inner_AddRef ( IUnknown *  iface)
static

Definition at line 249 of file mediadet.c.

250{
251 MediaDetImpl *detector = impl_from_IUnknown(iface);
252 ULONG refcount = InterlockedIncrement(&detector->ref);
253
254 TRACE("%p increasing refcount to %lu.\n", detector, refcount);
255
256 return refcount;
257}
#define InterlockedIncrement
Definition: armddk.h:53
static MediaDetImpl * impl_from_IUnknown(IUnknown *iface)
Definition: mediadet.c:49
LONG ref
Definition: mediadet.c:39
uint32_t ULONG
Definition: typedefs.h:59

◆ MediaDet_inner_QueryInterface()

static HRESULT WINAPI MediaDet_inner_QueryInterface ( IUnknown *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 228 of file mediadet.c.

229{
231
232 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
233
234 *ppv = NULL;
236 *ppv = &This->IUnknown_inner;
237 else if (IsEqualIID(riid, &IID_IMediaDet))
238 *ppv = &This->IMediaDet_iface;
239 else
240 WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
241
242 if (!*ppv)
243 return E_NOINTERFACE;
244
245 IUnknown_AddRef((IUnknown*)*ppv);
246 return S_OK;
247}
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95

◆ MediaDet_inner_Release()

static ULONG WINAPI MediaDet_inner_Release ( IUnknown *  iface)
static

Definition at line 259 of file mediadet.c.

260{
261 MediaDetImpl *detector = impl_from_IUnknown(iface);
262 ULONG refcount = InterlockedDecrement(&detector->ref);
263
264 TRACE("%p decreasing refcount to %lu.\n", detector, refcount);
265
266 if (!refcount)
267 {
268 MD_cleanup(detector);
269 CoTaskMemFree(detector);
270 }
271
272 return refcount;
273}
#define InterlockedDecrement
Definition: armddk.h:52
static void MD_cleanup(MediaDetImpl *This)
Definition: mediadet.c:59

◆ MediaDet_put_CurrentStream()

static HRESULT WINAPI MediaDet_put_CurrentStream ( IMediaDet *  iface,
LONG  newVal 
)
static

Definition at line 462 of file mediadet.c.

463{
465 HRESULT hr;
466
467 TRACE("detector %p, index %ld.\n", This, newVal);
468
469 if (This->num_streams == -1)
470 {
471 LONG n;
473 if (FAILED(hr))
474 return hr;
475 }
476
477 if (newVal < 0 || This->num_streams <= newVal)
478 return E_INVALIDARG;
479
480 hr = SetCurPin(This, newVal);
481 if (FAILED(hr))
482 return hr;
483
484 This->cur_stream = newVal;
485 return S_OK;
486}
static HRESULT SetCurPin(MediaDetImpl *This, LONG strm)
Definition: mediadet.c:421
static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet *iface, LONG *pVal)
Definition: mediadet.c:365
GLdouble n
Definition: glext.h:7729
long LONG
Definition: pedump.c:60

Referenced by MediaDet_put_Filename().

◆ MediaDet_put_Filename()

static HRESULT WINAPI MediaDet_put_Filename ( IMediaDet *  iface,
BSTR  filename 
)
static

Definition at line 578 of file mediadet.c.

579{
581 IGraphBuilder *gb;
582 IBaseFilter *bf;
583 HRESULT hr;
584
585 TRACE("detector %p, filename %s.\n", This, debugstr_w(filename));
586
587 if (This->graph)
588 {
589 WARN("MSDN says not to call this method twice\n");
591 }
592
593 hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
594 &IID_IGraphBuilder, (void **) &gb);
595 if (FAILED(hr))
596 return hr;
597
598 if (FAILED(hr = IGraphBuilder_AddSourceFilter(gb, filename, L"Source", &bf)))
599 {
600 IGraphBuilder_Release(gb);
601 return hr;
602 }
603
604 if (!(This->filename = wcsdup(filename)))
605 {
606 IBaseFilter_Release(bf);
607 IGraphBuilder_Release(gb);
608 return E_OUTOFMEMORY;
609 }
610
611 This->graph = gb;
612 This->source = bf;
614 if (FAILED(hr))
615 return hr;
616
617 return MediaDet_put_CurrentStream(iface, 0);
618}
static HRESULT find_splitter(MediaDetImpl *detector)
Definition: mediadet.c:122
static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet *iface, LONG newVal)
Definition: mediadet.c:462
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
const char * filename
Definition: ioapi.h:137
#define debugstr_w
Definition: kernel32.h:32

◆ MediaDet_put_Filter()

static HRESULT WINAPI MediaDet_put_Filter ( IMediaDet *  iface,
IUnknown *  unk 
)
static

Definition at line 319 of file mediadet.c.

320{
321 MediaDetImpl *detector = impl_from_IMediaDet(iface);
324 HRESULT hr;
325
326 TRACE("detector %p, unk %p.\n", detector, unk);
327
328 if (!unk)
329 return E_POINTER;
330
331 if (FAILED(hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter)))
332 {
333 WARN("Object does not expose IBaseFilter.\n");
334 return hr;
335 }
336
337 if (detector->graph)
338 MD_cleanup(detector);
339
340 if (FAILED(hr = CoCreateInstance(&CLSID_FilterGraph, NULL,
341 CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **)&graph)))
342 {
343 IBaseFilter_Release(filter);
344 return hr;
345 }
346
347 if (FAILED(hr = IGraphBuilder_AddFilter(graph, filter, L"Source")))
348 {
349 IGraphBuilder_Release(graph);
350 IBaseFilter_Release(filter);
351 return hr;
352 }
353
354 detector->graph = graph;
355 detector->source = filter;
356 if (FAILED(find_splitter(detector)))
357 {
358 detector->splitter = detector->source;
359 IBaseFilter_AddRef(detector->splitter);
360 }
361
362 return IMediaDet_put_CurrentStream(&detector->IMediaDet_iface, 0);
363}
IMediaDet IMediaDet_iface
Definition: mediadet.c:37
Definition: graph.c:32

◆ MediaDet_QueryInterface()

static HRESULT WINAPI MediaDet_QueryInterface ( IMediaDet *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 283 of file mediadet.c.

284{
286 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
287}

◆ MediaDet_Release()

static ULONG WINAPI MediaDet_Release ( IMediaDet *  iface)
static

Definition at line 295 of file mediadet.c.

296{
298 return IUnknown_Release(This->outer_unk);
299}

◆ MediaDet_WriteBitmapBits()

static HRESULT WINAPI MediaDet_WriteBitmapBits ( IMediaDet *  iface,
double  StreamTime,
LONG  Width,
LONG  Height,
BSTR  Filename 
)
static

Definition at line 631 of file mediadet.c.

634{
636 FIXME("(%p)->(%.16e %ld %ld %p): not implemented!\n", This, StreamTime, Width, Height, Filename);
637 return E_NOTIMPL;
638}
IN PVCB IN PBCB OUT PDIRENT IN USHORT IN POEM_STRING Filename
Definition: fatprocs.h:940

◆ SetCurPin()

static HRESULT SetCurPin ( MediaDetImpl *  This,
LONG  strm 
)
static

Definition at line 421 of file mediadet.c.

422{
423 IEnumPins *pins;
424 IPin *pin;
425 HRESULT hr;
426
427 assert(This->splitter);
428 assert(0 <= strm && strm < This->num_streams);
429
430 if (This->cur_pin)
431 {
432 IPin_Release(This->cur_pin);
433 This->cur_pin = NULL;
434 }
435
436 hr = IBaseFilter_EnumPins(This->splitter, &pins);
437 if (FAILED(hr))
438 return hr;
439
440 while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK && !This->cur_pin)
441 {
443 hr = IPin_QueryDirection(pin, &dir);
444 if (FAILED(hr))
445 {
446 IPin_Release(pin);
447 IEnumPins_Release(pins);
448 return hr;
449 }
450
451 if (dir == PINDIR_OUTPUT && strm-- == 0)
452 This->cur_pin = pin;
453 else
454 IPin_Release(pin);
455 }
456 IEnumPins_Release(pins);
457
458 assert(This->cur_pin);
459 return S_OK;
460}
#define assert(_expr)
Definition: assert.h:32

Referenced by MediaDet_put_CurrentStream().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( quartz  )

Variable Documentation

◆ IMediaDet_VTable

const IMediaDetVtbl IMediaDet_VTable
static
Initial value:
=
{
}
static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet *iface, LONG *pVal)
Definition: mediadet.c:409
static ULONG WINAPI MediaDet_Release(IMediaDet *iface)
Definition: mediadet.c:295
static HRESULT WINAPI MediaDet_QueryInterface(IMediaDet *iface, REFIID riid, void **ppv)
Definition: mediadet.c:283
static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet *iface, ISampleGrabber **ppVal)
Definition: mediadet.c:656
static HRESULT WINAPI MediaDet_put_Filename(IMediaDet *iface, BSTR filename)
Definition: mediadet.c:578
static HRESULT WINAPI MediaDet_get_FrameRate(IMediaDet *iface, double *pVal)
Definition: mediadet.c:664
static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet *iface, double StreamTime, LONG *pBufferSize, char *pBuffer, LONG Width, LONG Height)
Definition: mediadet.c:620
static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet *iface, double StreamTime, LONG Width, LONG Height, BSTR Filename)
Definition: mediadet.c:631
static ULONG WINAPI MediaDet_AddRef(IMediaDet *iface)
Definition: mediadet.c:289
static HRESULT WINAPI MediaDet_get_Filename(IMediaDet *iface, BSTR *pVal)
Definition: mediadet.c:556
static HRESULT WINAPI MediaDet_get_StreamType(IMediaDet *iface, GUID *majortype)
Definition: mediadet.c:488
static HRESULT WINAPI MediaDet_get_StreamLength(IMediaDet *iface, double *length)
Definition: mediadet.c:525
static HRESULT WINAPI MediaDet_EnterBitmapGrabMode(IMediaDet *iface, double SeekTime)
Definition: mediadet.c:693
static HRESULT WINAPI MediaDet_get_Filter(IMediaDet *iface, IUnknown **filter)
Definition: mediadet.c:301
static HRESULT WINAPI MediaDet_put_Filter(IMediaDet *iface, IUnknown *unk)
Definition: mediadet.c:319
static HRESULT WINAPI MediaDet_get_StreamTypeB(IMediaDet *iface, BSTR *bstr)
Definition: mediadet.c:508

Definition at line 701 of file mediadet.c.

Referenced by media_detector_create().

◆ mediadet_vtbl

const IUnknownVtbl mediadet_vtbl
static
Initial value:
=
{
}
static ULONG WINAPI MediaDet_inner_Release(IUnknown *iface)
Definition: mediadet.c:259
static ULONG WINAPI MediaDet_inner_AddRef(IUnknown *iface)
Definition: mediadet.c:249
static HRESULT WINAPI MediaDet_inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: mediadet.c:228

Definition at line 275 of file mediadet.c.

Referenced by media_detector_create().