From 789edc3363aae4b2f2636285bb77640d36004cb8 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 25 Mar 2008 16:11:22 -0700 Subject: [PATCH] quartz: Allow filters to implement their own seeking methods when using the parser --- dlls/quartz/avisplit.c | 2 +- dlls/quartz/mpegsplit.c | 2 +- dlls/quartz/parser.c | 23 ++++++++++++++++------- dlls/quartz/parser.h | 2 +- dlls/quartz/waveparser.c | 2 +- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index 140b0df..0d9aed7 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -622,7 +622,7 @@ HRESULT AVISplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) This->pCurrentSample = NULL; This->streams = NULL; - hr = Parser_Create(&(This->Parser), &CLSID_AviSplitter, AVISplitter_Sample, AVISplitter_QueryAccept, AVISplitter_InputPin_PreConnect, AVISplitter_Cleanup); + hr = Parser_Create(&(This->Parser), &CLSID_AviSplitter, AVISplitter_Sample, AVISplitter_QueryAccept, AVISplitter_InputPin_PreConnect, AVISplitter_Cleanup, NULL, NULL, NULL); if (FAILED(hr)) return hr; diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index 0ecafc8..0dbc3c5 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -721,7 +721,7 @@ HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) return E_OUTOFMEMORY; ZeroMemory(This, sizeof(MPEGSplitterImpl)); - hr = Parser_Create(&(This->Parser), &CLSID_MPEG1Splitter, MPEGSplitter_process_sample, MPEGSplitter_query_accept, MPEGSplitter_pre_connect, MPEGSplitter_cleanup); + hr = Parser_Create(&(This->Parser), &CLSID_MPEG1Splitter, MPEGSplitter_process_sample, MPEGSplitter_query_accept, MPEGSplitter_pre_connect, MPEGSplitter_cleanup, NULL, NULL, NULL); if (FAILED(hr)) { CoTaskMemFree(This); diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index 8fdf939..b7bb270 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -43,7 +43,7 @@ static const IPinVtbl Parser_OutputPin_Vtbl; static const IPinVtbl Parser_InputPin_Vtbl; static HRESULT Parser_OutputPin_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt); -static HRESULT Parser_ChangeStart(IBaseFilter *iface); +static HRESULT Parser_ChangeCurrent(IBaseFilter *iface); static HRESULT Parser_ChangeStop(IBaseFilter *iface); static HRESULT Parser_ChangeRate(IBaseFilter *iface); @@ -55,7 +55,7 @@ static inline ParserImpl *impl_from_IMediaSeeking( IMediaSeeking *iface ) } -HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup) +HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup, CHANGEPROC stop, CHANGEPROC current, CHANGEPROC rate) { HRESULT hr; PIN_INFO piInput; @@ -80,7 +80,16 @@ HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMP piInput.pFilter = (IBaseFilter *)pParser; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); - MediaSeekingImpl_Init((IBaseFilter*)pParser, Parser_ChangeStop, Parser_ChangeStart, Parser_ChangeRate, &pParser->mediaSeeking, &pParser->csFilter); + if (!current) + current = Parser_ChangeCurrent; + + if (!stop) + stop = Parser_ChangeStop; + + if (!rate) + rate = Parser_ChangeRate; + + MediaSeekingImpl_Init((IBaseFilter*)pParser, stop, current, rate, &pParser->mediaSeeking, &pParser->csFilter); pParser->mediaSeeking.lpVtbl = &Parser_Seeking_Vtbl; hr = Parser_InputPin_Construct(&piInput, fnProcessSample, (LPVOID)pParser, fnQueryAccept, &pParser->csFilter, (IPin **)&pParser->pInputPin); @@ -551,21 +560,21 @@ static HRESULT Parser_RemoveOutputPins(ParserImpl * This) return S_OK; } -static HRESULT Parser_ChangeStart(IBaseFilter *iface) +static HRESULT Parser_ChangeCurrent(IBaseFilter *iface) { - FIXME("(%p)\n", iface); + FIXME("(%p) filter hasn't implemented current position change!\n", iface); return S_OK; } static HRESULT Parser_ChangeStop(IBaseFilter *iface) { - FIXME("(%p)\n", iface); + FIXME("(%p) filter hasn't implemented stop position change!\n", iface); return S_OK; } static HRESULT Parser_ChangeRate(IBaseFilter *iface) { - FIXME("(%p)\n", iface); + FIXME("(%p) filter hasn't implemented rate change!\n", iface); return S_OK; } diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h index 876f0fc..0bba062 100644 --- a/dlls/quartz/parser.h +++ b/dlls/quartz/parser.h @@ -54,4 +54,4 @@ typedef struct Parser_OutputPin HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, const AM_MEDIA_TYPE * amt); -HRESULT Parser_Create(ParserImpl*, const CLSID*, PFN_PROCESS_SAMPLE, PFN_QUERY_ACCEPT, PFN_PRE_CONNECT, PFN_CLEANUP); +HRESULT Parser_Create(ParserImpl*, const CLSID*, PFN_PROCESS_SAMPLE, PFN_QUERY_ACCEPT, PFN_PRE_CONNECT, PFN_CLEANUP, CHANGEPROC stop, CHANGEPROC current, CHANGEPROC rate); diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 3d4bd74..55fad4c 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -334,7 +334,7 @@ HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) This->pCurrentSample = NULL; - hr = Parser_Create(&(This->Parser), &CLSID_WAVEParser, WAVEParser_Sample, WAVEParser_QueryAccept, WAVEParser_InputPin_PreConnect, WAVEParser_Cleanup); + hr = Parser_Create(&(This->Parser), &CLSID_WAVEParser, WAVEParser_Sample, WAVEParser_QueryAccept, WAVEParser_InputPin_PreConnect, WAVEParser_Cleanup, NULL, NULL, NULL); if (FAILED(hr)) return hr; -- 1.5.4.1