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(IMediaStream_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 HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream* iface, REFMSPID idPurpose, IMediaStream** ppMediaStream) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); MSPID PurposeId; unsigned int i; TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(idPurpose), ppMediaStream); for (i = 0; i < This->nbStreams; i++) { IMediaStream_GetInformation(This->pStreams[i], &PurposeId, NULL); if (IsEqualIID(&PurposeId, idPurpose)) { *ppMediaStream = This->pStreams[i]; IMediaStream_AddRef(*ppMediaStream); return S_OK; } } return MS_E_NOSTREAM; }
static HRESULT WINAPI MediaStreamFilterImpl_GetMediaStream(IMediaStreamFilter* iface, REFMSPID idPurpose, IMediaStream **ppMediaStream) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); MSPID purpose_id; unsigned int i; TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(idPurpose), ppMediaStream); for (i = 0; i < This->nb_streams; i++) { IMediaStream_GetInformation(This->streams[i], &purpose_id, NULL); if (IsEqualIID(&purpose_id, idPurpose)) { *ppMediaStream = This->streams[i]; IMediaStream_AddRef(*ppMediaStream); return S_OK; } } return MS_E_NOSTREAM; }
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(IMediaStream_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; }