25 #define imemoffset offsetof(libAVPin, imemvtbl) 28 { {&IID_IUnknown,0}, {&IID_IPin,0}, {&IID_IMemInputPin,
imemoffset} })
35 dshowdebug(
"libAVPin_Connect(%p, %p, %p)\n",
this, pin, type);
41 const AM_MEDIA_TYPE *type)
44 dshowdebug(
"libAVPin_ReceiveConnection(%p)\n",
this);
48 if (this->connectedto)
49 return VFW_E_ALREADY_CONNECTED;
53 if (!IsEqualGUID(&type->majortype, &MEDIATYPE_Video))
54 return VFW_E_TYPE_NOT_ACCEPTED;
56 if (!IsEqualGUID(&type->majortype, &MEDIATYPE_Audio))
57 return VFW_E_TYPE_NOT_ACCEPTED;
61 this->connectedto = pin;
72 if (this->
filter->state != State_Stopped)
73 return VFW_E_NOT_STOPPED;
74 if (!this->connectedto)
76 IPin_Release(this->connectedto);
77 this->connectedto =
NULL;
84 dshowdebug(
"libAVPin_ConnectedTo(%p)\n",
this);
88 if (!this->connectedto)
89 return VFW_E_NOT_CONNECTED;
90 IPin_AddRef(this->connectedto);
91 *pin = this->connectedto;
98 dshowdebug(
"libAVPin_ConnectionMediaType(%p)\n",
this);
102 if (!this->connectedto)
103 return VFW_E_NOT_CONNECTED;
110 dshowdebug(
"libAVPin_QueryPinInfo(%p)\n",
this);
118 info->pFilter = (IBaseFilter *) this->
filter;
119 info->dir = PINDIR_INPUT;
120 wcscpy(info->achName,
L"Capture");
127 dshowdebug(
"libAVPin_QueryDirection(%p)\n",
this);
141 *
id = wcsdup(
L"libAV Pin");
148 dshowdebug(
"libAVPin_QueryAccept(%p)\n",
this);
154 const AM_MEDIA_TYPE *type =
NULL;
156 dshowdebug(
"libAVPin_EnumMediaTypes(%p)\n",
this);
164 *enumtypes = (IEnumMediaTypes *)
new;
171 dshowdebug(
"libAVPin_QueryInternalConnections(%p)\n",
this);
177 dshowdebug(
"libAVPin_EndOfStream(%p)\n",
this);
184 dshowdebug(
"libAVPin_BeginFlush(%p)\n",
this);
199 dshowdebug(
"libAVPin_NewSegment(%p)\n",
this);
207 IPinVtbl *vtbl = this->vtbl;
208 IMemInputPinVtbl *imemvtbl;
213 imemvtbl =
av_malloc(
sizeof(IMemInputPinVtbl));
227 this->imemvtbl = imemvtbl;
263 dshowdebug(
"libAVMemInputPin_QueryInterface(%p)\n",
this);
270 dshowdebug(
"libAVMemInputPin_AddRef(%p)\n",
this);
277 dshowdebug(
"libAVMemInputPin_Release(%p)\n",
this);
283 dshowdebug(
"libAVMemInputPin_GetAllocator(%p)\n",
this);
284 return VFW_E_NO_ALLOCATOR;
290 dshowdebug(
"libAVMemInputPin_NotifyAllocator(%p)\n",
this);
295 ALLOCATOR_PROPERTIES *props)
297 dshowdebug(
"libAVMemInputPin_GetAllocatorRequirements(%p)\n",
this);
311 int64_t orig_curtime;
313 const char *devtypename = (devtype ==
VideoDevice) ?
"video" :
"audio";
319 dshowdebug(
"libAVMemInputPin_Receive(%p)\n",
this);
324 IMediaSample_GetTime(sample, &orig_curtime, &dummy);
326 IReferenceClock_GetTime(clock, &graphtime);
329 IReferenceClock_GetTime(clock, &curtime);
331 IMediaSample_GetTime(sample, &curtime, &dummy);
332 if(curtime > 400000000000000000LL) {
337 "dshow dropping initial (or ending) audio frame with odd PTS too high %"PRId64
"\n", curtime);
343 buf_size = IMediaSample_GetActualDataLength(sample);
344 IMediaSample_GetPointer(sample, &buf);
351 "timestamp %"PRId64
" orig timestamp %"PRId64
" graph timestamp %"PRId64
" diff %"PRId64
" %s\n",
352 devtypename, buf_size, curtime, orig_curtime, graphtime, graphtime - orig_curtime, ctx->
device_name[devtype]);
353 pin->
filter->
callback(priv_data, index, buf, buf_size, curtime, devtype);
359 IMediaSample **samples,
long n,
long *nproc)
362 dshowdebug(
"libAVMemInputPin_ReceiveMultiple(%p)\n",
this);
364 for (i = 0; i <
n; i++)
373 dshowdebug(
"libAVMemInputPin_ReceiveCanBlock(%p)\n",
this);
382 dshowdebug(
"libAVMemInputPin_Destroy(%p)\n",
this);
long WINAPI libAVPin_ReceiveConnection(libAVPin *this, IPin *pin, const AM_MEDIA_TYPE *type)
long WINAPI libAVMemInputPin_GetAllocatorRequirements(libAVMemInputPin *this, ALLOCATOR_PROPERTIES *props)
enum dshowDeviceType type
#define DECLARE_DESTROY(class, func)
unsigned long WINAPI libAVPin_Release(libAVPin *)
long WINAPI libAVPin_QueryAccept(libAVPin *this, const AM_MEDIA_TYPE *type)
long WINAPI libAVPin_QueryPinInfo(libAVPin *this, PIN_INFO *info)
#define DECLARE_CREATE(class, setup,...)
void libAVPin_Destroy(libAVPin *)
long WINAPI libAVPin_QueryId(libAVPin *this, wchar_t **id)
static void filter(int16_t *output, ptrdiff_t out_stride, int16_t *low, ptrdiff_t low_stride, int16_t *high, ptrdiff_t high_stride, int len, int clip)
long WINAPI libAVPin_Connect(libAVPin *, IPin *, const AM_MEDIA_TYPE *)
long WINAPI libAVMemInputPin_GetAllocator(libAVMemInputPin *this, IMemAllocator **alloc)
#define AV_LOG_VERBOSE
Detailed information.
long WINAPI libAVMemInputPin_ReceiveCanBlock(libAVMemInputPin *this)
long WINAPI libAVPin_EnumMediaTypes(libAVPin *this, IEnumMediaTypes **enumtypes)
#define DECLARE_RELEASE(class)
long ff_copy_dshow_media_type(AM_MEDIA_TYPE *dst, const AM_MEDIA_TYPE *src)
void(* callback)(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time, enum dshowDeviceType type)
DECLARE_QUERYINTERFACE(libAVPin, { {&IID_IUnknown, 0}, {&IID_IPin, 0}, {&IID_IMemInputPin, imemoffset} })
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
long WINAPI libAVPin_NewSegment(libAVPin *this, REFERENCE_TIME start, REFERENCE_TIME stop, double rate)
unsigned long WINAPI libAVPin_AddRef(libAVPin *)
long WINAPI libAVPin_ConnectedTo(libAVPin *this, IPin **pin)
long WINAPI libAVMemInputPin_QueryInterface(libAVMemInputPin *this, const GUID *riid, void **ppvObject)
#define SETVTBL(vtbl, class, fn)
long WINAPI libAVPin_QueryDirection(libAVPin *this, PIN_DIRECTION *dir)
long WINAPI libAVPin_EndOfStream(libAVPin *this)
long WINAPI libAVPin_EndFlush(libAVPin *this)
long WINAPI libAVPin_Disconnect(libAVPin *this)
unsigned long WINAPI libAVFilter_AddRef(libAVFilter *)
long WINAPI libAVMemInputPin_Receive(libAVMemInputPin *this, IMediaSample *sample)
void libAVMemInputPin_Destroy(libAVMemInputPin *this)
static int libAVPin_Setup(libAVPin *this, libAVFilter *filter)
unsigned long WINAPI libAVMemInputPin_AddRef(libAVMemInputPin *this)
static void nothing(void *foo)
long WINAPI libAVPin_QueryInterface(libAVPin *, const GUID *, void **)
unsigned long WINAPI libAVMemInputPin_Release(libAVMemInputPin *this)
long WINAPI libAVMemInputPin_NotifyAllocator(libAVMemInputPin *this, IMemAllocator *alloc, BOOL rdwr)
long WINAPI libAVMemInputPin_ReceiveMultiple(libAVMemInputPin *this, IMediaSample **samples, long n, long *nproc)
long WINAPI libAVPin_BeginFlush(libAVPin *this)
long WINAPI libAVPin_QueryInternalConnections(libAVPin *this, IPin **pin, unsigned long *npin)
void * priv_data
Format private data.
libAVEnumMediaTypes * libAVEnumMediaTypes_Create(const AM_MEDIA_TYPE *type)
void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE *type)
long WINAPI libAVPin_ConnectionMediaType(libAVPin *this, AM_MEDIA_TYPE *type)
struct libAVMemInputPin libAVMemInputPin
#define DECLARE_ADDREF(class)