AJA NTV2 SDK  18.0.0.2717
NTV2 SDK 18.0.0.2717
outputq.h
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // File: OutputQ.h
3 //
4 // Desc: DirectShow base classes - defines the COutputQueue class, which
5 // makes a queue of samples and sends them to an output pin. The
6 // class will optionally send the samples to the pin directly.
7 //
8 // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
9 //------------------------------------------------------------------------------
10 
11 
13 
14 class COutputQueue : public CCritSec
15 {
16 public:
17  // Constructor
18  COutputQueue(IPin *pInputPin, // Pin to send stuff to
19  __inout HRESULT *phr, // 'Return code'
20  BOOL bAuto = TRUE, // Ask pin if blocks
21  BOOL bQueue = TRUE, // Send through queue (ignored if
22  // bAuto set)
23  LONG lBatchSize = 1, // Batch
24  BOOL bBatchExact = FALSE,// Batch exactly to BatchSize
25  LONG lListSize = // Likely number in the list
27  DWORD dwPriority = // Priority of thread to create
28  THREAD_PRIORITY_NORMAL,
29  bool bFlushingOpt = false // flushing optimization
30  );
31  ~COutputQueue();
32 
33  // enter flush state - discard all data
34  void BeginFlush(); // Begin flushing samples
35 
36  // re-enable receives (pass this downstream)
37  void EndFlush(); // Complete flush of samples - downstream
38  // pin guaranteed not to block at this stage
39 
40  void EOS(); // Call this on End of stream
41 
42  void SendAnyway(); // Send batched samples anyway (if bBatchExact set)
43 
44  void NewSegment(
45  REFERENCE_TIME tStart,
46  REFERENCE_TIME tStop,
47  double dRate);
48 
49  HRESULT Receive(IMediaSample *pSample);
50 
51  // do something with these media samples
52  HRESULT ReceiveMultiple (
53  __in_ecount(nSamples) IMediaSample **pSamples,
54  long nSamples,
55  __out long *nSamplesProcessed);
56 
57  void Reset(); // Reset m_hr ready for more data
58 
59  // See if its idle or not
60  BOOL IsIdle();
61 
62  // give the class an event to fire after everything removed from the queue
63  void SetPopEvent(HANDLE hEvent);
64 
65 protected:
66  static DWORD WINAPI InitialThreadProc(__in LPVOID pv);
67  DWORD ThreadProc();
68  BOOL IsQueued()
69  {
70  return m_List != NULL;
71  };
72 
73  // The critical section MUST be held when this is called
74  void QueueSample(IMediaSample *pSample);
75 
76  BOOL IsSpecialSample(IMediaSample *pSample)
77  {
78  return (DWORD_PTR)pSample > (DWORD_PTR)(LONG_PTR)(-16);
79  };
80 
81  // Remove and Release() batched and queued samples
82  void FreeSamples();
83 
84  // Notify the thread there is something to do
85  void NotifyThread();
86 
87 
88 protected:
89  // Queue 'messages'
90  #define SEND_PACKET ((IMediaSample *)(LONG_PTR)(-2)) // Send batch
91  #define EOS_PACKET ((IMediaSample *)(LONG_PTR)(-3)) // End of stream
92  #define RESET_PACKET ((IMediaSample *)(LONG_PTR)(-4)) // Reset m_hr
93  #define NEW_SEGMENT ((IMediaSample *)(LONG_PTR)(-5)) // send NewSegment
94 
95  // new segment packet is always followed by one of these
97  REFERENCE_TIME tStart;
98  REFERENCE_TIME tStop;
99  double dRate;
100  };
101 
102  // Remember input stuff
103  IPin * const m_pPin;
104  IMemInputPin * m_pInputPin;
105  BOOL const m_bBatchExact;
106  LONG const m_lBatchSize;
107 
112  __field_ecount_opt(m_lBatchSize) IMediaSample ** m_ppSamples;
113  __range(0, m_lBatchSize) LONG m_nBatched;
114 
115  // Wait optimization
117  // Flush synchronization
119 
120  // flushing optimization. some downstream filters have trouble
121  // with the queue's flushing optimization. other rely on it
124 
125  // Terminate now
127 
128  // Send anyway flag for batching
130 
131  // Deferred 'return code'
132  HRESULT volatile m_hr;
133 
134  // an event that can be fired after every deliver
136 };
137 
COutputQueue::BeginFlush
void BeginFlush()
Definition: outputq.cpp:463
COutputQueue::IsIdle
BOOL IsIdle()
Definition: outputq.cpp:775
COutputQueue::m_hr
HRESULT volatile m_hr
Definition: outputq.h:132
HANDLE
short HANDLE
Definition: ajatypes.h:338
CGenericList< IMediaSample >
COutputQueue::ThreadProc
DWORD ThreadProc()
Definition: outputq.cpp:203
NULL
#define NULL
Definition: ntv2caption608types.h:19
COutputQueue::m_List
CSampleList * m_List
Definition: outputq.h:108
COutputQueue::Receive
HRESULT Receive(IMediaSample *pSample)
Definition: outputq.cpp:576
COutputQueue::m_bSendAnyway
BOOL m_bSendAnyway
Definition: outputq.h:129
COutputQueue::Reset
void Reset()
Definition: outputq.cpp:701
COutputQueue::EndFlush
void EndFlush()
Definition: outputq.cpp:516
CSampleList
CGenericList< IMediaSample > CSampleList
Definition: outputq.h:12
COutputQueue::NewSegmentPacket::tStart
REFERENCE_TIME tStart
Definition: outputq.h:97
COutputQueue::m_pInputPin
IMemInputPin * m_pInputPin
Definition: outputq.h:104
COutputQueue::m_bBatchExact
const BOOL m_bBatchExact
Definition: outputq.h:105
COutputQueue::NewSegment
void NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
Definition: outputq.cpp:393
COutputQueue::m_bFlushingOpt
bool m_bFlushingOpt
Definition: outputq.h:123
COutputQueue::NotifyThread
void NotifyThread()
Definition: outputq.cpp:759
COutputQueue::m_hThread
HANDLE m_hThread
Definition: outputq.h:111
COutputQueue::SendAnyway
void SendAnyway()
Definition: outputq.cpp:374
COutputQueue::m_pPin
IPin *const m_pPin
Definition: outputq.h:103
COutputQueue::m_lBatchSize
const LONG m_lBatchSize
Definition: outputq.h:106
COutputQueue::InitialThreadProc
static DWORD WINAPI InitialThreadProc(__in LPVOID pv)
Definition: outputq.cpp:182
CCritSec
Definition: wxutil.h:18
CAMEvent
Definition: wxutil.h:108
DEFAULTCACHE
const int DEFAULTCACHE
Definition: wxlist.h:57
COutputQueue::ReceiveMultiple
HRESULT ReceiveMultiple(__in_ecount(nSamples) IMediaSample **pSamples, long nSamples, __out long *nSamplesProcessed)
Definition: outputq.cpp:594
COutputQueue::FreeSamples
void FreeSamples()
Definition: outputq.cpp:716
COutputQueue::IsSpecialSample
BOOL IsSpecialSample(IMediaSample *pSample)
Definition: outputq.h:76
COutputQueue::__field_ecount_opt
__field_ecount_opt(m_lBatchSize) IMediaSample **m_ppSamples
COutputQueue::m_bTerminate
BOOL m_bTerminate
Definition: outputq.h:126
COutputQueue::m_lWaiting
LONG m_lWaiting
Definition: outputq.h:116
COutputQueue::COutputQueue
COutputQueue(IPin *pInputPin, __inout HRESULT *phr, BOOL bAuto=TRUE, BOOL bQueue=TRUE, LONG lBatchSize=1, BOOL bBatchExact=FALSE, LONG lListSize=DEFAULTCACHE, DWORD dwPriority=THREAD_PRIORITY_NORMAL, bool bFlushingOpt=false)
Definition: outputq.cpp:43
COutputQueue::m_bFlushing
BOOL m_bFlushing
Definition: outputq.h:118
COutputQueue::EOS
void EOS()
Definition: outputq.cpp:436
COutputQueue::m_bFlushed
BOOL m_bFlushed
Definition: outputq.h:122
COutputQueue::IsQueued
BOOL IsQueued()
Definition: outputq.h:68
COutputQueue::QueueSample
void QueueSample(IMediaSample *pSample)
Definition: outputq.cpp:558
COutputQueue::m_hSem
HANDLE m_hSem
Definition: outputq.h:109
pv
__in REFIID __deref_out void ** pv
Definition: dllentry.cpp:194
COutputQueue::NewSegmentPacket::tStop
REFERENCE_TIME tStop
Definition: outputq.h:98
COutputQueue::m_hEventPop
HANDLE m_hEventPop
Definition: outputq.h:135
COutputQueue::__range
__range(0, m_lBatchSize) LONG m_nBatched
COutputQueue
Definition: outputq.h:14
COutputQueue::~COutputQueue
~COutputQueue()
Definition: outputq.cpp:149
COutputQueue::NewSegmentPacket::dRate
double dRate
Definition: outputq.h:99
COutputQueue::m_evFlushComplete
CAMEvent m_evFlushComplete
Definition: outputq.h:110
COutputQueue::SetPopEvent
void SetPopEvent(HANDLE hEvent)
Definition: outputq.cpp:798
COutputQueue::NewSegmentPacket
Definition: outputq.h:96