static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* iface, IAMMediaStream *pAMMediaStream) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); IMediaStream** streams; IPin** pins; MediaStreamFilter_InputPin* pin; HRESULT hr; PIN_INFO info; MSPID purpose_id; TRACE("(%p)->(%p)\n", iface, pAMMediaStream); streams = CoTaskMemRealloc(This->streams, (This->nb_streams + 1) * sizeof(IMediaStream*)); 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 = (IBaseFilter*)&This->filter; 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_BaseFuncTable, &input_BaseInputFuncTable, &This->filter.csFilter, NULL, &This->pins[This->nb_streams]); if (FAILED(hr)) return hr; pin = (MediaStreamFilter_InputPin*)This->pins[This->nb_streams]; pin->pin.pin.pinInfo.pFilter = (LPVOID)This; This->streams[This->nb_streams] = (IMediaStream*)pAMMediaStream; This->nb_streams++; IMediaStream_AddRef((IMediaStream*)pAMMediaStream); return S_OK; }
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 ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface, const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample) { IDirectDrawStreamSampleImpl *object; HRESULT hr; TRACE("(%p)\n", ddraw_stream_sample); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) return E_OUTOFMEMORY; object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl; object->ref = 1; object->parent = (IMediaStream*)parent; IMediaStream_AddRef(object->parent); if (surface) { object->surface = surface; IDirectDrawSurface_AddRef(surface); } else { DDSURFACEDESC desc; IDirectDraw *ddraw; hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw); if (FAILED(hr)) { IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface); return hr; } desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT; desc.dwHeight = 100; desc.dwWidth = 100; desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat); desc.ddpfPixelFormat.dwFlags = DDPF_RGB; desc.ddpfPixelFormat.dwRGBBitCount = 32; desc.ddpfPixelFormat.dwRBitMask = 0xff0000; desc.ddpfPixelFormat.dwGBitMask = 0x00ff00; desc.ddpfPixelFormat.dwBBitMask = 0x0000ff; desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0; desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; desc.lpSurface = NULL; hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL); IDirectDraw_Release(ddraw); if (FAILED(hr)) { ERR("failed to create surface, 0x%08x\n", hr); IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface); return hr; } } if (rect) object->rect = *rect; else if (object->surface) { DDSURFACEDESC desc = { sizeof(desc) }; hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc); if (hr == S_OK) { object->rect.left = object->rect.top = 0; object->rect.right = desc.dwWidth; object->rect.bottom = desc.dwHeight; } } *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface; return S_OK; }