ReactOS 0.4.15-dev-7889-g76290a6
outputqueue.c File Reference
#include "dshow.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wine/list.h"
#include "wine/strmbase.h"
#include "uuids.h"
#include "vfwmsgs.h"
#include <assert.h>
Include dependency graph for outputqueue.c:

Go to the source code of this file.

Classes

struct  tagQueuedEvent
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct tagQueuedEvent QueuedEvent
 

Enumerations

enum  { SAMPLE_PACKET , EOS_PACKET }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (strmbase)
 
static DWORD WINAPI OutputQueue_InitialThreadProc (LPVOID data)
 
static void OutputQueue_FreeSamples (OutputQueue *pOutputQueue)
 
HRESULT WINAPI OutputQueue_Construct (BaseOutputPin *pInputPin, BOOL bAuto, BOOL bQueue, LONG lBatchSize, BOOL bBatchExact, DWORD dwPriority, const OutputQueueFuncTable *pFuncsTable, OutputQueue **ppOutputQueue)
 
HRESULT WINAPI OutputQueue_Destroy (OutputQueue *pOutputQueue)
 
HRESULT WINAPI OutputQueue_ReceiveMultiple (OutputQueue *pOutputQueue, IMediaSample **ppSamples, LONG nSamples, LONG *nSamplesProcessed)
 
HRESULT WINAPI OutputQueue_Receive (OutputQueue *pOutputQueue, IMediaSample *pSample)
 
VOID WINAPI OutputQueue_SendAnyway (OutputQueue *pOutputQueue)
 
VOID WINAPI OutputQueue_EOS (OutputQueue *pOutputQueue)
 
DWORD WINAPI OutputQueueImpl_ThreadProc (OutputQueue *pOutputQueue)
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file outputqueue.c.

Typedef Documentation

◆ QueuedEvent

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
SAMPLE_PACKET 
EOS_PACKET 

Definition at line 34 of file outputqueue.c.

@ EOS_PACKET
Definition: outputqueue.c:34
@ SAMPLE_PACKET
Definition: outputqueue.c:34

Function Documentation

◆ OutputQueue_Construct()

HRESULT WINAPI OutputQueue_Construct ( BaseOutputPin pInputPin,
BOOL  bAuto,
BOOL  bQueue,
LONG  lBatchSize,
BOOL  bBatchExact,
DWORD  dwPriority,
const OutputQueueFuncTable pFuncsTable,
OutputQueue **  ppOutputQueue 
)

Definition at line 60 of file outputqueue.c.

70{
71 BOOL threaded = FALSE;
72 DWORD tid;
73
75
76 if (!pInputPin || !pFuncsTable || !ppOutputQueue)
77 return E_INVALIDARG;
78
79 *ppOutputQueue = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(OutputQueue));
80 if (!*ppOutputQueue)
81 return E_OUTOFMEMORY;
82
83 This = *ppOutputQueue;
84 This->pFuncsTable = pFuncsTable;
85 This->lBatchSize = lBatchSize;
86 This->bBatchExact = bBatchExact;
88 This->csQueue.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": OutputQueue.csQueue");
89 list_init(&This->SampleList);
90
91 This->pInputPin = pInputPin;
92 IPin_AddRef(&pInputPin->pin.IPin_iface);
93
94 EnterCriticalSection(&This->csQueue);
95 if (bAuto && pInputPin->pMemInputPin)
96 threaded = IMemInputPin_ReceiveCanBlock(pInputPin->pMemInputPin) == S_OK;
97 else
98 threaded = bQueue;
99
100 if (threaded)
101 {
103 if (This->hThread)
104 {
105 SetThreadPriority(This->hThread, dwPriority);
106 This->hProcessQueue = CreateEventW(NULL, 0, 0, NULL);
107 }
108 }
109 LeaveCriticalSection(&This->csQueue);
110
111 return S_OK;
112}
static void list_init(struct list_entry *head)
Definition: list.h:51
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:700
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
static TfClientId tid
static DWORD WINAPI OutputQueue_InitialThreadProc(LPVOID data)
Definition: outputqueue.c:43
IMemInputPin * pMemInputPin
Definition: strmbase.h:67
BasePin pin
Definition: strmbase.h:66
IPin IPin_iface
Definition: strmbase.h:35
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
#define DWORD_PTR
Definition: treelist.c:76
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

◆ OutputQueue_Destroy()

HRESULT WINAPI OutputQueue_Destroy ( OutputQueue pOutputQueue)

Definition at line 114 of file outputqueue.c.

115{
116 EnterCriticalSection(&pOutputQueue->csQueue);
117 OutputQueue_FreeSamples(pOutputQueue);
118 pOutputQueue->bTerminate = TRUE;
119 SetEvent(pOutputQueue->hProcessQueue);
120 LeaveCriticalSection(&pOutputQueue->csQueue);
121
122 pOutputQueue->csQueue.DebugInfo->Spare[0] = 0;
123 DeleteCriticalSection(&pOutputQueue->csQueue);
124 CloseHandle(pOutputQueue->hProcessQueue);
125
126 IPin_Release(&pOutputQueue->pInputPin->pin.IPin_iface);
127 HeapFree(GetProcessHeap(),0,pOutputQueue);
128 return S_OK;
129}
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:739
#define HeapFree(x, y, z)
Definition: compat.h:735
static void OutputQueue_FreeSamples(OutputQueue *pOutputQueue)
Definition: outputqueue.c:49
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
Definition: winbase.h:887
PCRITICAL_SECTION_DEBUG DebugInfo
Definition: winbase.h:894
BaseOutputPin * pInputPin
Definition: strmbase.h:348
CRITICAL_SECTION csQueue
Definition: strmbase.h:346
BOOL bTerminate
Definition: strmbase.h:355
HANDLE hProcessQueue
Definition: strmbase.h:351
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ OutputQueue_EOS()

VOID WINAPI OutputQueue_EOS ( OutputQueue pOutputQueue)

Definition at line 193 of file outputqueue.c.

194{
195 EnterCriticalSection(&pOutputQueue->csQueue);
196 if (pOutputQueue->hThread)
197 {
199 if (!qev)
200 {
201 ERR("Out of Memory\n");
202 LeaveCriticalSection(&pOutputQueue->csQueue);
203 return;
204 }
205 qev->type = EOS_PACKET;
206 qev->pSample = NULL;
207 list_add_tail(&pOutputQueue->SampleList, &qev->entry);
208 }
209 else
210 {
211 IPin* ppin = NULL;
212 IPin_ConnectedTo(&pOutputQueue->pInputPin->pin.IPin_iface, &ppin);
213 if (ppin)
214 {
215 IPin_EndOfStream(ppin);
216 IPin_Release(ppin);
217 }
218 }
219 LeaveCriticalSection(&pOutputQueue->csQueue);
220 /* Covers sending the Event to the worker Thread */
221 OutputQueue_SendAnyway(pOutputQueue);
222}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define ERR(fmt,...)
Definition: debug.h:110
Definition: axcore.idl:92
VOID WINAPI OutputQueue_SendAnyway(OutputQueue *pOutputQueue)
Definition: outputqueue.c:179
struct list SampleList
Definition: strmbase.h:358
HANDLE hThread
Definition: strmbase.h:350
struct list entry
Definition: outputqueue.c:38
IMediaSample * pSample
Definition: outputqueue.c:40

◆ OutputQueue_FreeSamples()

static void OutputQueue_FreeSamples ( OutputQueue pOutputQueue)
static

Definition at line 49 of file outputqueue.c.

50{
51 struct list *cursor, *cursor2;
52 LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList)
53 {
56 HeapFree(GetProcessHeap(),0,qev);
57 }
58}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
Definition: list.h:37
const char cursor[]
Definition: icontest.c:13
uint32_t entry
Definition: isohybrid.c:63
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
Definition: list.h:192
#define LIST_ENTRY(type)
Definition: queue.h:175

Referenced by OutputQueue_Destroy().

◆ OutputQueue_InitialThreadProc()

static DWORD WINAPI OutputQueue_InitialThreadProc ( LPVOID  data)
static

Definition at line 43 of file outputqueue.c.

44{
46 return This->pFuncsTable->pfnThreadProc(This);
47}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by OutputQueue_Construct().

◆ OutputQueue_Receive()

HRESULT WINAPI OutputQueue_Receive ( OutputQueue pOutputQueue,
IMediaSample pSample 
)

Definition at line 173 of file outputqueue.c.

174{
176 return OutputQueue_ReceiveMultiple(pOutputQueue,&pSample,1,&processed);
177}
HRESULT WINAPI OutputQueue_ReceiveMultiple(OutputQueue *pOutputQueue, IMediaSample **ppSamples, LONG nSamples, LONG *nSamplesProcessed)
Definition: outputqueue.c:131
long LONG
Definition: pedump.c:60
static int processed(const type_t *type)
Definition: typegen.c:2254

◆ OutputQueue_ReceiveMultiple()

HRESULT WINAPI OutputQueue_ReceiveMultiple ( OutputQueue pOutputQueue,
IMediaSample **  ppSamples,
LONG  nSamples,
LONG nSamplesProcessed 
)

Definition at line 131 of file outputqueue.c.

132{
133 HRESULT hr = S_OK;
134 int i;
135
136 if (!pOutputQueue->pInputPin->pin.pConnectedTo || !pOutputQueue->pInputPin->pMemInputPin)
137 return VFW_E_NOT_CONNECTED;
138
139 if (!pOutputQueue->hThread)
140 {
141 IMemInputPin_AddRef(pOutputQueue->pInputPin->pMemInputPin);
142 hr = IMemInputPin_ReceiveMultiple(pOutputQueue->pInputPin->pMemInputPin,ppSamples, nSamples, nSamplesProcessed);
143 IMemInputPin_Release(pOutputQueue->pInputPin->pMemInputPin);
144 }
145 else
146 {
147 EnterCriticalSection(&pOutputQueue->csQueue);
148 *nSamplesProcessed = 0;
149
150 for (i = 0; i < nSamples; i++)
151 {
153 if (!qev)
154 {
155 ERR("Out of Memory\n");
157 break;
158 }
159 qev->type = SAMPLE_PACKET;
160 qev->pSample = ppSamples[i];
161 IMediaSample_AddRef(ppSamples[i]);
162 list_add_tail(&pOutputQueue->SampleList, &qev->entry);
163 (*nSamplesProcessed)++;
164 }
165
166 if (!pOutputQueue->bBatchExact || list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize)
167 SetEvent(pOutputQueue->hProcessQueue);
168 LeaveCriticalSection(&pOutputQueue->csQueue);
169 }
170 return hr;
171}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
__WINE_SERVER_LIST_INLINE unsigned int list_count(const struct list *list)
Definition: list.h:155
HRESULT hr
Definition: shlfolder.c:183
IPin * pConnectedTo
Definition: strmbase.h:39
LONG lBatchSize
Definition: strmbase.h:353
BOOL bBatchExact
Definition: strmbase.h:354
#define VFW_E_NOT_CONNECTED
Definition: vfwmsgs.h:48

Referenced by OutputQueue_Receive().

◆ OutputQueue_SendAnyway()

VOID WINAPI OutputQueue_SendAnyway ( OutputQueue pOutputQueue)

Definition at line 179 of file outputqueue.c.

180{
181 if (pOutputQueue->hThread)
182 {
183 EnterCriticalSection(&pOutputQueue->csQueue);
184 if (!list_empty(&pOutputQueue->SampleList))
185 {
186 pOutputQueue->bSendAnyway = TRUE;
187 SetEvent(pOutputQueue->hProcessQueue);
188 }
189 LeaveCriticalSection(&pOutputQueue->csQueue);
190 }
191}
static int list_empty(struct list_entry *head)
Definition: list.h:58
BOOL bSendAnyway
Definition: strmbase.h:356

Referenced by OutputQueue_EOS().

◆ OutputQueueImpl_ThreadProc()

DWORD WINAPI OutputQueueImpl_ThreadProc ( OutputQueue pOutputQueue)

Definition at line 224 of file outputqueue.c.

225{
226 do
227 {
228 EnterCriticalSection(&pOutputQueue->csQueue);
229 if (!list_empty(&pOutputQueue->SampleList) &&
230 (!pOutputQueue->bBatchExact ||
231 list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize ||
232 pOutputQueue->bSendAnyway
233 )
234 )
235 {
236 while (!list_empty(&pOutputQueue->SampleList))
237 {
238 IMediaSample **ppSamples;
239 LONG nSamples;
240 LONG nSamplesProcessed;
241 struct list *cursor, *cursor2;
242 int i = 0;
243
244 /* First Pass Process Samples */
245 i = list_count(&pOutputQueue->SampleList);
246 ppSamples = HeapAlloc(GetProcessHeap(),0,sizeof(IMediaSample*) * i);
247 nSamples = 0;
248 LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList)
249 {
251 if (qev->type == SAMPLE_PACKET)
252 ppSamples[nSamples++] = qev->pSample;
253 else
254 break;
256 HeapFree(GetProcessHeap(),0,qev);
257 }
258
259 if (pOutputQueue->pInputPin->pin.pConnectedTo && pOutputQueue->pInputPin->pMemInputPin)
260 {
261 IMemInputPin_AddRef(pOutputQueue->pInputPin->pMemInputPin);
262 LeaveCriticalSection(&pOutputQueue->csQueue);
263 IMemInputPin_ReceiveMultiple(pOutputQueue->pInputPin->pMemInputPin, ppSamples, nSamples, &nSamplesProcessed);
264 EnterCriticalSection(&pOutputQueue->csQueue);
265 IMemInputPin_Release(pOutputQueue->pInputPin->pMemInputPin);
266 }
267 for (i = 0; i < nSamples; i++)
268 IMediaSample_Release(ppSamples[i]);
269 HeapFree(GetProcessHeap(),0,ppSamples);
270
271 /* Process Non-Samples */
272 LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList)
273 {
275 if (qev->type == EOS_PACKET)
276 {
277 IPin* ppin = NULL;
278 IPin_ConnectedTo(&pOutputQueue->pInputPin->pin.IPin_iface, &ppin);
279 if (ppin)
280 {
281 IPin_EndOfStream(ppin);
282 IPin_Release(ppin);
283 }
284 }
285 else if (qev->type == SAMPLE_PACKET)
286 break;
287 else
288 FIXME("Unhandled Event type %i\n",qev->type);
290 HeapFree(GetProcessHeap(),0,qev);
291 }
292 }
293 pOutputQueue->bSendAnyway = FALSE;
294 }
295 LeaveCriticalSection(&pOutputQueue->csQueue);
297 }
298 while (!pOutputQueue->bTerminate);
299 return S_OK;
300}
#define FIXME(fmt,...)
Definition: debug.h:111
#define INFINITE
Definition: serial.h:102
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( strmbase  )