Chris Robinson : quartz: Add a cleanup callback for parser filters to call on release.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Apr 7 05:23:19 CDT 2007


Module: wine
Branch: master
Commit: 828d5a0c4a8f13e170916801ac020b90ddcddbf7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=828d5a0c4a8f13e170916801ac020b90ddcddbf7

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Fri Apr  6 21:18:25 2007 -0700

quartz: Add a cleanup callback for parser filters to call on release.

---

 dlls/quartz/avisplit.c   |    2 +-
 dlls/quartz/parser.c     |    6 +++++-
 dlls/quartz/parser.h     |    4 +++-
 dlls/quartz/waveparser.c |    2 +-
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c
index e90035d..20bfe92 100644
--- a/dlls/quartz/avisplit.c
+++ b/dlls/quartz/avisplit.c
@@ -594,7 +594,7 @@ HRESULT AVISplitter_create(IUnknown * pUnkOuter, LPVOID * ppv)
 
     This->pCurrentSample = NULL;
 
-    hr = Parser_Create(&(This->Parser), &CLSID_AviSplitter, AVISplitter_Sample, AVISplitter_QueryAccept, AVISplitter_InputPin_PreConnect);
+    hr = Parser_Create(&(This->Parser), &CLSID_AviSplitter, AVISplitter_Sample, AVISplitter_QueryAccept, AVISplitter_InputPin_PreConnect, NULL);
 
     if (FAILED(hr))
         return hr;
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 01d215f..8e85456 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -60,7 +60,7 @@ static inline Parser_OutputPin *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)
+HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup)
 {
     HRESULT hr;
     PIN_INFO piInput;
@@ -74,6 +74,7 @@ HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMP
     pParser->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ParserImpl.csFilter");
     pParser->state = State_Stopped;
     pParser->pClock = NULL;
+    pParser->fnCleanup = fnCleanup;
     ZeroMemory(&pParser->filterInfo, sizeof(FILTER_INFO));
 
     pParser->cStreams = 0;
@@ -187,6 +188,9 @@ static ULONG WINAPI Parser_Release(IBaseFilter * iface)
     {
         ULONG i;
 
+        if (This->fnCleanup)
+            This->fnCleanup(This);
+
         if (This->pClock)
             IReferenceClock_Release(This->pClock);
         
diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h
index fec1d37..25f1d6d 100644
--- a/dlls/quartz/parser.h
+++ b/dlls/quartz/parser.h
@@ -23,6 +23,7 @@ typedef struct ParserImpl ParserImpl;
 typedef HRESULT (*PFN_PROCESS_SAMPLE) (LPVOID iface, IMediaSample * pSample);
 typedef HRESULT (*PFN_QUERY_ACCEPT) (LPVOID iface, const AM_MEDIA_TYPE * pmt);
 typedef HRESULT (*PFN_PRE_CONNECT) (IPin * iface, IPin * pConnectPin);
+typedef HRESULT (*PFN_CLEANUP) (LPVOID iface);
 
 struct ParserImpl
 {
@@ -33,6 +34,7 @@ struct ParserImpl
     FILTER_STATE state;
     REFERENCE_TIME rtStreamStart;
     IReferenceClock * pClock;
+    PFN_CLEANUP fnCleanup;
     FILTER_INFO filterInfo;
     CLSID clsid;
 
@@ -54,4 +56,4 @@ typedef struct Parser_OutputPin
 } Parser_OutputPin;
 
 HRESULT Parser_AddPin(ParserImpl * This, PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, AM_MEDIA_TYPE * amt, float fSamplesPerSec, DWORD dwSampleSize, DWORD dwLength);
-HRESULT Parser_Create(ParserImpl*, const CLSID*, PFN_PROCESS_SAMPLE, PFN_QUERY_ACCEPT, PFN_PRE_CONNECT);
+HRESULT Parser_Create(ParserImpl*, const CLSID*, PFN_PROCESS_SAMPLE, PFN_QUERY_ACCEPT, PFN_PRE_CONNECT, PFN_CLEANUP);
diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c
index 5cd979f..7feeadf 100644
--- a/dlls/quartz/waveparser.c
+++ b/dlls/quartz/waveparser.c
@@ -318,7 +318,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);
+    hr = Parser_Create(&(This->Parser), &CLSID_WAVEParser, WAVEParser_Sample, WAVEParser_QueryAccept, WAVEParser_InputPin_PreConnect, NULL);
 
     if (FAILED(hr))
         return hr;




More information about the wine-cvs mailing list