Damjan Jovanovic : strmbase: Store and use the chosen IMemAllocator instead of getting it from the input pin .

Alexandre Julliard julliard at winehq.org
Tue Jan 15 13:46:17 CST 2013


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

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Tue Jan 15 08:43:33 2013 +0200

strmbase: Store and use the chosen IMemAllocator instead of getting it from the input pin.

---

 dlls/strmbase/pin.c     |   52 ++++++++++-------------------------------------
 include/wine/strmbase.h |    1 +
 2 files changed, 12 insertions(+), 41 deletions(-)

diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index 936ae0c..750752e 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -402,6 +402,9 @@ ULONG WINAPI BaseOutputPinImpl_Release(IPin * iface)
     if (!refCount)
     {
         FreeMediaType(&This->pin.mtCurrent);
+        if (This->pAllocator)
+            IMemAllocator_Release(This->pAllocator);
+        This->pAllocator = NULL;
         CoTaskMemFree(This);
         return 0;
     }
@@ -584,18 +587,10 @@ HRESULT WINAPI BaseOutputPinImpl_GetDeliveryBuffer(BaseOutputPin *This, IMediaSa
         hr = VFW_E_NOT_CONNECTED;
     else
     {
-        IMemAllocator * pAlloc = NULL;
-
-        hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pAlloc);
-
-        if (SUCCEEDED(hr))
-            hr = IMemAllocator_GetBuffer(pAlloc, ppSample, tStart, tStop, dwFlags);
+        hr = IMemAllocator_GetBuffer(This->pAllocator, ppSample, tStart, tStop, dwFlags);
 
         if (SUCCEEDED(hr))
             hr = IMediaSample_SetTime(*ppSample, tStart, tStop);
-
-        if (pAlloc)
-            IMemAllocator_Release(pAlloc);
     }
 
     return hr;
@@ -653,17 +648,7 @@ HRESULT WINAPI BaseOutputPinImpl_Active(BaseOutputPin *This)
         if (!This->pin.pConnectedTo || !This->pMemInputPin)
             hr = VFW_E_NOT_CONNECTED;
         else
-        {
-            IMemAllocator * pAlloc = NULL;
-
-            hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pAlloc);
-
-            if (SUCCEEDED(hr))
-                hr = IMemAllocator_Commit(pAlloc);
-
-            if (pAlloc)
-                IMemAllocator_Release(pAlloc);
-        }
+            hr = IMemAllocator_Commit(This->pAllocator);
     }
     LeaveCriticalSection(This->pin.pCritSec);
 
@@ -683,17 +668,7 @@ HRESULT WINAPI BaseOutputPinImpl_Inactive(BaseOutputPin *This)
         if (!This->pin.pConnectedTo || !This->pMemInputPin)
             hr = VFW_E_NOT_CONNECTED;
         else
-        {
-            IMemAllocator * pAlloc = NULL;
-
-            hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pAlloc);
-
-            if (SUCCEEDED(hr))
-                hr = IMemAllocator_Decommit(pAlloc);
-
-            if (pAlloc)
-                IMemAllocator_Release(pAlloc);
-        }
+            hr = IMemAllocator_Decommit(This->pAllocator);
     }
     LeaveCriticalSection(This->pin.pCritSec);
 
@@ -714,15 +689,7 @@ HRESULT WINAPI BaseOutputPinImpl_BreakConnect(BaseOutputPin *This)
             hr = VFW_E_NOT_CONNECTED;
         else
         {
-            IMemAllocator * pAlloc = NULL;
-
-            hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pAlloc);
-
-            if (SUCCEEDED(hr))
-                hr = IMemAllocator_Decommit(pAlloc);
-
-            if (pAlloc)
-                IMemAllocator_Release(pAlloc);
+            hr = IMemAllocator_Decommit(This->pAllocator);
 
             if (SUCCEEDED(hr))
                 hr = IPin_Disconnect(This->pin.pConnectedTo);
@@ -795,7 +762,9 @@ HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(BasePin* iface, IPin * pRecei
         if (SUCCEEDED(hr))
         {
             hr = This->pFuncsTable->pfnDecideAllocator(This, This->pMemInputPin, &pMemAlloc);
-            if (pMemAlloc)
+            if (SUCCEEDED(hr))
+                This->pAllocator = pMemAlloc;
+            else if (pMemAlloc)
                 IMemAllocator_Release(pMemAlloc);
         }
 
@@ -839,6 +808,7 @@ static HRESULT OutputPin_Init(const IPinVtbl *OutputPin_Vtbl, const PIN_INFO * p
 
     /* Output pin attributes */
     pPinImpl->pMemInputPin = NULL;
+    pPinImpl->pAllocator = NULL;
     pPinImpl->pFuncsTable = pBaseOutputFuncsTable;
 
     return S_OK;
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index da6475d..cbb7d23 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -61,6 +61,7 @@ typedef struct BaseOutputPin
 	/* inheritance C style! */
 	BasePin pin;
 	IMemInputPin * pMemInputPin;
+	IMemAllocator * pAllocator;
 
 	const struct BaseOutputPinFuncTable* pFuncsTable;
 } BaseOutputPin;




More information about the wine-cvs mailing list