[PATCH 10/10] amstream: Use streams as pins in MediaStreamFilter.
Anton Baskanov
baskanov at gmail.com
Fri Feb 16 10:43:43 CST 2018
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
dlls/amstream/mediastreamfilter.c | 185 ++------------------------------------
dlls/amstream/tests/amstream.c | 4 +
2 files changed, 10 insertions(+), 179 deletions(-)
diff --git a/dlls/amstream/mediastreamfilter.c b/dlls/amstream/mediastreamfilter.c
index c14e8ac7dd..5abcb2f65f 100644
--- a/dlls/amstream/mediastreamfilter.c
+++ b/dlls/amstream/mediastreamfilter.c
@@ -34,38 +34,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(amstream);
-typedef struct MediaStreamFilter_InputPin
-{
- BaseInputPin pin;
-} MediaStreamFilter_InputPin;
-
-static const IPinVtbl MediaStreamFilter_InputPin_Vtbl =
-{
- BaseInputPinImpl_QueryInterface,
- BasePinImpl_AddRef,
- BaseInputPinImpl_Release,
- BaseInputPinImpl_Connect,
- BaseInputPinImpl_ReceiveConnection,
- BasePinImpl_Disconnect,
- BasePinImpl_ConnectedTo,
- BasePinImpl_ConnectionMediaType,
- BasePinImpl_QueryPinInfo,
- BasePinImpl_QueryDirection,
- BasePinImpl_QueryId,
- BasePinImpl_QueryAccept,
- BasePinImpl_EnumMediaTypes,
- BasePinImpl_QueryInternalConnections,
- BaseInputPinImpl_EndOfStream,
- BaseInputPinImpl_BeginFlush,
- BaseInputPinImpl_EndFlush,
- BasePinImpl_NewSegment
-};
-
typedef struct {
BaseFilter filter;
ULONG nb_streams;
IAMMediaStream** streams;
- IPin** pins;
} IMediaStreamFilterImpl;
static inline IMediaStreamFilterImpl *impl_from_IMediaStreamFilter(IMediaStreamFilter *iface)
@@ -73,133 +45,6 @@ static inline IMediaStreamFilterImpl *impl_from_IMediaStreamFilter(IMediaStreamF
return CONTAINING_RECORD(iface, IMediaStreamFilterImpl, filter);
}
-static HRESULT WINAPI BasePinImpl_CheckMediaType(BasePin *This, const AM_MEDIA_TYPE *pmt)
-{
- IMediaStreamFilterImpl *filter = impl_from_IMediaStreamFilter((IMediaStreamFilter*)This->pinInfo.pFilter);
- MSPID purpose_id;
- ULONG i;
-
- TRACE("Checking media type %s - %s\n", debugstr_guid(&pmt->majortype), debugstr_guid(&pmt->subtype));
-
- /* Find which stream is associated with the pin */
- for (i = 0; i < filter->nb_streams; i++)
- if (&This->IPin_iface == filter->pins[i])
- break;
-
- if (i == filter->nb_streams)
- return S_FALSE;
-
- if (FAILED(IAMMediaStream_GetInformation(filter->streams[i], &purpose_id, NULL)))
- return S_FALSE;
-
- TRACE("Checking stream with purpose id %s\n", debugstr_guid(&purpose_id));
-
- if (IsEqualGUID(&purpose_id, &MSPID_PrimaryVideo) && IsEqualGUID(&pmt->majortype, &MEDIATYPE_Video))
- {
- if (IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB1) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB4) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB8) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB565) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB555) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB24) ||
- IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB32))
- {
- TRACE("Video sub-type %s matches\n", debugstr_guid(&pmt->subtype));
- return S_OK;
- }
- }
- else if (IsEqualGUID(&purpose_id, &MSPID_PrimaryAudio) && IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio))
- {
- if (IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_PCM))
- {
- TRACE("Audio sub-type %s matches\n", debugstr_guid(&pmt->subtype));
- return S_OK;
- }
- }
-
- return S_FALSE;
-}
-
-static LONG WINAPI BasePinImp_GetMediaTypeVersion(BasePin *This)
-{
- return 0;
-}
-
-static HRESULT WINAPI BasePinImp_GetMediaType(BasePin *This, int index, AM_MEDIA_TYPE *amt)
-{
- IMediaStreamFilterImpl *filter = (IMediaStreamFilterImpl*)This->pinInfo.pFilter;
- MSPID purpose_id;
- ULONG i;
-
- /* FIXME: Reset structure as we only fill majortype and minortype for now */
- ZeroMemory(amt, sizeof(*amt));
-
- /* Find which stream is associated with the pin */
- for (i = 0; i < filter->nb_streams; i++)
- if (&This->IPin_iface == filter->pins[i])
- break;
-
- if (i == filter->nb_streams)
- return S_FALSE;
-
- if (FAILED(IAMMediaStream_GetInformation(filter->streams[i], &purpose_id, NULL)))
- return S_FALSE;
-
- TRACE("Processing stream with purpose id %s\n", debugstr_guid(&purpose_id));
-
- if (IsEqualGUID(&purpose_id, &MSPID_PrimaryVideo))
- {
- amt->majortype = MEDIATYPE_Video;
-
- switch (index)
- {
- case 0:
- amt->subtype = MEDIASUBTYPE_RGB1;
- break;
- case 1:
- amt->subtype = MEDIASUBTYPE_RGB4;
- break;
- case 2:
- amt->subtype = MEDIASUBTYPE_RGB8;
- break;
- case 3:
- amt->subtype = MEDIASUBTYPE_RGB565;
- break;
- case 4:
- amt->subtype = MEDIASUBTYPE_RGB555;
- break;
- case 5:
- amt->subtype = MEDIASUBTYPE_RGB24;
- break;
- case 6:
- amt->subtype = MEDIASUBTYPE_RGB32;
- break;
- default:
- return S_FALSE;
- }
- }
- else if (IsEqualGUID(&purpose_id, &MSPID_PrimaryAudio))
- {
- if (index)
- return S_FALSE;
-
- amt->majortype = MEDIATYPE_Audio;
- amt->subtype = MEDIASUBTYPE_PCM;
- }
-
- return S_OK;
-}
-
-static const BaseInputPinFuncTable input_BaseInputFuncTable = {
- {
- BasePinImpl_CheckMediaType,
- NULL,
- BasePinImp_GetMediaTypeVersion,
- BasePinImp_GetMediaType
- },
- NULL
-};
-
/*** IUnknown methods ***/
static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter *iface, REFIID riid, void **ret_iface)
@@ -246,11 +91,10 @@ static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter *iface)
ULONG i;
for (i = 0; i < This->nb_streams; i++)
{
+ IAMMediaStream_JoinFilter(This->streams[i], NULL);
IAMMediaStream_Release(This->streams[i]);
- IPin_Release(This->pins[i]);
}
CoTaskMemFree(This->streams);
- CoTaskMemFree(This->pins);
BaseFilter_Destroy(&This->filter);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -344,11 +188,7 @@ static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* i
{
IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface);
IAMMediaStream** streams;
- IPin** pins;
- MediaStreamFilter_InputPin* pin;
HRESULT hr;
- PIN_INFO info;
- MSPID purpose_id;
TRACE("(%p)->(%p)\n", iface, pAMMediaStream);
@@ -356,25 +196,11 @@ static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* i
if (!streams)
return E_OUTOFMEMORY;
This->streams = streams;
- pins = CoTaskMemRealloc(This->pins, (This->nb_streams + 1) * sizeof(IPin*));
- if (!pins)
- return E_OUTOFMEMORY;
- This->pins = pins;
- info.pFilter = &This->filter.IBaseFilter_iface;
- info.dir = PINDIR_INPUT;
- hr = IAMMediaStream_GetInformation(pAMMediaStream, &purpose_id, NULL);
- if (FAILED(hr))
- return hr;
- /* Pin name is "I{guid MSPID_PrimaryVideo or MSPID_PrimaryAudio}" */
- info.achName[0] = 'I';
- StringFromGUID2(&purpose_id, info.achName + 1, 40);
- hr = BaseInputPin_Construct(&MediaStreamFilter_InputPin_Vtbl, sizeof(BaseInputPin), &info,
- &input_BaseInputFuncTable, &This->filter.csFilter, NULL, &This->pins[This->nb_streams]);
+
+ hr = IAMMediaStream_JoinFilter(pAMMediaStream, iface);
if (FAILED(hr))
return hr;
- pin = (MediaStreamFilter_InputPin*)This->pins[This->nb_streams];
- pin->pin.pin.pinInfo.pFilter = &This->filter.IBaseFilter_iface;
This->streams[This->nb_streams] = pAMMediaStream;
This->nb_streams++;
@@ -488,8 +314,9 @@ static IPin* WINAPI MediaStreamFilterImpl_GetPin(BaseFilter *iface, int pos)
if (pos < This->nb_streams)
{
- IPin_AddRef(This->pins[pos]);
- return This->pins[pos];
+ IPin *pin = NULL;
+ IAMMediaStream_QueryInterface(This->streams[pos], &IID_IPin, (void **)&pin);
+ return pin;
}
return NULL;
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index 05957df425..70cd18de1b 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -483,6 +483,10 @@ static void test_media_streams(void)
ok(SUCCEEDED(hr), "IEnumMediaTypes_Next returned: %x\n", hr);
ok(nb_media_types > 0, "nb_media_types should be >0\n");
IEnumMediaTypes_Release(enum_media_types);
+ hr = IMediaStream_QueryInterface(i ? audio_stream : video_stream, &IID_IPin, (void **)&pin);
+ ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr);
+ ok(pin == pins[i], "Pin is %p instead of %p\n", pins[i], pin);
+ IPin_Release(pin);
IPin_Release(pins[i]);
}
IEnumPins_Release(enum_pins);
--
2.14.1
More information about the wine-devel
mailing list