quartz: Add stub IAMStreamSelect to MPEG-1 Stream Splitter. (try 2)
Anton Baskanov
baskanov at gmail.com
Sun Feb 15 00:30:54 CST 2015
---
dlls/quartz/mpegsplit.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++-
include/axcore.idl | 39 +++++++++++++++++++
2 files changed, 138 insertions(+), 1 deletion(-)
diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c
index 1ed352b..48be7c0 100644
--- a/dlls/quartz/mpegsplit.c
+++ b/dlls/quartz/mpegsplit.c
@@ -55,6 +55,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz);
typedef struct MPEGSplitterImpl
{
ParserImpl Parser;
+ IAMStreamSelect IAMStreamSelect_iface;
LONGLONG EndOfFile;
LONGLONG position;
DWORD begin_offset;
@@ -64,11 +65,21 @@ typedef struct MPEGSplitterImpl
BOOL seek;
} MPEGSplitterImpl;
+static inline MPEGSplitterImpl *impl_from_IBaseFilter( IBaseFilter *iface )
+{
+ return CONTAINING_RECORD(iface, MPEGSplitterImpl, Parser.filter.IBaseFilter_iface);
+}
+
static inline MPEGSplitterImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
{
return CONTAINING_RECORD(iface, MPEGSplitterImpl, Parser.sourceSeeking.IMediaSeeking_iface);
}
+static inline MPEGSplitterImpl *impl_from_IAMStreamSelect( IAMStreamSelect *iface )
+{
+ return CONTAINING_RECORD(iface, MPEGSplitterImpl, IAMStreamSelect_iface);
+}
+
static int MPEGSplitter_head_check(const BYTE *header)
{
/* If this is a possible start code, check for a system or video header */
@@ -729,9 +740,37 @@ static HRESULT MPEGSplitter_first_request(LPVOID iface)
return hr;
}
+static HRESULT WINAPI MPEGSplitter_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
+{
+ MPEGSplitterImpl *This = impl_from_IBaseFilter(iface);
+ TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
+
+ *ppv = NULL;
+
+ if ( IsEqualIID(riid, &IID_IUnknown)
+ || IsEqualIID(riid, &IID_IPersist)
+ || IsEqualIID(riid, &IID_IMediaFilter)
+ || IsEqualIID(riid, &IID_IBaseFilter) )
+ *ppv = iface;
+
+ if ( IsEqualIID(riid, &IID_IAMStreamSelect) )
+ *ppv = &This->IAMStreamSelect_iface;
+
+ if (*ppv)
+ {
+ IBaseFilter_AddRef(iface);
+ return S_OK;
+ }
+
+ if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IVideoWindow))
+ FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
+
+ return E_NOINTERFACE;
+}
+
static const IBaseFilterVtbl MPEGSplitter_Vtbl =
{
- Parser_QueryInterface,
+ MPEGSplitter_QueryInterface,
Parser_AddRef,
Parser_Release,
Parser_GetClassID,
@@ -748,6 +787,64 @@ static const IBaseFilterVtbl MPEGSplitter_Vtbl =
Parser_QueryVendorInfo
};
+static HRESULT WINAPI StreamSelect_QueryInterface(IAMStreamSelect *iface, REFIID riid, LPVOID *ppv)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ return IBaseFilter_QueryInterface(&This->Parser.filter.IBaseFilter_iface, riid, ppv);
+}
+
+static ULONG WINAPI StreamSelect_AddRef(IAMStreamSelect *iface)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ return IBaseFilter_AddRef(&This->Parser.filter.IBaseFilter_iface);
+}
+
+static ULONG WINAPI StreamSelect_Release(IAMStreamSelect *iface)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ return IBaseFilter_Release(&This->Parser.filter.IBaseFilter_iface);
+}
+
+static HRESULT WINAPI StreamSelect_Count(IAMStreamSelect *iface, DWORD *pcStreams)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcStreams);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI StreamSelect_Info(IAMStreamSelect *iface, LONG lIndex, AM_MEDIA_TYPE **ppmt, DWORD *pdwFlags, LCID *plcid, DWORD *pdwGroup, WCHAR **ppszName, IUnknown **ppObject, IUnknown **ppUnk)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ FIXME("(%p/%p)->(%d,%p,%p,%p,%p,%p,%p,%p) stub!\n", This, iface, lIndex, ppmt, pdwFlags, plcid, pdwGroup, ppszName, ppObject, ppUnk);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI StreamSelect_Enable(IAMStreamSelect *iface, LONG lIndex, DWORD dwFlags)
+{
+ MPEGSplitterImpl *This = impl_from_IAMStreamSelect(iface);
+
+ FIXME("(%p/%p)->(%d,%x) stub!\n", This, iface, lIndex, dwFlags);
+
+ return E_NOTIMPL;
+}
+
+static const IAMStreamSelectVtbl StreamSelect_Vtbl =
+{
+ StreamSelect_QueryInterface,
+ StreamSelect_AddRef,
+ StreamSelect_Release,
+ StreamSelect_Count,
+ StreamSelect_Info,
+ StreamSelect_Enable
+};
+
HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv)
{
MPEGSplitterImpl *This;
@@ -771,6 +868,7 @@ HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv)
CoTaskMemFree(This);
return hr;
}
+ This->IAMStreamSelect_iface.lpVtbl = &StreamSelect_Vtbl;
This->seek = 1;
/* Note: This memory is managed by the parser filter once created */
diff --git a/include/axcore.idl b/include/axcore.idl
index b8c0e69..8a5a996 100644
--- a/include/axcore.idl
+++ b/include/axcore.idl
@@ -655,3 +655,42 @@ enum tagAM_MEDIAEVENT_FLAGS
{
AM_MEDIAEVENT_NONOTIFY = 0x01
};
+
+enum _AMSTREAMSELECTINFOFLAGS
+{
+ AMSTREAMSELECTINFO_ENABLED = 0x1,
+ AMSTREAMSELECTINFO_EXCLUSIVE = 0x2
+};
+
+enum _AMSTREAMSELECTENABLEFLAGS
+{
+ AMSTREAMSELECTENABLE_ENABLE = 0x1,
+ AMSTREAMSELECTENABLE_ENABLEALL = 0x2
+};
+
+[
+object,
+uuid(c1960960-17f5-11d1-abe1-00a0c905f375),
+pointer_default(unique)
+]
+interface IAMStreamSelect : IUnknown
+{
+ HRESULT Count(
+ [out] DWORD * pcStreams);
+
+ HRESULT Info(
+ [in] long lIndex,
+ [out] AM_MEDIA_TYPE ** ppmt,
+ [out] DWORD * pdwFlags,
+ [out] LCID * plcid,
+ [out] DWORD * pdwGroup,
+ [out] WCHAR ** ppszName,
+ [out] IUnknown ** ppObject,
+ [out] IUnknown ** ppUnk);
+
+ HRESULT Enable(
+ [in] long lIndex,
+ [in] DWORD dwFlags);
+}
+
+typedef IAMStreamSelect *PAMSTREAMSELECT;
--
2.1.0
More information about the wine-patches
mailing list