2 * DirectShow capture interface
3 * Copyright (c) 2010 Ramiro Polla
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #ifndef AVDEVICE_DSHOW_H
23 #define AVDEVICE_DSHOW_H
31 #define NO_DSHOW_STRSAFE
35 /* EC_DEVICE_LOST is not defined in MinGW dshow headers. */
36 #ifndef EC_DEVICE_LOST
37 #define EC_DEVICE_LOST 0x1f
40 long ff_copy_dshow_media_type(AM_MEDIA_TYPE
*dst
, const AM_MEDIA_TYPE
*src
);
41 void ff_print_VIDEO_STREAM_CONFIG_CAPS(const VIDEO_STREAM_CONFIG_CAPS
*caps
);
42 void ff_print_AUDIO_STREAM_CONFIG_CAPS(const AUDIO_STREAM_CONFIG_CAPS
*caps
);
43 void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE
*type
);
44 void ff_printGUID(const GUID
*g
);
47 extern const AVClass
*ff_dshow_context_class_ptr
;
48 #define dshowdebug(...) av_log(&ff_dshow_context_class_ptr, AV_LOG_DEBUG, __VA_ARGS__)
50 #define dshowdebug(...)
53 static inline void nothing(void *foo
)
62 enum dshowDeviceType
{
67 #define DECLARE_QUERYINTERFACE(class, ...) \
69 class##_QueryInterface(class *this, const GUID *riid, void **ppvObject) \
71 struct GUIDoffset ifaces[] = __VA_ARGS__; \
73 dshowdebug(AV_STRINGIFY(class)"_QueryInterface(%p, %p, %p)\n", this, riid, ppvObject); \
77 for (i = 0; i < sizeof(ifaces)/sizeof(ifaces[0]); i++) { \
78 if (IsEqualGUID(riid, ifaces[i].iid)) { \
79 void *obj = (void *) ((uint8_t *) this + ifaces[i].offset); \
80 class##_AddRef(this); \
81 dshowdebug("\tfound %d with offset %d\n", i, ifaces[i].offset); \
82 *ppvObject = (void *) obj; \
86 dshowdebug("\tE_NOINTERFACE\n"); \
88 return E_NOINTERFACE; \
90 #define DECLARE_ADDREF(class) \
91 unsigned long WINAPI \
92 class##_AddRef(class *this) \
94 dshowdebug(AV_STRINGIFY(class)"_AddRef(%p)\t%ld\n", this, this->ref+1); \
95 return InterlockedIncrement(&this->ref); \
97 #define DECLARE_RELEASE(class) \
98 unsigned long WINAPI \
99 class##_Release(class *this) \
101 long ref = InterlockedDecrement(&this->ref); \
102 dshowdebug(AV_STRINGIFY(class)"_Release(%p)\t%ld\n", this, ref); \
104 class##_Destroy(this); \
108 #define DECLARE_DESTROY(class, func) \
109 void class##_Destroy(class *this) \
111 dshowdebug(AV_STRINGIFY(class)"_Destroy(%p)\n", this); \
115 CoTaskMemFree(this->vtbl); \
116 CoTaskMemFree(this); \
119 #define DECLARE_CREATE(class, setup, ...) \
120 class *class##_Create(__VA_ARGS__) \
122 class *this = CoTaskMemAlloc(sizeof(class)); \
123 void *vtbl = CoTaskMemAlloc(sizeof(*this->vtbl)); \
124 dshowdebug(AV_STRINGIFY(class)"_Create(%p)\n", this); \
125 if (!this || !vtbl) \
127 ZeroMemory(this, sizeof(class)); \
128 ZeroMemory(vtbl, sizeof(*this->vtbl)); \
133 dshowdebug("created "AV_STRINGIFY(class)" %p\n", this); \
136 class##_Destroy(this); \
137 dshowdebug("could not create "AV_STRINGIFY(class)"\n"); \
141 #define SETVTBL(vtbl, class, fn) \
142 do { (vtbl)->fn = (void *) class##_##fn; } while(0)
144 /*****************************************************************************
145 * Forward Declarations
146 ****************************************************************************/
147 typedef struct libAVPin libAVPin
;
148 typedef struct libAVMemInputPin libAVMemInputPin
;
149 typedef struct libAVEnumPins libAVEnumPins
;
150 typedef struct libAVEnumMediaTypes libAVEnumMediaTypes
;
151 typedef struct libAVFilter libAVFilter
;
153 /*****************************************************************************
155 ****************************************************************************/
162 IMemInputPinVtbl
*imemvtbl
;
165 long WINAPI
libAVPin_QueryInterface (libAVPin
*, const GUID
*, void **);
166 unsigned long WINAPI
libAVPin_AddRef (libAVPin
*);
167 unsigned long WINAPI
libAVPin_Release (libAVPin
*);
168 long WINAPI
libAVPin_Connect (libAVPin
*, IPin
*, const AM_MEDIA_TYPE
*);
169 long WINAPI
libAVPin_ReceiveConnection (libAVPin
*, IPin
*, const AM_MEDIA_TYPE
*);
170 long WINAPI
libAVPin_Disconnect (libAVPin
*);
171 long WINAPI
libAVPin_ConnectedTo (libAVPin
*, IPin
**);
172 long WINAPI
libAVPin_ConnectionMediaType (libAVPin
*, AM_MEDIA_TYPE
*);
173 long WINAPI
libAVPin_QueryPinInfo (libAVPin
*, PIN_INFO
*);
174 long WINAPI
libAVPin_QueryDirection (libAVPin
*, PIN_DIRECTION
*);
175 long WINAPI
libAVPin_QueryId (libAVPin
*, wchar_t **);
176 long WINAPI
libAVPin_QueryAccept (libAVPin
*, const AM_MEDIA_TYPE
*);
177 long WINAPI
libAVPin_EnumMediaTypes (libAVPin
*, IEnumMediaTypes
**);
178 long WINAPI
libAVPin_QueryInternalConnections(libAVPin
*, IPin
**, unsigned long *);
179 long WINAPI
libAVPin_EndOfStream (libAVPin
*);
180 long WINAPI
libAVPin_BeginFlush (libAVPin
*);
181 long WINAPI
libAVPin_EndFlush (libAVPin
*);
182 long WINAPI
libAVPin_NewSegment (libAVPin
*, REFERENCE_TIME
, REFERENCE_TIME
, double);
184 long WINAPI
libAVMemInputPin_QueryInterface (libAVMemInputPin
*, const GUID
*, void **);
185 unsigned long WINAPI
libAVMemInputPin_AddRef (libAVMemInputPin
*);
186 unsigned long WINAPI
libAVMemInputPin_Release (libAVMemInputPin
*);
187 long WINAPI
libAVMemInputPin_GetAllocator (libAVMemInputPin
*, IMemAllocator
**);
188 long WINAPI
libAVMemInputPin_NotifyAllocator (libAVMemInputPin
*, IMemAllocator
*, BOOL
);
189 long WINAPI
libAVMemInputPin_GetAllocatorRequirements(libAVMemInputPin
*, ALLOCATOR_PROPERTIES
*);
190 long WINAPI
libAVMemInputPin_Receive (libAVMemInputPin
*, IMediaSample
*);
191 long WINAPI
libAVMemInputPin_ReceiveMultiple (libAVMemInputPin
*, IMediaSample
**, long, long *);
192 long WINAPI
libAVMemInputPin_ReceiveCanBlock (libAVMemInputPin
*);
194 void libAVPin_Destroy(libAVPin
*);
195 libAVPin
*libAVPin_Create (libAVFilter
*filter
);
197 void libAVMemInputPin_Destroy(libAVMemInputPin
*);
199 /*****************************************************************************
201 ****************************************************************************/
202 struct libAVEnumPins
{
210 long WINAPI
libAVEnumPins_QueryInterface(libAVEnumPins
*, const GUID
*, void **);
211 unsigned long WINAPI
libAVEnumPins_AddRef (libAVEnumPins
*);
212 unsigned long WINAPI
libAVEnumPins_Release (libAVEnumPins
*);
213 long WINAPI
libAVEnumPins_Next (libAVEnumPins
*, unsigned long, IPin
**, unsigned long *);
214 long WINAPI
libAVEnumPins_Skip (libAVEnumPins
*, unsigned long);
215 long WINAPI
libAVEnumPins_Reset (libAVEnumPins
*);
216 long WINAPI
libAVEnumPins_Clone (libAVEnumPins
*, libAVEnumPins
**);
218 void libAVEnumPins_Destroy(libAVEnumPins
*);
219 libAVEnumPins
*libAVEnumPins_Create (libAVPin
*pin
, libAVFilter
*filter
);
221 /*****************************************************************************
222 * libAVEnumMediaTypes
223 ****************************************************************************/
224 struct libAVEnumMediaTypes
{
231 long WINAPI
libAVEnumMediaTypes_QueryInterface(libAVEnumMediaTypes
*, const GUID
*, void **);
232 unsigned long WINAPI
libAVEnumMediaTypes_AddRef (libAVEnumMediaTypes
*);
233 unsigned long WINAPI
libAVEnumMediaTypes_Release (libAVEnumMediaTypes
*);
234 long WINAPI
libAVEnumMediaTypes_Next (libAVEnumMediaTypes
*, unsigned long, AM_MEDIA_TYPE
**, unsigned long *);
235 long WINAPI
libAVEnumMediaTypes_Skip (libAVEnumMediaTypes
*, unsigned long);
236 long WINAPI
libAVEnumMediaTypes_Reset (libAVEnumMediaTypes
*);
237 long WINAPI
libAVEnumMediaTypes_Clone (libAVEnumMediaTypes
*, libAVEnumMediaTypes
**);
239 void libAVEnumMediaTypes_Destroy(libAVEnumMediaTypes
*);
240 libAVEnumMediaTypes
*libAVEnumMediaTypes_Create(const AM_MEDIA_TYPE
*type
);
242 /*****************************************************************************
244 ****************************************************************************/
246 IBaseFilterVtbl
*vtbl
;
252 IReferenceClock
*clock
;
253 enum dshowDeviceType type
;
257 void (*callback
)(void *priv_data
, int index
, uint8_t *buf
, int buf_size
, int64_t time
, enum dshowDeviceType type
);
260 long WINAPI
libAVFilter_QueryInterface (libAVFilter
*, const GUID
*, void **);
261 unsigned long WINAPI
libAVFilter_AddRef (libAVFilter
*);
262 unsigned long WINAPI
libAVFilter_Release (libAVFilter
*);
263 long WINAPI
libAVFilter_GetClassID (libAVFilter
*, CLSID
*);
264 long WINAPI
libAVFilter_Stop (libAVFilter
*);
265 long WINAPI
libAVFilter_Pause (libAVFilter
*);
266 long WINAPI
libAVFilter_Run (libAVFilter
*, REFERENCE_TIME
);
267 long WINAPI
libAVFilter_GetState (libAVFilter
*, DWORD
, FILTER_STATE
*);
268 long WINAPI
libAVFilter_SetSyncSource (libAVFilter
*, IReferenceClock
*);
269 long WINAPI
libAVFilter_GetSyncSource (libAVFilter
*, IReferenceClock
**);
270 long WINAPI
libAVFilter_EnumPins (libAVFilter
*, IEnumPins
**);
271 long WINAPI
libAVFilter_FindPin (libAVFilter
*, const wchar_t *, IPin
**);
272 long WINAPI
libAVFilter_QueryFilterInfo(libAVFilter
*, FILTER_INFO
*);
273 long WINAPI
libAVFilter_JoinFilterGraph(libAVFilter
*, IFilterGraph
*, const wchar_t *);
274 long WINAPI
libAVFilter_QueryVendorInfo(libAVFilter
*, wchar_t **);
276 void libAVFilter_Destroy(libAVFilter
*);
277 libAVFilter
*libAVFilter_Create (void *, void *, enum dshowDeviceType
);
279 #endif /* AVDEVICE_DSHOW_H */