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
30 #define WIN32_LEAN_AND_MEAN
32 #define NO_DSHOW_STRSAFE
36 /* EC_DEVICE_LOST is not defined in MinGW dshow headers. */
37 #ifndef EC_DEVICE_LOST
38 #define EC_DEVICE_LOST 0x1f
41 long ff_copy_dshow_media_type(AM_MEDIA_TYPE
*dst
, const AM_MEDIA_TYPE
*src
);
42 void ff_print_VIDEO_STREAM_CONFIG_CAPS(const VIDEO_STREAM_CONFIG_CAPS
*caps
);
43 void ff_print_AUDIO_STREAM_CONFIG_CAPS(const AUDIO_STREAM_CONFIG_CAPS
*caps
);
44 void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE
*type
);
45 void ff_printGUID(const GUID
*g
);
48 extern const AVClass
*ff_dshow_context_class_ptr
;
49 #define dshowdebug(...) av_log(&ff_dshow_context_class_ptr, AV_LOG_DEBUG, __VA_ARGS__)
51 #define dshowdebug(...)
54 static inline void nothing(void *foo
)
63 enum dshowDeviceType
{
68 #define DECLARE_QUERYINTERFACE(class, ...) \
70 class##_QueryInterface(class *this, const GUID *riid, void **ppvObject) \
72 struct GUIDoffset ifaces[] = __VA_ARGS__; \
74 dshowdebug(AV_STRINGIFY(class)"_QueryInterface(%p, %p, %p)\n", this, riid, ppvObject); \
78 for (i = 0; i < sizeof(ifaces)/sizeof(ifaces[0]); i++) { \
79 if (IsEqualGUID(riid, ifaces[i].iid)) { \
80 void *obj = (void *) ((uint8_t *) this + ifaces[i].offset); \
81 class##_AddRef(this); \
82 dshowdebug("\tfound %d with offset %d\n", i, ifaces[i].offset); \
83 *ppvObject = (void *) obj; \
87 dshowdebug("\tE_NOINTERFACE\n"); \
89 return E_NOINTERFACE; \
91 #define DECLARE_ADDREF(class) \
92 unsigned long WINAPI \
93 class##_AddRef(class *this) \
95 dshowdebug(AV_STRINGIFY(class)"_AddRef(%p)\t%ld\n", this, this->ref+1); \
96 return InterlockedIncrement(&this->ref); \
98 #define DECLARE_RELEASE(class) \
99 unsigned long WINAPI \
100 class##_Release(class *this) \
102 long ref = InterlockedDecrement(&this->ref); \
103 dshowdebug(AV_STRINGIFY(class)"_Release(%p)\t%ld\n", this, ref); \
105 class##_Destroy(this); \
109 #define DECLARE_DESTROY(class, func) \
110 void class##_Destroy(class *this) \
112 dshowdebug(AV_STRINGIFY(class)"_Destroy(%p)\n", this); \
116 CoTaskMemFree(this->vtbl); \
117 CoTaskMemFree(this); \
120 #define DECLARE_CREATE(class, setup, ...) \
121 class *class##_Create(__VA_ARGS__) \
123 class *this = CoTaskMemAlloc(sizeof(class)); \
124 void *vtbl = CoTaskMemAlloc(sizeof(*this->vtbl)); \
125 dshowdebug(AV_STRINGIFY(class)"_Create(%p)\n", this); \
126 if (!this || !vtbl) \
128 ZeroMemory(this, sizeof(class)); \
129 ZeroMemory(vtbl, sizeof(*this->vtbl)); \
134 dshowdebug("created "AV_STRINGIFY(class)" %p\n", this); \
137 class##_Destroy(this); \
138 dshowdebug("could not create "AV_STRINGIFY(class)"\n"); \
142 #define SETVTBL(vtbl, class, fn) \
143 do { (vtbl)->fn = (void *) class##_##fn; } while(0)
145 /*****************************************************************************
146 * Forward Declarations
147 ****************************************************************************/
148 typedef struct libAVPin libAVPin
;
149 typedef struct libAVMemInputPin libAVMemInputPin
;
150 typedef struct libAVEnumPins libAVEnumPins
;
151 typedef struct libAVEnumMediaTypes libAVEnumMediaTypes
;
152 typedef struct libAVFilter libAVFilter
;
154 /*****************************************************************************
156 ****************************************************************************/
163 IMemInputPinVtbl
*imemvtbl
;
166 long WINAPI
libAVPin_QueryInterface (libAVPin
*, const GUID
*, void **);
167 unsigned long WINAPI
libAVPin_AddRef (libAVPin
*);
168 unsigned long WINAPI
libAVPin_Release (libAVPin
*);
169 long WINAPI
libAVPin_Connect (libAVPin
*, IPin
*, const AM_MEDIA_TYPE
*);
170 long WINAPI
libAVPin_ReceiveConnection (libAVPin
*, IPin
*, const AM_MEDIA_TYPE
*);
171 long WINAPI
libAVPin_Disconnect (libAVPin
*);
172 long WINAPI
libAVPin_ConnectedTo (libAVPin
*, IPin
**);
173 long WINAPI
libAVPin_ConnectionMediaType (libAVPin
*, AM_MEDIA_TYPE
*);
174 long WINAPI
libAVPin_QueryPinInfo (libAVPin
*, PIN_INFO
*);
175 long WINAPI
libAVPin_QueryDirection (libAVPin
*, PIN_DIRECTION
*);
176 long WINAPI
libAVPin_QueryId (libAVPin
*, wchar_t **);
177 long WINAPI
libAVPin_QueryAccept (libAVPin
*, const AM_MEDIA_TYPE
*);
178 long WINAPI
libAVPin_EnumMediaTypes (libAVPin
*, IEnumMediaTypes
**);
179 long WINAPI
libAVPin_QueryInternalConnections(libAVPin
*, IPin
**, unsigned long *);
180 long WINAPI
libAVPin_EndOfStream (libAVPin
*);
181 long WINAPI
libAVPin_BeginFlush (libAVPin
*);
182 long WINAPI
libAVPin_EndFlush (libAVPin
*);
183 long WINAPI
libAVPin_NewSegment (libAVPin
*, REFERENCE_TIME
, REFERENCE_TIME
, double);
185 long WINAPI
libAVMemInputPin_QueryInterface (libAVMemInputPin
*, const GUID
*, void **);
186 unsigned long WINAPI
libAVMemInputPin_AddRef (libAVMemInputPin
*);
187 unsigned long WINAPI
libAVMemInputPin_Release (libAVMemInputPin
*);
188 long WINAPI
libAVMemInputPin_GetAllocator (libAVMemInputPin
*, IMemAllocator
**);
189 long WINAPI
libAVMemInputPin_NotifyAllocator (libAVMemInputPin
*, IMemAllocator
*, BOOL
);
190 long WINAPI
libAVMemInputPin_GetAllocatorRequirements(libAVMemInputPin
*, ALLOCATOR_PROPERTIES
*);
191 long WINAPI
libAVMemInputPin_Receive (libAVMemInputPin
*, IMediaSample
*);
192 long WINAPI
libAVMemInputPin_ReceiveMultiple (libAVMemInputPin
*, IMediaSample
**, long, long *);
193 long WINAPI
libAVMemInputPin_ReceiveCanBlock (libAVMemInputPin
*);
195 void libAVPin_Destroy(libAVPin
*);
196 libAVPin
*libAVPin_Create (libAVFilter
*filter
);
198 void libAVMemInputPin_Destroy(libAVMemInputPin
*);
200 /*****************************************************************************
202 ****************************************************************************/
203 struct libAVEnumPins
{
211 long WINAPI
libAVEnumPins_QueryInterface(libAVEnumPins
*, const GUID
*, void **);
212 unsigned long WINAPI
libAVEnumPins_AddRef (libAVEnumPins
*);
213 unsigned long WINAPI
libAVEnumPins_Release (libAVEnumPins
*);
214 long WINAPI
libAVEnumPins_Next (libAVEnumPins
*, unsigned long, IPin
**, unsigned long *);
215 long WINAPI
libAVEnumPins_Skip (libAVEnumPins
*, unsigned long);
216 long WINAPI
libAVEnumPins_Reset (libAVEnumPins
*);
217 long WINAPI
libAVEnumPins_Clone (libAVEnumPins
*, libAVEnumPins
**);
219 void libAVEnumPins_Destroy(libAVEnumPins
*);
220 libAVEnumPins
*libAVEnumPins_Create (libAVPin
*pin
, libAVFilter
*filter
);
222 /*****************************************************************************
223 * libAVEnumMediaTypes
224 ****************************************************************************/
225 struct libAVEnumMediaTypes
{
232 long WINAPI
libAVEnumMediaTypes_QueryInterface(libAVEnumMediaTypes
*, const GUID
*, void **);
233 unsigned long WINAPI
libAVEnumMediaTypes_AddRef (libAVEnumMediaTypes
*);
234 unsigned long WINAPI
libAVEnumMediaTypes_Release (libAVEnumMediaTypes
*);
235 long WINAPI
libAVEnumMediaTypes_Next (libAVEnumMediaTypes
*, unsigned long, AM_MEDIA_TYPE
**, unsigned long *);
236 long WINAPI
libAVEnumMediaTypes_Skip (libAVEnumMediaTypes
*, unsigned long);
237 long WINAPI
libAVEnumMediaTypes_Reset (libAVEnumMediaTypes
*);
238 long WINAPI
libAVEnumMediaTypes_Clone (libAVEnumMediaTypes
*, libAVEnumMediaTypes
**);
240 void libAVEnumMediaTypes_Destroy(libAVEnumMediaTypes
*);
241 libAVEnumMediaTypes
*libAVEnumMediaTypes_Create(const AM_MEDIA_TYPE
*type
);
243 /*****************************************************************************
245 ****************************************************************************/
247 IBaseFilterVtbl
*vtbl
;
253 IReferenceClock
*clock
;
254 enum dshowDeviceType type
;
258 void (*callback
)(void *priv_data
, int index
, uint8_t *buf
, int buf_size
, int64_t time
, enum dshowDeviceType type
);
261 long WINAPI
libAVFilter_QueryInterface (libAVFilter
*, const GUID
*, void **);
262 unsigned long WINAPI
libAVFilter_AddRef (libAVFilter
*);
263 unsigned long WINAPI
libAVFilter_Release (libAVFilter
*);
264 long WINAPI
libAVFilter_GetClassID (libAVFilter
*, CLSID
*);
265 long WINAPI
libAVFilter_Stop (libAVFilter
*);
266 long WINAPI
libAVFilter_Pause (libAVFilter
*);
267 long WINAPI
libAVFilter_Run (libAVFilter
*, REFERENCE_TIME
);
268 long WINAPI
libAVFilter_GetState (libAVFilter
*, DWORD
, FILTER_STATE
*);
269 long WINAPI
libAVFilter_SetSyncSource (libAVFilter
*, IReferenceClock
*);
270 long WINAPI
libAVFilter_GetSyncSource (libAVFilter
*, IReferenceClock
**);
271 long WINAPI
libAVFilter_EnumPins (libAVFilter
*, IEnumPins
**);
272 long WINAPI
libAVFilter_FindPin (libAVFilter
*, const wchar_t *, IPin
**);
273 long WINAPI
libAVFilter_QueryFilterInfo(libAVFilter
*, FILTER_INFO
*);
274 long WINAPI
libAVFilter_JoinFilterGraph(libAVFilter
*, IFilterGraph
*, const wchar_t *);
275 long WINAPI
libAVFilter_QueryVendorInfo(libAVFilter
*, wchar_t **);
277 void libAVFilter_Destroy(libAVFilter
*);
278 libAVFilter
*libAVFilter_Create (void *, void *, enum dshowDeviceType
);
280 #endif /* AVDEVICE_DSHOW_H */