Ivan Leo : amstream: Implement IAMMultiMediaStreamImpl_OpenFile and
IAMMultiMediaStreamImpl_OpenMoniker .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 26 07:12:32 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 27bfdc2a022b1dba59c5e5cca64e319d13526695
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=27bfdc2a022b1dba59c5e5cca64e319d13526695
Author: Ivan Leo <ivanleo at gmail.com>
Date: Sat Jun 24 20:08:58 2006 +0100
amstream: Implement IAMMultiMediaStreamImpl_OpenFile and IAMMultiMediaStreamImpl_OpenMoniker.
---
dlls/amstream/amstream.c | 70 +++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/dlls/amstream/amstream.c b/dlls/amstream/amstream.c
index 87e7a7b..d17b456 100644
--- a/dlls/amstream/amstream.c
+++ b/dlls/amstream/amstream.c
@@ -2,6 +2,7 @@
* Implementation of IAMMultiMediaStream Interface
*
* Copyright 2004 Christian Costa
+ * Copyright 2006 Ivan Leo Puoti
*
* This file contains the (internal) driver registration functions,
* driver enumeration APIs and DirectDraw creation functions.
@@ -38,6 +39,8 @@ typedef struct {
IAMMultiMediaStream lpVtbl;
LONG ref;
IGraphBuilder* pFilterGraph;
+ IPin* ipin;
+ IGraphBuilder* GraphBuilder;
ULONG nbStreams;
IMediaStream** pStreams;
STREAM_TYPE StreamType;
@@ -280,11 +283,67 @@ static HRESULT WINAPI IAMMultiMediaStrea
static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* iface, LPCWSTR pszFileName, DWORD dwFlags)
{
+ HRESULT ret;
IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
+ IFileSourceFilter *SourceFilter;
+ IBaseFilter *BaseFilter;
+ IEnumPins *EnumPins;
+ IPin *ipin;
+ PIN_DIRECTION pin_direction;
- FIXME("(%p/%p)->(%s,%lx) stub!\n", This, iface, debugstr_w(pszFileName), dwFlags);
+ TRACE("(%p/%p)->(%s,%lx)\n", This, iface, debugstr_w(pszFileName), dwFlags);
- return E_NOTIMPL;
+ ret = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IFileSourceFilter, (void**)&SourceFilter);
+ if(ret != S_OK)
+ return ret;
+
+ ret = IFileSourceFilter_Load(SourceFilter, pszFileName, NULL);
+ if(ret != S_OK)
+ {
+ IFileSourceFilter_Release(SourceFilter);
+ return ret;
+ }
+
+ ret = IFileSourceFilter_QueryInterface(SourceFilter, &IID_IBaseFilter, (void**)&BaseFilter);
+ if(ret != S_OK)
+ {
+ IFileSourceFilter_Release(SourceFilter);
+ return ret;
+ }
+
+ ret = IBaseFilter_EnumPins(BaseFilter, &EnumPins);
+ if(ret != S_OK)
+ {
+ goto end;
+ }
+
+ ret = IEnumPins_Next(EnumPins, 1, &ipin, NULL);
+ if(ret == S_OK)
+ {
+ ret = IPin_QueryDirection(ipin, &pin_direction);
+ IEnumPins_Release(EnumPins);
+ if(ret == S_OK && pin_direction == PINDIR_OUTPUT)
+ This->ipin = ipin;
+ else
+ goto end;
+ }
+ else
+ {
+ IEnumPins_Release(EnumPins);
+ goto end;
+ }
+
+ ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder);
+ if(ret != S_OK)
+ {
+ goto end;
+ }
+
+ ret = IGraphBuilder_AddSourceFilter(This->GraphBuilder, pszFileName, pszFileName, &BaseFilter);
+ end:
+ IBaseFilter_Release(BaseFilter);
+ IFileSourceFilter_Release(SourceFilter);
+ return ret;
}
static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenMoniker(IAMMultiMediaStream* iface, IBindCtx* pCtx, IMoniker* pMoniker, DWORD dwFlags)
@@ -300,9 +359,12 @@ static HRESULT WINAPI IAMMultiMediaStrea
{
IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
- FIXME("(%p/%p)->(%lx) stub!\n", This, iface, dwFlags);
+ FIXME("(%p/%p)->(%lx)\n", This, iface, dwFlags);
- return E_NOTIMPL;
+ if(dwFlags != AMMSF_NOCLOCK)
+ return E_INVALIDARG;
+
+ return IGraphBuilder_Render(This->GraphBuilder, This->ipin);
}
static const IAMMultiMediaStreamVtbl AM_Vtbl =
More information about the wine-cvs
mailing list