49 if (!(
object = heap_alloc_zero(
sizeof(*
object))))
58 IPin_AddRef(&
pin->IPin_iface);
60 if (
pin->ops->pin_get_media_type)
69 TRACE(
"Created enumerator %p.\n",
object);
70 *
out = &
object->IEnumMediaTypes_iface;
86 IEnumMediaTypes_AddRef(iface);
112 IPin_Release(&enummt->
pin->IPin_iface);
126 TRACE(
"enummt %p, count %lu, mts %p, ret_count %p.\n", enummt,
count, mts, ret_count);
128 if (!enummt->
pin->ops->pin_get_media_type)
137 hr = enummt->
pin->ops->pin_get_media_type(enummt->
pin, enummt->
index +
i, &mt);
157 TRACE(
"Returning media type %u:\n", enummt->
index +
i);
162 if (
count != 1 || ret_count)
172 TRACE(
"enummt %p, count %lu.\n", enummt,
count);
184 TRACE(
"enummt %p.\n", enummt);
187 if (enummt->
pin->ops->pin_get_media_type)
189 while (enummt->
pin->ops->pin_get_media_type(enummt->
pin, enummt->
count, &mt) ==
S_OK)
206 TRACE(
"enummt %p, out %p.\n", enummt,
out);
210 return IEnumMediaTypes_Skip(*
out, enummt->
index);
259 for (
i = 0; (pin =
sink->pin.
filter->ops->filter_get_pin(
sink->pin.filter,
i)); ++
i)
277 if (pin->
ops->pin_query_interface &&
SUCCEEDED(
hr = pin->
ops->pin_query_interface(pin, iid,
out)))
295 return IBaseFilter_AddRef(&pin->
filter->IBaseFilter_iface);
301 return IBaseFilter_Release(&pin->
filter->IBaseFilter_iface);
363 IBaseFilter_AddRef(
info->pFilter = &pin->
filter->IBaseFilter_iface);
396 if (pin->
ops->pin_query_accept && pin->
ops->pin_query_accept(pin,
mt) !=
S_OK)
420 if (pin->
ops->pin_get_media_type)
453 if (!
IsEqualGUID(&req_mt->majortype, &pin_mt->majortype)
457 if (!
IsEqualGUID(&req_mt->subtype, &pin_mt->subtype)
461 if (!
IsEqualGUID(&req_mt->formattype, &pin_mt->formattype)
485 IPin_QueryDirection(peer, &
dir);
488 WARN(
"Attempt to connect to another source pin, returning VFW_E_INVALID_DIRECTION.\n");
497 WARN(
"Pin is already connected, returning VFW_E_ALREADY_CONNECTED.\n");
501 if (
pin->pin.filter->state != State_Stopped)
504 WARN(
"Filter is not stopped; returning VFW_E_NOT_STOPPED.\n");
514 hr =
pin->pFuncsTable->pfnAttemptConnection(
pin, peer, mt);
519 if (
SUCCEEDED(IPin_EnumMediaTypes(peer, &enummt)))
521 while (IEnumMediaTypes_Next(enummt, 1, &candidate_ptr, &
count) ==
S_OK)
524 &&
pin->pFuncsTable->pfnAttemptConnection(
pin, peer, candidate_ptr) ==
S_OK)
528 IEnumMediaTypes_Release(enummt);
534 IEnumMediaTypes_Release(enummt);
537 if (
pin->pFuncsTable->base.pin_get_media_type)
539 for (
i = 0;
pin->pFuncsTable->base.pin_get_media_type(&
pin->pin,
i, &candidate) ==
S_OK; ++
i)
543 &&
pin->pFuncsTable->pfnAttemptConnection(
pin, peer, &candidate) ==
S_OK)
562 WARN(
"pin %p %s:%s, peer %p, mt %p, unexpected call.\n",
pin,
577 if (
This->pin.filter->state != State_Stopped)
580 WARN(
"Filter is not stopped; returning VFW_E_NOT_STOPPED.\n");
584 if (
This->pFuncsTable->source_disconnect)
585 This->pFuncsTable->source_disconnect(
This);
587 if (
This->pMemInputPin)
589 IMemInputPin_Release(
This->pMemInputPin);
593 if (
This->pAllocator)
595 IMemAllocator_Release(
This->pAllocator);
601 IPin_Release(
This->pin.peer);
685 hr = IMemInputPin_GetAllocator(pPin, pAlloc);
689 CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (
void **)pAlloc);
696 IMemInputPin_GetAllocatorRequirements(pPin, &rProps);
697 hr =
This->pFuncsTable->pfnDecideBufferSize(
This, *pAlloc, &rProps);
701 hr = IMemInputPin_NotifyAllocator(pPin, *pAlloc,
FALSE);
716 TRACE(
"(%p)->(%p, %p)\n",
This, pReceivePin, pmt);
721 This->pin.peer = pReceivePin;
722 IPin_AddRef(pReceivePin);
725 hr = IPin_ReceiveConnection(pReceivePin, &
This->pin.IPin_iface, pmt);
732 hr = IPin_QueryInterface(pReceivePin, &IID_IMemInputPin, (
LPVOID)&
This->pMemInputPin);
736 hr =
This->pFuncsTable->pfnDecideAllocator(
This,
This->pMemInputPin, &pMemAlloc);
738 This->pAllocator = pMemAlloc;
740 IMemAllocator_Release(pMemAlloc);
746 if (
This->pMemInputPin)
747 IMemInputPin_Release(
This->pMemInputPin);
750 IPin_Disconnect(pReceivePin);
756 IPin_Release(
This->pin.peer);
761 TRACE(
"Returning %#lx.\n",
hr);
774 pin->pin.ops = &func_table->
base;
775 pin->pFuncsTable = func_table;
782 IMemAllocator_Release(
pin->pAllocator);
817 if (
This->pin.filter->state != State_Stopped)
820 WARN(
"Filter is not stopped; returning VFW_E_NOT_STOPPED.\n");
833 IPin_QueryDirection(pReceivePin, &pindirReceive);
837 ERR(
"Can't connect from non-output pin\n");
843 hr =
This->pFuncsTable->sink_connect(
This, pReceivePin, pmt);
848 This->pin.peer = pReceivePin;
849 IPin_AddRef(pReceivePin);
866 if (
pin->pin.filter->state != State_Stopped)
869 WARN(
"Filter is not stopped; returning VFW_E_NOT_STOPPED.\n");
875 if (
pin->pFuncsTable->sink_disconnect)
876 pin->pFuncsTable->sink_disconnect(
pin);
880 IMemAllocator_Release(
pin->pAllocator);
884 IPin_Release(
pin->pin.peer);
900 return IPin_EndOfStream(
pin );
910 if (
pin->pFuncsTable->sink_eos)
913 hr =
pin->pFuncsTable->sink_eos(
pin);
930 return IPin_BeginFlush(
pin );
944 if (
pin->pFuncsTable->sink_begin_flush)
945 hr =
pin->pFuncsTable->sink_begin_flush(
pin);
956 return IPin_EndFlush(
pin );
970 if (
pin->pFuncsTable->sink_end_flush)
971 hr =
pin->pFuncsTable->sink_end_flush(
pin);
989 return IPin_NewSegment(pin,
args->tStart,
args->tStop,
args->rate);
1000 if (
pin->pFuncsTable->sink_new_segment)
1043 return IPin_QueryInterface(&
This->pin.IPin_iface,
riid,
ppv);
1050 return IPin_AddRef(&
This->pin.IPin_iface);
1057 return IPin_Release(&
This->pin.IPin_iface);
1067 *ppAllocator =
This->pAllocator;
1069 IMemAllocator_AddRef(*ppAllocator);
1082 FIXME(
"Read only flag not handled yet!\n");
1087 WARN(
"Null allocator\n");
1094 if (
This->pAllocator)
1095 IMemAllocator_Release(
This->pAllocator);
1097 if (
This->pAllocator)
1098 IMemAllocator_AddRef(
This->pAllocator);
1123 if (
pin->pFuncsTable->pfnReceive)
1136 for (*nSamplesProcessed = 0; *nSamplesProcessed < nSamples; (*nSamplesProcessed)++)
1138 hr = IMemInputPin_Receive(iface, pSamples[*nSamplesProcessed]);
1177 pin->pin.ops = &func_table->
base;
1178 pin->pFuncsTable = func_table;
1180 if (
pin->preferred_allocator)
1181 IMemAllocator_AddRef(
pin->preferred_allocator);
1188 if (
pin->pAllocator)
1189 IMemAllocator_Release(
pin->pAllocator);
1191 pin->pin.IPin_iface.lpVtbl =
NULL;
static BOOL heap_free(void *mem)
#define InterlockedIncrement
#define InterlockedDecrement
enum _PinDirection PIN_DIRECTION
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei GLenum GLboolean sink
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
static struct enum_media_types * impl_from_IEnumMediaTypes(IEnumMediaTypes *iface)
static HRESULT WINAPI source_NewSegment(IPin *iface, REFERENCE_TIME start, REFERENCE_TIME stop, double rate)
static ULONG WINAPI enum_media_types_Release(IEnumMediaTypes *iface)
static HRESULT WINAPI MemInputPin_ReceiveCanBlock(IMemInputPin *iface)
static ULONG WINAPI pin_Release(IPin *iface)
static HRESULT WINAPI pin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
static HRESULT WINAPI pin_QueryInterface(IPin *iface, REFIID iid, void **out)
static HRESULT enum_media_types_create(struct strmbase_pin *pin, IEnumMediaTypes **out)
static HRESULT deliver_beginflush(IPin *pin, LPVOID unused)
static HRESULT WINAPI pin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *count)
HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(struct strmbase_source *This, IMemInputPin *pPin, IMemAllocator **pAlloc)
static struct strmbase_sink * impl_sink_from_IPin(IPin *iface)
static HRESULT SendFurther(struct strmbase_sink *sink, SendPinFunc func, void *arg)
static HRESULT WINAPI sink_BeginFlush(IPin *iface)
static HRESULT WINAPI MemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **pSamples, LONG nSamples, LONG *nSamplesProcessed)
static BOOL compare_media_types(const AM_MEDIA_TYPE *req_mt, const AM_MEDIA_TYPE *pin_mt)
HRESULT(* SendPinFunc)(IPin *to, LPVOID arg)
static HRESULT WINAPI enum_media_types_QueryInterface(IEnumMediaTypes *iface, REFIID iid, void **out)
static HRESULT WINAPI pin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *pmt)
static struct strmbase_source * impl_source_from_IPin(IPin *iface)
static ULONG WINAPI MemInputPin_AddRef(IMemInputPin *iface)
static HRESULT WINAPI sink_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
static HRESULT deliver_endofstream(IPin *pin, LPVOID unused)
static ULONG WINAPI pin_AddRef(IPin *iface)
static HRESULT WINAPI sink_Disconnect(IPin *iface)
static HRESULT WINAPI MemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, LPVOID *ppv)
static HRESULT WINAPI source_EndFlush(IPin *iface)
void strmbase_source_init(struct strmbase_source *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_source_ops *func_table)
static HRESULT WINAPI source_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
static const IPinVtbl source_vtbl
static HRESULT WINAPI pin_QueryPinInfo(IPin *iface, PIN_INFO *info)
static HRESULT WINAPI source_Disconnect(IPin *iface)
static HRESULT WINAPI pin_ConnectedTo(IPin *iface, IPin **ppPin)
static ULONG WINAPI MemInputPin_Release(IMemInputPin *iface)
static struct strmbase_sink * impl_from_IMemInputPin(IMemInputPin *iface)
static HRESULT WINAPI enum_media_types_Reset(IEnumMediaTypes *iface)
static HRESULT WINAPI pin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mt)
static ULONG WINAPI enum_media_types_AddRef(IEnumMediaTypes *iface)
static HRESULT WINAPI source_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
void strmbase_sink_cleanup(struct strmbase_sink *pin)
static const IPinVtbl sink_vtbl
static HRESULT WINAPI sink_NewSegment(IPin *iface, REFERENCE_TIME start, REFERENCE_TIME stop, double rate)
static HRESULT WINAPI pin_QueryId(IPin *iface, WCHAR **id)
static HRESULT WINAPI MemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample)
HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(struct strmbase_source *This, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
static HRESULT WINAPI MemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *pAllocator, BOOL bReadOnly)
static HRESULT WINAPI MemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **ppAllocator)
void strmbase_source_cleanup(struct strmbase_source *pin)
static HRESULT WINAPI MemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *props)
static HRESULT deliver_endflush(IPin *pin, LPVOID unused)
static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count, AM_MEDIA_TYPE **mts, ULONG *ret_count)
static HRESULT WINAPI enum_media_types_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **out)
static HRESULT WINAPI sink_EndOfStream(IPin *iface)
static HRESULT WINAPI sink_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
void strmbase_sink_init(struct strmbase_sink *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_sink_ops *func_table, IMemAllocator *allocator)
static struct strmbase_pin * impl_from_IPin(IPin *iface)
static HRESULT WINAPI sink_EndFlush(IPin *iface)
static const IMemInputPinVtbl MemInputPin_Vtbl
static HRESULT WINAPI enum_media_types_Skip(IEnumMediaTypes *iface, ULONG count)
static HRESULT WINAPI pin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **enum_media_types)
static BOOL query_accept(struct strmbase_pin *pin, const AM_MEDIA_TYPE *mt)
static const IEnumMediaTypesVtbl enum_media_types_vtbl
static HRESULT WINAPI source_BeginFlush(IPin *iface)
static HRESULT deliver_newsegment(IPin *pin, LPVOID data)
static HRESULT WINAPI source_EndOfStream(IPin *iface)
static HRESULT updatehres(HRESULT original, HRESULT new)
static const char * debugstr_time(REFERENCE_TIME time)
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt)
void WINAPI DeleteMediaType(AM_MEDIA_TYPE *pMediaType)
const struct strmbase_pin_ops * ops
struct strmbase_filter * filter
struct strmbase_pin_ops base
IMemAllocator * pAllocator
IMemInputPin IMemInputPin_iface
struct strmbase_pin_ops base
#define CONTAINING_RECORD(address, type, field)
#define VFW_E_ALREADY_CONNECTED
#define VFW_E_TYPE_NOT_ACCEPTED
#define VFW_E_INVALID_DIRECTION
#define VFW_E_NOT_STOPPED
#define VFW_E_NO_ACCEPTABLE_TYPES
#define VFW_E_NO_ALLOCATOR
#define VFW_E_NOT_CONNECTED
static const WCHAR props[]
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)