22 #ifndef AVDEVICE_DSHOW_H
23 #define AVDEVICE_DSHOW_H
31 #define NO_DSHOW_STRSAFE
36 #ifndef EC_DEVICE_LOST
37 #define EC_DEVICE_LOST 0x1f
48 #define dshowdebug(...) av_log(&ff_dshow_context_class_ptr, AV_LOG_DEBUG, __VA_ARGS__)
50 #define dshowdebug(...)
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)
void libAVEnumPins_Destroy(libAVEnumPins *)
void libAVEnumMediaTypes_Destroy(libAVEnumMediaTypes *)
void libAVMemInputPin_Destroy(libAVMemInputPin *)
long WINAPI libAVMemInputPin_GetAllocator(libAVMemInputPin *, IMemAllocator **)
libAVPin * libAVPin_Create(libAVFilter *filter)
long WINAPI libAVFilter_Pause(libAVFilter *)
void ff_print_VIDEO_STREAM_CONFIG_CAPS(const VIDEO_STREAM_CONFIG_CAPS *caps)
long WINAPI libAVPin_EndFlush(libAVPin *)
enum dshowDeviceType type
long WINAPI libAVMemInputPin_ReceiveMultiple(libAVMemInputPin *, IMediaSample **, long, long *)
long WINAPI libAVMemInputPin_NotifyAllocator(libAVMemInputPin *, IMemAllocator *, BOOL)
unsigned long WINAPI libAVPin_Release(libAVPin *)
long WINAPI libAVEnumMediaTypes_Skip(libAVEnumMediaTypes *, unsigned long)
long WINAPI libAVFilter_EnumPins(libAVFilter *, IEnumPins **)
long WINAPI libAVFilter_Stop(libAVFilter *)
long WINAPI libAVPin_ReceiveConnection(libAVPin *, IPin *, const AM_MEDIA_TYPE *)
long WINAPI libAVMemInputPin_Receive(libAVMemInputPin *, IMediaSample *)
unsigned long WINAPI libAVEnumMediaTypes_Release(libAVEnumMediaTypes *)
long WINAPI libAVPin_QueryPinInfo(libAVPin *, PIN_INFO *)
long WINAPI libAVPin_EndOfStream(libAVPin *)
long WINAPI libAVPin_QueryId(libAVPin *, wchar_t **)
long WINAPI libAVPin_NewSegment(libAVPin *, REFERENCE_TIME, REFERENCE_TIME, double)
long WINAPI libAVEnumPins_Reset(libAVEnumPins *)
long WINAPI libAVFilter_SetSyncSource(libAVFilter *, IReferenceClock *)
void libAVPin_Destroy(libAVPin *)
long WINAPI libAVEnumMediaTypes_Next(libAVEnumMediaTypes *, unsigned long, AM_MEDIA_TYPE **, unsigned long *)
long WINAPI libAVMemInputPin_ReceiveCanBlock(libAVMemInputPin *)
long WINAPI libAVPin_EnumMediaTypes(libAVPin *, IEnumMediaTypes **)
long WINAPI libAVFilter_QueryInterface(libAVFilter *, const GUID *, void **)
libAVFilter * libAVFilter_Create(void *, void *, enum dshowDeviceType)
long WINAPI libAVPin_Connect(libAVPin *, IPin *, const AM_MEDIA_TYPE *)
long WINAPI libAVEnumMediaTypes_Clone(libAVEnumMediaTypes *, libAVEnumMediaTypes **)
long WINAPI libAVPin_QueryInternalConnections(libAVPin *, IPin **, unsigned long *)
unsigned long WINAPI libAVEnumMediaTypes_AddRef(libAVEnumMediaTypes *)
long ff_copy_dshow_media_type(AM_MEDIA_TYPE *dst, const AM_MEDIA_TYPE *src)
unsigned long WINAPI libAVEnumPins_AddRef(libAVEnumPins *)
long WINAPI libAVPin_BeginFlush(libAVPin *)
long WINAPI libAVEnumPins_QueryInterface(libAVEnumPins *, const GUID *, void **)
long WINAPI libAVFilter_FindPin(libAVFilter *, const wchar_t *, IPin **)
unsigned long WINAPI libAVPin_AddRef(libAVPin *)
long WINAPI libAVMemInputPin_GetAllocatorRequirements(libAVMemInputPin *, ALLOCATOR_PROPERTIES *)
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
long WINAPI libAVEnumPins_Next(libAVEnumPins *, unsigned long, IPin **, unsigned long *)
void ff_print_AUDIO_STREAM_CONFIG_CAPS(const AUDIO_STREAM_CONFIG_CAPS *caps)
unsigned long WINAPI libAVMemInputPin_AddRef(libAVMemInputPin *)
long WINAPI libAVPin_ConnectedTo(libAVPin *, IPin **)
const AVClass * ff_dshow_context_class_ptr
long WINAPI libAVFilter_GetSyncSource(libAVFilter *, IReferenceClock **)
long WINAPI libAVFilter_JoinFilterGraph(libAVFilter *, IFilterGraph *, const wchar_t *)
long WINAPI libAVMemInputPin_QueryInterface(libAVMemInputPin *, const GUID *, void **)
typedef void(RENAME(mix_any_func_type))
long WINAPI libAVFilter_QueryFilterInfo(libAVFilter *, FILTER_INFO *)
void ff_printGUID(const GUID *g)
unsigned long WINAPI libAVMemInputPin_Release(libAVMemInputPin *)
Main libavdevice API header.
void(* callback)(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time)
unsigned long WINAPI libAVFilter_AddRef(libAVFilter *)
Describe the class of an AVClass context structure.
static void nothing(void *foo)
libAVEnumPins * libAVEnumPins_Create(libAVPin *pin, libAVFilter *filter)
long WINAPI libAVPin_Disconnect(libAVPin *)
long WINAPI libAVPin_QueryAccept(libAVPin *, const AM_MEDIA_TYPE *)
IMemInputPinVtbl * imemvtbl
long WINAPI libAVPin_QueryInterface(libAVPin *, const GUID *, void **)
long WINAPI libAVPin_QueryDirection(libAVPin *, PIN_DIRECTION *)
unsigned long WINAPI libAVFilter_Release(libAVFilter *)
long WINAPI libAVFilter_Run(libAVFilter *, REFERENCE_TIME)
long WINAPI libAVEnumMediaTypes_Reset(libAVEnumMediaTypes *)
long WINAPI libAVPin_ConnectionMediaType(libAVPin *, AM_MEDIA_TYPE *)
long WINAPI libAVEnumPins_Skip(libAVEnumPins *, unsigned long)
unsigned long WINAPI libAVEnumPins_Release(libAVEnumPins *)
libAVEnumMediaTypes * libAVEnumMediaTypes_Create(const AM_MEDIA_TYPE *type)
long WINAPI libAVFilter_GetState(libAVFilter *, DWORD, FILTER_STATE *)
void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE *type)
long WINAPI libAVFilter_GetClassID(libAVFilter *, CLSID *)
struct libAVMemInputPin libAVMemInputPin
void libAVFilter_Destroy(libAVFilter *)
long WINAPI libAVFilter_QueryVendorInfo(libAVFilter *, wchar_t **)
long WINAPI libAVEnumMediaTypes_QueryInterface(libAVEnumMediaTypes *, const GUID *, void **)
long WINAPI libAVEnumPins_Clone(libAVEnumPins *, libAVEnumPins **)