outputq.h
资源名称:p2p_vod.rar [点击查看]
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:5k
源码类别:
P2P编程
开发平台:
Visual C++
- //------------------------------------------------------------------------------
- // 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) 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;
- };