Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//------------------------------------------------------------------------------
// File: OutputQ.h
//
// Desc: DirectShow base classes - defines the COutputQueue class, which
// makes a queue of samples and sends them to an output pin. The
// class will optionally send the samples to the pin directly.
//
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
typedef CGenericList<IMediaSample> CSampleList;
class COutputQueue : public CCritSec { public: // Constructor
COutputQueue(IPin *pInputPin, // Pin to send stuff to
HRESULT *phr, // 'Return code'
BOOL bAuto = TRUE, // Ask pin if blocks
BOOL bQueue = TRUE, // Send through queue (ignored if
// bAuto set)
LONG lBatchSize = 1, // Batch
BOOL bBatchExact = FALSE,// Batch exactly to BatchSize
LONG lListSize = // Likely number in the list
DEFAULTCACHE, DWORD dwPriority = // Priority of thread to create
THREAD_PRIORITY_NORMAL, bool bFlushingOpt = false // flushing optimization
); ~COutputQueue();
// enter flush state - discard all data
void BeginFlush(); // Begin flushing samples
// re-enable receives (pass this downstream)
void EndFlush(); // Complete flush of samples - downstream
// pin guaranteed not to block at this stage
void EOS(); // Call this on End of stream
void SendAnyway(); // Send batched samples anyway (if bBatchExact set)
void NewSegment( REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
HRESULT Receive(IMediaSample *pSample);
// do something with these media samples
HRESULT ReceiveMultiple ( IMediaSample **pSamples, long nSamples, long *nSamplesProcessed);
void Reset(); // Reset m_hr ready for more data
// See if its idle or not
BOOL IsIdle();
// give the class an event to fire after everything removed from the queue
void SetPopEvent(HANDLE hEvent);
protected: static DWORD WINAPI InitialThreadProc(LPVOID pv); DWORD ThreadProc(); BOOL IsQueued() { return m_List != NULL; };
// The critical section MUST be held when this is called
void QueueSample(IMediaSample *pSample);
BOOL IsSpecialSample(IMediaSample *pSample) { return (DWORD_PTR)pSample > (DWORD_PTR)(LONG_PTR)(-16); };
// Remove and Release() batched and queued samples
void FreeSamples();
// Notify the thread there is something to do
void NotifyThread();
protected: // Queue 'messages'
#define SEND_PACKET ((IMediaSample *)(LONG_PTR)(-2)) // Send batch
#define EOS_PACKET ((IMediaSample *)(LONG_PTR)(-3)) // End of stream
#define RESET_PACKET ((IMediaSample *)(LONG_PTR)(-4)) // Reset m_hr
#define NEW_SEGMENT ((IMediaSample *)(LONG_PTR)(-5)) // send NewSegment
// new segment packet is always followed by one of these
struct NewSegmentPacket { REFERENCE_TIME tStart; REFERENCE_TIME tStop; double dRate; };
// Remember input stuff
IPin * const m_pPin; IMemInputPin * m_pInputPin; BOOL const m_bBatchExact; LONG const m_lBatchSize;
CSampleList * m_List; HANDLE m_hSem; CAMEvent m_evFlushComplete; HANDLE m_hThread; IMediaSample ** m_ppSamples; LONG m_nBatched;
// Wait optimization
LONG m_lWaiting; // Flush synchronization
BOOL m_bFlushing;
// flushing optimization. some downstream filters have trouble
// with the queue's flushing optimization. other rely on it
BOOL m_bFlushed; bool m_bFlushingOpt;
// Terminate now
BOOL m_bTerminate;
// Send anyway flag for batching
BOOL m_bSendAnyway;
// Deferred 'return code'
BOOL volatile m_hr;
// an event that can be fired after every deliver
HANDLE m_hEventPop; };
|