AJA NTV2 SDK  17.1.3.1410
NTV2 SDK 17.1.3.1410
ntv2ccgrabber.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2ccgrabber.h"
9 #include "ntv2captionrenderer.h"
10 #include "ntv2line21captioner.h"
15 #include "ntv2debug.h"
16 #include "ntv2transcode.h"
17 #include "ajabase/common/types.h"
18 #include "ajabase/system/memory.h"
19 #include <iostream>
20 #include <iomanip>
21 #include <utility> // std::rel_ops
22 #include <algorithm> // set_difference
23 #include <iterator> // for inserter
24 
25 using namespace std;
26 using namespace std::rel_ops;
27 
28 #define AsConstUBytePtr(__p__) reinterpret_cast<const UByte*>(__p__)
29 #define AsConstULWordPtr(__p__) reinterpret_cast<const ULWord*>(__p__)
30 #define AsULWordPtr(__p__) reinterpret_cast<ULWord*>(__p__)
31 #define AsUBytePtr(__p__) reinterpret_cast<UByte*>(__p__)
32 //#define NTV2_BUFFER_LOCK // Define this to use buffer locking in kernel driver
33 
34 static const ULWord kAppSignature NTV2_FOURCC ('C','C','G','R');
37 static const uint32_t MAX_ACCUM_FRAME_COUNT (30); // At least every second?
38 
39 
41 
42  : mConfig (inConfigData),
43  mCaptureThread (AJAThread()),
44  mDeviceID (DEVICE_ID_NOTFOUND),
45  mSavedTaskMode (NTV2_DISABLE_TASKS),
46  mAudioSystem (mConfig.fWithAudio ? NTV2_AUDIOSYSTEM_1 : NTV2_AUDIOSYSTEM_INVALID),
47  mVancMode (NTV2_VANCMODE_INVALID),
48  mGlobalQuit (false),
49  mSquares (false),
50  mLastOutStr (),
51  mLastOutFrame (0),
52  mErrorTally (0),
53  mCaptionDataTally (0),
54  m608Channel (mConfig.fCaptionChannel),
55  m608Mode (NTV2_CC608_CapModeUnknown),
56  m608Decoder (),
57  mVPIDInfoDS1 (0),
58  mVPIDInfoDS2 (0),
59  mInputFrameStores (),
60  mActiveSDIInputs (),
61  mActiveCSCs (),
62  mInputConnections (),
63  mHostBuffers (),
64  mCircularBuffer (),
65  mInputXferInfo (),
66  mHeadUpDisplayOn (true),
67  mOutputChannel (NTV2_CHANNEL_INVALID),
68  mPlayoutFBF (NTV2_FBF_ARGB),
69  mPlayoutThread (AJAThread()),
70  mOutputConnections ()
71 {
72  CNTV2CaptionDecoder608::Create(m608Decoder);
73  CNTV2CaptionDecoder708::Create(m708DecoderAnc);
74  CNTV2CaptionDecoder708::Create(m708DecoderVanc);
75  NTV2_ASSERT (m608Decoder && m708DecoderAnc && m708DecoderVanc);
76 
77 } // constructor
78 
79 
81 {
82  if (m608Decoder)
84 
85  // Stop my capture thread, then destroy it...
86  Quit();
87 
88  // Unsubscribe from input vertical event...
89  mDevice.UnsubscribeInputVerticalEvent(mInputFrameStores);
90 
92 
93  if (!mConfig.fDoMultiFormat)
94  {
95  mDevice.SetEveryFrameServices(mSavedTaskMode);
96  mDevice.ReleaseStreamForApplication (kAppSignature, static_cast<int32_t>(AJAProcess::GetPid()));
97  }
98 
99 } // destructor
100 
101 
103 {
104  // Set the 'quit' flag, and wait for the threads to go inactive...
105  mGlobalQuit = true;
106 
107  while (mCaptureThread.Active())
108  AJATime::Sleep(10);
109 
110  while (mPlayoutThread.Active())
111  AJATime::Sleep(10);
112 
113  if (!mConfig.fDoMultiFormat)
114  mDevice.ClearRouting();
115 
116 } // Quit
117 
118 
120 {
121  CNTV2DemoCommon::SetDefaultPageSize(); // Set host-specific page size
122 
123  // Open the device...
125  {cerr << "## ERROR: Device '" << mConfig.fDeviceSpec << "' not found" << endl; return AJA_STATUS_OPEN;}
126 
127  if (!mDevice.IsDeviceReady(false))
128  {cerr << "## ERROR: Device '" << mConfig.fDeviceSpec << "' not ready" << endl; return AJA_STATUS_INITIALIZE;}
129 
130  mDeviceID = mDevice.GetDeviceID(); // Keep this handy because it's used frequently
131  const string deviceStr(::NTV2DeviceIDToString(mDeviceID));
132 
133  if (mConfig.fBurnCaptions)
134  {
135  if (mDevice.features().GetNumFrameStores() < 2) // Need 2+ frame stores
136  {
137  cerr << "## ERROR: Device '" << deviceStr << "' can't burn-in captions because at least 2 frame stores are required" << endl;
138  return AJA_STATUS_FAIL;
139  }
140  if (!mDevice.features().CanDoPlayback())
141  {
142  cerr << "## ERROR: Device '" << deviceStr << "' can't burn-in captions because device can only capture/ingest" << endl;
143  return AJA_STATUS_FAIL;
144  }
145  if (mDevice.features().GetNumVideoInputs() < 1 || mDevice.features().GetNumVideoOutputs() < 1) // Need 1 input & 1 output
146  {
147  cerr << "## ERROR: Device '" << deviceStr << "' can't be used -- at least 1 SDI input and 1 SDI output required" << endl;
148  return AJA_STATUS_FAIL;
149  }
150  if (!mDevice.features().GetNumMixers()) // Need 1 or more mixers
151  {
152  cerr << "## ERROR: Device '" << deviceStr << "' can't burn-in captions because a mixer/keyer widget is required" << endl;
153  return AJA_STATUS_FAIL;
154  }
155  if (!mDevice.features().CanDoFrameBufferFormat(mPlayoutFBF)) // FrameStore must handle 8-bit RGB with alpha
156  {
157  cerr << "## ERROR: Device '" << deviceStr << "' can't burn-in captions because it can't do 8-bit RGB (with alpha)" << endl;
158  return AJA_STATUS_FAIL;
159  }
160  } // if --burn
161 
162  if (!mConfig.fDoMultiFormat)
163  {
164  if (!mDevice.AcquireStreamForApplication (kAppSignature, static_cast<int32_t>(AJAProcess::GetPid())))
165  {cerr << "## ERROR: Cannot acquire -- device busy" << endl; return AJA_STATUS_BUSY;} // Some other app owns the device
166  mDevice.GetEveryFrameServices(mSavedTaskMode); // Save the current task mode
167  }
168 
169  mDevice.SetEveryFrameServices(NTV2_OEM_TASKS); // Use the OEM service level
170 
171  if (mDevice.features().CanDoMultiFormat())
172  mDevice.SetMultiFormatMode(mConfig.fDoMultiFormat);
173 
174  if (!mConfig.fUseVanc && !mDevice.features().CanDoCustomAnc()) // --vanc not specified && no anc extractors?
175  {
176  cerr << "## WARNING: Enabling VANC because no Anc extractors" << endl;
177  mConfig.fUseVanc = true;
178  }
179 
180  // Set up the input video...
181  AJAStatus status = SetupInputVideo();
182  if (AJA_FAILURE(status))
183  return status;
184 
185  // Set up the audio...
186  status = SetupAudio();
187  if (AJA_FAILURE(status))
188  return status;
189 
190  if (!m608Decoder->SubscribeChangeNotification(Caption608ChangedStatic, this))
191  {cerr << "## WARNING: SubscribeChangeNotification failed" << endl; return AJA_STATUS_FAIL;}
192  #if defined(_DEBUG)
193  cerr << mConfig << endl;
194  #endif // defined(_DEBUG)
195  return AJA_STATUS_SUCCESS;
196 
197 } // Init
198 
199 
201 {
203  mDevice.GetVANCMode (vancMode, mConfig.fInputChannel);
204  const ULWord captureBufferSize (::GetVideoWriteSize (inVideoFormat, mConfig.fPixelFormat, vancMode));
205 
207  mCircularBuffer.SetAbortFlag (&mGlobalQuit);
208 
209  // Allocate and add each NTV2FrameData to my circular buffer member variable...
210  mHostBuffers.reserve(CIRCULAR_BUFFER_SIZE);
211  while (mHostBuffers.size() < CIRCULAR_BUFFER_SIZE)
212  {
213  mHostBuffers.push_back(NTV2FrameData()); // Make a new NTV2FrameData...
214  NTV2FrameData & frameData(mHostBuffers.back()); // ...and get a reference to it
215  // Allocate a page-aligned video buffer
216  if (!frameData.fVideoBuffer.Allocate(captureBufferSize, /*pageAlign?*/true))
217  return AJA_STATUS_MEMORY;
218  if (NTV2_IS_VALID_AUDIO_SYSTEM(mAudioSystem))
219  if (!frameData.fAudioBuffer.Allocate(NTV2_AUDIOSIZE_MAX, /*pageAlign?*/true))
220  return AJA_STATUS_MEMORY;
221  // Anc data buffers --- only used if Anc extractors supported...
222  if (mDevice.features().CanDoCustomAnc())
223  {
224  if (!frameData.fAncBuffer.Allocate(NTV2_ANCSIZE_MAX, /*pageAlign?*/true))
225  return AJA_STATUS_MEMORY;
226  if (!frameData.fAncBuffer2.Allocate(NTV2_ANCSIZE_MAX, /*pageAlign?*/true))
227  return AJA_STATUS_MEMORY;
228  }
229  #if defined(NTV2_BUFFER_LOCK)
230  frameData.LockAll(mDevice);
231  #endif
232  mCircularBuffer.Add(&frameData); // Add to my circular buffer
233  } // for each NTV2FrameData
234 
235  return AJA_STATUS_SUCCESS;
236 
237 } // SetupHostBuffers
238 
239 
241 {
242  // Unlock each in-host NTV2FrameData...
243  #if defined(NTV2_BUFFER_LOCK)
244  for (size_t ndx(0); ndx < mHostBuffers.size(); ndx++)
245  {
246  NTV2FrameData & frameData(mHostBuffers.at(ndx));
247  frameData.UnlockAll(mDevice);
248  }
249  #endif // NTV2_BUFFER_LOCK
250  mHostBuffers.clear();
251  mCircularBuffer.Clear();
252  return;
253 
254 } // ReleaseHostBuffers
255 
256 
258 {
259  bool isTransmit (false);
260  const UWord numFrameStores (mDevice.features().GetNumFrameStores());
261  const NTV2DeviceID deviceID (mDevice.GetDeviceID());
262  const string deviceName (::NTV2DeviceIDToString(deviceID));
263  const string channelName (::NTV2ChannelToString(mConfig.fInputChannel, true));
264 
265  // CCGrabber is SDI only
266  // User must have specified at least --input or --channel
268  {cerr << "## ERROR: Must specify at least input source or input channel" << endl; return AJA_STATUS_FAIL;}
269  else if (!NTV2_IS_VALID_INPUT_SOURCE(mConfig.fInputSource))
271  else if (!NTV2_IS_VALID_CHANNEL(mConfig.fInputChannel))
273 
274  // Check input source
275  const string inputName (::NTV2InputSourceToString(mConfig.fInputSource,true));
276  if (!mDevice.features().CanDoInputSource(mConfig.fInputSource))
277  {cerr << "## ERROR: '" << deviceName << "' cannot grab captions from '" << inputName << "'" << endl; return AJA_STATUS_FAIL;}
279  {cerr << "## ERROR: Input '" << inputName << "' not SDI" << endl; return AJA_STATUS_FAIL;}
280 
281  // Check channel
282  if (numFrameStores < UWord(mConfig.fInputChannel+1))
283  {cerr << "## ERROR: " << deviceName << " has no " << channelName << " input" << endl; return AJA_STATUS_FAIL;}
284 
285  const NTV2Channel sdiInput(::NTV2InputSourceToChannel(mConfig.fInputSource));
286  mActiveSDIInputs.insert(sdiInput);
287  if (mDevice.features().HasBiDirectionalSDI()) // If device has bidirectional SDI connectors...
288  if (mDevice.GetSDITransmitEnable(sdiInput, isTransmit)) // ...and GetSDITransmitEnable succeeds...
289  if (isTransmit) // ...and input is set to "transmit"...
290  {
291  mDevice.SetSDITransmitEnable(sdiInput, false); // ...then disable transmit mode...
292  mDevice.WaitForOutputVerticalInterrupt(NTV2_CHANNEL1, 12); // ...and give the device some time to lock to a signal
293  } // if input SDI connector needs to switch from transmit mode
294 
296  mDevice.GetReference(refSrc);
297  if (mConfig.fBurnCaptions || (!mConfig.fBurnCaptions && !mConfig.fDoMultiFormat))
298  {
299  // Set the device output clock reference to the SDI input.
300  // This is necessary only when...
301  // - Doing caption burn-in, which requires syncing the Mixer input to the SDI input;
302  // - Routing E-E, which is only done when not doing burn-in and not doing multi-format mode.
304  mDevice.SetReference(refSrc);
305  }
306  if (mConfig.fBurnCaptions) // Caption burn-in/playout requires choosing an output channel
307  switch (mConfig.fInputChannel)
308  {
309  case NTV2_CHANNEL1: mOutputChannel = (numFrameStores == 2 || numFrameStores > 4) ? NTV2_CHANNEL2 : NTV2_CHANNEL3; break;
310  case NTV2_CHANNEL2: mOutputChannel = (numFrameStores > 4) ? NTV2_CHANNEL3 : NTV2_CHANNEL4; break;
311  case NTV2_CHANNEL3: mOutputChannel = NTV2_CHANNEL4; break;
312  case NTV2_CHANNEL4: mOutputChannel = (numFrameStores > 4) ? NTV2_CHANNEL5 : NTV2_CHANNEL3; break;
313  case NTV2_CHANNEL5: mOutputChannel = NTV2_CHANNEL6; break;
314  case NTV2_CHANNEL6: mOutputChannel = NTV2_CHANNEL7; break;
315  case NTV2_CHANNEL7: mOutputChannel = NTV2_CHANNEL8; break;
316  case NTV2_CHANNEL8: mOutputChannel = NTV2_CHANNEL7; break;
318  }
319 
320  if (!mDevice.features().CanDoFrameBufferFormat(mConfig.fPixelFormat))
321  {cerr << "## ERROR: '" << deviceName << "' doesn't support '" << ::NTV2FrameBufferFormatToString(mConfig.fPixelFormat) << "'" << endl; return AJA_STATUS_FAIL;}
322 
323  // "Tune" the 608 decoder to the desired channel...
324  m608Decoder->SetDisplayChannel(m608Channel);
325  m708DecoderAnc->SetDisplayChannel(m608Channel);
326  m708DecoderVanc->SetDisplayChannel(m608Channel);
327 
328  cerr << "## NOTE: Using " << deviceName << " " << (mConfig.fUseVanc ? "VANC" : "AncExt") << " with spigot=" << inputName
329  << ", ref=" << ::NTV2ReferenceSourceToString(refSrc,true) << ", input=" << channelName;
330  if (mConfig.fBurnCaptions) cerr << ", output=" << ::NTV2ChannelToString(mOutputChannel,true);
331  cerr << endl;
332 
333  return AJA_STATUS_SUCCESS;
334 
335 } // SetupInputVideo
336 
337 
339 {
340  if (NTV2_IS_VALID_AUDIO_SYSTEM(mAudioSystem))
341  {
342  const UWord numAudioSystems (mDevice.features().GetNumAudioSystems());
343  if (numAudioSystems > 1 && UWord(mConfig.fInputChannel) < numAudioSystems)
344  mAudioSystem = ::NTV2ChannelToAudioSystem(mConfig.fInputChannel);
345 
346  // Configure the audio system...
348  mDevice.SetNumberAudioChannels (mDevice.features().GetMaxAudioChannels(), mAudioSystem);
349  mDevice.SetAudioRate (NTV2_AUDIO_48K, mAudioSystem);
350  mDevice.SetAudioBufferSize (NTV2_AUDIO_BUFFER_BIG, mAudioSystem);
351 
352  // Set up the output audio embedders...
353  if (mConfig.fBurnCaptions && numAudioSystems > 1)
354  {
355  if (mConfig.fDoMultiFormat)
356  {
357  UWord sdiOutput(mOutputChannel);
358  if (sdiOutput >= mDevice.features().GetNumVideoOutputs()) // Kona1 has 2 FrameStores/Channels, but only 1 SDI output
359  sdiOutput = mDevice.features().GetNumVideoOutputs() - 1;
360  mDevice.SetSDIOutputAudioSystem(NTV2Channel(sdiOutput), mAudioSystem);
361  }
362  else // Have all device outputs use the same audio system...
363  for (unsigned sdiOutput(0); sdiOutput < mDevice.features().GetNumVideoOutputs(); sdiOutput++)
364  if (!mDevice.features().HasBiDirectionalSDI()
365  || NTV2Channel(sdiOutput) != ::NTV2InputSourceToChannel(mConfig.fInputSource))
366  mDevice.SetSDIOutputAudioSystem(NTV2Channel(sdiOutput), mAudioSystem);
367  }
368 
369  // Loopback mode (E-E audio) should be enabled only when not burning-in captions (i.e. when routing E-E).
370  // If caption burn-in and loopback are enabled, output video will lag the audio, as video frames are delayed
371  // in the ring buffer.
373  }
374  return AJA_STATUS_SUCCESS;
375 
376 } // SetupAudio
377 
378 
381 
384 
387 
388 
390 {
391  const bool isRGBFBF (::IsRGBFormat(mConfig.fPixelFormat));
392  const bool isRGBWire (mVPIDInfoDS1.IsRGBSampling());
393  const bool isSquares (!mVPIDInfoDS1.IsStandardTwoSampleInterleave());
394  const bool is4KHFR (NTV2_IS_HFR_STANDARD(::GetNTV2StandardFromVideoFormat(inVideoFormat)));
395  const NTV2Channel sdiInput (::NTV2InputSourceToChannel(mConfig.fInputSource));
396  const NTV2ChannelList frameStores (::NTV2MakeChannelList(mInputFrameStores));
397  NTV2ChannelList sdiInputs (::NTV2MakeChannelList(mActiveSDIInputs));
398  const NTV2ChannelList activeCSCs (::NTV2MakeChannelList(mActiveCSCs));
399  static const bool ShowRoutingProgress(false);
400 
401  mInputConnections.clear();
402  if (ShowRoutingProgress) mDevice.ClearRouting();
403 
404  // Route frameStore's input to sdiInput's output (possibly through CSC, if required)
405  if (isRGBFBF && isRGBWire)
406  {
407  if (isSquares) // SDIIn ==> DLIn ==> FrameStore
408  {
409  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
410  { NTV2Channel frmSt(frameStores.at(ndx)), sdiIn(sdiInputs.at(ndx));
411  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdiIn, /*linkB?*/false),
412  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/false)));
413  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdiIn, /*linkB?*/true),
414  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/true)));
415  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(sdiIn),
416  ::GetDLInOutputXptFromChannel(frmSt)));
417  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
418  }
419  }
420  else // TSI // 2x SDIIn ==> 2x DLIn ==> 425MUX ==> RGBFrameStore
421  {
422  NTV2ChannelSet sdiIns = ::NTV2MakeChannelSet(sdiInput, UWord(2*frameStores.size()));
423  sdiInputs = ::NTV2MakeChannelList(sdiIns);
424  NTV2ChannelList tsiMuxes = CNTV2DemoCommon::GetTSIMuxesForFrameStore(mDevice, frameStores.at(0),
425  UWord(frameStores.size()*2));
426  mDevice.SetSDITransmitEnable(sdiIns, true); // Gotta do this again, since sdiInputs changed
427  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
428  { NTV2Channel frmSt(frameStores.at(ndx/2)), tsiMux(tsiMuxes.at(ndx/2)), sdiIn(sdiInputs.at(ndx));
429  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdiIn, /*DS2?*/false),
430  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/false)));
431  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdiIn, /*DS2?*/true),
432  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/true)));
433  mInputConnections.insert(NTV2XptConnection(::GetTSIMuxInputXptFromChannel(tsiMux, /*lnkB?*/ndx & 1),
434  ::GetDLInOutputXptFromChannel(sdiIn)));
435  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*lnkB?*/false),
436  ::GetTSIMuxOutputXptFromChannel(tsiMux,/*lnkB?*/false, /*rgb?*/true)));
437  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*lnkB?*/true),
438  ::GetTSIMuxOutputXptFromChannel(tsiMux,/*lnkB?*/true, /*rgb?*/true)));
439  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
440  }
441  }
442  }
443  else if (isRGBFBF && !isRGBWire)
444  {
445  if (isSquares) // SDIIn ==> CSC ==> RGBFrameStore
446  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
447  { NTV2Channel frmSt(frameStores.at(ndx)), sdiIn(sdiInputs.at(ndx));
448  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt),
449  ::GetCSCOutputXptFromChannel(frmSt, /*key?*/false, /*RGB?*/true)));
450  mInputConnections.insert(NTV2XptConnection(::GetCSCInputXptFromChannel(frmSt),
452  }
453  else // TSI // SDIIn ==> 2 x CSC ==> 425MUX ==> RGBFrameStore
454  {
455  NTV2ChannelSet sdiIns = ::NTV2MakeChannelSet(sdiInput, UWord(frameStores.size()));
456  sdiInputs = ::NTV2MakeChannelList(sdiIns);
458  UWord(2*sdiInputs.size()));
459  NTV2ChannelList tsiMuxes = CNTV2DemoCommon::GetTSIMuxesForFrameStore(mDevice, frameStores.at(0),
460  UWord(frameStores.size()));
461  cerr << "FrameStores: " << ::NTV2ChannelListToStr(frameStores) << endl
462  << "SDIInputs: " << ::NTV2ChannelListToStr(sdiInputs) << endl
463  << "TSIMuxers: " << ::NTV2ChannelListToStr(tsiMuxes) << endl;
464  mDevice.SetSDITransmitEnable(sdiIns, false); // Gotta do this again, since sdiIns changed
465  for (size_t ndx(0); ndx < cscs.size(); ndx++)
466  { NTV2Channel frmSt(frameStores.at(ndx/2)), sdiIn(sdiInputs.at(ndx/2)), tsiMux(tsiMuxes.at(ndx/2)),
467  csc(cscs.at(ndx));
468  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*inputB?*/ndx & 1),
469  ::GetTSIMuxOutputXptFromChannel(tsiMux,/*linkB?*/ndx & 1,/*rgb?*/true)));
470  mInputConnections.insert(NTV2XptConnection(::GetTSIMuxInputXptFromChannel(tsiMux, /*linkB?*/ndx & 1),
471  ::GetCSCOutputXptFromChannel(csc, /*key?*/false, /*rgb?*/true)));
472  mInputConnections.insert(NTV2XptConnection(::GetCSCInputXptFromChannel(csc),
473  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/ndx & 1)));
474  }
475  }
476  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
477  }
478  else if (!isRGBFBF && isRGBWire)
479  {
480  if (isSquares) // SDIIn ==> DLIn ==> CSC ==> FrameStore
481  {
482  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
483  { NTV2Channel frmSt(frameStores.at(ndx)), csc(activeCSCs.at(ndx)), sdi(sdiInputs.at(ndx));
484  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*BInput?*/false),
486  mInputConnections.insert(NTV2XptConnection(::GetCSCInputXptFromChannel(csc),
488  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdi, /*lnkB?*/false),
489  ::GetSDIInputOutputXptFromChannel(sdi, /*DS2?*/false)));
490  mInputConnections.insert(NTV2XptConnection(::GetDLInInputXptFromChannel(sdi, /*lnkB?*/true),
491  ::GetSDIInputOutputXptFromChannel(sdi, /*DS2?*/true)));
492  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
493  }
494  }
495  else // TSI // SDIIn ==> DLIn ==> CSC ==> TSIMux ==> FrameStore
496  {
497  //TBD
498  }
499  }
500  else // SDIIn ==> YUVFrameStore
501  {
502  if (isSquares) // SDIIn ==> FrameStore
503  {
504  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
505  { NTV2Channel frmSt(frameStores.at(ndx)), sdiIn(sdiInputs.at(ndx));
506  mInputConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt),
508  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
509  }
510  }
511  else // TSI // SDIIn (LFR: 2 x DS1&DS2, 4KHFR: 4 x DS1) ==> 425MUX ==> YUVFrameStore
512  {
513  NTV2XptConnections & mConnections(mInputConnections);
514  sdiInputs = ::NTV2MakeChannelList(sdiInputs.at(0), is4KHFR ? 4 : UWord(frameStores.size()));
515  NTV2ChannelList tsiMuxes = CNTV2DemoCommon::GetTSIMuxesForFrameStore(mDevice, frameStores.at(0),
516  UWord(frameStores.size()));
517  cerr << (is4KHFR ? "4KHFR" : "") << endl << "FrameStores: " << ::NTV2ChannelListToStr(frameStores) << endl
518  << "SDIInputs: " << ::NTV2ChannelListToStr(sdiInputs) << endl << "TSIMuxes: " << ::NTV2ChannelListToStr(tsiMuxes) << endl;
519  for (size_t ndx(0); ndx < sdiInputs.size(); ndx++)
520  { NTV2Channel frmSt(frameStores.at(is4KHFR ? ndx/2 : ndx)),
521  tsiMux(tsiMuxes.at(is4KHFR ? ndx/2 : ndx)),
522  sdiIn(sdiInputs.at(ndx));
523  mConnections.insert(NTV2XptConnection(::GetTSIMuxInputXptFromChannel(tsiMux, /*linkB?*/is4KHFR && (ndx & 1)),
524  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/false)));
525  if (!is4KHFR)
526  mConnections.insert(NTV2XptConnection(::GetTSIMuxInputXptFromChannel(tsiMux, /*linkB?*/true),
527  ::GetSDIInputOutputXptFromChannel(sdiIn, /*DS2?*/true)));
528  mConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*inputB?*/is4KHFR && (ndx & 1)),
529  ::GetTSIMuxOutputXptFromChannel(tsiMux,/*linkB?*/is4KHFR && (ndx & 1))));
530  if (!is4KHFR)
531  mConnections.insert(NTV2XptConnection(::GetFrameBufferInputXptFromChannel(frmSt, /*inputB?*/true),
532  ::GetTSIMuxOutputXptFromChannel(tsiMux,/*linkB?*/true)));
533  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
534  }
535  }
536  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
537  }
538  // At this point, sdiInputs is authoritative, so update mActiveSDIInputs...
539  mActiveSDIInputs = ::NTV2MakeChannelSet(sdiInputs);
540 
541  // E-E ROUTING
542  if ((false) /* not ready for prime-time */ && !mConfig.fBurnCaptions && !mConfig.fDoMultiFormat)
543  { // Not doing caption burn-in: route E-E pass-thru...
544  NTV2ChannelList sdiOutputs;
545  if (mDevice.features().HasBiDirectionalSDI())
546  {
547  const NTV2ChannelSet allSDIs (::NTV2MakeChannelSet(NTV2_CHANNEL1, mDevice.features().GetNumVideoOutputs()));
548  NTV2ChannelSet sdiOuts;
549  set_difference (allSDIs.begin(), allSDIs.end(), // allSDIs
550  mActiveSDIInputs.begin(), mActiveSDIInputs.end(), // - mActiveSDIInputs
551  inserter(sdiOuts, sdiOuts.begin())); // ==> sdiOuts
552  sdiOutputs = ::NTV2MakeChannelList(sdiOuts);
553  cerr << "allSDIs: " << ::NTV2ChannelSetToStr(allSDIs) << endl << "actSDIIns: " << ::NTV2ChannelSetToStr(mActiveSDIInputs) << endl; // DEBUG
554  }
555  else
556  sdiOutputs = ::NTV2MakeChannelList(NTV2_CHANNEL1, mDevice.features().GetNumVideoOutputs());
557  cerr << "SDIOuts: " << ::NTV2ChannelListToStr(sdiOutputs) << endl << "SDIIns: " << ::NTV2ChannelListToStr(sdiInputs) << endl; // DEBUG
558  for (size_t sdiNdx(0); sdiNdx < sdiOutputs.size(); sdiNdx++)
559  { const NTV2Channel sdiOut(sdiOutputs.at(sdiNdx));
560  const NTV2Channel sdiIn(sdiInputs.at(sdiNdx < sdiInputs.size() ? sdiNdx : sdiInputs.size()-1));
561  if (mDevice.features().HasBiDirectionalSDI() && mActiveSDIInputs.find(sdiOut) == mActiveSDIInputs.end())
562  {
563  cerr << "Switching SDI " << (sdiOut+1) << " to output" << endl; // DEBUG
564  mDevice.SetSDITransmitEnable(sdiOut, true);
565  }
566  if (isRGBWire)
567  { // Route DLIn output to DLOut...
568  mInputConnections.insert(NTV2XptConnection(::GetDLOutInputXptFromChannel(sdiOut),
569  ::GetDLInOutputXptFromChannel(sdiIn)));
570  mInputConnections.insert(NTV2XptConnection(::GetSDIOutputInputXpt(sdiOut,false),
571  ::GetDLOutOutputXptFromChannel(sdiOut,false)));
572  mInputConnections.insert(NTV2XptConnection(::GetSDIOutputInputXpt(sdiOut,true),
573  ::GetDLOutOutputXptFromChannel(sdiOut,true)));
574  }
575  else
576  mInputConnections.insert(NTV2XptConnection(::GetSDIOutputInputXpt(sdiOut),
578  if (ShowRoutingProgress) mDevice.ApplySignalRoute(mInputConnections);
579  } // for each output spigot
580  } // if not burning captions and not multiFormat
581 
582  return mDevice.ApplySignalRoute(mInputConnections, /*replaceExistingRouting?*/!mConfig.fDoMultiFormat);
583 
584 } // RouteInputSignal
585 
586 
588 {
589  NTV2_ASSERT (!mConfig.fBurnCaptions); // Must not be burning captions
590 
591  const NTV2Channel sdiInputAsChan (::NTV2InputSourceToChannel(mConfig.fInputSource));
592  const NTV2Standard outputStandard (::GetNTV2StandardFromVideoFormat(inVideoFormat));
593  const NTV2Channel startNum (sdiInputAsChan == NTV2_CHANNEL1 ? NTV2_CHANNEL1 : NTV2_CHANNEL5);
594  const NTV2Channel endNum (sdiInputAsChan == NTV2_CHANNEL1 ? NTV2_CHANNEL5 : NTV2_MAX_NUM_CHANNELS);
595 
596  for (NTV2Channel chan(startNum); chan < endNum; chan = NTV2Channel(chan + 1))
597  {
598  if (ULWord(chan) >= mDevice.features().GetNumVideoChannels())
599  break;
600  if (chan != sdiInputAsChan)
601  if (mDevice.features().CanDoWidget(g3GSDIOutputs[chan]) || mDevice.features().CanDoWidget(gSDIOutputs[chan]))
602  mDevice.SetSDIOutputStandard(chan, outputStandard);
603  } // for each output spigot
604 
605 } // SetOutputStandards
606 
607 
609 {
610  // Start the capture thread...
611  AJAStatus result (StartCaptureThread());
612  if (AJA_FAILURE(result))
613  return result;
614 
615  AJATime::Sleep(500); // Wait a half second for the capture thread to start (or fail?)...
617 
618 } // Run
619 
620 
621 
623 
624 // Starts the capture thread
626 {
627  // Create and start the capture thread...
628  AJAStatus result (mCaptureThread.Attach(CaptureThreadStatic, this));
629  if (AJA_SUCCESS(result))
630  result = mCaptureThread.SetPriority(AJA_ThreadPriority_High);
631  if (AJA_SUCCESS(result))
632  result = mCaptureThread.Start();
633  return result;
634 
635 } // StartCaptureThread
636 
637 
638 // The capture thread function
639 void NTV2CCGrabber::CaptureThreadStatic (AJAThread * pThread, void * pContext) // static
640 {
641  (void) pThread;
642  // Grab the NTV2CCGrabber instance pointer from the pContext parameter,
643  // then call its CaptureFrames method...
644  NTV2CCGrabber * pApp (reinterpret_cast <NTV2CCGrabber *> (pContext));
645  pApp->CaptureFrames ();
646 
647 } // CaptureThreadStatic
648 
649 
650 // The capture function -- capture frames until told to quit...
652 {
653  ULWord xferTally(0), xferFails(0), noVideoTally(0), waitTally(0);
654  bool bUsingVanc (mConfig.fUseVanc); // To detect fUseVanc changes
655  CAPNOTE("Thread started");
656  NTV2_ASSERT(!mActiveSDIInputs.empty());
657 
658  // Loop until time to quit...
659  while (!mGlobalQuit)
660  {
661  NTV2PixelFormat currentPF (mConfig.fPixelFormat);
663  if (currentVF == NTV2_FORMAT_UNKNOWN)
664  break; // Quit
665 
666  // At this point, the input video format is stable.
667 
668  // Configure the input FrameStore(s): pixel format, mode...
669  mDevice.EnableChannels(mInputFrameStores);
670  mDevice.SetFrameBufferFormat(mInputFrameStores, mConfig.fPixelFormat);
671 
672  // Enable and subscribe to the interrupts for the channel to be used...
673  mDevice.EnableInputInterrupt (mInputFrameStores);
674  mDevice.SubscribeInputVerticalEvent (mInputFrameStores);
675 
676  // Set up the device signal routing...
677  RouteInputSignal(currentVF);
678 
679  // Set the device format to the input format detected, and set VANC mode...
680  mDevice.SetVideoFormat (mInputFrameStores, currentVF, /*retailMode*/false);
681  if (NTV2_IS_4K_VIDEO_FORMAT(currentVF))
682  {
683  if (mDevice.features().CanDo12gRouting())
684  mDevice.SetTsiFrameEnable(true, mConfig.fInputChannel);
685  else if (mSquares)
686  mDevice.Set4kSquaresEnable(true, mConfig.fInputChannel);
687  else
688  mDevice.SetTsiFrameEnable(true, mConfig.fInputChannel);
689  mVancMode = NTV2_VANCMODE_OFF;
690  if (mConfig.fUseVanc)
691  CAPWARN("VANC mode incompatible with 4K/UHD format");
692  }
693  else
694  mVancMode = mConfig.fUseVanc ? NTV2_VANCMODE_TALL : NTV2_VANCMODE_OFF; // "Tall" mode is sufficient to grab captions
695  mDevice.SetVANCMode(mInputFrameStores, mVancMode);
696  if (::Is8BitFrameBufferFormat(mConfig.fPixelFormat))
697  mDevice.SetVANCShiftMode (mConfig.fInputChannel, // 8-bit FBFs require VANC bit shift
699 
700  // Set up the circular buffers based on the detected currentVF...
701  AJAStatus status (SetupHostBuffers(currentVF));
702  if (AJA_FAILURE(status))
703  return;
704 
705  if (mConfig.fBurnCaptions) // If burning-in captions...
706  StartPlayThread(); // ...start a new playout thread
707  else // else E-E mode...
708  SetOutputStandards(currentVF); // ...output standard may need changing
709 
710  mDevice.AutoCirculateStop(mConfig.fInputChannel);
711  if (!mDevice.AutoCirculateInitForInput( mConfig.fInputChannel, // primary channel
712  mConfig.fFrames.count(), // numFrames (zero if specifying range)
713  mAudioSystem, // audio system
715  | (mDevice.features().CanDoCustomAnc() ? AUTOCIRCULATE_WITH_ANC : 0), // flags
716  1, // numChannels to gang
717  mConfig.fFrames.firstFrame(), mConfig.fFrames.lastFrame()))
718  {CAPFAIL("Failed to init Ch" << DEC(mConfig.fInputChannel+1) << " for input"); break;}
719 
720  // Start AutoCirculate...
721  if (!mDevice.AutoCirculateStart(mConfig.fInputChannel))
722  {CAPFAIL("Failed to start Ch" << DEC(mConfig.fInputChannel+1)); break;}
723 
724  // Process frames until signal format changes...
725  while (!mGlobalQuit)
726  {
727  AUTOCIRCULATE_STATUS acStatus;
728  mDevice.AutoCirculateGetStatus (mConfig.fInputChannel, acStatus);
729  if (acStatus.IsRunning() && acStatus.HasAvailableInputFrame())
730  {
731  // At this point, there's at least one fully-formed frame available in the device's
732  // frame buffer to transfer to the host. Reserve an NTV2FrameData to "produce", and
733  // use it to store the next frame to be transferred from the device...
734  NTV2FrameData * pCaptureData (mCircularBuffer.StartProduceNextBuffer());
735  if (pCaptureData)
736  {
737  mInputXferInfo.acFrameBufferFormat = mConfig.fPixelFormat;
738  mInputXferInfo.SetBuffers (pCaptureData->VideoBuffer(), pCaptureData->VideoBufferSize(),
739  pCaptureData->AudioBuffer(), pCaptureData->AudioBufferSize(),
740  pCaptureData->AncBuffer(), pCaptureData->AncBufferSize(),
741  pCaptureData->AncBuffer2(), pCaptureData->AncBuffer2Size());
742 
743  // Transfer the frame data from the device into our host NTV2FrameData...
744  if (mDevice.AutoCirculateTransfer (mConfig.fInputChannel, mInputXferInfo))
745  {
746  xferTally++;
747  if (mConfig.fBurnCaptions)
748  mInputXferInfo.GetInputTimeCodes(pCaptureData->fTimecodes, ::NTV2InputSourceToChannel(mConfig.fInputSource)); // Captured timecodes
749 
750  // Extract closed-captioning data from the host NTV2FrameData while we have full access to it...
751  ExtractClosedCaptionData (mInputXferInfo.GetTransferStatus().GetProcessedFrameCount(), currentVF);
752  }
753  else
754  xferFails++;
755 
756  // Signal that we're done "producing" the frame, making it available for future "consumption"...
757  mCircularBuffer.EndProduceNextBuffer();
758 
759  if (!mConfig.fBurnCaptions)
760  {
761  // If no caption burn-in is taking place, there's nobody to consume the buffer.
762  // In this case, simply consume it now, thus recycling it immediately...
763  mCircularBuffer.StartConsumeNextBuffer();
764  mCircularBuffer.EndConsumeNextBuffer();
765  }
766  } // if pCaptureData != NULL
767  } // if A/C running and frame(s) are available for transfer
768  else
769  {
770  // Either AutoCirculate is not running, or there were no frames available on the device to transfer.
771  // Rather than waste CPU cycles spinning, waiting until a frame becomes available, it's far more
772  // efficient to wait for the next input vertical interrupt event to get signaled...
774  ++waitTally;
775 
776  // Did incoming video format or VPID(s) change?
777  const NTV2Channel sdiConnector (mActiveSDIInputs.empty() ? NTV2_CHANNEL1 : *(mActiveSDIInputs.begin()));
778  ULWord vpidDS1(0), vpidDS2(0);
779  if (mDevice.GetVPIDValidA(sdiConnector))
780  mDevice.ReadSDIInVPID (sdiConnector, vpidDS1, vpidDS2);
781 
782  NTV2VideoFormat newVF (mDevice.GetInputVideoFormat(mConfig.fInputSource));
783  const bool vfChanged(newVF != currentVF);
784  const bool vpidChgd(mVPIDInfoDS1.GetVPID() != vpidDS1 || mVPIDInfoDS2.GetVPID() != vpidDS2);
785  if (vfChanged || vpidChgd) // || squares != mSquares)
786  {
787  ++noVideoTally;
788  if (vfChanged)
789  CAPWARN("Input video format changed from '" << ::NTV2VideoFormatToString(currentVF)
790  << "' to '" << ::NTV2VideoFormatToString(newVF) << "'");
791  else if (vpidChgd)
792  CAPWARN("Input VPID changed: DS1 (" << xHEX0N(mVPIDInfoDS1.GetVPID(),8) << " to " << xHEX0N(vpidDS1,8)
793  << "), DS2 (" << xHEX0N(mVPIDInfoDS2.GetVPID(),8) << " to " << xHEX0N(vpidDS2,8) << ")");
794 
795  // Terminate the playout thread...
796  mCircularBuffer.StartProduceNextBuffer();
797  mCircularBuffer.EndProduceNextBuffer();
798  break; // exit frame processing loop to restart AutoCirculate
799  } // if incoming video format changed
800  } // else not running or no frames available
801 
802  // Check if pixel format change requested (user pressed P key)...
803  if (mConfig.fPixelFormat != currentPF)
804  {
805  CAPWARN("FrameStore pixel format changed from '"
806  << ::NTV2FrameBufferFormatToString(currentPF,true) << "' to '"
807  << ::NTV2FrameBufferFormatToString(mConfig.fPixelFormat,true) << "'");
808  break; // exit frame processing loop -- restart AutoCirculate
809  }
810  if (mConfig.fUseVanc != bUsingVanc)
811  {
812  CAPWARN("Vanc " << (mConfig.fUseVanc?"enabled":"disabled"));
813  bUsingVanc = mConfig.fUseVanc;
814  break; // exit frame processing loop -- restart AutoCirculate
815  }
816  } // normal frame processing loop -- loop until signal or pixel format change
817 
818  // Stop AutoCirculate...
819  mDevice.AutoCirculateStop(mConfig.fInputChannel);
820 
821  } // loop til quit signaled
822  CAPNOTE("Thread completed, " << DEC(xferTally) << " of " << DEC(xferTally+xferFails) << " frms xferred, "
823  << DEC(waitTally) << " waits, " << DEC(noVideoTally) << " sig chgs");
824 
825 } // CaptureFrames
826 
828 {
830  ULWord numConsecutiveFrames(0), MIN_NUM_CONSECUTIVE_FRAMES(6);
831  NTV2_ASSERT(!mActiveSDIInputs.empty());
832  NTV2Channel sdiConnector(*(mActiveSDIInputs.begin()));
833 
834  // Detection loop:
835  while (result == NTV2_FORMAT_UNKNOWN)
836  {
837  // Determine the input video signal format...
838  // Warning: if there's no input signal, this loop won't exit until mGlobalQuit goes true!
839  mVPIDInfoDS1.MakeInvalid(); mVPIDInfoDS2.MakeInvalid(); // Reset VPID info
840  UWord loopCount(0);
841  while (result == NTV2_FORMAT_UNKNOWN)
842  {
844  if (mGlobalQuit)
845  return NTV2_FORMAT_UNKNOWN; // Terminate if asked to do so
846 
847  const NTV2VideoFormat currVF (mDevice.GetInputVideoFormat(mConfig.fInputSource));
848  if (currVF == NTV2_FORMAT_UNKNOWN)
849  { // Wait for video signal to appear
850  if (++loopCount % 500 == 0) // Log message every minute or so at ~50ms
851  CAPDBG("Waiting for valid video signal to appear at "
852  << ::NTV2InputSourceToString(mConfig.fInputSource,true));
853  }
854  else if (numConsecutiveFrames == 0)
855  {
856  lastVF = currVF; // First valid video format to appear
857  numConsecutiveFrames++; // Start debounce counter
858  }
859  else if (numConsecutiveFrames == MIN_NUM_CONSECUTIVE_FRAMES)
860  {
861  numConsecutiveFrames = 0; // Reset for next signal outage
862  result = currVF; // Set official video format to use
863  }
864  else
865  numConsecutiveFrames = (lastVF == currVF) ? numConsecutiveFrames + 1 : 0;
866  } // loop while input video format is unstable
867 
868  // At this point, the video format is stable and valid.
869 
870  // Grab input VPID info...
871  if (mDevice.GetVPIDValidA(sdiConnector))
872  { ULWord vpidDS1(0), vpidDS2(0);
873  mDevice.ReadSDIInVPID (sdiConnector, vpidDS1, vpidDS2);
874  mVPIDInfoDS1.SetVPID(vpidDS1);
875  mVPIDInfoDS2.SetVPID(vpidDS2);
876  }
877  if (mVPIDInfoDS1.IsValid())
878  { // DS1 VPID valid ---
879  CAPNOTE(::NTV2InputSourceToString(mConfig.fInputSource,true) << " DS1: " << mVPIDInfoDS1);
880  NTV2VideoFormat vfVPID (mVPIDInfoDS1.GetVideoFormat());
881  if (mVPIDInfoDS2.IsValid())
882  CAPNOTE(::NTV2InputSourceToString(mConfig.fInputSource,true) << " DS2: " << mVPIDInfoDS2);
883  if (vfVPID != result && !mSquares)
884  {
885  CAPWARN("VPID=" << ::NTV2VideoFormatToString(vfVPID) << " != " << ::NTV2VideoFormatToString(result));
886  result = vfVPID;
887  }
888  }
889 
890  ostringstream osserr;
891  if (!mDevice.features().CanDoVideoFormat(result)) // Can this device handle this video format?
892  osserr << mDevice.GetModelName() << " can't handle " << ::NTV2VideoFormatToString(result);
893  else if (mVPIDInfoDS1.IsValid() && mVPIDInfoDS1.IsStandardTwoSampleInterleave() && !mDevice.features().CanDo425Mux())
894  osserr << mDevice.GetModelName() << " can't handle TSI";
895  if (!osserr.str().empty())
896  {
897  CAPWARN(osserr.str());
898  result = NTV2_FORMAT_UNKNOWN;
899  mDevice.WaitForInputVerticalInterrupt(mConfig.fInputChannel, 30); // Wait 30 frames
900  continue; // Retry
901  }
902 
903  CAPNOTE(::NTV2InputSourceToString(mConfig.fInputSource,true) << " video format: " << ::NTV2VideoFormatToString(result));
904  cerr << endl << "## NOTE: " << ::NTV2InputSourceToString(mConfig.fInputSource,true)
905  << " video format is " << ::NTV2VideoFormatToString(result) << endl;
906  break; // Done!
907  } // loop
908 
909  // Using 'result' & possibly mVPIDInfoDS1 & mVPIDInfoDS2 --
910  // Does this format require another SDI wire? So we should check for another SDI input?
911  // For now, use just 1 framestore, 1 SDI input, 1 CSC...
912  mDevice.DisableChannels(mInputFrameStores);
913  mInputFrameStores.clear(); mInputFrameStores.insert(mConfig.fInputChannel);
914  mActiveSDIInputs.clear(); mActiveSDIInputs.insert(sdiConnector);
915  if (NTV2_IS_4K_VIDEO_FORMAT(result))
916  {
917  mInputFrameStores = ::NTV2MakeChannelSet(mConfig.fInputChannel,
918  mVPIDInfoDS1.IsValid() && mVPIDInfoDS1.IsStandardTwoSampleInterleave() ? 2 : 4);
919  mActiveSDIInputs = ::NTV2MakeChannelSet(sdiConnector, UWord(mInputFrameStores.size()));
920  }
921  mActiveCSCs = mActiveSDIInputs;
922  CAPDBG(::NTV2VideoFormatToString(result) << ": SDIs=" << ::NTV2ChannelSetToStr(mActiveSDIInputs)
923  << " FrameStores=" << ::NTV2ChannelSetToStr(mInputFrameStores)
924  << " CSCs=" << ::NTV2ChannelSetToStr(mActiveCSCs));
925  cerr << "WaitForStableInputSignal: " << ::NTV2VideoFormatToString(result) << ": SDIIns=" << ::NTV2ChannelSetToStr(mActiveSDIInputs)
926  << " FrameStores=" << ::NTV2ChannelSetToStr(mInputFrameStores)
927  << " CSCs=" << ::NTV2ChannelSetToStr(mActiveCSCs) << endl;
928  NTV2_ASSERT(result != NTV2_FORMAT_UNKNOWN);
929  return result;
930 } // WaitForStableInputSignal
931 
932 
934 
935 
937 {
938  mConfig.fUseVanc = !mConfig.fUseVanc;
939  cerr << endl << "## NOTE: VANC frame geometry " << (mConfig.fUseVanc ? "enabled" : "disabled") << endl;
940 }
941 
942 
944 {
945  OutputMode mode (mConfig.fOutputMode);
946  mode = OutputMode(mode+1);
947  if (!IS_VALID_OutputMode(mode))
949  if (mConfig.fOutputMode != mode)
950  cerr << endl << "## NOTE: Output changed to '" << CCGrabberConfig::OutputModeToString(mode) << "'" << endl;
951  mConfig.fOutputMode = mode;
952 }
953 
955 {
956  CaptionDataSrc src (mConfig.fCaptionSrc);
957  src = CaptionDataSrc(src+1);
958  if (!IS_VALID_CaptionDataSrc(src))
960  if (mConfig.fCaptionSrc != src)
961  cerr << endl << "## NOTE: CC source changed to '" << CCGrabberConfig::CaptionDataSrcToString(src) << "'" << endl;
962  mConfig.fCaptionSrc = src;
963 }
964 
966 {
967  NTV2PixelFormat pf (mConfig.fPixelFormat);
968  do
969  {
970  pf = NTV2PixelFormat(pf+1);
971  if (pf == NTV2_FBF_LAST)
972  pf = NTV2_FBF_FIRST;
973  } while (NTV2_IS_FBF_PLANAR(pf) || !mDevice.features().CanDoFrameBufferFormat(pf));
974  if (mConfig.fPixelFormat != pf)
975  cerr << endl << "## NOTE: Pixel format changed to " << ::NTV2FrameBufferFormatToString(pf) << endl;
976  mConfig.fPixelFormat = pf;
977 }
978 
979 void NTV2CCGrabber::ExtractClosedCaptionData (const uint32_t inFrameNum, const NTV2VideoFormat inVideoFormat)
980 {
981  AJAAncillaryList ancPackets, vancPackets;
982  CaptionData captionData708Anc, captionData708Vanc, captionData608Anc, captionData608Vanc, captionDataL21Anc, captionDataL21; // The 608 caption byte pairs (one pair per field)
983  const NTV2FormatDescriptor formatDesc (inVideoFormat, mConfig.fPixelFormat, mVancMode);
984 
985  if (NTV2_IS_VANCMODE_ON(mVancMode) || mDevice.features().CanDoCustomAnc()) // Gotta have at least VANC or AncExt
986  {
987  // Get all VANC packets...
988  if (NTV2_IS_VANCMODE_ON(mVancMode))
989  {
990  AJAAncillaryList::SetFromVANCData (mInputXferInfo.acVideoBuffer, formatDesc, vancPackets, inFrameNum);
991  vancPackets.ParseAllAncillaryData();
992  }
993 
994  // Get all anc extractor packets...
995  if (mDevice.features().CanDoCustomAnc())
996  {
997  const NTV2Buffer validAncF1 (mInputXferInfo.acANCBuffer.GetHostAddress(0), mInputXferInfo.GetCapturedAncByteCount(false));
998  const NTV2Buffer validAncF2 (mInputXferInfo.acANCField2Buffer.GetHostAddress(0), mInputXferInfo.GetCapturedAncByteCount(true));
999  AJAAncillaryList::SetFromDeviceAncBuffers (validAncF1, validAncF2, ancPackets, inFrameNum);
1000  ancPackets.ParseAllAncillaryData();
1001  }
1002 
1003  if (NTV2_IS_VANCMODE_ON(mVancMode))
1004  { // Compare with what we got from VANC lines:
1005  NTV2StringList diffs;
1006  if (!ancPackets.CompareWithInfo (diffs, vancPackets, true/*ignoreLoc*/, false /*ignoreChksum*/))
1007  {
1008  NTV2StringList lines(aja::split(diffs.at(0), "\n")); // Only log first diff
1009  CAPDBG(DEC(diffs.size()) << " VANC/AncExt diff(s): " << lines.at(0));
1010  for (size_t n(1); n < lines.size(); n++)
1011  CAPDBG(lines.at(n));
1012  }
1013  }
1014  }
1015 
1016  // Get Line21 CC data...
1017  if (NTV2_IS_SD_VIDEO_FORMAT(inVideoFormat) && (mConfig.fPixelFormat == NTV2_FBF_8BIT_YCBCR || mConfig.fPixelFormat == NTV2_FBF_10BIT_YCBCR))
1018  { // Anything encoded in Line 21?
1019  ULWord line21RowOffset(0);
1020  const UByte * pLine21(AJA_NULL);
1021  formatDesc.GetLineOffsetFromSMPTELine (21, line21RowOffset);
1022  pLine21 = AsConstUBytePtr(formatDesc.GetRowAddress(mInputXferInfo.acVideoBuffer.GetHostPointer(),
1023  line21RowOffset));
1024  if (pLine21)
1025  {
1026  if (mConfig.fPixelFormat == NTV2_FBF_10BIT_YCBCR) // CNTV2Line21Captioner::DecodeLine requires 8-bit YUV
1027  ::ConvertLine_v210_to_2vuy(AsConstULWordPtr(pLine21), (UByte*)(pLine21), 720); // Convert YUV10 to YUV8 in-place
1028  captionDataL21.bGotField1Data = CNTV2Line21Captioner::DecodeLine(pLine21, captionDataL21.f1_char1, captionDataL21.f1_char2);
1029  }
1030  pLine21 = AsConstUBytePtr(formatDesc.GetRowAddress(mInputXferInfo.acVideoBuffer.GetHostPointer(),
1031  line21RowOffset+1)); // F2 should be on next row
1032  if (pLine21)
1033  {
1034  if (mConfig.fPixelFormat == NTV2_FBF_10BIT_YCBCR) // CNTV2Line21Captioner::DecodeLine requires 8-bit YUV
1035  ::ConvertLine_v210_to_2vuy(AsConstULWordPtr(pLine21), (UByte*)(pLine21), 720); // Convert YUV10 to YUV8 in-place
1036  captionDataL21.bGotField2Data = CNTV2Line21Captioner::DecodeLine(pLine21, captionDataL21.f2_char1, captionDataL21.f2_char2);
1037  }
1038  }
1039 
1040  // Any 608 packets (anc extractor)?
1041  if (ancPackets.GetAncillaryDataWithType(AJAAncDataType_Cea608_Vanc, 0)) // F1
1042  {
1044  if (pkt608F1.GetPayloadData() && pkt608F1.GetPayloadByteCount() && AJA_SUCCESS(pkt608F1.ParsePayloadData()))
1045  pkt608F1.GetCEA608Bytes (captionData608Anc.f1_char1, captionData608Anc.f1_char2, captionData608Anc.bGotField1Data);
1046  }
1047  if (ancPackets.GetAncillaryDataWithType(AJAAncDataType_Cea608_Vanc, 1)) // F2
1048  {
1050  if (pkt608F2.GetPayloadData() && pkt608F2.GetPayloadByteCount() && AJA_SUCCESS(pkt608F2.ParsePayloadData()))
1051  pkt608F2.GetCEA608Bytes(captionData608Anc.f2_char1, captionData608Anc.f2_char2, captionData608Anc.bGotField2Data);
1052  }
1053 
1054  // Any 608 packets (Vanc)?
1056  {
1058  if (pkt608F1.GetPayloadData() && pkt608F1.GetPayloadByteCount() && AJA_SUCCESS(pkt608F1.ParsePayloadData()))
1059  pkt608F1.GetCEA608Bytes (captionData608Vanc.f1_char1, captionData608Vanc.f1_char2, captionData608Vanc.bGotField1Data);
1060  }
1062  {
1064  if (pkt608F2.GetPayloadData() && pkt608F2.GetPayloadByteCount() && AJA_SUCCESS(pkt608F2.ParsePayloadData()))
1065  pkt608F2.GetCEA608Bytes(captionData608Vanc.f2_char1, captionData608Vanc.f2_char2, captionData608Vanc.bGotField2Data);
1066  }
1067 
1068  // Any 708 packets (vanc)?
1070  {
1071  AJAAncillaryData vancCEA708DataIn (vancPackets.GetAncillaryDataWithType(AJAAncDataType_Cea708));
1072  bool hasParityErrors (false);
1073  if (vancCEA708DataIn.GetPayloadData() && vancCEA708DataIn.GetPayloadByteCount() && AJA_SUCCESS(vancCEA708DataIn.ParsePayloadData()))
1074  if (m708DecoderVanc->SetSMPTE334AncData (vancCEA708DataIn.GetPayloadData(), vancCEA708DataIn.GetPayloadByteCount()))
1075  if (m708DecoderVanc->ParseSMPTE334AncPacket(hasParityErrors))
1076  {
1077  vector<UByte> svcBlk;
1078  size_t blkSize(0), byteCount(0);
1079  int svcNum(0);
1080  bool isExtendedSvc(false);
1081  if (!hasParityErrors)
1082  captionData708Vanc = m708DecoderVanc->GetCC608CaptionData();
1083  if (m708DecoderVanc->GetNextServiceBlockInfoFromQueue (NTV2_CC708PrimaryCaptionServiceNum, blkSize, byteCount, svcNum, isExtendedSvc))
1084  m708DecoderVanc->GetNextServiceBlockFromQueue(NTV2_CC708PrimaryCaptionServiceNum, svcBlk); // Pop queued service block
1085  }
1086  }
1087  // Any 708 packets (anc extractor)?
1089  {
1090  AJAAncillaryData ancCEA708DataIn (ancPackets.GetAncillaryDataWithType(AJAAncDataType_Cea708));
1091  bool hasParityErrors (false);
1092  if (ancCEA708DataIn.GetPayloadData() && ancCEA708DataIn.GetPayloadByteCount() && AJA_SUCCESS(ancCEA708DataIn.ParsePayloadData()))
1093  if (m708DecoderAnc->SetSMPTE334AncData (ancCEA708DataIn.GetPayloadData(), ancCEA708DataIn.GetPayloadByteCount()))
1094  if (m708DecoderAnc->ParseSMPTE334AncPacket(hasParityErrors))
1095  {
1096  vector<UByte> svcBlk;
1097  size_t blkSize(0), byteCount(0);
1098  int svcNum(0);
1099  bool isExtendedSvc(false);
1100  if (!hasParityErrors)
1101  captionData708Anc = m708DecoderAnc->GetCC608CaptionData();
1102  if (m708DecoderAnc->GetNextServiceBlockInfoFromQueue (NTV2_CC708PrimaryCaptionServiceNum, blkSize, byteCount, svcNum, isExtendedSvc))
1103  m708DecoderAnc->GetNextServiceBlockFromQueue(NTV2_CC708PrimaryCaptionServiceNum, svcBlk); // Pop queued service block
1104  }
1105  }
1106  // Any "analog" packets?
1108  {
1110  if (AJA_SUCCESS(ancEIA608DataIn.ParsePayloadData()))
1111  ancEIA608DataIn.GetCEA608Bytes(captionDataL21Anc.f1_char1, captionDataL21Anc.f1_char2, captionDataL21Anc.bGotField1Data);
1113  {
1115  if (AJA_SUCCESS(ancEIA608F2.ParsePayloadData()))
1116  ancEIA608F2.GetCEA608Bytes(captionDataL21Anc.f2_char1, captionDataL21Anc.f2_char2, captionDataL21Anc.bGotField2Data);
1117  }
1118  }
1119 
1120  // Compare CaptionData results...
1121  ostringstream ossCompare;
1122  const CaptionData * p608CaptionData(AJA_NULL);
1123  if (NTV2_IS_SD_VIDEO_FORMAT(inVideoFormat))
1124  {
1125  const CaptionData * pL21CaptionData (AJA_NULL);
1126  if (captionDataL21.HasData() && captionDataL21Anc.HasData())
1127  if (captionDataL21 != captionDataL21Anc)
1128  ossCompare << "L21Vanc != L21Anlg: " << captionDataL21 << " " << captionDataL21Anc << endl;
1129  if (captionDataL21.HasData())
1130  pL21CaptionData = &captionDataL21;
1131  else if (captionDataL21Anc.HasData())
1132  pL21CaptionData = &captionDataL21Anc;
1133  if (captionData608Anc.HasData() && pL21CaptionData)
1134  if (captionData608Anc != *pL21CaptionData)
1135  ossCompare << "608 != L21: " << captionData608Anc << " " << *pL21CaptionData << endl;
1136  if (captionData608Anc.HasData())
1137  p608CaptionData = &captionData608Anc; // 608 anc has precedence
1138  else if (pL21CaptionData)
1139  p608CaptionData = pL21CaptionData; // followed by line 21
1140  }
1141  else
1142  {
1143  if (captionData608Anc.HasData() && captionData708Anc.HasData())
1144  if (captionData608Anc != captionData708Anc)
1145  ossCompare << "608anc != 708anc: " << captionData608Anc << " " << captionData708Anc << endl;
1146  if (captionData608Vanc.HasData() && captionData708Vanc.HasData())
1147  if (captionData608Vanc != captionData708Vanc)
1148  ossCompare << "608vanc != 708vanc: " << captionData608Vanc << " " << captionData708Vanc << endl;
1149  if (captionData708Anc.HasData())
1150  p608CaptionData = &captionData708Anc; // 608-in-708anc has highest precedence
1151  else if (captionData708Vanc.HasData())
1152  p608CaptionData = &captionData708Vanc; // followed by 608-in-708vanc
1153  else if (captionData608Anc.HasData())
1154  p608CaptionData = &captionData608Anc; // followed by 608anc
1155  else if (captionData608Vanc.HasData())
1156  p608CaptionData = &captionData608Vanc; // followed by 608vanc
1157  }
1158  if (!ossCompare.str().empty())
1159  CAPDBG("CaptionData mis-compare(s): " << ossCompare.str());
1160 
1161  // Set p608CaptionData based on mConfig.fCaptionSrc...
1162  switch (mConfig.fCaptionSrc)
1163  { // captionData708Anc, captionData708Vanc, captionData608Anc, captionData608Vanc, captionDataL21Anc, captionDataL21
1164  case kCaptionDataSrc_Line21: p608CaptionData = &captionDataL21Anc; break;
1165  case kCaptionDataSrc_608FBVanc: p608CaptionData = &captionDataL21; break;
1166  case kCaptionDataSrc_708FBVanc: p608CaptionData = &captionData708Vanc; break;
1167  case kCaptionDataSrc_608Anc: p608CaptionData = &captionData608Anc; break;
1168  case kCaptionDataSrc_708Anc: p608CaptionData = &captionData708Anc; break;
1169  default: break;
1170  }
1171 
1172  if (!p608CaptionData)
1173  return; // Got nothing
1174 
1175  // This demo only handles CEA-608 captions (no Teletext, IBU, etc.)
1176  // The 608 decoder expects to be called once per frame (to implement flashing characters, smooth-scroll roll-up, etc.).
1177  // Pass the caption byte pairs to it for processing (even if captionData.HasData returns false)...
1178  m608Decoder->ProcessNew608FrameData(*p608CaptionData);
1179 
1180  DoCCOutput(inFrameNum, *p608CaptionData, inVideoFormat);
1181 
1182 } // ExtractClosedCaptionData
1183 
1184 
1185 void NTV2CCGrabber::DoCCOutput (const uint32_t inFrameNum, const CaptionData & inCCData, const NTV2VideoFormat inVideoFormat)
1186 {
1187  // Print out the caption characters...
1188  const bool isFirstTime (mLastOutFrame == 0 && inFrameNum > mLastOutFrame);
1189  char char1(0), char2(0);
1190  const bool showField2 (IsField2Line21CaptionChannel(m608Channel));
1191  const bool gotData (showField2 ? inCCData.bGotField2Data : inCCData.bGotField1Data);
1192  switch (mConfig.fOutputMode)
1193  {
1195  if (gotData)
1196  { // Can't distinguish between CC1/CC2/Tx1/Tx2 for F1 (nor CC3/CC4/Tx3/Tx4 for F2).
1197  // They'll just have to be interspersed for now...
1198  char1 = (char(showField2 ? inCCData.f2_char1 : inCCData.f1_char1) & 0x7F);
1199  char2 = (char(showField2 ? inCCData.f2_char2 : inCCData.f1_char2) & 0x7F);
1200  if (char1 >= ' ' && char1 <= '~')
1201  {
1202  if (mLastOutStr != " " || char1 != ' ')
1203  {cout << char1 << flush; mLastOutStr = string(1,char1);}
1204  if (char2 >= ' ' && char2 <= '~')
1205  {
1206  if (mLastOutStr != " " || char2 != ' ')
1207  {cout << char2 << flush; mLastOutStr = string(1,char2);}
1208  }
1209  }
1210  else if (mLastOutStr != " ")
1211  {cout << " " << flush; mLastOutStr = " ";}
1212  }
1213  break;
1215  {
1216  if (inFrameNum == (mLastOutFrame+1))
1217  {
1218  mLastOutFrame = inFrameNum;
1219  if ((mLastOutFrame - mFirstOutFrame) < MAX_ACCUM_FRAME_COUNT)
1220  break; // Don't spew yet -- keep going
1221  }
1222  const string currentScreen(m608Decoder->GetOnAirCharacters());
1223  if (currentScreen != mLastOutStr)
1224  cout << currentScreen << endl;
1225  mLastOutStr = currentScreen;
1226  mFirstOutFrame = mLastOutFrame = inFrameNum;
1227  break;
1228  }
1230  {
1231  uint16_t u16(uint16_t(uint16_t(showField2 ? inCCData.f2_char1 : inCCData.f1_char1) << 8) | uint16_t(showField2 ? inCCData.f2_char2 : inCCData.f1_char2));
1232  ostringstream oss;
1233  oss << Hex0N(u16,4);
1234  mLastOutStr.append(mLastOutStr.empty() ? "\t" : " ");
1235  mLastOutStr.append(oss.str());
1236  if (inFrameNum == (mLastOutFrame+1))
1237  { // Save for later
1238  mLastOutFrame = inFrameNum;
1239  if ((mLastOutFrame - mFirstOutFrame) < MAX_ACCUM_FRAME_COUNT)
1240  break; // Don't spew yet -- keep going
1241  }
1242  if (isFirstTime)
1243  cout << "Scenarist_SCC V1.0" << endl;
1244 
1245  string tcStr;
1246  AJATimeCode tcFirst(mFirstOutFrame);
1248  tcFirst.QueryString(tcStr, tcBase, false);
1249  cout << endl << tcStr << ":" << mLastOutStr << endl;
1250  mFirstOutFrame = mLastOutFrame = inFrameNum;
1251  mLastOutStr.clear();
1252  break;
1253  }
1254  case kOutputMode_Stats:
1255  if (inFrameNum % 60 == 0) // Every 60 frames
1256  {
1257  CNTV2CaptionDecodeChannel608Ptr chDecoder (m608Decoder->Get608ChannelDecoder(m608Decoder->GetDisplayChannel()));
1258  if (chDecoder)
1259  {
1260  const vector<uint32_t> stats (chDecoder->GetStats());
1261  AJALabelValuePairs info;
1263  for (size_t num(0); num < stats.size(); num++)
1264  {
1266  if (title.empty())
1267  break;
1268  if (!stats[num])
1269  continue;
1270  ostringstream oss; oss << DEC(stats[num]);
1271  AJASystemInfo::append(info, title, oss.str());
1272  }
1273  cout << AJASystemInfo::ToString(info) << endl;
1274  }
1275  }
1276  break;
1277  default: break;
1278  }
1279 } // DoCCOutput
1280 
1281 
1283 
1284 
1285 static const UWord gMixerNums [] = {0, 0, 1, 1, 2, 2, 3, 3};
1286 
1287 
1289 {
1290  NTV2_ASSERT (mConfig.fBurnCaptions); // Must be burning captions
1291 
1292  // Configure the output FrameStore...
1293  mDevice.EnableChannel (mOutputChannel);
1294  mDevice.SetMode (mOutputChannel, NTV2_MODE_DISPLAY);
1295  mDevice.SetFrameBufferFormat (mOutputChannel, mPlayoutFBF);
1296  mDevice.SetVideoFormat (inVideoFormat, /*retailMode?*/false, /*keepVANC?*/false, /*channel*/mOutputChannel);
1297  mDevice.SetEnableVANCData(NTV2_IS_VANCMODE_TALL(mVancMode), NTV2_IS_VANCMODE_TALLER(mVancMode), mOutputChannel);
1298 
1299  // RGB: Set up mixer to "mix" mode, FG raster "unshaped", BG raster "full raster" and VANC pass-thru from BG...
1300  const UWord mixerNumber (gMixerNums[mOutputChannel]);
1301  mDevice.SetMixerMode (mixerNumber, NTV2MIXERMODE_FOREGROUND_ON);
1304  mDevice.SetMixerVancOutputFromForeground (mixerNumber, false); // false means "use BG VANC, not FG"
1305  cerr << "## NOTE: Caption burn-in using mixer/keyer " << (mixerNumber+1) << " on " << ::NTV2ChannelToString(mOutputChannel)
1306  << ", " << ::NTV2FrameBufferFormatToString(mPlayoutFBF)
1307  << ", " << ::NTV2VideoFormatToString(inVideoFormat) << endl;
1308 
1309  return AJA_STATUS_SUCCESS;
1310 
1311 } // SetupOutputVideo
1312 
1313 
1315 {
1316  NTV2_ASSERT (mConfig.fBurnCaptions); // Must be burning captions
1317  const NTV2OutputCrosspointID frameStoreOutputRGB (::GetFrameBufferOutputXptFromChannel (mOutputChannel, true)); // true=RGB
1318  const NTV2OutputCrosspointID cscOutputYUV (::GetCSCOutputXptFromChannel (mOutputChannel));
1319  const NTV2OutputCrosspointID cscOutputKey (::GetCSCOutputXptFromChannel (mOutputChannel, true)); // true=key
1320  const NTV2OutputCrosspointID mixerOutputYUV (::GetMixerOutputXptFromChannel (mOutputChannel));
1322  const NTV2Standard outputStandard (::GetNTV2StandardFromVideoFormat (inVideoFormat));
1323  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1324  UWord connectFailures (0);
1325 
1326  if (mConfig.fDoMultiFormat)
1327  {
1328  // Multiformat --- route the one SDI output to the mixer's YUV output, and set its output standard...
1329  if (mDevice.features().HasBiDirectionalSDI())
1330  mDevice.SetSDITransmitEnable (mOutputChannel, true);
1331  if (mDevice.features().CanDoWidget(g12GSDIOutputs[mOutputChannel])
1332  || mDevice.features().CanDoWidget(g3GSDIOutputs[mOutputChannel])
1333  || mDevice.features().CanDoWidget(gSDIOutputs[mOutputChannel]))
1334  {
1335  if (!mDevice.Connect (::GetSDIOutputInputXpt(mOutputChannel), mixerOutputYUV, canVerify)) connectFailures++;
1336  mDevice.SetSDIOutputStandard (mOutputChannel, outputStandard);
1337  }
1338  }
1339  else
1340  {
1341  // If not multiformat: Route all SDI outputs to the mixer's YUV output...
1342  const ULWord numVideoOutputs (mDevice.features().GetNumVideoOutputs());
1343  const NTV2Channel startNum (NTV2_CHANNEL1);
1344  const NTV2Channel endNum (NTV2_CHANNEL_INVALID);
1345  const NTV2Channel sdiInputAsChan (::NTV2InputSourceToChannel(mConfig.fInputSource));
1346 
1347  for (NTV2Channel chan(startNum); chan < endNum; chan = NTV2Channel(chan + 1))
1348  {
1349  if (ULWord(chan) >= numVideoOutputs)
1350  break;
1351  if (mDevice.features().HasBiDirectionalSDI())
1352  {
1353  if (chan == sdiInputAsChan)
1354  continue; // Skip the input
1355  mDevice.SetSDITransmitEnable (chan, true);
1356  }
1357  if (mDevice.features().CanDoWidget(g12GSDIOutputs[chan])
1358  || mDevice.features().CanDoWidget(g3GSDIOutputs[chan])
1359  || mDevice.features().CanDoWidget(gSDIOutputs[chan]))
1360  {
1361  if (!mDevice.Connect (::GetSDIOutputInputXpt(chan), mixerOutputYUV, canVerify)) connectFailures++;
1362  mDevice.SetSDIOutputStandard (chan, outputStandard);
1363  }
1364  } // for each output spigot
1365  }
1366 
1367  // Connect CSC video input to frame buffer's RGB output:
1368  if (!mDevice.Connect (::GetCSCInputXptFromChannel(mOutputChannel), frameStoreOutputRGB, canVerify)) connectFailures++;
1369  // Connect mixer's foreground video input to the CSC's YUV video output:
1370  if (!mDevice.Connect (::GetMixerFGInputXpt(mOutputChannel), cscOutputYUV, canVerify)) connectFailures++;
1371  // Connect mixer's foreground key input to the CSC's YUV key output:
1372  if (!mDevice.Connect (::GetMixerFGInputXpt(mOutputChannel, true), cscOutputKey, canVerify)) connectFailures++;
1373  // Connect mixer's background video input to the SDI input:
1374  if (!mDevice.Connect (::GetMixerBGInputXpt(mOutputChannel), signalInput, canVerify)) connectFailures++;
1375 
1376  if (!mConfig.fDoMultiFormat)
1377  {
1378  // Connect more outputs -- HDMI, analog, SDI monitor, etc... (Don't bother to verify these connections)
1379  if (mDevice.features().CanDoWidget(NTV2_WgtHDMIOut1))
1380  mDevice.Connect (NTV2_XptHDMIOutInput, mixerOutputYUV);
1381  if (mDevice.features().CanDoWidget(NTV2_WgtHDMIOut1v2))
1382  mDevice.Connect (NTV2_XptHDMIOutQ1Input, mixerOutputYUV);
1383  if (mDevice.features().CanDoWidget(NTV2_WgtAnalogOut1))
1384  mDevice.Connect (NTV2_XptAnalogOutInput, mixerOutputYUV);
1385  if (mDevice.features().CanDoWidget(NTV2_WgtSDIMonOut1))
1386  mDevice.Connect (::GetSDIOutputInputXpt (NTV2_CHANNEL5), mixerOutputYUV);
1387  }
1388  return connectFailures == 0;
1389 
1390 } // RouteOutputSignal
1391 
1392 
1393 // Starts the play thread
1395 {
1396  // Create and start the playout thread...
1397  NTV2_ASSERT(mConfig.fBurnCaptions);
1398  AJAStatus result (mPlayoutThread.Attach(PlayThreadStatic, this));
1399  if (AJA_SUCCESS(result))
1400  result = mPlayoutThread.SetPriority(AJA_ThreadPriority_High);
1401  if (AJA_SUCCESS(result))
1402  result = mPlayoutThread.Start();
1403  return result;
1404 
1405 } // StartPlayThread
1406 
1407 
1408 // The playout thread function
1409 void NTV2CCGrabber::PlayThreadStatic (AJAThread * pThread, void * pContext) // static
1410 {
1411  (void) pThread;
1412  // Grab the NTV2Burn instance pointer from the pContext parameter,
1413  // then call its PlayFrames method...
1414  NTV2CCGrabber * pApp (reinterpret_cast <NTV2CCGrabber *> (pContext));
1415  pApp->PlayFrames ();
1416 
1417 } // PlayThreadStatic
1418 
1419 
1421 {
1422  const NTV2VideoFormat videoFormat (mDevice.GetInputVideoFormat(mConfig.fInputSource));
1424  ULWord fbNum (10); // Bounce between frames 10 & 11
1425  const string indicators [] = {"/", "-", "\\", "|", ""};
1426  AUTOCIRCULATE_STATUS acStatus;
1427 
1428  CAPNOTE("Thread started");
1429  SetupOutputVideo (videoFormat); // Set up device output
1430  RouteOutputSignal (videoFormat); // Set up output signal routing
1431  mDevice.GetVANCMode (vancMode, mConfig.fInputChannel);
1432  if (mDevice.AutoCirculateInitForOutput (mOutputChannel, 2) && mDevice.AutoCirculateGetStatus (mOutputChannel, acStatus)) // Find out which buffers we got
1433  fbNum = ULWord(acStatus.acStartFrame); // Use them
1434  else if (mDevice.AutoCirculateGetStatus(mConfig.fInputChannel, acStatus)) // Use the frame just past the last input A/C frame
1435  fbNum = ULWord(acStatus.GetEndFrame()) + 1;
1436 
1437  const NTV2FormatDesc formatDesc (videoFormat, mPlayoutFBF, vancMode);
1438  const uint32_t bufferSizeBytes (formatDesc.GetTotalRasterBytes ());
1439  const uint32_t activeSizeBytes (formatDesc.GetVisibleRasterBytes ());
1440  ULWord pingPong (0); // Bounce between 0 and 1
1441  UWord consecSyncErrs (0);
1442  // Caption status head-up-display...
1443  static uint64_t frameTally (0);
1444  const string strVideoFormat (CNTV2DemoCommon::StripFormatString (::NTV2VideoFormatToString (videoFormat)));
1445  ULWord lastErrorTally (0);
1446 
1447  // Allocate host frame buffer for blitting captions into...
1448  NTV2Buffer hostBuffer;
1449  if (!hostBuffer.Allocate(bufferSizeBytes, /*pageAligned*/true))
1450  {cerr << "## NOTE: Caption burn-in failed -- unable to allocate " << bufferSizeBytes << "-byte caption video buffer" << endl; return;}
1451  NTV2Buffer visibleRgn (formatDesc.GetTopVisibleRowAddress(AsUBytePtr(hostBuffer.GetHostPointer())),activeSizeBytes);
1452 
1453  // Clear both device ping/pong buffers to fully transparent, all black...
1454  hostBuffer.Fill(ULWord(0));
1455  mDevice.DMAWriteFrame (fbNum + 0, AsULWordPtr(hostBuffer.GetHostPointer()), bufferSizeBytes);
1456  mDevice.DMAWriteFrame (fbNum + 1, AsULWordPtr(hostBuffer.GetHostPointer()), bufferSizeBytes);
1457  mDevice.SetOutputFrame (mOutputChannel, fbNum + pingPong);
1458  pingPong = pingPong ? 0 : 1;
1459 
1460  // Do forever (until Quit)...
1461  while (!mGlobalQuit)
1462  {
1463  // Wait for the next frame to become ready to "consume"...
1464  NTV2FrameData * pFrameData(mCircularBuffer.StartConsumeNextBuffer());
1465  if (pFrameData)
1466  {
1467  // "Burn" captions into the host buffer before it gets sent to the AJA device...
1468  m608Decoder->BurnCaptions (hostBuffer, formatDesc);
1469  m608Decoder->IdleFrame(); // This is needed for captions that flash/blink
1470 
1471  if (mHeadUpDisplayOn)
1472  {
1473  ostringstream oss;
1474  const string strCaptionChan (::NTV2Line21ChannelToStr(NTV2_IS_HD_VIDEO_FORMAT(videoFormat)
1475  ? m708DecoderAnc->GetDisplayChannel()
1476  : m608Decoder->GetDisplayChannel()));
1477  oss << indicators [mCaptionDataTally % 4] << " " << strCaptionChan << " " << frameTally++ << " "
1478  << formatDesc.GetRasterWidth() << "x" << formatDesc.GetFullRasterHeight() << (mConfig.fUseVanc ? "v" : " ") << strVideoFormat;
1479 
1480  const ULWord newErrorTally (mErrorTally);
1481  const NTV2Line21Attributes & color (lastErrorTally != newErrorTally ? kRedOnTransparentBG : kGreenOnTransparentBG);
1482  CNTV2CaptionRenderer::BurnString (oss.str(), color, hostBuffer, formatDesc, 7, 1);
1483  lastErrorTally = newErrorTally;
1484 
1485  if (!pFrameData->fTimecodes.empty())
1486  {
1487  const NTV2_RP188 & tc (pFrameData->fTimecodes.begin()->second);
1488  if (tc.IsValid() && tc.fDBB & BIT(16)) // Bit 16 will be set if this frame had timecode
1489  {
1490  CRP188 rp188(tc);
1491  CNTV2CaptionRenderer::BurnString (rp188.GetRP188CString(), kGreenOnTransparentBG, hostBuffer, formatDesc, 8, 1);
1492  }
1493  }
1494  }
1495 
1496  // Transfer the caption raster to the device, then ping-pong it into the mixer foreground...
1497  mDevice.DMAWriteFrame (fbNum + pingPong, AsULWordPtr(visibleRgn.GetHostPointer()), activeSizeBytes);
1498  mDevice.SetOutputFrame (mOutputChannel, fbNum + pingPong); // Toggle device frame buffer
1499  pingPong = pingPong ? 0 : 1; // Switch device frame numbers for next time
1500  visibleRgn.Fill(ULWord(0)); // Clear visible region of host buffer to fully-transparent, all-black again
1501 
1502  // Signal that the frame has been "consumed"...
1503  mCircularBuffer.EndConsumeNextBuffer ();
1504 
1505  // Check for format change...
1506  if (videoFormat != mDevice.GetInputVideoFormat(mConfig.fInputSource))
1507  {
1508  cerr << "## NOTE: Caption burn-in stopped due to video format change -- was " << strVideoFormat
1509  << ", now " << ::NTV2VideoFormatToString (mDevice.GetInputVideoFormat(mConfig.fInputSource)) << endl;
1510  m608Decoder->Reset(); // Don't leave captions from old video stream on-screen
1511  m708DecoderAnc->Reset();
1512  m708DecoderVanc->Reset();
1513  break;
1514  }
1515 
1516  // Check mixer sync...
1517  bool mixerSyncOK (false);
1518  mDevice.GetMixerSyncStatus (gMixerNums[mOutputChannel], mixerSyncOK);
1519  if (mixerSyncOK)
1520  consecSyncErrs = 0;
1521  else if (++consecSyncErrs > 60) // Bail if lack of mixer sync for longer than ~1 sec
1522  {cerr << "#MXSYNC#"; consecSyncErrs = 0;} // break;}
1523  } // if pPlayData
1524  } // loop til quit signaled
1525 
1526  if (mDevice.AutoCirculateGetStatus (mOutputChannel, acStatus) && !acStatus.IsStopped())
1527  mDevice.AutoCirculateStop(mOutputChannel);
1528  CAPNOTE("Thread completed, will exit");
1529 
1530 } // PlayFrames
1531 
1532 
1534 {
1535  if (m608Channel != inNewChannel)
1536  {
1537  m608Channel = inNewChannel;
1538  if (m608Decoder)
1539  m608Decoder->SetDisplayChannel(m608Channel);
1540  if (m708DecoderAnc)
1541  m708DecoderAnc->SetDisplayChannel(m608Channel);
1542  if (m708DecoderVanc)
1543  m708DecoderVanc->SetDisplayChannel(m608Channel);
1544  cerr << endl << "## NOTE: Caption display channel changed to '" << ::NTV2Line21ChannelToStr(m608Channel) << "'" << endl;
1545  }
1546 }
1547 
1548 
1550 { (void) inChangeInfo;
1551  mCaptionDataTally++;
1552 }
1553 
1554 
1555 void NTV2CCGrabber::Caption608ChangedStatic (void * pInstance, const NTV2Caption608ChangeInfo & inChangeInfo) // STATIC
1556 {
1557  NTV2CCGrabber * pGrabber(reinterpret_cast<NTV2CCGrabber*>(pInstance));
1558  if (pGrabber)
1559  pGrabber->CaptioningChanged(inChangeInfo);
1560 }
1561 
1562 
1563 string NTV2CCGrabber::GetLine21ChannelNames (string inDelimiterStr) // static
1564 {
1565  string result;
1566  for (unsigned enumVal(0); enumVal < NTV2_CC608_ChannelMax; )
1567  {
1568  result += ::NTV2Line21ChannelToStr (NTV2Line21Channel(enumVal++));
1569  if (enumVal < NTV2_CC608_ChannelMax)
1570  result += inDelimiterStr;
1571  else
1572  break;
1573  }
1574  return result;
1575 
1576 } // GetLine21ChannelNames
1577 
1578 AJALabelValuePairs CCGrabberConfig::Get (const bool inCompact) const
1579 {
1580  AJALabelValuePairs result (CaptureConfig::Get(inCompact));
1581  AJASystemInfo::append(result, "Output Mode", IS_VALID_OutputMode(fOutputMode) ? OutputModeToString(fOutputMode) : "(invalid)");
1583  AJASystemInfo::append(result, "Timecode Source", ::NTV2TCIndexToString(fTimecodeSrc, inCompact));
1584  AJASystemInfo::append(result, "Caption Channel", ::NTV2Line21ChannelToStr(fCaptionChannel, inCompact));
1585  AJASystemInfo::append(result, "Burn-In Captions", fBurnCaptions ? "Y" : "N");
1586  AJASystemInfo::append(result, "MultiFormat Mode", fDoMultiFormat ? "Y" : "N");
1587  AJASystemInfo::append(result, "Use Vanc", fUseVanc ? "Y" : "N");
1588  return result;
1589 }
1590 
1591 
1593 {
1594  string result;
1596  {
1597  result += OutputModeToString(mode);
1598  mode = OutputMode(mode+1);
1599  if (mode < kOutputMode_INVALID)
1600  result += ",";
1601  }
1602  return result;
1603 }
1604 
1606 {
1607  static const string gModeStrs[] = {"stream","screen","scc","mcc","stats",""};
1608  if (IS_VALID_OutputMode(inMode))
1609  return gModeStrs[inMode];
1610  string result;
1611  for (unsigned ndx(0); ndx < 5; )
1612  {
1613  result += gModeStrs[ndx];
1614  if (!(gModeStrs[++ndx].empty()))
1615  result += "|";
1616  }
1617  return result;
1618 }
1619 
1621 {
1622  typedef pair<string,OutputMode> StringToOutputModePair;
1623  typedef map<string,OutputMode> StringToOutputModeMap;
1624  typedef StringToOutputModeMap::const_iterator StringToOutputModeConstIter;
1625  static StringToOutputModeMap sStringToOutputModeMap;
1626  static AJALock sStringToOutputModeMapLock;
1627  if (sStringToOutputModeMap.empty())
1628  {
1629  AJAAutoLock autoLock(&sStringToOutputModeMapLock);
1631  {
1632  string outputModeStr (OutputModeToString(om));
1633  aja::lower(outputModeStr);
1634  sStringToOutputModeMap.insert(StringToOutputModePair(outputModeStr,om));
1635  }
1636  }
1637  string modeStr(inModeStr);
1638  aja::lower(aja::strip(modeStr));
1639  StringToOutputModeConstIter iter(sStringToOutputModeMap.find(modeStr));
1640  return iter != sStringToOutputModeMap.end() ? iter->second : kOutputMode_INVALID;
1641 }
1642 
1644 {
1645  string result;
1647  {
1648  result += CaptionDataSrcToString(src);
1649  src = CaptionDataSrc(src+1);
1650  if (src < kCaptionDataSrc_INVALID)
1651  result += ",";
1652  }
1653  return result;
1654 }
1655 
1657 {
1658  static const string gSrcStrs[] = {"default","line21","608vanc","708vanc","608anc","708anc",""};
1659  if (IS_VALID_CaptionDataSrc(inDataSrc))
1660  return gSrcStrs[inDataSrc];
1661  string result;
1662  for (unsigned ndx(0); ndx < 6; )
1663  {
1664  result += gSrcStrs[ndx];
1665  if (!gSrcStrs[++ndx].empty())
1666  result += "|";
1667  }
1668  return result;
1669 }
1670 
1672 {
1673  typedef pair<string,CaptionDataSrc> StringToCaptionDataSrcPair;
1674  typedef map<string,CaptionDataSrc> StringToCaptionDataSrcMap;
1675  typedef StringToCaptionDataSrcMap::const_iterator StringToCaptionDataSrcConstIter;
1676  static StringToCaptionDataSrcMap sStringToCaptionDataSrcMap;
1677  static AJALock sStringToCaptionDataSrcMapLock;
1678  if (sStringToCaptionDataSrcMap.empty())
1679  {
1680  AJAAutoLock autoLock(&sStringToCaptionDataSrcMapLock);
1682  {
1683  string captionDataSrcStr (CaptionDataSrcToString(cds));
1684  aja::lower(captionDataSrcStr);
1685  sStringToCaptionDataSrcMap.insert(StringToCaptionDataSrcPair(captionDataSrcStr,cds));
1686  }
1687  }
1688  string cdsStr(inDataSrcStr);
1689  aja::lower(aja::strip(cdsStr));
1690  StringToCaptionDataSrcConstIter iter(sStringToCaptionDataSrcMap.find(cdsStr));
1691  return iter != sStringToCaptionDataSrcMap.end() ? iter->second : kCaptionDataSrc_INVALID;
1692 }
1693 
1694 
1695 std::ostream & operator << (std::ostream & ioStrm, const CCGrabberConfig & inObj)
1696 {
1697  ioStrm << AJASystemInfo::ToString(inObj.Get());
1698  return ioStrm;
1699 }
AUTOCIRCULATE_TRANSFER::acFrameBufferFormat
NTV2FrameBufferFormat acFrameBufferFormat
Specifies the frame buffer format to change to. Ignored if AUTOCIRCULATE_WITH_FBFCHANGE option is not...
Definition: ntv2publicinterface.h:8040
CNTV2Card::SetVANCMode
virtual bool SetVANCMode(const NTV2VANCMode inVancMode, const NTV2Channel inChannel=NTV2_CHANNEL1)
Sets the VANC mode for the given FrameStore.
Definition: ntv2register.cpp:2640
CaptureConfig::fDoMultiFormat
bool fDoMultiFormat
If true, use multi-format/multi-channel mode, if device supports it; otherwise normal mode.
Definition: ntv2democommon.h:276
AsULWordPtr
#define AsULWordPtr(__p__)
Definition: ntv2ccgrabber.cpp:30
NTV2InputSourceToReferenceSource
NTV2ReferenceSource NTV2InputSourceToReferenceSource(const NTV2InputSource inInputSource)
Converts a given NTV2InputSource to its equivalent NTV2ReferenceSource value.
Definition: ntv2utils.cpp:5081
NTV2_CC608_Blue
@ NTV2_CC608_Blue
Definition: ntv2caption608types.h:157
NTV2ChannelSetToStr
std::string NTV2ChannelSetToStr(const NTV2ChannelSet &inObj, const bool inCompact=true)
Definition: ntv2publicinterface.cpp:3351
CNTV2Card::SetMultiFormatMode
virtual bool SetMultiFormatMode(const bool inEnable)
Enables or disables multi-format (per channel) device operation. If enabled, each device channel can ...
Definition: ntv2register.cpp:4379
CCGrabberConfig::fTimecodeSrc
NTV2TCIndex fTimecodeSrc
Timecode source to use (if any)
Definition: ntv2ccgrabber.h:67
NTV2_XptHDMIOutInput
@ NTV2_XptHDMIOutInput
Definition: ntv2enums.h:2793
GetSDIOutputInputXpt
NTV2InputXptID GetSDIOutputInputXpt(const NTV2Channel inSDIOutput, const bool inIsDS2=false)
Definition: ntv2signalrouter.cpp:942
CCGrabberConfig::StringToOutputMode
static OutputMode StringToOutputMode(const std::string &inModeStr)
Definition: ntv2ccgrabber.cpp:1620
NTV2ChannelToInputSource
NTV2InputSource NTV2ChannelToInputSource(const NTV2Channel inChannel, const NTV2IOKinds inKinds=NTV2_IOKINDS_SDI)
Definition: ntv2utils.cpp:5190
NTV2CCGrabber::SetupAudio
virtual AJAStatus SetupAudio(void)
Sets up audio for capture (and playout, if burning captions).
Definition: ntv2ccgrabber.cpp:338
NTV2InputSourceToChannel
NTV2Channel NTV2InputSourceToChannel(const NTV2InputSource inInputSource)
Converts a given NTV2InputSource to its equivalent NTV2Channel value.
Definition: ntv2utils.cpp:5105
NTV2_IS_SD_VIDEO_FORMAT
#define NTV2_IS_SD_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:707
DeviceCapabilities::CanDoVideoFormat
bool CanDoVideoFormat(const NTV2VideoFormat inVF)
Definition: ntv2devicecapabilities.h:251
NTV2_IS_VANCMODE_TALLER
#define NTV2_IS_VANCMODE_TALLER(__v__)
Definition: ntv2enums.h:3726
NTV2_FBF_ARGB
@ NTV2_FBF_ARGB
See 8-Bit ARGB, RGBA, ABGR Formats.
Definition: ntv2enums.h:212
AsUBytePtr
#define AsUBytePtr(__p__)
Definition: ntv2ccgrabber.cpp:31
GetSDIInputOutputXptFromChannel
NTV2OutputXptID GetSDIInputOutputXptFromChannel(const NTV2Channel inSDIInput, const bool inIsDS2=false)
Definition: ntv2signalrouter.cpp:893
AUTOCIRCULATE_TRANSFER::GetTransferStatus
const AUTOCIRCULATE_TRANSFER_STATUS & GetTransferStatus(void) const
Returns a constant reference to my AUTOCIRCULATE_TRANSFER_STATUS.
Definition: ntv2publicinterface.h:8324
AJATimeCode::QueryString
void QueryString(std::string &str, const AJATimeBase &timeBase, bool bDropFrame)
Definition: timecode.cpp:225
NTV2_AUDIO_LOOPBACK_OFF
@ NTV2_AUDIO_LOOPBACK_OFF
Embeds silence (zeroes) into the data stream.
Definition: ntv2enums.h:1975
GetMixerFGInputXpt
NTV2InputXptID GetMixerFGInputXpt(const NTV2Channel inChannel, const bool inIsKey=false)
Definition: ntv2signalrouter.cpp:968
NTV2_Wgt12GSDIOut1
@ NTV2_Wgt12GSDIOut1
Definition: ntv2enums.h:2951
NTV2ChannelListToStr
std::string NTV2ChannelListToStr(const NTV2ChannelList &inObj, const bool inCompact=true)
Definition: ntv2publicinterface.cpp:3330
NTV2_CHANNEL8
@ NTV2_CHANNEL8
Specifies channel or Frame Store 8 (or the 8th item).
Definition: ntv2enums.h:1314
NTV2MIXERINPUTCONTROL_UNSHAPED
@ NTV2MIXERINPUTCONTROL_UNSHAPED
Definition: ntv2enums.h:1725
NTV2_WgtSDIOut2
@ NTV2_WgtSDIOut2
Definition: ntv2enums.h:2866
AJAAncDataType_Cea608_Vanc
@ AJAAncDataType_Cea608_Vanc
CEA608 SD Closed Captioning (SMPTE 334 VANC packet)
Definition: ancillarydata.h:51
CAPDBG
#define CAPDBG(_expr_)
Definition: ntv2democommon.h:30
NTV2_FOURCC
#define NTV2_FOURCC(_a_, _b_, _c_, _d_)
Definition: ntv2publicinterface.h:5444
NTV2_CHANNEL2
@ NTV2_CHANNEL2
Specifies channel or Frame Store 2 (or the 2nd item).
Definition: ntv2enums.h:1308
AJA_ThreadPriority_High
@ AJA_ThreadPriority_High
Definition: thread.h:44
NTV2ACFrameRange::firstFrame
UWord firstFrame(void) const
Definition: ntv2utils.h:975
NTV2_WgtSDIMonOut1
@ NTV2_WgtSDIMonOut1
Definition: ntv2enums.h:2909
CNTV2CaptionDecoder708::Create
static bool Create(CNTV2CaptionDecoder708Ptr &outDecoder)
Creates a new CNTV2CaptionEncoder708 instance.
CNTV2Card::SetVideoFormat
virtual bool SetVideoFormat(const NTV2VideoFormat inVideoFormat, const bool inIsAJARetail=(!(0)), const bool inKeepVancSettings=(0), const NTV2Channel inChannel=NTV2_CHANNEL1)
Configures the AJA device to handle a specific video format.
Definition: ntv2register.cpp:204
AUTOCIRCULATE_TRANSFER_STATUS::GetProcessedFrameCount
ULWord GetProcessedFrameCount(void) const
Definition: ntv2publicinterface.h:7923
ancillarydata_cea608_line21.h
Declares the AJAAncillaryData_Cea608_line21 class.
CNTV2Card::Set4kSquaresEnable
virtual bool Set4kSquaresEnable(const bool inIsEnabled, const NTV2Channel inChannel)
Enables or disables SMPTE 425 "2K quadrants" mode for the given FrameStore bank on the device....
Definition: ntv2register.cpp:1238
GetDLInInputXptFromChannel
NTV2InputXptID GetDLInInputXptFromChannel(const NTV2Channel inChannel, const bool inLinkB=false)
Definition: ntv2signalrouter.cpp:796
ntv2transcode.h
Declares a number of pixel format transcoder functions.
CCGrabberConfig::fOutputMode
OutputMode fOutputMode
Desired output (captionStream, Screen etc)
Definition: ntv2ccgrabber.h:65
ntv2ccgrabber.h
Header file for NTV2CCGrabber demonstration class.
CaptionData::f2_char1
UByte f2_char1
Caption Byte 1 of Field 2.
Definition: ntv2caption608types.h:662
ntv2line21captioner.h
Declares the CNTV2Line21Captioner class.
NTV2_AUDIO_BUFFER_BIG
@ NTV2_AUDIO_BUFFER_BIG
Definition: ntv2enums.h:1864
CNTV2Card::GetVPIDValidA
virtual bool GetVPIDValidA(const NTV2Channel inChannel)
Definition: ntv2regvpid.cpp:50
AJAAncillaryData_Cea608::GetCEA608Bytes
virtual AJAStatus GetCEA608Bytes(uint8_t &outByte1, uint8_t &outByte2, bool &outIsValid) const
Answers with the CEA608 payload bytes.
Definition: ancillarydata_cea608.cpp:89
CCGrabberConfig::fCaptionChannel
NTV2Line21Channel fCaptionChannel
Caption channel to monitor (defaults to CC1)
Definition: ntv2ccgrabber.h:68
NTV2FormatDescriptor
Describes a video frame for a given video standard or format and pixel format, including the total nu...
Definition: ntv2formatdescriptor.h:41
NTV2_IS_FBF_PLANAR
#define NTV2_IS_FBF_PLANAR(__s__)
Definition: ntv2enums.h:255
aja::strip
std::string & strip(std::string &str, const std::string &ws)
Definition: common.cpp:461
kCaptionDataSrc_608FBVanc
@ kCaptionDataSrc_608FBVanc
Definition: ntv2ccgrabber.h:49
types.h
Declares common types used in the ajabase library.
NTV2FormatDescriptor::GetRowAddress
const void * GetRowAddress(const void *pInStartAddress, const ULWord inRowIndex0, const UWord inPlaneIndex0=0) const
Definition: ntv2formatdescriptor.cpp:997
NTV2FrameData
I encapsulate the video, audio and anc host buffers used in the AutoCirculate demos....
Definition: ntv2democommon.h:79
NTV2CCGrabber::SetOutputStandards
virtual void SetOutputStandards(const NTV2VideoFormat inVideoFormat)
Sets the device output standard based on the given video format.
Definition: ntv2ccgrabber.cpp:587
Is8BitFrameBufferFormat
bool Is8BitFrameBufferFormat(const NTV2FrameBufferFormat fbFormat)
Definition: ntv2utils.cpp:5484
CNTV2Card::GetMixerSyncStatus
virtual bool GetMixerSyncStatus(const UWord inWhichMixer, bool &outIsSyncOK)
Returns the current sync state of the given mixer/keyer.
Definition: ntv2register.cpp:2962
CNTV2DemoCommon::GetTSIMuxesForFrameStore
static NTV2ChannelList GetTSIMuxesForFrameStore(CNTV2Card &inDevice, const NTV2Channel in1stFrameStore, const UWord inCount)
Definition: ntv2democommon.cpp:1182
NTV2CCGrabber::ExtractClosedCaptionData
virtual void ExtractClosedCaptionData(const uint32_t inFrameCount, const NTV2VideoFormat inVideoFormat)
Extracts closed-caption data, if present, and emits it on a character-by-character basis to the stand...
Definition: ntv2ccgrabber.cpp:979
AJAAncillaryList::SetFromDeviceAncBuffers
static AJAStatus SetFromDeviceAncBuffers(const NTV2Buffer &inF1AncBuffer, const NTV2Buffer &inF2AncBuffer, AJAAncillaryList &outPackets, const uint32_t inFrameNum=0)
Returns all ancillary data packets found in the given F1 and F2 ancillary data buffers.
Definition: ancillarylist.cpp:1076
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1305
NTV2Buffer
A generic user-space buffer object that has an address and a length. Used most often to share an arbi...
Definition: ntv2publicinterface.h:5993
IsField2Line21CaptionChannel
#define IsField2Line21CaptionChannel(_chan_)
Definition: ntv2caption608types.h:107
AUTOCIRCULATE_STATUS::acStartFrame
LWord acStartFrame
First frame to circulate. FIXFIXFIX Why is this signed? CHANGE TO ULWord??
Definition: ntv2publicinterface.h:7164
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJARefPtr
I am a reference-counted pointer template class. I am intended to be a proxy for an underlying object...
Definition: ajarefptr.h:89
aja::split
void split(const std::string &str, const char delim, std::vector< std::string > &elems)
Definition: common.cpp:350
MAX_ACCUM_FRAME_COUNT
static const uint32_t MAX_ACCUM_FRAME_COUNT(30)
NTV2_ASSERT
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:506
GetNTV2FrameRateFromVideoFormat
NTV2FrameRate GetNTV2FrameRateFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:3530
CNTV2VPID::MakeInvalid
virtual CNTV2VPID & MakeInvalid(void)
Definition: ntv2vpid.h:102
AJAAncillaryData_Cea608_Line21
This class handles "analog" (Line 21) based CEA-608 caption data packets.
Definition: ancillarydata_cea608_line21.h:27
NTV2_Wgt3GSDIOut3
@ NTV2_Wgt3GSDIOut3
Definition: ntv2enums.h:2871
NTV2_Wgt3GSDIOut7
@ NTV2_Wgt3GSDIOut7
Definition: ntv2enums.h:2920
CNTV2Card::SetMixerBGInputControl
virtual bool SetMixerBGInputControl(const UWord inWhichMixer, const NTV2MixerKeyerInputControl inInputControl)
Sets the background input control value for the given mixer/keyer.
Definition: ntv2register.cpp:2897
CNTV2Card::ReadSDIInVPID
virtual bool ReadSDIInVPID(const NTV2Channel inSDIInput, ULWord &outValueA, ULWord &outValueB)
Definition: ntv2regvpid.cpp:68
AJAThread::Attach
virtual AJAStatus Attach(AJAThreadFunction *pThreadFunction, void *pUserContext)
Definition: thread.cpp:169
CNTV2Card::WaitForInputVerticalInterrupt
virtual bool WaitForInputVerticalInterrupt(const NTV2Channel inChannel=NTV2_CHANNEL1, UWord inRepeatCount=1)
Efficiently sleeps the calling thread/process until the next one or more field (interlaced video) or ...
Definition: ntv2subscriptions.cpp:149
CNTV2Card::EnableInputInterrupt
virtual bool EnableInputInterrupt(const NTV2Channel channel=NTV2_CHANNEL1)
Allows the CNTV2Card instance to wait for and respond to input vertical blanking interrupts originati...
Definition: ntv2interrupts.cpp:23
NTV2_AUDIO_48K
@ NTV2_AUDIO_48K
Definition: ntv2enums.h:1875
NTV2FrameData::AncBuffer2
NTV2Buffer & AncBuffer2(void)
Definition: ntv2democommon.h:117
NTV2_CC608_Red
@ NTV2_CC608_Red
Definition: ntv2caption608types.h:159
NTV2CCGrabber::IsCaptureThreadRunning
virtual bool IsCaptureThreadRunning(void) const
Returns true if my capture thread is currently running.
Definition: ntv2ccgrabber.h:159
g3GSDIOutputs
static const NTV2WidgetID g3GSDIOutputs[]
Definition: ntv2ccgrabber.cpp:382
CNTV2CaptionDecoder708::SetDisplayChannel
virtual bool SetDisplayChannel(const NTV2Line21Channel inChan)
Setsthe caption channel I'm currently focused on (i.e. that I'm currently "burning" into video).
NTV2CCGrabber::SwitchPixelFormat
virtual void SwitchPixelFormat(void)
Switches/rotates –pixelFormat.
Definition: ntv2ccgrabber.cpp:965
ancillarylist.h
Declares the AJAAncillaryList class.
AJA_STATUS_BUSY
@ AJA_STATUS_BUSY
Definition: types.h:391
NTV2FormatDescriptor::GetTopVisibleRowAddress
UByte * GetTopVisibleRowAddress(UByte *pInStartAddress) const
Definition: ntv2formatdescriptor.h:230
CNTV2DeviceScanner::GetFirstDeviceFromArgument
static bool GetFirstDeviceFromArgument(const std::string &inArgument, CNTV2Card &outDevice)
Rescans the host, and returns an open CNTV2Card instance for the AJA device that matches a command li...
Definition: ntv2devicescanner.cpp:366
NTV2_WgtSDIOut4
@ NTV2_WgtSDIOut4
Definition: ntv2enums.h:2868
NTV2MakeChannelList
NTV2ChannelList NTV2MakeChannelList(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
Definition: ntv2publicinterface.cpp:3374
CCGrabberConfig::Get
AJALabelValuePairs Get(const bool inCompact=(0)) const
Definition: ntv2ccgrabber.cpp:1578
NTV2FormatDescriptor::GetVisibleRasterBytes
ULWord GetVisibleRasterBytes(const UWord inPlaneIndex0=0) const
Definition: ntv2formatdescriptor.h:134
NTV2_AUDIOSYSTEM_1
@ NTV2_AUDIOSYSTEM_1
This identifies the first Audio System.
Definition: ntv2enums.h:3816
AJACircularBuffer::StartConsumeNextBuffer
FrameDataPtr StartConsumeNextBuffer(void)
The thread that's responsible for processing incoming frames – the consumer – calls this function to ...
Definition: circularbuffer.h:153
CaptureConfig::fPixelFormat
NTV2PixelFormat fPixelFormat
Pixel format to use.
Definition: ntv2democommon.h:273
NTV2_IS_HFR_STANDARD
#define NTV2_IS_HFR_STANDARD(__s__)
Definition: ntv2enums.h:201
CNTV2CaptionRenderer::BurnString
static bool BurnString(const std::string &inString, const NTV2Line21Attrs &inAttribs, NTV2Buffer &inFB, const NTV2FormatDesc &inFBDescriptor, const UWord inRowNum=15, const UWord inColumnNum=1)
Blits the contents of the given UTF-8 encoded string into the given host buffer using the given displ...
NTV2InputSourceToEmbeddedAudioInput
NTV2EmbeddedAudioInput NTV2InputSourceToEmbeddedAudioInput(const NTV2InputSource inInputSource)
Converts a given NTV2InputSource to its equivalent NTV2EmbeddedAudioInput value.
Definition: ntv2utils.cpp:4935
NTV2ACFrameRange::count
UWord count(void) const
Definition: ntv2utils.h:974
AJAAncillaryList::CountAncillaryDataWithType
virtual uint32_t CountAncillaryDataWithType(const AJAAncDataType inMatchType) const
Answers with the number of AJAAncillaryData objects having the given type.
Definition: ancillarylist.cpp:222
GetFrameBufferInputXptFromChannel
NTV2InputXptID GetFrameBufferInputXptFromChannel(const NTV2Channel inFrameStore, const bool inIsBInput=false)
Definition: ntv2signalrouter.cpp:762
CNTV2Card::ClearRouting
virtual bool ClearRouting(void)
Removes all existing signal path connections between any and all widgets on the AJA device.
Definition: ntv2regroute.cpp:278
NTV2CCGrabber::PlayFrames
virtual void PlayFrames(void)
Repeatedly updates captions (until global quit flag set).
Definition: ntv2ccgrabber.cpp:1420
NTV2XptConnection
std::pair< NTV2InputXptID, NTV2OutputXptID > NTV2XptConnection
Definition: ntv2signalrouter.h:38
CNTV2Card::AutoCirculateInitForInput
virtual bool AutoCirculateInitForInput(const NTV2Channel inChannel, const UWord inFrameCount=7, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_INVALID, const ULWord inOptionFlags=0, const UByte inNumChannels=1, const UWord inStartFrameNumber=0, const UWord inEndFrameNumber=0)
Prepares for subsequent AutoCirculate ingest, designating a contiguous block of frame buffers on the ...
Definition: ntv2autocirculate.cpp:221
NTV2DeviceID
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
AJAAncillaryList::ParseAllAncillaryData
virtual AJAStatus ParseAllAncillaryData(void)
Sends a "ParsePayloadData" command to all of my AJAAncillaryData objects.
Definition: ancillarylist.cpp:205
NTV2CCGrabber::CaptioningChanged
virtual void CaptioningChanged(const NTV2Caption608ChangeInfo &inChangeInfo)
This function gets called whenever caption changes occur.
Definition: ntv2ccgrabber.cpp:1549
CNTV2MacDriverInterface::ReleaseStreamForApplication
virtual bool ReleaseStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Releases exclusive use of the AJA device for the given process, permitting other processes to acquire...
Definition: ntv2macdriverinterface.cpp:516
NTV2_WIDGET_INVALID
@ NTV2_WIDGET_INVALID
Definition: ntv2enums.h:2968
CNTV2Card::SetOutputFrame
virtual bool SetOutputFrame(const NTV2Channel inChannel, const ULWord inValue)
Sets the output frame index number for the given FrameStore. This identifies which frame in device SD...
Definition: ntv2register.cpp:2191
NTV2_Wgt12GSDIOut3
@ NTV2_Wgt12GSDIOut3
Definition: ntv2enums.h:2953
NTV2_Wgt3GSDIOut1
@ NTV2_Wgt3GSDIOut1
Definition: ntv2enums.h:2869
NTV2FrameData::fAncBuffer2
NTV2Buffer fAncBuffer2
Additional "F2" host anc buffer.
Definition: ntv2democommon.h:86
NTV2FrameBufferFormat
NTV2FrameBufferFormat
Identifies a particular video frame buffer format. See Device Frame Buffer Formats for details.
Definition: ntv2enums.h:207
AJA_STATUS_MEMORY
@ AJA_STATUS_MEMORY
Definition: types.h:397
AJACircularBuffer::EndProduceNextBuffer
void EndProduceNextBuffer(void)
The producer thread calls this function to signal that it has finished populating the frame it obtain...
Definition: circularbuffer.h:259
AJAAncillaryData_Cea608_Vanc::ParsePayloadData
virtual AJAStatus ParsePayloadData(void)
Parses out (interprets) the "local" ancillary data from my payload data.
Definition: ancillarydata_cea608_vanc.cpp:100
NTV2Buffer::Allocate
bool Allocate(const size_t inByteCount, const bool inPageAligned=false)
Allocates (or re-allocates) my user-space storage using the given byte count. I assume full responsib...
Definition: ntv2publicinterface.cpp:1630
kCaptionDataSrc_INVALID
@ kCaptionDataSrc_INVALID
Definition: ntv2ccgrabber.h:53
CNTV2Card::GetVANCMode
virtual bool GetVANCMode(NTV2VANCMode &outVancMode, const NTV2Channel inChannel=NTV2_CHANNEL1)
Retrieves the current VANC mode for the given FrameStore.
Definition: ntv2register.cpp:2728
CNTV2CaptionDecoder608::Reset
virtual void Reset(void)
Flushes me, clearing all in-progress data.
CNTV2Card::ApplySignalRoute
virtual bool ApplySignalRoute(const CNTV2SignalRouter &inRouter, const bool inReplace=(0))
Applies the given routing table to the AJA device.
Definition: ntv2regroute.cpp:242
NTV2_Wgt3GSDIOut8
@ NTV2_Wgt3GSDIOut8
Definition: ntv2enums.h:2921
CNTV2CaptionDecoder608::BurnCaptions
virtual bool BurnCaptions(NTV2Buffer &inFB, const NTV2FormatDesc &inFD)
Blits all of my current caption channel's "on-air" captions into the given host buffer with the corre...
NTV2PixelFormat
NTV2FrameBufferFormat NTV2PixelFormat
An alias for NTV2FrameBufferFormat.
Definition: ntv2enums.h:248
CaptureConfig::Get
AJALabelValuePairs Get(const bool inCompact=(0)) const
Definition: ntv2democommon.cpp:1664
NTV2FrameData::fAncBuffer
NTV2Buffer fAncBuffer
Host ancillary data buffer.
Definition: ntv2democommon.h:85
CNTV2CaptionDecoder708::GetCC608CaptionData
virtual CaptionData GetCC608CaptionData(void)
Pops the next CC608 data.
CNTV2Card::SetAudioLoopBack
virtual bool SetAudioLoopBack(const NTV2AudioLoopBack inMode, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Enables or disables NTV2AudioLoopBack mode for the given NTV2AudioSystem.
Definition: ntv2audio.cpp:300
NTV2_CHANNEL1
@ NTV2_CHANNEL1
Specifies channel or Frame Store 1 (or the first item).
Definition: ntv2enums.h:1307
ntv2debug.h
CNTV2Card::SetFrameBufferFormat
virtual bool SetFrameBufferFormat(NTV2Channel inChannel, NTV2FrameBufferFormat inNewFormat, bool inIsAJARetail=(!(0)), NTV2HDRXferChars inXferChars=NTV2_VPID_TC_SDR_TV, NTV2HDRColorimetry inColorimetry=NTV2_VPID_Color_Rec709, NTV2HDRLuminance inLuminance=NTV2_VPID_Luminance_YCbCr)
Sets the frame buffer format for the given FrameStore on the AJA device.
Definition: ntv2register.cpp:1812
CNTV2Card::SetSDITransmitEnable
virtual bool SetSDITransmitEnable(const NTV2Channel inChannel, const bool inEnable)
Sets the specified bidirectional SDI connector to act as an input or an output.
Definition: ntv2register.cpp:3796
CaptionData::f1_char2
UByte f1_char2
Caption Byte 2 of Field 1.
Definition: ntv2caption608types.h:659
CNTV2Card::GetSDITransmitEnable
virtual bool GetSDITransmitEnable(const NTV2Channel inChannel, bool &outEnabled)
Answers whether or not the specified SDI connector is currently acting as a transmitter (i....
Definition: ntv2register.cpp:3817
CNTV2Card::SetVANCShiftMode
virtual bool SetVANCShiftMode(NTV2Channel inChannel, NTV2VANCDataShiftMode inMode)
Enables or disables the "VANC Shift Mode" feature for the given channel.
Definition: ntv2register.cpp:2800
NTV2FormatDescriptor::GetLineOffsetFromSMPTELine
bool GetLineOffsetFromSMPTELine(const ULWord inSMPTELine, ULWord &outLineOffset) const
Answers with the equivalent line offset into the raster I describe for the given SMPTE line number.
Definition: ntv2formatdescriptor.cpp:1200
g12GSDIOutputs
static const NTV2WidgetID g12GSDIOutputs[]
Definition: ntv2ccgrabber.cpp:385
AJAAncillaryList::GetAncillaryDataWithType
virtual AJAAncillaryData * GetAncillaryDataWithType(const AJAAncDataType inMatchType, const uint32_t inIndex=0) const
Answers with the AJAAncillaryData object having the given type and index.
Definition: ancillarylist.cpp:238
NTV2_Wgt3GSDIOut5
@ NTV2_Wgt3GSDIOut5
Definition: ntv2enums.h:2918
nlohmann::json_abiNLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON_v3_11_NLOHMANN_JSON_VERSION_PATCH::detail::void
j template void())
Definition: json.hpp:4893
NTV2CCGrabber::Run
virtual AJAStatus Run(void)
Runs me.
Definition: ntv2ccgrabber.cpp:608
AJAAncillaryList
I am an ordered collection of AJAAncillaryData instances which represent one or more SMPTE 291 data p...
Definition: ancillarylist.h:64
CCGrabberConfig::fCaptionSrc
CaptionDataSrc fCaptionSrc
Caption data source (Line21? 608 VANC? 608 Anc? etc)
Definition: ntv2ccgrabber.h:66
NTV2CCGrabber::StartCaptureThread
virtual AJAStatus StartCaptureThread(void)
Starts my capture thread.
Definition: ntv2ccgrabber.cpp:625
CaptionDataSrc
enum _CaptionDataSrc CaptionDataSrc
NTV2CCGrabber::Quit
virtual void Quit(void)
Gracefully stops me from running.
Definition: ntv2ccgrabber.cpp:102
NTV2_CHANNEL_INVALID
@ NTV2_CHANNEL_INVALID
Definition: ntv2enums.h:1316
NTV2_CHANNEL6
@ NTV2_CHANNEL6
Specifies channel or Frame Store 6 (or the 6th item).
Definition: ntv2enums.h:1312
GetMixerOutputXptFromChannel
NTV2OutputXptID GetMixerOutputXptFromChannel(const NTV2Channel inChannel, const bool inIsKey=false)
Definition: ntv2signalrouter.cpp:955
CNTV2CaptionDecoder608::GetOnAirCharacters
virtual std::string GetOnAirCharacters(const UWord inRowNumber=0) const
Retrieves all "on-air" characters either for all rows, or a specific row.
CNTV2Card::SetAudioSystemInputSource
virtual bool SetAudioSystemInputSource(const NTV2AudioSystem inAudioSystem, const NTV2AudioSource inAudioSource, const NTV2EmbeddedAudioInput inEmbeddedInput)
Sets the audio source for the given NTV2AudioSystem on the device.
Definition: ntv2audio.cpp:485
NTV2CCGrabber::DoCCOutput
virtual void DoCCOutput(const uint32_t inFrameNum, const CaptionData &inCCData, const NTV2VideoFormat inVideoFormat)
Outputs CC data.
Definition: ntv2ccgrabber.cpp:1185
NTV2FrameData::VideoBuffer
NTV2Buffer & VideoBuffer(void)
Definition: ntv2democommon.h:106
NTV2_IS_4K_VIDEO_FORMAT
#define NTV2_IS_4K_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:746
NTV2_REFERENCE_INVALID
@ NTV2_REFERENCE_INVALID
Definition: ntv2enums.h:1425
NTV2_CHANNEL4
@ NTV2_CHANNEL4
Specifies channel or Frame Store 4 (or the 4th item).
Definition: ntv2enums.h:1310
kOutputMode_INVALID
@ kOutputMode_INVALID
Definition: ntv2ccgrabber.h:39
NTV2_CHANNEL5
@ NTV2_CHANNEL5
Specifies channel or Frame Store 5 (or the 5th item).
Definition: ntv2enums.h:1311
CNTV2Card::GetModelName
virtual std::string GetModelName(void)
Answers with this device's model name.
Definition: ntv2card.cpp:80
CaptionDecode608Stats
enum _CaptionDecode608Stats CaptionDecode608Stats
The currently supported caption decoder stats.
CNTV2Card::features
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:141
NTV2CCGrabber::SwitchOutput
virtual void SwitchOutput(void)
Switches/rotates –output mode.
Definition: ntv2ccgrabber.cpp:943
AJAThread
Definition: thread.h:69
AUTOCIRCULATE_WITH_ANC
#define AUTOCIRCULATE_WITH_ANC
Use this to AutoCirculate with ancillary data.
Definition: ntv2publicinterface.h:5527
AJAThread::Active
virtual bool Active()
Definition: thread.cpp:116
NTV2Caption608ChangeInfo
This class is used to respond to dynamic events that occur during CEA-608 caption decoding.
Definition: ntv2caption608types.h:779
NTV2_WgtSDIOut1
@ NTV2_WgtSDIOut1
Definition: ntv2enums.h:2865
AJAStatus
AJAStatus
Definition: types.h:378
GetMixerBGInputXpt
NTV2InputXptID GetMixerBGInputXpt(const NTV2Channel inChannel, const bool inIsKey=false)
Definition: ntv2signalrouter.cpp:981
aja::lower
std::string & lower(std::string &str)
Definition: common.cpp:436
NTV2InputSourceToString
std::string NTV2InputSourceToString(const NTV2InputSource inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7215
kAppSignature
static const ULWord kAppSignature((((uint32_t)( 'C'))<< 24)|(((uint32_t)( 'C'))<< 16)|(((uint32_t)( 'G'))<< 8)|(((uint32_t)( 'R'))<< 0))
NTV2_Wgt3GSDIOut2
@ NTV2_Wgt3GSDIOut2
Definition: ntv2enums.h:2870
NTV2TCIndexToString
std::string NTV2TCIndexToString(const NTV2TCIndex inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6413
NTV2CCGrabber::SetupOutputVideo
virtual AJAStatus SetupOutputVideo(const NTV2VideoFormat inVideoFormat)
Sets up everything I need for capturing video.
Definition: ntv2ccgrabber.cpp:1288
AJATime::Sleep
static void Sleep(const int32_t inMilliseconds)
Suspends execution of the current thread for a given number of milliseconds.
Definition: systemtime.cpp:284
AJACircularBuffer::Add
AJAStatus Add(FrameDataPtr pInFrameData)
Appends a new frame buffer to me, increasing my frame storage capacity by one frame.
Definition: circularbuffer.h:92
CNTV2CaptionDecodeChannel608::GetStatTitle
static std::string GetStatTitle(const CaptionDecode608Stats inStat)
NTV2_VANCMODE_TALL
@ NTV2_VANCMODE_TALL
This identifies the "tall" mode in which there are some VANC lines in the frame buffer.
Definition: ntv2enums.h:3719
NTV2Standard
NTV2Standard
Identifies a particular video standard.
Definition: ntv2enums.h:153
NTV2_MAX_NUM_CHANNELS
@ NTV2_MAX_NUM_CHANNELS
Definition: ntv2enums.h:1315
CAPFAIL
#define CAPFAIL(_expr_)
Definition: ntv2democommon.h:28
NTV2_VANCMODE_OFF
@ NTV2_VANCMODE_OFF
This identifies the mode in which there are no VANC lines in the frame buffer.
Definition: ntv2enums.h:3718
CNTV2Card::SetSDIOutputAudioSystem
virtual bool SetSDIOutputAudioSystem(const NTV2Channel inSDIOutputConnector, const NTV2AudioSystem inAudioSystem)
Sets the device's NTV2AudioSystem that will provide audio for the given SDI output's audio embedder....
Definition: ntv2register.cpp:3949
AJATimeBase
Definition: timebase.h:18
CNTV2CaptionDecoder608::Get608ChannelDecoder
virtual CNTV2CaptionDecodeChannel608Ptr Get608ChannelDecoder(const NTV2Line21Channel inChannel) const
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
ULWord
uint32_t ULWord
Definition: ajatypes.h:253
CNTV2Card::EnableChannels
virtual bool EnableChannels(const NTV2ChannelSet &inChannels, const bool inDisableOthers=(0))
Enables the given FrameStore(s).
Definition: ntv2register.cpp:2107
NTV2_VANCDATA_8BITSHIFT_ENABLE
@ NTV2_VANCDATA_8BITSHIFT_ENABLE
Definition: ntv2enums.h:3736
AJASystemInfo::append
static AJALabelValuePairs & append(AJALabelValuePairs &inOutTable, const std::string &inLabel, const std::string &inValue=std::string())
A convenience function that appends the given label and value strings to the provided AJALabelValuePa...
Definition: info.h:168
AsConstUBytePtr
#define AsConstUBytePtr(__p__)
Definition: ntv2ccgrabber.cpp:28
NTV2FrameData::fVideoBuffer
NTV2Buffer fVideoBuffer
Host video buffer.
Definition: ntv2democommon.h:82
NTV2_VANCDATA_8BITSHIFT_DISABLE
@ NTV2_VANCDATA_8BITSHIFT_DISABLE
Definition: ntv2enums.h:3735
AUTOCIRCULATE_STATUS
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
Definition: ntv2publicinterface.h:7160
NTV2_CHANNEL7
@ NTV2_CHANNEL7
Specifies channel or Frame Store 7 (or the 7th item).
Definition: ntv2enums.h:1313
AJAAncillaryData
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
Definition: ancillarydata.h:552
NTV2FrameData::VideoBufferSize
ULWord VideoBufferSize(void) const
Definition: ntv2democommon.h:107
NTV2_CC608_CapModeUnknown
@ NTV2_CC608_CapModeUnknown
Unknown or invalid caption mode.
Definition: ntv2caption608types.h:126
NTV2CCGrabber::GetLine21ChannelNames
static std::string GetLine21ChannelNames(std::string inDelimiter=", ")
Returns a string containing a concatenation of human-readable names of every available NTV2Line21Chan...
Definition: ntv2ccgrabber.cpp:1563
NTV2ReferenceSource
NTV2ReferenceSource
These enum values identify a specific source for the device's (output) reference clock.
Definition: ntv2enums.h:1399
kCaptionDataSrc_608Anc
@ kCaptionDataSrc_608Anc
Definition: ntv2ccgrabber.h:51
AJAAncillaryData::GetPayloadData
virtual const uint8_t * GetPayloadData(void) const
Definition: ancillarydata.h:801
CNTV2Card::SetMode
virtual bool SetMode(const NTV2Channel inChannel, const NTV2Mode inNewValue, const bool inIsRetail=(!(0)))
Determines if a given FrameStore on the AJA device will be used to capture or playout video.
Definition: ntv2register.cpp:1607
kOutputMode_CaptionScreen
@ kOutputMode_CaptionScreen
Definition: ntv2ccgrabber.h:35
CNTV2DemoCommon::SetDefaultPageSize
static size_t SetDefaultPageSize(void)
Definition: ntv2democommon.cpp:1484
NTV2_CC608_Transparent
@ NTV2_CC608_Transparent
Definition: ntv2caption608types.h:217
NTV2DeviceIDToString
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4673
AJAAncillaryData_Cea608_Line21::ParsePayloadData
virtual AJAStatus ParsePayloadData(void)
Parses out (interprets) the "local" ancillary data from my payload data.
Definition: ancillarydata_cea608_line21.cpp:83
CNTV2Card::UnsubscribeInputVerticalEvent
virtual bool UnsubscribeInputVerticalEvent(const NTV2Channel inChannel=NTV2_CHANNEL1)
Unregisters me so I'm no longer notified when an input VBI is signaled on the given input channel.
Definition: ntv2subscriptions.cpp:75
GetCSCOutputXptFromChannel
NTV2OutputXptID GetCSCOutputXptFromChannel(const NTV2Channel inCSC, const bool inIsKey=false, const bool inIsRGB=false)
Definition: ntv2signalrouter.cpp:819
CNTV2CaptionDecoder708::GetNextServiceBlockInfoFromQueue
virtual bool GetNextServiceBlockInfoFromQueue(const size_t svcIndex, size_t &outBlockSize, size_t &outDataSize, int &outServiceNum, bool &outIsExtended) const
AJASystemInfo::ToString
virtual void ToString(std::string &outAllLabelsAndValues) const
Answers with a multi-line string that contains the complete host system info table.
AJAProcess::GetPid
static uint64_t GetPid()
Definition: process.cpp:35
NTV2FrameData::AncBufferSize
ULWord AncBufferSize(void) const
Definition: ntv2democommon.h:114
OutputMode
enum _OutputMode OutputMode
CNTV2CaptionDecoder608::SubscribeChangeNotification
virtual bool SubscribeChangeNotification(NTV2Caption608Changed *pInCallback, void *pInUserData=0)
Subscribes to change notifications.
CNTV2CaptionDecoder708::ParseSMPTE334AncPacket
virtual bool ParseSMPTE334AncPacket(bool &outHasParityErrors)
Parses the current frame's SMPTE 334 Ancillary packet and extracts the 608 and 708 caption data from ...
NTV2CCGrabber::SetupHostBuffers
virtual AJAStatus SetupHostBuffers(const NTV2VideoFormat inVideoFormat)
Sets up my circular buffers.
Definition: ntv2ccgrabber.cpp:200
CCGrabberConfig
This class is used to configure an NTV2CCGrabber instance.
Definition: ntv2ccgrabber.h:62
NTV2CCGrabber::Init
virtual AJAStatus Init(void)
Initializes me and prepares me to Run.
Definition: ntv2ccgrabber.cpp:119
CaptionData::HasData
bool HasData(void) const
Definition: ntv2caption608types.h:698
AUTOCIRCULATE_TRANSFER::GetCapturedAncByteCount
ULWord GetCapturedAncByteCount(const bool inField2=false) const
Definition: ntv2publicinterface.h:8346
NTV2_CHANNEL3
@ NTV2_CHANNEL3
Specifies channel or Frame Store 3 (or the 3rd item).
Definition: ntv2enums.h:1309
UWord
uint16_t UWord
Definition: ajatypes.h:251
AJACircularBuffer::StartProduceNextBuffer
FrameDataPtr StartProduceNextBuffer(void)
The thread that's responsible for providing frames – the producer – calls this function to populate t...
Definition: circularbuffer.h:109
CNTV2Card::AutoCirculateGetStatus
virtual bool AutoCirculateGetStatus(const NTV2Channel inChannel, AUTOCIRCULATE_STATUS &outStatus)
Returns the current AutoCirculate status for the given channel.
Definition: ntv2autocirculate.cpp:646
NTV2FrameData::AudioBufferSize
ULWord AudioBufferSize(void) const
Definition: ntv2democommon.h:110
NTV2FrameData::AncBuffer2Size
ULWord AncBuffer2Size(void) const
Definition: ntv2democommon.h:118
NTV2_IS_VANCMODE_ON
#define NTV2_IS_VANCMODE_ON(__v__)
Definition: ntv2enums.h:3727
NTV2_IS_VALID_INPUT_SOURCE
#define NTV2_IS_VALID_INPUT_SOURCE(_inpSrc_)
Definition: ntv2enums.h:1243
NTV2_FBF_8BIT_YCBCR
@ NTV2_FBF_8BIT_YCBCR
See 8-Bit YCbCr Format.
Definition: ntv2enums.h:211
CaptureConfig::fDeviceSpec
std::string fDeviceSpec
The AJA device to use.
Definition: ntv2democommon.h:268
NTV2CCGrabber::StartPlayThread
virtual AJAStatus StartPlayThread(void)
Starts my playout thread.
Definition: ntv2ccgrabber.cpp:1394
CCGrabberConfig::CaptionDataSrcToString
static std::string CaptionDataSrcToString(const CaptionDataSrc inDataSrc)
Definition: ntv2ccgrabber.cpp:1656
NTV2VideoFormatToString
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6750
NTV2FrameData::AudioBuffer
NTV2Buffer & AudioBuffer(void)
Definition: ntv2democommon.h:109
AJA_SUCCESS
#define AJA_SUCCESS(_status_)
Definition: types.h:370
GetCSCInputXptFromChannel
NTV2InputXptID GetCSCInputXptFromChannel(const NTV2Channel inCSC, const bool inIsKeyInput=false)
Definition: ntv2signalrouter.cpp:775
NTV2MIXERMODE_FOREGROUND_ON
@ NTV2MIXERMODE_FOREGROUND_ON
Passes only foreground video + key to the Mixer output.
Definition: ntv2enums.h:1738
kRedOnTransparentBG
static const NTV2Line21Attributes kRedOnTransparentBG(NTV2_CC608_Red, NTV2_CC608_Blue, NTV2_CC608_Transparent)
NTV2_IS_HD_VIDEO_FORMAT
#define NTV2_IS_HD_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:700
CCGrabberConfig::GetLegalCaptionDataSources
static std::string GetLegalCaptionDataSources(void)
Definition: ntv2ccgrabber.cpp:1643
AUTOCIRCULATE_STATUS::IsStopped
bool IsStopped(void) const
Definition: ntv2publicinterface.h:7276
NTV2_Wgt12GSDIOut4
@ NTV2_Wgt12GSDIOut4
Definition: ntv2enums.h:2954
CNTV2CaptionDecoder608::Create
static bool Create(CNTV2CaptionDecoder608Ptr &outEncoder)
Creates a new CNTV2CaptionEncoder608 instance.
operator<<
std::ostream & operator<<(std::ostream &ioStrm, const CCGrabberConfig &inObj)
Definition: ntv2ccgrabber.cpp:1695
NTV2WidgetID
NTV2WidgetID
Definition: ntv2enums.h:2847
NTV2_CC608_Green
@ NTV2_CC608_Green
Definition: ntv2caption608types.h:156
CNTV2DriverInterface::IsDeviceReady
virtual bool IsDeviceReady(const bool inCheckValid=(0))
Definition: ntv2driverinterface.cpp:1284
CaptionData::bGotField2Data
bool bGotField2Data
True if Field 2 bytes have been set; otherwise false.
Definition: ntv2caption608types.h:661
NTV2_XptHDMIOutQ1Input
@ NTV2_XptHDMIOutQ1Input
Definition: ntv2enums.h:2794
NTV2_RP188::fDBB
ULWord fDBB
Definition: ntv2publicinterface.h:6761
GetVideoWriteSize
ULWord GetVideoWriteSize(const NTV2VideoFormat inVideoFormat, const NTV2FrameBufferFormat inFBFormat, const NTV2VANCMode inVancMode=NTV2_VANCMODE_OFF)
Identical to the GetVideoActiveSize function, except rounds the result up to the nearest 4K page size...
Definition: ntv2utils.cpp:2775
CCGrabberConfig::GetLegalOutputModes
static std::string GetLegalOutputModes(void)
Definition: ntv2ccgrabber.cpp:1592
DeviceCapabilities::CanDoInputSource
bool CanDoInputSource(const NTV2InputSource inSrc)
Definition: ntv2devicecapabilities.h:233
NTV2ChannelSet
std::set< NTV2Channel > NTV2ChannelSet
A set of distinct NTV2Channel values.
Definition: ntv2publicinterface.h:3854
AJACircularBuffer::EndConsumeNextBuffer
void EndConsumeNextBuffer(void)
The consumer thread calls this function to signal that it has finished processing the frame it obtain...
Definition: circularbuffer.h:266
AUTOCIRCULATE_TRANSFER::acANCField2Buffer
NTV2Buffer acANCField2Buffer
The host "Field 2" ancillary data buffer. This field is owned by the client application,...
Definition: ntv2publicinterface.h:8006
CNTV2Card::SetTsiFrameEnable
virtual bool SetTsiFrameEnable(const bool inIsEnabled, const NTV2Channel inChannel)
Enables or disables SMPTE 425 two-sample interleave (Tsi) frame mode on the device.
Definition: ntv2register.cpp:1311
NTV2_FBF_FIRST
@ NTV2_FBF_FIRST
Definition: ntv2enums.h:209
IS_VALID_OutputMode
#define IS_VALID_OutputMode(_x_)
Definition: ntv2ccgrabber.h:42
CNTV2Card::GetReference
virtual bool GetReference(NTV2ReferenceSource &outRefSource)
Answers with the device's current clock reference source.
Definition: ntv2register.cpp:1523
kOutputMode_CaptionFileSCC
@ kOutputMode_CaptionFileSCC
Definition: ntv2ccgrabber.h:36
CNTV2Card::GetInputVideoFormat
virtual NTV2VideoFormat GetInputVideoFormat(const NTV2InputSource inVideoSource=NTV2_INPUTSOURCE_SDI1, const bool inIsProgressive=(0))
Returns the video format of the signal that is present on the given input source.
Definition: ntv2register.cpp:3365
CRP188
Definition: ntv2rp188.h:55
AUTOCIRCULATE_STATUS::GetEndFrame
uint16_t GetEndFrame(void) const
Definition: ntv2publicinterface.h:7251
GetDLInOutputXptFromChannel
NTV2OutputXptID GetDLInOutputXptFromChannel(const NTV2Channel inDLInput)
Definition: ntv2signalrouter.cpp:917
NTV2_AUDIOSIZE_MAX
#define NTV2_AUDIOSIZE_MAX
Definition: ntv2democommon.h:46
CNTV2Card::SetEveryFrameServices
virtual bool SetEveryFrameServices(const NTV2EveryFrameTaskMode inMode)
Sets the device's task mode.
Definition: ntv2register.cpp:179
CNTV2CaptionDecoder608::IdleFrame
virtual void IdleFrame(void)
Call this once per video frame when I'm doing display "burn-in", whether there is new caption data to...
NTV2StringList
std::vector< std::string > NTV2StringList
Definition: ntv2utils.h:1134
AsConstULWordPtr
#define AsConstULWordPtr(__p__)
Definition: ntv2ccgrabber.cpp:29
NTV2VANCMode
NTV2VANCMode
These enum values identify the available VANC modes.
Definition: ntv2enums.h:3716
AJALock
Definition: lock.h:30
CNTV2CaptionDecoder708::Reset
virtual void Reset(void)
IS_VALID_CaptionDataSrc
#define IS_VALID_CaptionDataSrc(_x_)
Definition: ntv2ccgrabber.h:56
NTV2FormatDescriptor::GetTotalRasterBytes
ULWord GetTotalRasterBytes(const UWord inPlaneIndex0=0) const
Definition: ntv2formatdescriptor.h:114
NTV2_CC608_ChannelMax
@ NTV2_CC608_ChannelMax
Definition: ntv2caption608types.h:97
AJA_NULL
#define AJA_NULL
Definition: ajatypes.h:197
NTV2_IS_VALID_CHANNEL
#define NTV2_IS_VALID_CHANNEL(__x__)
Definition: ntv2enums.h:1319
CaptureConfig::fFrames
NTV2ACFrameRange fFrames
AutoCirculate frame count or range.
Definition: ntv2democommon.h:272
NTV2_DISABLE_TASKS
@ NTV2_DISABLE_TASKS
0: Disabled: Device is completely configured by controlling application(s) – no driver involvement.
Definition: ntv2publicinterface.h:4290
NTV2CCGrabber::PlayThreadStatic
static void PlayThreadStatic(AJAThread *pThread, void *pContext)
This is the playout thread's static callback function that gets called when the playout thread runs....
Definition: ntv2ccgrabber.cpp:1409
NTV2_VANCMODE_INVALID
@ NTV2_VANCMODE_INVALID
This identifies the invalid (unspecified, uninitialized) VANC mode.
Definition: ntv2enums.h:3721
CNTV2DemoCommon::GetAJAFrameRate
static AJA_FrameRate GetAJAFrameRate(const NTV2FrameRate inFrameRate)
Definition: ntv2democommon.cpp:1011
CNTV2Card::SetMixerFGInputControl
virtual bool SetMixerFGInputControl(const UWord inWhichMixer, const NTV2MixerKeyerInputControl inInputControl)
Sets the foreground input control value for the given mixer/keyer.
Definition: ntv2register.cpp:2874
AJAAncillaryList::CompareWithInfo
virtual std::string CompareWithInfo(const AJAAncillaryList &inCompareList, const bool inIgnoreLocation=true, const bool inIgnoreChecksum=true) const
Compares me with another list and returns a std::string that contains a human-readable explanation of...
Definition: ancillarylist.cpp:482
NTV2CCGrabber::SetupInputVideo
virtual AJAStatus SetupInputVideo(void)
Sets up everything I need for capturing video.
Definition: ntv2ccgrabber.cpp:257
CaptureConfig::fInputChannel
NTV2Channel fInputChannel
The device channel to use.
Definition: ntv2democommon.h:270
NTV2Buffer::GetHostAddress
void * GetHostAddress(const ULWord inByteOffset, const bool inFromEnd=false) const
Definition: ntv2publicinterface.cpp:1686
NTV2OutputCrosspointID
NTV2OutputCrosspointID
Identifies a widget output, a signal source, that potentially can drive another widget's input (ident...
Definition: ntv2enums.h:2471
NTV2ChannelList
std::vector< NTV2Channel > NTV2ChannelList
An ordered sequence of NTV2Channel values.
Definition: ntv2publicinterface.h:3835
NTV2Buffer::GetHostPointer
void * GetHostPointer(void) const
Definition: ntv2publicinterface.h:6049
AJAAutoLock
Definition: lock.h:91
CNTV2VPID::IsStandardTwoSampleInterleave
virtual bool IsStandardTwoSampleInterleave(void) const
Definition: ntv2vpid.cpp:281
NTV2CCGrabber::ReleaseHostBuffers
virtual void ReleaseHostBuffers(void)
Releases my circular buffers.
Definition: ntv2ccgrabber.cpp:240
gSDIOutputs
static const NTV2WidgetID gSDIOutputs[]
Definition: ntv2ccgrabber.cpp:379
NTV2_FORMAT_UNKNOWN
@ NTV2_FORMAT_UNKNOWN
Definition: ntv2enums.h:498
NTV2CCGrabber::CaptureFrames
virtual void CaptureFrames(void)
Repeatedly captures frames using AutoCirculate (until global quit flag set).
Definition: ntv2ccgrabber.cpp:651
NTV2FrameData::fAudioBuffer
NTV2Buffer fAudioBuffer
Host audio buffer.
Definition: ntv2democommon.h:84
CNTV2CaptionDecoder708::GetNextServiceBlockFromQueue
virtual size_t GetNextServiceBlockFromQueue(const size_t svcIndex, std::vector< UByte > &outData)
NTV2_WgtHDMIOut1
@ NTV2_WgtHDMIOut1
Definition: ntv2enums.h:2884
ntv2captionrenderer.h
Declares the CNTV2CaptionRenderer class.
CNTV2Card::Connect
virtual bool Connect(const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, const bool inValidate=(0))
Connects the given widget signal input (sink) to the given widget signal output (source).
Definition: ntv2regroute.cpp:87
NTV2_FBF_10BIT_YCBCR
@ NTV2_FBF_10BIT_YCBCR
See 10-Bit YCbCr Format.
Definition: ntv2enums.h:210
NTV2_Wgt3GSDIOut4
@ NTV2_Wgt3GSDIOut4
Definition: ntv2enums.h:2872
NTV2CCGrabber::Caption608ChangedStatic
static void Caption608ChangedStatic(void *pInstance, const NTV2Caption608ChangeInfo &inChangeInfo)
This static function gets called whenever 608 captioning changes.
Definition: ntv2ccgrabber.cpp:1555
AJA_STATUS_INITIALIZE
@ AJA_STATUS_INITIALIZE
Definition: types.h:386
NTV2CCGrabber::WaitForStableInputSignal
virtual NTV2VideoFormat WaitForStableInputSignal(void)
Wait for a stable input signal, and return it.
Definition: ntv2ccgrabber.cpp:827
CNTV2CaptionDecoder608::SetDisplayChannel
virtual bool SetDisplayChannel(const NTV2Line21Channel inChannel)
Changes the caption channel that I'm focused on (or that I'm currently "burning" into video).
DEC
#define DEC(__x__)
Definition: ntv2publicinterface.h:5605
NTV2Line21ChannelToStr
const std::string & NTV2Line21ChannelToStr(const NTV2Line21Channel inLine21Channel, const bool inCompact=true)
Converts the given NTV2Line21Channel value into a human-readable string.
CNTV2Card::SetSDIOutputStandard
virtual bool SetSDIOutputStandard(const UWord inOutputSpigot, const NTV2Standard inValue)
Sets the SDI output spigot's video standard.
Definition: ntv2register.cpp:3200
kCaptionDataSrc_708Anc
@ kCaptionDataSrc_708Anc
Definition: ntv2ccgrabber.h:52
kOutputMode_CaptionStream
@ kOutputMode_CaptionStream
Definition: ntv2ccgrabber.h:34
CNTV2Card::DisableChannels
virtual bool DisableChannels(const NTV2ChannelSet &inChannels)
Disables the given FrameStore(s).
Definition: ntv2register.cpp:2087
false
#define false
Definition: ntv2devicefeatures.h:25
UByte
uint8_t UByte
Definition: ajatypes.h:248
AUTOCIRCULATE_WITH_RP188
#define AUTOCIRCULATE_WITH_RP188
Use this to AutoCirculate with RP188.
Definition: ntv2publicinterface.h:5521
NTV2CCGrabber::~NTV2CCGrabber
virtual ~NTV2CCGrabber()
Definition: ntv2ccgrabber.cpp:80
CNTV2Card::SetMixerVancOutputFromForeground
virtual bool SetMixerVancOutputFromForeground(const UWord inWhichMixer, const bool inFromForegroundSource=(!(0)))
Sets the VANC source for the given mixer/keyer to the foreground video (or not). See the SDI Ancillar...
Definition: ntv2register.cpp:2853
CAPWARN
#define CAPWARN(_expr_)
Definition: ntv2democommon.h:29
NTV2ACFrameRange::lastFrame
UWord lastFrame(void) const
Definition: ntv2utils.h:976
ConvertLine_v210_to_2vuy
bool ConvertLine_v210_to_2vuy(const ULWord *pInSrcLine_v210, UByte *pOutDstLine_2vuy, const ULWord inNumPixels)
Converts a single 10-bit YCbCr 'v210' raster line to 8-bit YCbCr '2vuy'.
Definition: ntv2transcode.cpp:49
AUTOCIRCULATE_STATUS::IsRunning
bool IsRunning(void) const
Definition: ntv2publicinterface.h:7266
GetFrameBufferOutputXptFromChannel
NTV2OutputXptID GetFrameBufferOutputXptFromChannel(const NTV2Channel inFrameStore, const bool inIsRGB=false, const bool inIs425=false)
Definition: ntv2signalrouter.cpp:845
CRP188::GetRP188CString
const char * GetRP188CString() const
Definition: ntv2rp188.cpp:924
NTV2CCGrabber::SetCaptionDisplayChannel
virtual void SetCaptionDisplayChannel(const NTV2Line21Channel inNewChannel)
Changes the caption channel I'm displaying.
Definition: ntv2ccgrabber.cpp:1533
NTV2_AUDIO_LOOPBACK_ON
@ NTV2_AUDIO_LOOPBACK_ON
Embeds SDI input source audio into the data stream.
Definition: ntv2enums.h:1976
NTV2_RP188::IsValid
bool IsValid(void) const
Answers true if I'm valid, or false if I'm not valid.
Definition: ntv2publicinterface.h:6802
ancillarydata_cea608_vanc.h
Declares the AJAAncillaryData_Cea608_Vanc class.
NTV2FrameBufferFormatToString
std::string NTV2FrameBufferFormatToString(const NTV2FrameBufferFormat inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6940
AJAAncillaryData::ParsePayloadData
virtual AJAStatus ParsePayloadData(void)
Parses (interprets) the "local" ancillary data from my payload data.
Definition: ancillarydata.cpp:501
NTV2MIXERINPUTCONTROL_FULLRASTER
@ NTV2MIXERINPUTCONTROL_FULLRASTER
Definition: ntv2enums.h:1723
NTV2CCGrabber
I can decode captions from frames captured from an AJA device in real time. I can optionally play the...
Definition: ntv2ccgrabber.h:111
AJACircularBuffer::Clear
void Clear(void)
Clears my frame collection, their locks, everything.
Definition: circularbuffer.h:314
NTV2XptConnections
std::map< NTV2InputXptID, NTV2OutputXptID > NTV2XptConnections
Definition: ntv2signalrouter.h:39
GetTSIMuxOutputXptFromChannel
NTV2OutputXptID GetTSIMuxOutputXptFromChannel(const NTV2Channel inTSIMuxer, const bool inLinkB=false, const bool inIsRGB=false)
Definition: ntv2signalrouter.cpp:1005
AJA_STATUS_BAD_PARAM
@ AJA_STATUS_BAD_PARAM
Definition: types.h:392
CNTV2VPID::GetVideoFormat
virtual NTV2VideoFormat GetVideoFormat(void) const
Definition: ntv2vpid.cpp:674
NTV2Line21Channel
NTV2Line21Channel
The CEA-608 caption channels: CC1 thru CC4, TX1 thru TX4, plus XDS.
Definition: ntv2caption608types.h:82
CNTV2Card::WaitForOutputVerticalInterrupt
virtual bool WaitForOutputVerticalInterrupt(const NTV2Channel inChannel=NTV2_CHANNEL1, UWord inRepeatCount=1)
Efficiently sleeps the calling thread/process until the next one or more field (interlaced video) or ...
Definition: ntv2subscriptions.cpp:134
NTV2CCGrabber::Switch608Source
virtual void Switch608Source(void)
Switches/rotates –608src.
Definition: ntv2ccgrabber.cpp:954
NTV2MakeChannelSet
NTV2ChannelSet NTV2MakeChannelSet(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
Definition: ntv2publicinterface.cpp:3357
std
Definition: json.hpp:5362
NTV2_RP188
This struct replaces the old RP188_STRUCT.
Definition: ntv2publicinterface.h:6760
AUTOCIRCULATE_TRANSFER::acVideoBuffer
NTV2Buffer acVideoBuffer
The host video buffer. This field is owned by the client application, and thus is responsible for all...
Definition: ntv2publicinterface.h:7977
CNTV2Card::SetMixerMode
virtual bool SetMixerMode(const UWord inWhichMixer, const NTV2MixerKeyerMode inMode)
Sets the mode for the given mixer/keyer.
Definition: ntv2register.cpp:2920
IsRGBFormat
bool IsRGBFormat(const NTV2FrameBufferFormat format)
Definition: ntv2utils.cpp:5442
NTV2_Wgt3GSDIOut6
@ NTV2_Wgt3GSDIOut6
Definition: ntv2enums.h:2919
NTV2_AUDIO_EMBEDDED
@ NTV2_AUDIO_EMBEDDED
Obtain audio samples from the audio that's embedded in the video HANC.
Definition: ntv2enums.h:1952
CNTV2Card::AutoCirculateTransfer
virtual bool AutoCirculateTransfer(const NTV2Channel inChannel, AUTOCIRCULATE_TRANSFER &transferInfo)
Transfers all or part of a frame as specified in the given AUTOCIRCULATE_TRANSFER object to/from the ...
Definition: ntv2autocirculate.cpp:695
AJAAncDataType_Cea708
@ AJAAncDataType_Cea708
CEA708 (SMPTE 334) HD Closed Captioning.
Definition: ancillarydata.h:50
NTV2_WgtHDMIOut1v2
@ NTV2_WgtHDMIOut1v2
Definition: ntv2enums.h:2908
CNTV2Card::AutoCirculateInitForOutput
virtual bool AutoCirculateInitForOutput(const NTV2Channel inChannel, const UWord inFrameCount=7, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_INVALID, const ULWord inOptionFlags=0, const UByte inNumChannels=1, const UWord inStartFrameNumber=0, const UWord inEndFrameNumber=0)
Prepares for subsequent AutoCirculate playout, designating a contiguous block of frame buffers on the...
Definition: ntv2autocirculate.cpp:353
NTV2VideoFormat
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
Hex0N
#define Hex0N(__x__, __n__)
Definition: ntv2publicinterface.h:5597
CNTV2CaptionDecoder608::ProcessNew608FrameData
virtual bool ProcessNew608FrameData(const CaptionData &inCC608Data)
Notifies me that new frame data has arrived. Clients should call this method once per video frame wit...
kCaptionDataSrc_Default
@ kCaptionDataSrc_Default
Definition: ntv2ccgrabber.h:47
CNTV2VPID::IsRGBSampling
virtual bool IsRGBSampling(void) const
Definition: ntv2vpid.cpp:414
NTV2_WgtSDIOut3
@ NTV2_WgtSDIOut3
Definition: ntv2enums.h:2867
NTV2_WgtAnalogOut1
@ NTV2_WgtAnalogOut1
Definition: ntv2enums.h:2881
CIRCULAR_BUFFER_SIZE
static const size_t CIRCULAR_BUFFER_SIZE(10)
Number of NTV2FrameData's in our ring.
CNTV2MacDriverInterface::AcquireStreamForApplication
virtual bool AcquireStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Reserves exclusive use of the AJA device for a given process, preventing other processes on the host ...
Definition: ntv2macdriverinterface.cpp:481
kCaptionDataSrc_Line21
@ kCaptionDataSrc_Line21
Definition: ntv2ccgrabber.h:48
DeviceCapabilities::CanDoWidget
bool CanDoWidget(const NTV2WidgetID inWgtID)
Definition: ntv2devicecapabilities.h:260
NTV2CCGrabber::RouteInputSignal
virtual bool RouteInputSignal(const NTV2VideoFormat inVideoFormat)
Definition: ntv2ccgrabber.cpp:389
true
#define true
Definition: ntv2devicefeatures.h:26
CNTV2DriverInterface::GetDeviceID
virtual NTV2DeviceID GetDeviceID(void)
Definition: ntv2driverinterface.cpp:381
AUTOCIRCULATE_STATUS::HasAvailableInputFrame
bool HasAvailableInputFrame(void) const
Definition: ntv2publicinterface.h:7236
CCGrabberConfig::OutputModeToString
static std::string OutputModeToString(const OutputMode inMode)
Definition: ntv2ccgrabber.cpp:1605
NTV2_Wgt12GSDIOut2
@ NTV2_Wgt12GSDIOut2
Definition: ntv2enums.h:2952
CNTV2Card::GetEveryFrameServices
virtual bool GetEveryFrameServices(NTV2EveryFrameTaskMode &outMode)
Retrieves the device's current "retail service" task mode.
Definition: ntv2register.cpp:184
kGreenOnTransparentBG
static const NTV2Line21Attributes kGreenOnTransparentBG(NTV2_CC608_Green, NTV2_CC608_Blue, NTV2_CC608_Transparent)
CNTV2Card::DMAWriteFrame
virtual bool DMAWriteFrame(const ULWord inFrameNumber, const ULWord *pInFrameBuffer, const ULWord inByteCount)
Transfers a single frame from the host to the AJA device.
Definition: ntv2dma.cpp:65
NTV2FrameData::UnlockAll
bool UnlockAll(CNTV2Card &inDevice)
Definition: ntv2democommon.cpp:408
CNTV2Card::SetEnableVANCData
virtual bool SetEnableVANCData(const bool inVANCenabled, const bool inTallerVANC, const NTV2Standard inStandard, const NTV2FrameGeometry inGeometry, const NTV2Channel inChannel=NTV2_CHANNEL1)
Definition: ntv2register.cpp:2720
CNTV2VPID::SetVPID
virtual CNTV2VPID & SetVPID(const ULWord inData)
Definition: ntv2vpid.h:71
NTV2_CC708PrimaryCaptionServiceNum
const int NTV2_CC708PrimaryCaptionServiceNum
Definition: ntv2caption708serviceinfo.h:18
AJACircularBuffer::SetAbortFlag
void SetAbortFlag(const bool *pAbortFlag)
Tells me the boolean variable I should monitor such that when it gets set to "true" will cause any th...
Definition: circularbuffer.h:51
AJAAncillaryData_Cea608_Vanc
This class handles VANC-based CEA-608 caption data packets (not "analog" Line 21).
Definition: ancillarydata_cea608_vanc.h:26
NTV2ChannelToString
std::string NTV2ChannelToString(const NTV2Channel inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5759
NTV2_INPUT_SOURCE_IS_SDI
#define NTV2_INPUT_SOURCE_IS_SDI(_inpSrc_)
Definition: ntv2enums.h:1242
NTV2_IS_VANCMODE_TALL
#define NTV2_IS_VANCMODE_TALL(__v__)
Definition: ntv2enums.h:3725
kCaptionDataSrc_708FBVanc
@ kCaptionDataSrc_708FBVanc
Definition: ntv2ccgrabber.h:50
GetNTV2StandardFromVideoFormat
NTV2Standard GetNTV2StandardFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:2277
ancillarydata_cea708.h
Declares the AJAAncillaryData_Cea708 class.
CNTV2Line21Captioner::DecodeLine
static bool DecodeLine(const UByte *pLineData, UByte &outChar1, UByte &outChar2)
Decodes the supplied line of 8-bit uncompressed ('2vuy') data and, if successful, returns the two 8-b...
NTV2Buffer::Fill
bool Fill(const T &inValue)
Fills me with the given scalar value.
Definition: ntv2publicinterface.h:6218
AJAThread::SetPriority
virtual AJAStatus SetPriority(AJAThreadPriority priority)
Definition: thread.cpp:133
CNTV2Card::AutoCirculateStart
virtual bool AutoCirculateStart(const NTV2Channel inChannel, const ULWord64 inStartTime=0)
Starts AutoCirculating the specified channel that was previously initialized by CNTV2Card::AutoCircul...
Definition: ntv2autocirculate.cpp:503
CaptionData::bGotField1Data
bool bGotField1Data
True if Field 1 bytes have been set; otherwise false.
Definition: ntv2caption608types.h:657
CNTV2Card::SetReference
virtual bool SetReference(const NTV2ReferenceSource inRefSource, const bool inKeepFramePulseSelect=(0))
Sets the device's clock reference source. See Video Output Clocking & Synchronization for more inform...
Definition: ntv2register.cpp:1484
GetDLOutInputXptFromChannel
NTV2InputXptID GetDLOutInputXptFromChannel(const NTV2Channel inDLOutWidget)
Definition: ntv2signalrouter.cpp:808
NTV2Line21Attributes
CEA-608 Character Attributes.
Definition: ntv2caption608types.h:357
AJA_STATUS_OPEN
@ AJA_STATUS_OPEN
Definition: types.h:388
CCGrabberConfig::fUseVanc
bool fUseVanc
If true, use Vanc, even if the device supports Anc insertion.
Definition: ntv2ccgrabber.h:70
CaptionData
This structure encapsulates all possible CEA-608 caption data bytes that may be associated with a giv...
Definition: ntv2caption608types.h:655
NTV2FrameData::LockAll
bool LockAll(CNTV2Card &inDevice)
Definition: ntv2democommon.cpp:387
gMixerNums
static const UWord gMixerNums[]
Definition: ntv2ccgrabber.cpp:1285
AUTOCIRCULATE_TRANSFER::GetInputTimeCodes
bool GetInputTimeCodes(NTV2TimeCodeList &outValues) const
Intended for capture, answers with the timecodes captured in my acTransferStatus member's acFrameStam...
Definition: ntv2publicinterface.cpp:2834
CNTV2Card::SetNumberAudioChannels
virtual bool SetNumberAudioChannels(const ULWord inNumChannels, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Sets the number of audio channels to be concurrently captured or played for a given Audio System on t...
Definition: ntv2audio.cpp:146
CNTV2Card::SetAudioBufferSize
virtual bool SetAudioBufferSize(const NTV2AudioBufferSize inValue, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Changes the size of the audio buffer that is used for a given Audio System in the AJA device.
Definition: ntv2audio.cpp:249
AJAThread::Start
virtual AJAStatus Start()
Definition: thread.cpp:91
CNTV2DemoCommon::StripFormatString
static std::string StripFormatString(const std::string &inStr)
Definition: ntv2democommon.cpp:933
NTV2ReferenceSourceToString
std::string NTV2ReferenceSourceToString(const NTV2ReferenceSource inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7258
CaptionData::f2_char2
UByte f2_char2
Caption Byte 2 of Field 2.
Definition: ntv2caption608types.h:663
CCGrabberConfig::StringToCaptionDataSrc
static CaptionDataSrc StringToCaptionDataSrc(const std::string &inDataSrcStr)
Definition: ntv2ccgrabber.cpp:1671
AJALabelValuePairs
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:69
BIT
#define BIT(_x_)
Definition: ajatypes.h:561
CNTV2Card::SubscribeInputVerticalEvent
virtual bool SubscribeInputVerticalEvent(const NTV2Channel inChannel=NTV2_CHANNEL1)
Causes me to be notified when an input vertical blanking interrupt occurs on the given input channel.
Definition: ntv2subscriptions.cpp:39
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5604
AJA_FAILURE
#define AJA_FAILURE(_status_)
Definition: types.h:371
NTV2_IS_VALID_AUDIO_SYSTEM
#define NTV2_IS_VALID_AUDIO_SYSTEM(__x__)
Definition: ntv2enums.h:3833
NTV2CCGrabber::CaptureThreadStatic
static void CaptureThreadStatic(AJAThread *pThread, void *pContext)
This is the capture thread's static callback function that gets called when the capture thread runs....
Definition: ntv2ccgrabber.cpp:639
AJAAncDataType_Cea608_Line21
@ AJAAncDataType_Cea608_Line21
CEA608 SD Closed Captioning ("Line 21" waveform)
Definition: ancillarydata.h:52
CNTV2CaptionDecoder708::SetSMPTE334AncData
virtual bool SetSMPTE334AncData(const AJAAncillaryData_Cea708 &inPacket)
Copies the given SMPTE 334 CDP data from the given ancillary data packet into my private CDP buffer.
Definition: ntv2captiondecoder708.h:106
CNTV2Card::EnableChannel
virtual bool EnableChannel(const NTV2Channel inChannel)
Enables the given FrameStore.
Definition: ntv2register.cpp:2097
NTV2_MODE_DISPLAY
@ NTV2_MODE_DISPLAY
Playout (output) mode, which reads from device SDRAM.
Definition: ntv2enums.h:1200
DeviceCapabilities::CanDoFrameBufferFormat
bool CanDoFrameBufferFormat(const NTV2PixelFormat inPF)
Definition: ntv2devicecapabilities.h:223
NTV2FrameData::AncBuffer
NTV2Buffer & AncBuffer(void)
Definition: ntv2democommon.h:113
NTV2FormatDescriptor::GetFullRasterHeight
ULWord GetFullRasterHeight(void) const
Definition: ntv2formatdescriptor.h:175
NTV2ChannelToAudioSystem
NTV2AudioSystem NTV2ChannelToAudioSystem(const NTV2Channel inChannel)
Converts the given NTV2Channel value into its equivalent NTV2AudioSystem.
Definition: ntv2utils.cpp:4927
AUTOCIRCULATE_TRANSFER::acANCBuffer
NTV2Buffer acANCBuffer
The host ancillary data buffer. This field is owned by the client application, and thus is responsibl...
Definition: ntv2publicinterface.h:7995
NTV2_XptAnalogOutInput
@ NTV2_XptAnalogOutInput
Definition: ntv2enums.h:2810
NTV2CCGrabber::NTV2CCGrabber
NTV2CCGrabber(const CCGrabberConfig &inConfigData)
Constructs me using the given configuration settings.
Definition: ntv2ccgrabber.cpp:40
NTV2CCGrabber::RouteOutputSignal
virtual bool RouteOutputSignal(const NTV2VideoFormat inVideoFormat)
Definition: ntv2ccgrabber.cpp:1314
CCGrabberConfig::fBurnCaptions
bool fBurnCaptions
If true, burn-in captions on 2nd channel.
Definition: ntv2ccgrabber.h:69
CNTV2Card::AutoCirculateStop
virtual bool AutoCirculateStop(const NTV2Channel inChannel, const bool inAbort=(0))
Stops AutoCirculate for the given channel, and releases the on-device frame buffers that were allocat...
Definition: ntv2autocirculate.cpp:519
GetTSIMuxInputXptFromChannel
NTV2InputXptID GetTSIMuxInputXptFromChannel(const NTV2Channel inTSIMuxer, const bool inLinkB=false)
Definition: ntv2signalrouter.cpp:993
memory.h
Declares the AJAMemory class.
DEVICE_ID_NOTFOUND
@ DEVICE_ID_NOTFOUND
Invalid or "not found".
Definition: ntv2enums.h:90
NTV2_ANCSIZE_MAX
#define NTV2_ANCSIZE_MAX
Definition: ntv2democommon.h:47
CaptureConfig::fInputSource
NTV2InputSource fInputSource
The device input connector to use.
Definition: ntv2democommon.h:271
CAPNOTE
#define CAPNOTE(_expr_)
Definition: ntv2democommon.h:31
CaptionData::f1_char1
UByte f1_char1
Caption Byte 1 of Field 1.
Definition: ntv2caption608types.h:658
AUTOCIRCULATE_TRANSFER::SetBuffers
bool SetBuffers(ULWord *pInVideoBuffer, const ULWord inVideoByteCount, ULWord *pInAudioBuffer, const ULWord inAudioByteCount, ULWord *pInANCBuffer, const ULWord inANCByteCount, ULWord *pInANCF2Buffer=NULL, const ULWord inANCF2ByteCount=0)
Sets my buffers for use in a subsequent call to CNTV2Card::AutoCirculateTransfer.
Definition: ntv2publicinterface.cpp:2696
CNTV2CaptionDecoder608::GetDisplayChannel
virtual NTV2Line21Channel GetDisplayChannel(void) const
Answers with the caption channel that I'm currently focused on (or that I'm currently "burning" into ...
Definition: ntv2captiondecoder608.h:108
CNTV2CaptionDecoder708::GetDisplayChannel
virtual NTV2Line21Channel GetDisplayChannel(void) const
Answers with the caption channel that I'm currently focused on (or that I'm currently "burning" into ...
Definition: ntv2captiondecoder708.h:98
NTV2_OEM_TASKS
@ NTV2_OEM_TASKS
2: OEM: Device is configured by controlling application(s), with minimal driver involvement.
Definition: ntv2publicinterface.h:4292
GetDLOutOutputXptFromChannel
NTV2OutputXptID GetDLOutOutputXptFromChannel(const NTV2Channel inDLOutput, const bool inIsLinkB=false)
Definition: ntv2signalrouter.cpp:905
NTV2CCGrabber::ToggleVANC
virtual void ToggleVANC(void)
Toggles the use of VANC. (Debug, experimental)
Definition: ntv2ccgrabber.cpp:936
kOutputMode_Stats
@ kOutputMode_Stats
Definition: ntv2ccgrabber.h:38
AJATimeCode
Utility class for timecodes.
Definition: timecode.h:17
AJAAncillaryList::SetFromVANCData
static AJAStatus SetFromVANCData(const NTV2Buffer &inFrameBuffer, const NTV2FormatDescriptor &inFormatDesc, AJAAncillaryList &outPackets, const uint32_t inFrameNum=0)
Returns all packets found in the VANC lines of the given NTV2 frame buffer.
Definition: ancillarylist.cpp:880
NTV2FrameData::fTimecodes
NTV2TimeCodes fTimecodes
Map of TC indexes to NTV2_RP188 values.
Definition: ntv2democommon.h:87
CNTV2Card::SetAudioRate
virtual bool SetAudioRate(const NTV2AudioRate inRate, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Sets the NTV2AudioRate for the given Audio System.
Definition: ntv2audio.cpp:205
NTV2_FBF_LAST
@ NTV2_FBF_LAST
Definition: ntv2enums.h:243
NTV2_AUDIOSYSTEM_INVALID
@ NTV2_AUDIOSYSTEM_INVALID
Definition: ntv2enums.h:3826
CNTV2CaptionDecoder608::UnsubscribeChangeNotification
virtual bool UnsubscribeChangeNotification(NTV2Caption608Changed *pInCallback, void *pInUserData=0)
Unsubscribes a prior change notification subscription.