From 89763f0e954c751975f70acd3fe40676d28bda89 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 25 Nov 2016 12:10:45 +0300 Subject: [PATCH] strmbase: Allocate sample list as a part of queue structure. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/strmbase/outputqueue.c | 33 ++++++++++++--------------------- include/wine/strmbase.h | 4 +++- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/dlls/strmbase/outputqueue.c b/dlls/strmbase/outputqueue.c index 842a9f0fa07..5513193989b 100644 --- a/dlls/strmbase/outputqueue.c +++ b/dlls/strmbase/outputqueue.c @@ -49,7 +49,7 @@ static DWORD WINAPI OutputQueue_InitialThreadProc(LPVOID data) static void OutputQueue_FreeSamples(OutputQueue *pOutputQueue) { struct list *cursor, *cursor2; - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); list_remove(cursor); @@ -86,14 +86,7 @@ HRESULT WINAPI OutputQueue_Construct( This->bBatchExact = bBatchExact; InitializeCriticalSection(&This->csQueue); This->csQueue.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": OutputQueue.csQueue"); - This->SampleList = HeapAlloc(GetProcessHeap(),0,sizeof(struct list)); - if (!This->SampleList) - { - OutputQueue_Destroy(This); - *ppOutputQueue = NULL; - return E_OUTOFMEMORY; - } - list_init(This->SampleList); + list_init(&This->SampleList); This->pInputPin = pInputPin; IPin_AddRef(&pInputPin->pin.IPin_iface); @@ -130,8 +123,6 @@ HRESULT WINAPI OutputQueue_Destroy(OutputQueue *pOutputQueue) DeleteCriticalSection(&pOutputQueue->csQueue); CloseHandle(pOutputQueue->hProcessQueue); - HeapFree(GetProcessHeap(),0,pOutputQueue->SampleList); - IPin_Release(&pOutputQueue->pInputPin->pin.IPin_iface); HeapFree(GetProcessHeap(),0,pOutputQueue); return S_OK; @@ -168,11 +159,11 @@ HRESULT WINAPI OutputQueue_ReceiveMultiple(OutputQueue *pOutputQueue, IMediaSamp qev->type = SAMPLE_PACKET; qev->pSample = ppSamples[i]; IMediaSample_AddRef(ppSamples[i]); - list_add_tail(pOutputQueue->SampleList, &qev->entry); + list_add_tail(&pOutputQueue->SampleList, &qev->entry); (*nSamplesProcessed)++; } - if (!pOutputQueue->bBatchExact || list_count(pOutputQueue->SampleList) >= pOutputQueue->lBatchSize) + if (!pOutputQueue->bBatchExact || list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize) SetEvent(pOutputQueue->hProcessQueue); LeaveCriticalSection(&pOutputQueue->csQueue); } @@ -190,7 +181,7 @@ VOID WINAPI OutputQueue_SendAnyway(OutputQueue *pOutputQueue) if (pOutputQueue->hThread) { EnterCriticalSection(&pOutputQueue->csQueue); - if (!list_empty(pOutputQueue->SampleList)) + if (!list_empty(&pOutputQueue->SampleList)) { pOutputQueue->bSendAnyway = TRUE; SetEvent(pOutputQueue->hProcessQueue); @@ -213,7 +204,7 @@ VOID WINAPI OutputQueue_EOS(OutputQueue *pOutputQueue) } qev->type = EOS_PACKET; qev->pSample = NULL; - list_add_tail(pOutputQueue->SampleList, &qev->entry); + list_add_tail(&pOutputQueue->SampleList, &qev->entry); } else { @@ -235,14 +226,14 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) do { EnterCriticalSection(&pOutputQueue->csQueue); - if (!list_empty(pOutputQueue->SampleList) && + if (!list_empty(&pOutputQueue->SampleList) && (!pOutputQueue->bBatchExact || - list_count(pOutputQueue->SampleList) >= pOutputQueue->lBatchSize || + list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize || pOutputQueue->bSendAnyway ) ) { - while (!list_empty(pOutputQueue->SampleList)) + while (!list_empty(&pOutputQueue->SampleList)) { IMediaSample **ppSamples; LONG nSamples; @@ -251,10 +242,10 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) int i = 0; /* First Pass Process Samples */ - i = list_count(pOutputQueue->SampleList); + i = list_count(&pOutputQueue->SampleList); ppSamples = HeapAlloc(GetProcessHeap(),0,sizeof(IMediaSample*) * i); nSamples = 0; - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); if (qev->type == SAMPLE_PACKET) @@ -278,7 +269,7 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) HeapFree(GetProcessHeap(),0,ppSamples); /* Process Non-Samples */ - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); if (qev->type == EOS_PACKET) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 841359d445e..abe92aea869 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wine/list.h" + HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc); void WINAPI FreeMediaType(AM_MEDIA_TYPE * pMediaType); AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const * pSrc); @@ -351,7 +353,7 @@ typedef struct tagOutputQueue { BOOL bTerminate; BOOL bSendAnyway; - struct list *SampleList; + struct list SampleList; const struct OutputQueueFuncTable* pFuncsTable; } OutputQueue;