AJA NTV2 SDK  17.5.0.1658
NTV2 SDK 17.5.0.1658
ntv2player4k.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2player4k.h"
9 #include "ntv2debug.h"
10 #include "ntv2devicescanner.h"
11 #include "ntv2testpatterngen.h"
13 #include "ajabase/system/process.h"
17 
18 using namespace std;
19 
20 //#define NTV2_BUFFER_LOCKING // Define this to pre-lock video/audio buffers in kernel
21 
22 // Convenience macros for EZ logging:
23 #define TCFAIL(_expr_) AJA_sERROR (AJA_DebugUnit_TimecodeGeneric, AJAFUNC << ": " << _expr_)
24 #define TCWARN(_expr_) AJA_sWARNING(AJA_DebugUnit_TimecodeGeneric, AJAFUNC << ": " << _expr_)
25 #define TCNOTE(_expr_) AJA_sNOTICE (AJA_DebugUnit_TimecodeGeneric, AJAFUNC << ": " << _expr_)
26 #define TCINFO(_expr_) AJA_sINFO (AJA_DebugUnit_TimecodeGeneric, AJAFUNC << ": " << _expr_)
27 #define TCDBG(_expr_) AJA_sDEBUG (AJA_DebugUnit_TimecodeGeneric, AJAFUNC << ": " << _expr_)
28 
34 static ULWord gAncMaxSizeBytes (NTV2_ANCSIZE_MAX); // Max per-frame anc buffer size, in bytes
35 
44 static const uint32_t gAudMaxSizeBytes (256 * 1024); // Max per-frame audio buffer size, in bytes
45 
46 static const bool BUFFER_PAGE_ALIGNED (true);
47 
48 // Audio tone generator data
49 static const double gFrequencies [] = {250.0, 500.0, 1000.0, 2000.0};
50 static const ULWord gNumFrequencies (sizeof(gFrequencies) / sizeof(double));
51 // Unlike NTV2Player, this demo uses the same waveform amplitude in each audio channel
52 
53 
55  : mConfig (inConfig),
56  mConsumerThread (),
57  mProducerThread (),
58  mDevice (),
59  mDeviceID (DEVICE_ID_INVALID),
60  mSavedTaskMode (NTV2_TASK_MODE_INVALID),
61  mCurrentFrame (0),
62  mCurrentSample (0),
63  mToneFrequency (440.0),
64  mAudioSystem (NTV2_AUDIOSYSTEM_INVALID),
65  mFormatDesc (),
66  mGlobalQuit (false),
67  mTCBurner (),
68  mHostBuffers (),
69  mFrameDataRing (),
70  mTestPatRasters ()
71 {
72 }
73 
74 
76 {
77  // Stop my playout and producer threads, then destroy them...
78  Quit();
79 
80  mDevice.UnsubscribeOutputVerticalEvent(mConfig.fOutputChannel); // Unsubscribe from output VBI event
81 } // destructor
82 
83 
84 void NTV2Player4K::Quit (void)
85 {
86  // Set the global 'quit' flag, and wait for the threads to go inactive...
87  mGlobalQuit = true;
88 
89  while (mProducerThread.Active())
90  AJATime::Sleep(10);
91 
92  while (mConsumerThread.Active())
93  AJATime::Sleep(10);
94 
95 #if defined(NTV2_BUFFER_LOCKING)
96  mDevice.DMABufferUnlockAll();
97 #endif // NTV2_BUFFER_LOCKING
98  if (!mConfig.fDoMultiFormat && mDevice.IsOpen())
99  {
101  if (NTV2_IS_VALID_TASK_MODE(mSavedTaskMode))
102  mDevice.SetEveryFrameServices(mSavedTaskMode); // Restore prior task mode
103  }
104 } // Quit
105 
106 
108 {
109  AJAStatus status (AJA_STATUS_SUCCESS);
110 
111  // Open the device...
113  {cerr << "## ERROR: Device '" << mConfig.fDeviceSpec << "' not found" << endl; return AJA_STATUS_OPEN;}
114  mDeviceID = mDevice.GetDeviceID(); // Keep this ID handy -- it's used frequently
115 
116  if (!mDevice.IsDeviceReady(false))
117  {cerr << "## ERROR: Device '" << mConfig.fDeviceSpec << "' not ready" << endl; return AJA_STATUS_INITIALIZE;}
118  if (!mDevice.features().CanDoPlayback())
119  {cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' is capture-only" << endl; return AJA_STATUS_FEATURE;}
120 
121  const UWord maxNumChannels (mDevice.features().GetNumFrameStores());
122 
123  // Check for an invalid configuration
124  if (NTV2_IS_4K_HFR_VIDEO_FORMAT(mConfig.fVideoFormat) && mConfig.fDoRGBOnWire)
125  {cerr << "## ERROR: HFR RGB output not supported" << endl; return AJA_STATUS_BAD_PARAM;}
126 
127  // Check for valid channel...
128  if (UWord(mConfig.fOutputChannel) >= maxNumChannels)
129  {
130  cerr << "## ERROR: Cannot use channel '" << DEC(mConfig.fOutputChannel+1) << "' -- device only supports channel 1"
131  << (maxNumChannels > 1 ? string(" thru ") + string(1, char(maxNumChannels+'0')) : "") << endl;
132  return AJA_STATUS_UNSUPPORTED;
133  }
134  if (mDevice.features().CanDo12gRouting())
135  {
136  if (mConfig.fDoTsiRouting)
137  cerr << "## WARNING: '--tsi' option used with device that has 12G FrameStores with integral Tsi muxers" << endl;
138  mConfig.fDoTsiRouting = false; // Kona5 & Corvid44/12G FrameStores have built-in TSI muxers for easier routing
139  }
140  else if (mConfig.fDoTsiRouting)
141  {
142  if (mConfig.fOutputChannel & 1)
143  {
144  cerr << "## ERROR: Tsi requires Ch" << DEC(mConfig.fOutputChannel-1) << " -- not Ch" << DEC(mConfig.fOutputChannel) << endl;
145  return AJA_STATUS_BAD_PARAM;
146  }
147  }
148  else if (mConfig.fOutputChannel != NTV2_CHANNEL1 && mConfig.fOutputChannel != NTV2_CHANNEL5)
149  {
150  cerr << "## ERROR: Squares requires Ch1 or Ch5, not Ch" << DEC(mConfig.fOutputChannel) << endl;
151  return AJA_STATUS_BAD_PARAM;
152  }
153 
154  if (!mConfig.fDoMultiFormat)
155  {
156  mDevice.GetEveryFrameServices(mSavedTaskMode); // Save the current task mode
158  return AJA_STATUS_BUSY; // Device is in use by another app -- fail
159  }
160  mDevice.SetEveryFrameServices(NTV2_OEM_TASKS); // Set OEM service level
161 
162  if (mDevice.features().CanDoMultiFormat())
163  mDevice.SetMultiFormatMode(mConfig.fDoMultiFormat);
164  else
165  mConfig.fDoMultiFormat = false;
166 
167  // Set up the video and audio...
168  status = SetUpVideo();
169  if (AJA_FAILURE(status))
170  return status;
171  status = mConfig.WithAudio() ? SetUpAudio() : AJA_STATUS_SUCCESS;
172  if (AJA_FAILURE(status))
173  return status;
174 
175  // Set up the circular buffers, and the test pattern buffers...
176  status = SetUpHostBuffers();
177  if (AJA_FAILURE(status))
178  return status;
179  status = SetUpTestPatternBuffers();
180  if (AJA_FAILURE(status))
181  return status;
182 
183  // Set up the device signal routing...
184  if (!RouteOutputSignal())
185  return AJA_STATUS_FAIL;
186 
187  // Lastly, prepare my AJATimeCodeBurn instance...
188  if (!mTCBurner.RenderTimeCodeFont (CNTV2DemoCommon::GetAJAPixelFormat(mConfig.fPixelFormat), mFormatDesc.numPixels, mFormatDesc.numLines))
189  {cerr << "## ERROR: RenderTimeCodeFont failed for: " << mFormatDesc << endl; return AJA_STATUS_UNSUPPORTED;}
190 
191  // Ready to go...
192  #if defined(_DEBUG)
193  cerr << mConfig;
194  if (mDevice.IsRemote())
195  cerr << "Device Description: " << mDevice.GetDescription() << endl;
196  cerr << endl;
197  #endif // defined(_DEBUG)
198  return AJA_STATUS_SUCCESS;
199 
200 } // Init
201 
202 
204 {
205  // Configure the device to output the requested video format...
206  if (mConfig.fVideoFormat == NTV2_FORMAT_UNKNOWN)
207  return AJA_STATUS_BAD_PARAM;
208  if (!mDevice.features().CanDoVideoFormat(mConfig.fVideoFormat))
209  { cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' doesn't support "
210  << ::NTV2VideoFormatToString(mConfig.fVideoFormat) << endl;
211  return AJA_STATUS_UNSUPPORTED;
212  }
213  if (!mDevice.features().CanDoFrameBufferFormat(mConfig.fPixelFormat))
214  { cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' doesn't support "
215  << ::NTV2FrameBufferFormatString(mConfig.fPixelFormat) << endl;
216  return AJA_STATUS_UNSUPPORTED;
217  }
218 
219  NTV2ChannelSet channels1357, channels15, frameStores;
220  channels1357.insert(NTV2_CHANNEL1); channels1357.insert(NTV2_CHANNEL3); channels1357.insert(NTV2_CHANNEL5); channels1357.insert(NTV2_CHANNEL7);
221  channels15.insert(NTV2_CHANNEL1); channels15.insert(NTV2_CHANNEL5);
222  if (mDevice.features().CanDo12gRouting())
223  frameStores = ::NTV2MakeChannelSet (mConfig.fOutputChannel, 1); // 1 x 12G FrameStore (fOutputChannel)
224  else if (mConfig.fDoTsiRouting)
225  { // "Tsi" routing requires 2 FrameStores
226  if (channels1357.find(mConfig.fOutputChannel) == channels1357.end())
227  return AJA_STATUS_BAD_PARAM; // fOutputChannel not Ch1, Ch3, Ch5 or Ch7
228  frameStores = ::NTV2MakeChannelSet (mConfig.fOutputChannel, 2); // 2 x FrameStores starting at Ch1, Ch3, Ch5 or Ch7
229  }
230  else
231  { // "Squares" routing requires 4 FrameStores
232  if (channels15.find(mConfig.fOutputChannel) == channels15.end())
233  return AJA_STATUS_BAD_PARAM; // fOutputChannel not Ch1 or Ch5
234  frameStores = ::NTV2MakeChannelSet (mConfig.fOutputChannel, 4); // 4 x FrameStores starting at Ch1 or Ch5
235  }
236  // Disable SDI output conversions
237  mDevice.SetSDIOutLevelAtoLevelBConversion (frameStores, false);
238  mDevice.SetSDIOutRGBLevelAConversion (frameStores, false);
239 
240  // Keep the raster description handy...
241  mFormatDesc = NTV2FormatDescriptor(mConfig.fVideoFormat, mConfig.fPixelFormat);
242  if (!mFormatDesc.IsValid())
243  return AJA_STATUS_FAIL;
244 
245  // Turn on the FrameStores (to read frame buffer memory and transmit video)...
246  mDevice.EnableChannels (frameStores, /*disableOthers=*/!mConfig.fDoMultiFormat);
247 
248  // This demo requires VANC be disabled...
249  mDevice.SetVANCMode (frameStores, NTV2_VANCMODE_OFF); // VANC is incompatible with 4K/UHD formats
250  mDevice.SetVANCShiftMode(frameStores, NTV2_VANCDATA_NORMAL);
251 
252  // Set the FrameStore video format...
253  mDevice.SetVideoFormat (frameStores, mConfig.fVideoFormat, false);
254 
255  // Set the frame buffer pixel format for the device FrameStore(s)...
256  mDevice.SetFrameBufferFormat (frameStores, mConfig.fPixelFormat);
257 
258  // The output interrupt is Enabled by default, but on some platforms, you must subscribe to it
259  // in order to be able to wait on its event/semaphore...
261 
262  // Get current per-field maximum Anc buffer size...
265 
266  // Set output clock reference...
267  mDevice.SetReference(mDevice.features().CanDo2110() ? NTV2_REFERENCE_SFP1_PTP : NTV2_REFERENCE_FREERUN);
268 
269  // At this point, video setup is complete (except for widget signal routing).
270  return AJA_STATUS_SUCCESS;
271 
272 } // SetUpVideo
273 
274 
276 {
277  uint16_t numAudioChannels (mDevice.features().GetMaxAudioChannels());
278 
279  // If there are 4096 pixels on a line instead of 3840, reduce the number of audio channels
280  // This is because HANC is narrower, and has space for only 8 channels
281  if (NTV2_IS_4K_4096_VIDEO_FORMAT(mConfig.fVideoFormat) && numAudioChannels > 8)
282  numAudioChannels = 8;
283 
284  // Use the NTV2AudioSystem that has the same ordinal value as the output FrameStore/Channel...
285  mAudioSystem = ::NTV2ChannelToAudioSystem(mConfig.fOutputChannel);
286 
287  if (mConfig.fNumAudioLinks > 1) // For users that want to send 32 or 64 audio channels on 2 or 4 SDI links
288  switch (mAudioSystem)
289  {
290  default:
291  case NTV2_AUDIOSYSTEM_1:
292  { const UWord numChan(NTV2_IS_4K_HFR_VIDEO_FORMAT(mConfig.fVideoFormat) ? 4 : 2);
293  const NTV2AudioSystemSet audSystems (::NTV2MakeAudioSystemSet (mAudioSystem, numChan));
294  for (UWord chan(0); chan < numChan; chan++)
295  mDevice.SetSDIOutputAudioSystem (NTV2Channel(chan), NTV2AudioSystem(chan));
296  mDevice.SetNumberAudioChannels (numAudioChannels, audSystems);
297  mDevice.SetAudioBufferSize (NTV2_AUDIO_BUFFER_BIG, audSystems);
298  mDevice.SetAudioLoopBack (NTV2_AUDIO_LOOPBACK_OFF, audSystems);
299  break;
300  }
301  case NTV2_AUDIOSYSTEM_3:
304  break;
305  }
306  else
307  {
308  NTV2ChannelSet sdiSpigots (::NTV2MakeChannelSet (mConfig.fOutputChannel, 1));
309  if (!mDevice.features().CanDo12gRouting())
310  sdiSpigots = ::NTV2MakeChannelSet (mAudioSystem == NTV2_AUDIOSYSTEM_1 || mAudioSystem == NTV2_AUDIOSYSTEM_3
311  ? NTV2_CHANNEL1
312  : NTV2_CHANNEL5, 4);
313  mDevice.SetSDIOutputAudioSystem (sdiSpigots, mAudioSystem);
314  mDevice.SetNumberAudioChannels (numAudioChannels, mAudioSystem);
315  mDevice.SetAudioBufferSize (NTV2_AUDIO_BUFFER_BIG, mAudioSystem);
316  mDevice.SetAudioLoopBack (NTV2_AUDIO_LOOPBACK_OFF, mAudioSystem);
317  }
318 
319  if (mConfig.fDoHDMIOutput)
320  {
324  }
325 
326  return AJA_STATUS_SUCCESS;
327 
328 } // SetUpAudio
329 
330 
332 {
333  CNTV2DemoCommon::SetDefaultPageSize(); // Set host-specific page size
334 
335  // Let my circular buffer know when it's time to quit...
336  mFrameDataRing.SetAbortFlag (&mGlobalQuit);
337 
338  // Multi-link audio uses stacked buffers for transferring to the board,
339  // the first byte after the end of the first audio link buffer is the start of the second audio link buffer.
340  const size_t audioBufferSize (gAudMaxSizeBytes * uint32_t(mConfig.fNumAudioLinks));
341 
342  // Allocate and add each in-host NTV2FrameData to my circular buffer member variable...
343  mHostBuffers.reserve(CIRCULAR_BUFFER_SIZE);
344  while (mHostBuffers.size() < CIRCULAR_BUFFER_SIZE)
345  {
346  mHostBuffers.push_back(NTV2FrameData()); // Make a new NTV2FrameData...
347  NTV2FrameData & frameData(mHostBuffers.back()); // ...and get a reference to it
348 
349  // Don't allocate a page-aligned video buffer here.
350  // Instead, the test pattern buffers are used (and re-used) in the consumer thread.
351  // This saves a LOT of memory and time spent copying data with these large 4K/UHD rasters.
352  // NOTE: This differs substantially from the NTV2Player demo, which pre-allocates the ring of video buffers
353  // here, then in its producer thread, copies a fresh, unmodified test pattern raster into the video
354  // buffer, blits timecode into it, then transfers it to the hardware in its consumer thread.
355 
356  // Allocate a page-aligned audio buffer (if transmitting audio)
357  if (mConfig.WithAudio())
358  if (!frameData.fAudioBuffer.Allocate (audioBufferSize, BUFFER_PAGE_ALIGNED))
359  {
360  PLFAIL("Failed to allocate " << xHEX0N(audioBufferSize,8) << "-byte audio buffer");
361  return AJA_STATUS_MEMORY;
362  }
363  if (frameData.fAudioBuffer)
364  {
365  frameData.fAudioBuffer.Fill(ULWord(0));
366  #ifdef NTV2_BUFFER_LOCKING
367  mDevice.DMABufferLock(frameData.fAudioBuffer, /*alsoPreLockSGL*/true);
368  #endif
369  }
370  mFrameDataRing.Add (&frameData);
371  } // for each NTV2FrameData
372 
373  return AJA_STATUS_SUCCESS;
374 
375 } // SetUpHostBuffers
376 
377 
379 {
380  vector<NTV2TestPatternSelect> testPatIDs;
381  testPatIDs.push_back(NTV2_TestPatt_ColorBars100);
382  testPatIDs.push_back(NTV2_TestPatt_ColorBars75);
383  testPatIDs.push_back(NTV2_TestPatt_Ramp);
384  testPatIDs.push_back(NTV2_TestPatt_MultiBurst);
385  testPatIDs.push_back(NTV2_TestPatt_LineSweep);
386  testPatIDs.push_back(NTV2_TestPatt_CheckField);
387  testPatIDs.push_back(NTV2_TestPatt_FlatField);
388  testPatIDs.push_back(NTV2_TestPatt_MultiPattern);
389  testPatIDs.push_back(NTV2_TestPatt_Black);
390  testPatIDs.push_back(NTV2_TestPatt_White);
391  testPatIDs.push_back(NTV2_TestPatt_Border);
392  testPatIDs.push_back(NTV2_TestPatt_LinearRamp);
393  testPatIDs.push_back(NTV2_TestPatt_SlantRamp);
394  testPatIDs.push_back(NTV2_TestPatt_ZonePlate);
395  testPatIDs.push_back(NTV2_TestPatt_ColorQuadrant);
396  testPatIDs.push_back(NTV2_TestPatt_ColorQuadrantBorder);
397 
398  mTestPatRasters.clear();
399  for (size_t tpNdx(0); tpNdx < testPatIDs.size(); tpNdx++)
400  mTestPatRasters.push_back(NTV2Buffer());
401 
402  if (!mFormatDesc.IsValid())
403  {PLFAIL("Bad format descriptor"); return AJA_STATUS_FAIL;}
404  if (mFormatDesc.IsVANC())
405  {PLFAIL("VANC incompatible with UHD/4K: " << mFormatDesc); return AJA_STATUS_FAIL;}
406 
407  // Set up one video buffer for each test pattern...
408  for (size_t tpNdx(0); tpNdx < testPatIDs.size(); tpNdx++)
409  {
410  // Allocate the buffer memory...
411  if (!mTestPatRasters.at(tpNdx).Allocate (mFormatDesc.GetVideoWriteSize(), BUFFER_PAGE_ALIGNED))
412  { PLFAIL("Test pattern buffer " << DEC(tpNdx+1) << " of " << DEC(testPatIDs.size()) << ": "
413  << xHEX0N(mFormatDesc.GetVideoWriteSize(),8) << "-byte page-aligned alloc failed");
414  return AJA_STATUS_MEMORY;
415  }
416 
417  // Fill the buffer with test pattern...
418  NTV2TestPatternGen testPatternGen;
419  if (!testPatternGen.DrawTestPattern (testPatIDs.at(tpNdx), mFormatDesc, mTestPatRasters.at(tpNdx)))
420  {
421  cerr << "## ERROR: DrawTestPattern " << DEC(tpNdx) << " failed: " << mFormatDesc << endl;
422  return AJA_STATUS_FAIL;
423  }
424 
425  #ifdef NTV2_BUFFER_LOCKING
426  // Try to prelock the memory, including its scatter-gather list...
427  if (!mDevice.DMABufferLock(mTestPatRasters.at(tpNdx), /*alsoLockSegmentMap=*/true))
428  PLWARN("Test pattern buffer " << DEC(tpNdx+1) << " of " << DEC(testPatIDs.size()) << ": failed to pre-lock");
429  #endif
430  } // loop for each predefined pattern
431 
432  return AJA_STATUS_SUCCESS;
433 
434 } // SetUpTestPatternBuffers
435 
436 
438 {
439  const bool isRGB (::IsRGBFormat(mConfig.fPixelFormat));
440  bool useLinkGrouping = false;
441  UWord failures(0); // tally of routing failures
442 
443  if (!mConfig.fDoMultiFormat)
444  mDevice.ClearRouting(); // Replace current signal routing
445 
446  // Construct switch value to avoid multiple if-then-else
447  int switchValue = 0;
449  switchValue += 8;
450  if (mConfig.fDoTsiRouting)
451  switchValue += 4;
452  if (isRGB)
453  switchValue += 2;
454  if (mConfig.fDoRGBOnWire)
455  switchValue += 1;
456  if (mDevice.features().CanDo12GSDI() && !mDevice.features().CanDo12gRouting())
457  {
458  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, false);
459  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, false);
460  if (mConfig.fDoLinkGrouping)
461  useLinkGrouping = true;
462  }
463 
464  switch (switchValue)
465  {
466  case 0: // Low Frame Rate, Square, Pixel YCbCr, Wire YCbCr
467  if (!RouteFsToSDIOut()) failures++;
469  break;
470  case 1: // Low Frame Rate, Square, Pixel YCbCr, Wire RGB
471  if (!RouteFsToCsc()) failures++;
472  if (!RouteCscToDLOut()) failures++;
473  if (!RouteDLOutToSDIOut()) failures++;
475  break;
476  case 2: // Low Frame Rate, Square, Pixel RGB, Wire YCbCr
477  if (!RouteFsToCsc()) failures++;
478  if (!RouteCscTo4xSDIOut()) failures++;
480  break;
481  case 3: // Low Frame Rate, Square, Pixel RGB, Wire RGB
482  if (!RouteFsToDLOut()) failures++;
483  if (!RouteDLOutToSDIOut()) failures++;
485  break;
486  case 4: // Low Frame Rate, Tsi, Pixel YCbCr, Wire YCbCr
487  if (!RouteFsToTsiMux()) failures++;
488  if (!RouteTsiMuxTo2xSDIOut()) failures++;
489  if (useLinkGrouping)
490  {
491  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, true);
493  }
494  else
496  break;
497  case 5: // Low Frame Rate, Tsi, Pixel YCbCr, Wire RGB
498  if (!RouteFsToTsiMux()) failures++;
499  if (!RouteTsiMuxToCsc()) failures++;
500  if (!RouteCscToDLOut()) failures++;
501  if (!RouteDLOutToSDIOut()) failures++;
502  if (useLinkGrouping)
503  {
504  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
506  }
507  else
509  break;
510  case 6: // Low Frame Rate, Tsi, Pixel RGB, Wire YCbCr
511  if (!RouteFsToTsiMux()) failures++;
512  if (!RouteTsiMuxToCsc()) failures++;
513  if (!RouteCscTo2xSDIOut()) failures++;
514  if (useLinkGrouping)
515  {
516  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, true);
518  }
519  else
521  break;
522  case 7: // Low Frame Rate, Tsi, Pixel RGB, Wire RGB
523  if (!RouteFsToTsiMux()) failures++;
524  if (!RouteTsiMuxToDLOut()) failures++;
525  if (!RouteDLOutToSDIOut()) failures++;
526  if (useLinkGrouping)
527  {
528  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
530  }
531  else
533  break;
534  case 8: // High Frame Rate, Square, Pixel YCbCr, Wire YCbCr
535  if (!RouteFsToSDIOut()) failures++;
537  break;
538  case 9: // High Frame Rate, Square, Pixel YCbCr, Wire RGB
539  // No valid routing for this case
540  break;
541  case 10: // High Frame Rate, Square, Pixel RGB, Wire YCbCr
542  if (!RouteFsToCsc()) failures++;
543  if (!RouteCscTo4xSDIOut()) failures++;
545  break;
546  case 11: // High Frame Rate, Square, Pixel RGB, Wire RGB
547  // No valid routing for this case
548  break;
549  case 12: // High Frame Rate, Tsi, Pixel YCbCr, Wire YCbCr
550  if (!RouteFsToTsiMux()) failures++;
551  if (!RouteTsiMuxTo4xSDIOut()) failures++;
552  if (useLinkGrouping)
553  {
554  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
556  }
557  else
559  break;
560  case 13: // High Frame Rate, Tsi, Pixel YCbCr, Wire RGB
561  // No valid routing for this case
562  break;
563  case 14: // High Frame Rate, Tsi, Pixel RGB, Wire YCbCr
564  if (!RouteFsToTsiMux()) failures++;
565  if (!RouteTsiMuxToCsc()) failures++;
566  if (!RouteCscTo4xSDIOut()) failures++;
567  if(useLinkGrouping)
568  {
569  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
571  }
572  else
574  break;
575  case 15: // High Frame Rate, Tsi, Pixel RGB, Wire RGB
576  // No valid routing for this case
577  break;
578  default:
579  return false; // Fail
580  }
581 
582  if (mDevice.features().CanDo12gRouting())
583  mDevice.SetTsiFrameEnable (true, mConfig.fOutputChannel);
584  else if (mConfig.fDoTsiRouting)
585  mDevice.SetTsiFrameEnable (true, mConfig.fOutputChannel);
586  else
587  mDevice.Set4kSquaresEnable (true, mConfig.fOutputChannel);
588 
589  // Send signal to secondary outputs, if supported
590  if (!Route4KDownConverter()) failures++;
591  if (!RouteHDMIOutput()) failures++;
592  return failures == 0;
593 
594 } // RouteOutputSignal
595 
596 
597 void NTV2Player4K::SetupSDITransmitters (const NTV2Channel inFirstSDI, const UWord inNumSDIs)
598 {
599  if (mDevice.features().HasBiDirectionalSDI())
600  mDevice.SetSDITransmitEnable(::NTV2MakeChannelSet (inFirstSDI, mDevice.features().CanDo12gRouting() ? 1 : inNumSDIs),
601  /*transmit=*/true);
602 }
603 
604 
606 {
608  return true;
609 
610  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
611  UWord connectFailures (0);
612  if (::IsRGBFormat(mConfig.fPixelFormat))
613  {
614  mDevice.Enable4KDCRGBMode(true);
615 
616  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
617  {
618  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
619  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
620  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
621  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
622 
623  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
624  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
625  }
626  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
627  {
628  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
629  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
630  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
631  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
632 
633  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
634  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
635  }
636  }
637  else // YUV FBF
638  {
639  mDevice.Enable4KDCRGBMode (false);
640 
641  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
642  {
643  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
644  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
645  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
646  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
647 
648  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
649  }
650  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
651  {
652  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
653  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
654  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
655  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
656 
657  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
658  }
659  }
660  return connectFailures == 0;
661 
662 } // Route4KDownConverter
663 
664 
666 {
667  const bool isRGB (::IsRGBFormat(mConfig.fPixelFormat));
668  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
669  UWord connectFailures (0);
670 
671  if (mConfig.fDoHDMIOutput &&
675  || mDevice.features().CanDoWidget(NTV2_WgtHDMIOut1v5)) )
676  {
677  if (mDevice.features().CanDo12gRouting())
678  {
679  if (!mDevice.Connect (NTV2_XptHDMIOutInput, ::GetFrameBufferOutputXptFromChannel (mConfig.fOutputChannel, isRGB, false/*is425*/), canVerify))
680  connectFailures++;
681  }
682  else if(mConfig.fDoTsiRouting)
683  {
684  if (isRGB)
685  {
686  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
687  {
688  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
689  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
690  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
691  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
692  }
693  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
694  {
695  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
696  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
697  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
698  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
699  }
700  }
701  else
702  {
703  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
704  {
705  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
706  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
707  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
708  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
709  }
710  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
711  {
712  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
713  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
714  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
715  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
716  }
717  }
718  }
719  else
720  {
721  if (isRGB)
722  {
723  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
724  {
725  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
726  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
727 
728  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
729  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
730 
731  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
732  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
733 
734  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
735  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
736  }
737  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
738  {
739  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
740  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
741 
742  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
743  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
744 
745  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
746  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
747 
748  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
749  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
750  }
751  }
752  else
753  {
754  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
755  {
756  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
757  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
758  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
759  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
760  }
761  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
762  {
763  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
764  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
765  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
766  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
767  }
768  }
769  }
770 
771  mDevice.SetHDMIV2TxBypass (false);
779  }
780  else
782  return connectFailures == 0;
783 
784 } // RouteHDMIOutput
785 
786 
788 {
789  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
790  UWord connectFailures (0);
791  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
792  {
793  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
794  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
795  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
796  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
797  }
798  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
799  {
800  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
801  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
802  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
803  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
804  }
805  return connectFailures == 0;
806 } // RouteFsToDLOut
807 
808 
810 {
811  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
812  UWord connectFailures (0);
813  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
814  {
815  if (::IsRGBFormat(mConfig.fPixelFormat))
816  {
817  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
818  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
819  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
820  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
821  }
822  else
823  {
824  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
825  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
826  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
827  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
828  }
829  }
830  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
831  {
832  if (::IsRGBFormat(mConfig.fPixelFormat))
833  {
834  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
835  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
836  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
837  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
838  }
839  else
840  {
841  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
842  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
843  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
844  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
845  }
846  }
847  return connectFailures == 0;
848 } // RouteFsToCsc
849 
850 
852 {
853  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
854  UWord connectFailures (0);
855  if (mDevice.features().CanDo12gRouting())
856  {
857  if (!mDevice.Connect ( ::GetSDIOutputInputXpt (mConfig.fOutputChannel, false/*isDS2*/),
858  ::GetFrameBufferOutputXptFromChannel (mConfig.fOutputChannel, false/*isRGB*/, false/*is425*/),
859  canVerify))
860  connectFailures++;
861  }
862  else
863  {
864  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
865  {
866  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
867  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
868  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
869  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
870  }
871  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
872  {
873  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
874  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
875  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
876  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
877  }
878  }
879  return connectFailures == 0;
880 } // RouteFsToSDIOut
881 
882 
884 {
885  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
886  UWord connectFailures (0);
887  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
888  {
889  if (::IsRGBFormat(mConfig.fPixelFormat))
890  {
891  if (!mDevice.Connect (NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
892  if (!mDevice.Connect (NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2RGB, canVerify)) connectFailures++;
893  if (!mDevice.Connect (NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
894  if (!mDevice.Connect (NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2RGB, canVerify)) connectFailures++;
895  }
896  else
897  {
898  if (!mDevice.Connect (NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
899  if (!mDevice.Connect (NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2YUV, canVerify)) connectFailures++;
900  if (!mDevice.Connect (NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
901  if (!mDevice.Connect (NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2YUV, canVerify)) connectFailures++;
902  }
903  }
904  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
905  {
906  if (::IsRGBFormat(mConfig.fPixelFormat))
907  {
908  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
909  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer3_DS2RGB, canVerify)) connectFailures++;
910  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
911  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer4_DS2RGB, canVerify)) connectFailures++;
912  }
913  else
914  {
915  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
916  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer3_DS2YUV, canVerify)) connectFailures++;
917  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
918  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer4_DS2YUV, canVerify)) connectFailures++;
919  }
920  }
921  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
922  {
923  if (::IsRGBFormat(mConfig.fPixelFormat))
924  {
925  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
926  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer5_DS2RGB, canVerify)) connectFailures++;
927  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
928  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer6_DS2RGB, canVerify)) connectFailures++;
929  }
930  else
931  {
932  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
933  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer5_DS2YUV, canVerify)) connectFailures++;
934  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
935  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer6_DS2YUV, canVerify)) connectFailures++;
936  }
937  }
938  return connectFailures == 0;
939 } // RouteFsToTsiMux
940 
941 
943 {
944  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
945  UWord connectFailures (0);
946  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
947  {
948  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptDuallinkOut1, canVerify)) connectFailures++;
949  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_XptDuallinkOut1DS2, canVerify)) connectFailures++;
950  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptDuallinkOut2, canVerify)) connectFailures++;
951  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_XptDuallinkOut2DS2, canVerify)) connectFailures++;
952  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptDuallinkOut3, canVerify)) connectFailures++;
953  if (!mDevice.Connect (NTV2_XptSDIOut3InputDS2, NTV2_XptDuallinkOut3DS2, canVerify)) connectFailures++;
954  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptDuallinkOut4, canVerify)) connectFailures++;
955  if (!mDevice.Connect (NTV2_XptSDIOut4InputDS2, NTV2_XptDuallinkOut4DS2, canVerify)) connectFailures++;
956  }
957  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
958  {
959  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptDuallinkOut5, canVerify)) connectFailures++;
960  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_XptDuallinkOut5DS2, canVerify)) connectFailures++;
961  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptDuallinkOut6, canVerify)) connectFailures++;
962  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_XptDuallinkOut6DS2, canVerify)) connectFailures++;
963  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptDuallinkOut7, canVerify)) connectFailures++;
964  if (!mDevice.Connect (NTV2_XptSDIOut7InputDS2, NTV2_XptDuallinkOut7DS2, canVerify)) connectFailures++;
965  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptDuallinkOut8, canVerify)) connectFailures++;
966  if (!mDevice.Connect (NTV2_XptSDIOut8InputDS2, NTV2_XptDuallinkOut8DS2, canVerify)) connectFailures++;
967  }
968  return connectFailures == 0;
969 } // RouteDLOutToSDIOut
970 
971 
973 {
974  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
975  UWord connectFailures (0);
976  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
977  {
978  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
979  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
980  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
981  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
982  }
983  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
984  {
985  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
986  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
987  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
988  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
989  }
990  return connectFailures == 0;
991 } // RouteCscTo2xSDIOut
992 
993 
995 {
996  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
997  UWord connectFailures (0);
998  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
999  {
1000  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
1001  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
1002  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
1003  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
1004  }
1005  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1006  {
1007  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
1008  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
1009  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
1010  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
1011  }
1012  return connectFailures == 0;
1013 } // RouteCscTo4xSDIOut
1014 
1015 
1017 {
1018  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1019  UWord connectFailures (0);
1020  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1021  {
1022  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_XptCSC1VidRGB, canVerify)) connectFailures++;
1023  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_XptCSC2VidRGB, canVerify)) connectFailures++;
1024  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_XptCSC3VidRGB, canVerify)) connectFailures++;
1025  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_XptCSC4VidRGB, canVerify)) connectFailures++;
1026  }
1027  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1028  {
1029  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_XptCSC5VidRGB, canVerify)) connectFailures++;
1030  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_XptCSC6VidRGB, canVerify)) connectFailures++;
1031  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_XptCSC7VidRGB, canVerify)) connectFailures++;
1032  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_XptCSC8VidRGB, canVerify)) connectFailures++;
1033  }
1034  return connectFailures == 0;
1035 } // RouteCscToDLOut
1036 
1037 
1039 {
1040  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1041  UWord connectFailures (0);
1042  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1043  {
1044  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_Xpt425Mux1ARGB, canVerify)) connectFailures++;
1045  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_Xpt425Mux1BRGB, canVerify)) connectFailures++;
1046  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_Xpt425Mux2ARGB, canVerify)) connectFailures++;
1047  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_Xpt425Mux2BRGB, canVerify)) connectFailures++;
1048  }
1049  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1050  {
1051  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1052  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1053  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1054  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1055  }
1056  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1057  {
1058  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1059  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1060  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1061  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1062  }
1063  return connectFailures == 0;
1064 } // RouteTsiMuxToDLOut
1065 
1066 
1068 {
1069  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1070  UWord connectFailures (0);
1071  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1072  {
1073  if (::IsRGBFormat(mConfig.fPixelFormat))
1074  {
1075  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux1ARGB, canVerify)) connectFailures++;
1076  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux1BRGB, canVerify)) connectFailures++;
1077  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux2ARGB, canVerify)) connectFailures++;
1078  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux2BRGB, canVerify)) connectFailures++;
1079  }
1080  else
1081  {
1082  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1083  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1084  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1085  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1086  }
1087  }
1088  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1089  {
1090  if (::IsRGBFormat(mConfig.fPixelFormat))
1091  {
1092  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1093  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1094  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1095  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1096  }
1097  else
1098  {
1099  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1100  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1101  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1102  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1103  }
1104  }
1105  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1106  {
1107  if (::IsRGBFormat(mConfig.fPixelFormat))
1108  {
1109  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1110  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1111  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1112  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1113  }
1114  else
1115  {
1116  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1117  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1118  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1119  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1120  }
1121  }
1122  return connectFailures == 0;
1123 } // RouteTsiMuxToCsc
1124 
1125 
1127 {
1128  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1129  UWord connectFailures (0);
1130  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1131  {
1132  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1133  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1134  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1135  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1136  }
1137  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1138  {
1139  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1140  if (!mDevice.Connect (NTV2_XptSDIOut3InputDS2, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1141  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1142  if (!mDevice.Connect (NTV2_XptSDIOut4InputDS2, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1143  }
1144  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1145  {
1146  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1147  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1148  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1149  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1150  }
1151  return connectFailures == 0;
1152 } // RouteTsiMuxTo2xSDIOut
1153 
1154 
1156 {
1157  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1158  UWord connectFailures (0);
1159  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1160  {
1161  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1162  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1163  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1164  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1165  }
1166  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1167  { // Io4k+ 12G output
1168  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1169  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1170  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1171  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1172  }
1173  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1174  {
1175  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1176  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1177  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1178  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1179  }
1180  return connectFailures == 0;
1181 } // RouteTsiMuxTo4xSDIOut
1182 
1183 
1185 {
1186  // Start my consumer and producer threads...
1189  return AJA_STATUS_SUCCESS;
1190 
1191 } // Run
1192 
1193 
1194 
1196 // This is where the play thread starts
1197 
1199 {
1200  // Create and start the playout thread...
1201  mConsumerThread.Attach (ConsumerThreadStatic, this);
1202  mConsumerThread.SetPriority(AJA_ThreadPriority_High);
1203  mConsumerThread.Start();
1204 
1205 } // StartConsumerThread
1206 
1207 
1208 // The playout thread function
1209 void NTV2Player4K::ConsumerThreadStatic (AJAThread * pThread, void * pContext) // static
1210 { (void) pThread;
1211  // Grab the NTV2Player4K instance pointer from the pContext parameter,
1212  // then call its PlayFrames method...
1213  NTV2Player4K * pApp (reinterpret_cast<NTV2Player4K*>(pContext));
1214  if (pApp)
1215  pApp->ConsumeFrames();
1216 
1217 } // ConsumerThreadStatic
1218 
1219 
1221 {
1222  ULWord acOptions (AUTOCIRCULATE_WITH_RP188);
1223  AUTOCIRCULATE_TRANSFER outputXfer;
1224  AUTOCIRCULATE_STATUS outputStatus;
1225  AJAAncillaryData * pPkt (AJA_NULL);
1226  ULWord goodXfers(0), badXfers(0), prodWaits(0), noRoomWaits(0);
1227  const UWord numACFramesPerChannel(7);
1228 
1229  // Stop AutoCirculate, just in case someone else left it running...
1230  mDevice.AutoCirculateStop(mConfig.fOutputChannel);
1231  mDevice.WaitForOutputVerticalInterrupt(mConfig.fOutputChannel, 4); // Let it stop
1232  PLNOTE("Thread started");
1233 
1234  if (pPkt)
1235  { // Allocate page-aligned host Anc buffer...
1236  uint32_t hdrPktSize (0);
1237  if (!outputXfer.acANCBuffer.Allocate(gAncMaxSizeBytes, BUFFER_PAGE_ALIGNED) || !outputXfer.acANCBuffer.Fill(0LL))
1238  PLWARN("Anc buffer " << xHEX0N(gAncMaxSizeBytes,8) << "(" << DEC(gAncMaxSizeBytes) << ")-byte allocate failed -- HDR anc insertion disabled");
1239  else if (AJA_FAILURE(pPkt->GenerateTransmitData (outputXfer.acANCBuffer, outputXfer.acANCBuffer, hdrPktSize)))
1240  {
1241  PLWARN("HDR anc insertion disabled -- GenerateTransmitData failed");
1242  outputXfer.acANCBuffer.Deallocate();
1243  }
1244  else
1245  acOptions |= AUTOCIRCULATE_WITH_ANC;
1246  }
1247 #ifdef NTV2_BUFFER_LOCKING
1248  if (outputXfer.acANCBuffer)
1249  mDevice.DMABufferLock(outputXfer.acANCBuffer, /*alsoLockSGL*/true);
1250 #endif
1251 
1252  // Calculate start & end frame numbers (if mConfig.fFrames not used)...
1253  UWord startNum(0), endNum(0);
1254  if (mDevice.features().CanDo12gRouting())
1255  startNum = numACFramesPerChannel * mConfig.fOutputChannel;
1256  else switch (mConfig.fOutputChannel)
1257  { default:
1258  case NTV2_CHANNEL1: if (mConfig.fNumAudioLinks > 1)
1259  {
1262  {
1265  }
1266  }
1267  AJA_FALL_THRU;
1268  case NTV2_CHANNEL2: startNum = numACFramesPerChannel * 0; break;
1269 
1270  case NTV2_CHANNEL3: if (mConfig.fNumAudioLinks > 1)
1272  AJA_FALL_THRU;
1273  case NTV2_CHANNEL4: startNum = numACFramesPerChannel * 1; break;
1274 
1276  case NTV2_CHANNEL6: startNum = numACFramesPerChannel * 2; break;
1277 
1279  case NTV2_CHANNEL8: startNum = numACFramesPerChannel * 3; break;
1280  }
1281  endNum = startNum + numACFramesPerChannel - 1;
1282 
1283  // Initialize & start AutoCirculate...
1284  bool initOK(false);
1285  if (mConfig.fFrames.valid()) // --frames option controls everything:
1286  initOK = mDevice.AutoCirculateInitForOutput (mConfig.fOutputChannel, mConfig.fFrames.count(), mAudioSystem, acOptions,
1287  1 /*numChannels*/, mConfig.fFrames.firstFrame(), mConfig.fFrames.lastFrame());
1288  else // --frames option not used -- explicitly specify start & end frame numbers (as calculated above)
1289  initOK = mDevice.AutoCirculateInitForOutput (mConfig.fOutputChannel, 0, mAudioSystem, acOptions,
1290  1 /*numChannels*/, startNum, endNum);
1291  if (!initOK)
1292  {PLFAIL("AutoCirculateInitForOutput failed"); mGlobalQuit = true;}
1293 
1294  while (!mGlobalQuit)
1295  {
1296  mDevice.AutoCirculateGetStatus (mConfig.fOutputChannel, outputStatus);
1297 
1298  // Check if there's room for another frame on the card...
1299  if (outputStatus.CanAcceptMoreOutputFrames())
1300  {
1301  // Device has at least one free frame buffer that can be filled.
1302  // Wait for the next frame in our ring to become ready to "consume"...
1303  NTV2FrameData * pFrameData (mFrameDataRing.StartConsumeNextBuffer());
1304  if (!pFrameData)
1305  {prodWaits++; continue;}
1306 
1307  // Unlike in the NTV2Player demo, I now burn the current timecode into the test pattern buffer that was noted
1308  // earlier into this FrameData in my Producer thread. This is done to avoid copying large 4K/UHD rasters.
1309  const NTV2FrameRate ntv2FrameRate (::GetNTV2FrameRateFromVideoFormat(mConfig.fVideoFormat));
1310  const TimecodeFormat tcFormat (CNTV2DemoCommon::NTV2FrameRate2TimecodeFormat(ntv2FrameRate));
1311  const CRP188 rp188Info (mCurrentFrame++, 0, 0, 10, tcFormat);
1312  NTV2_RP188 tcData;
1313  string timeCodeString;
1314 
1315  rp188Info.GetRP188Reg (tcData);
1316  rp188Info.GetRP188Str (timeCodeString);
1317  mTCBurner.BurnTimeCode (pFrameData->fVideoBuffer, timeCodeString.c_str(), 80);
1318 
1319  // Transfer the timecode-burned frame (plus audio) to the device for playout...
1320  outputXfer.acVideoBuffer.Set (pFrameData->fVideoBuffer, pFrameData->fVideoBuffer);
1321  outputXfer.acAudioBuffer.Set (pFrameData->fAudioBuffer, pFrameData->fNumAudioBytes);
1322  outputXfer.SetOutputTimeCode (tcData, ::NTV2ChannelToTimecodeIndex(mConfig.fOutputChannel, /*LTC=*/false, /*F2=*/false));
1323  outputXfer.SetOutputTimeCode (tcData, ::NTV2ChannelToTimecodeIndex(mConfig.fOutputChannel, /*LTC=*/true, /*F2=*/false));
1324 
1325  // Perform the DMA transfer to the device...
1326  if (mDevice.AutoCirculateTransfer (mConfig.fOutputChannel, outputXfer))
1327  goodXfers++;
1328  else
1329  badXfers++;
1330 
1331  if (goodXfers == 3)
1332  mDevice.AutoCirculateStart(mConfig.fOutputChannel);
1333 
1334  // Signal that the frame has been "consumed"...
1335  mFrameDataRing.EndConsumeNextBuffer();
1336  continue; // Back to top of while loop
1337  }
1338 
1339  // Wait for one or more buffers to become available on the device, which should occur at next VBI...
1340  noRoomWaits++;
1342  } // loop til quit signaled
1343 
1344  // Stop AutoCirculate...
1345  mDevice.AutoCirculateStop(mConfig.fOutputChannel);
1346  PLNOTE("Thread completed: " << DEC(goodXfers) << " xfers, " << DEC(badXfers) << " failed, "
1347  << DEC(prodWaits) << " starves, " << DEC(noRoomWaits) << " VBI waits");
1348 
1349 } // ConsumeFrames
1350 
1351 
1352 
1354 // This is where the producer thread starts
1355 
1357 {
1358  // Create and start the producer thread...
1359  mProducerThread.Attach(ProducerThreadStatic, this);
1360  mProducerThread.SetPriority(AJA_ThreadPriority_High);
1361  mProducerThread.Start();
1362 
1363 } // StartProducerThread
1364 
1365 
1366 void NTV2Player4K::ProducerThreadStatic (AJAThread * pThread, void * pContext) // static
1367 {
1368  (void) pThread;
1369  NTV2Player4K * pApp (reinterpret_cast<NTV2Player4K*>(pContext));
1370  if (pApp)
1371  pApp->ProduceFrames();
1372 
1373 } // ProducerThreadStatic
1374 
1375 
1377 {
1378  ULWord freqNdx(0), testPatNdx(0), badTally(0);
1379  double timeOfLastSwitch (0.0);
1380 
1383 
1384  PLNOTE("Thread started");
1385  while (!mGlobalQuit)
1386  {
1387  NTV2FrameData * pFrameData (mFrameDataRing.StartProduceNextBuffer());
1388  if (!pFrameData)
1389  { badTally++; // No frame available!
1390  AJATime::Sleep(10); // Wait a bit for the consumer thread to free one up for me...
1391  continue; // ...then try again
1392  }
1393 
1394  // Unlike NTV2Player::ProduceFrames, NTV2Player4K::ProduceFrames doesn't touch this frame's video buffer.
1395  // Instead, to avoid wasting time copying large 4K/UHD rasters, in this thread we simply note which test
1396  // pattern buffer is to be modified and subsequently transferred to the hardware. This happens later, in
1397  // NTV2Player4K::ConsumeFrames...
1398  NTV2Buffer & testPatVidBuffer(mTestPatRasters.at(testPatNdx));
1399  pFrameData->fVideoBuffer.Set(testPatVidBuffer.GetHostPointer(), testPatVidBuffer.GetByteCount());
1400 
1401  // If also playing audio...
1402  if (pFrameData->AudioBuffer()) // ...then generate audio tone data for this frame...
1403  pFrameData->fNumAudioBytes = AddTone(pFrameData->AudioBuffer()); // ...and remember number of audio bytes to xfer
1404 
1405  // Every few seconds, change the test pattern and tone frequency...
1406  const double currentTime (timeBase.FramesToSeconds(mCurrentFrame++));
1407  if (currentTime > timeOfLastSwitch + 4.0)
1408  {
1409  freqNdx = (freqNdx + 1) % gNumFrequencies;
1410  testPatNdx = (testPatNdx + 1) % ULWord(mTestPatRasters.size());
1411  mToneFrequency = gFrequencies[freqNdx];
1412  timeOfLastSwitch = currentTime;
1413  PLINFO("F" << DEC0N(mCurrentFrame,6) << ": tone=" << mToneFrequency << "Hz, pattern='" << tpNames.at(testPatNdx) << "'");
1414  } // if time to switch test pattern & tone frequency
1415 
1416  // Signal that I'm done producing this FrameData, making it immediately available for transfer/playout...
1417  mFrameDataRing.EndProduceNextBuffer();
1418 
1419  } // loop til mGlobalQuit goes true
1420  PLNOTE("Thread completed: " << DEC(mCurrentFrame) << " frame(s) produced, " << DEC(badTally) << " failed");
1421 
1422 } // ProduceFrames
1423 
1424 
1425 uint32_t NTV2Player4K::AddTone (ULWord * audioBuffer)
1426 {
1429  ULWord numChannels (0);
1430 
1431  mDevice.GetFrameRate (frameRate, mConfig.fOutputChannel);
1432  mDevice.GetAudioRate (audioRate, mAudioSystem);
1433  mDevice.GetNumberAudioChannels (numChannels, mAudioSystem);
1434 
1435  // Since audio on AJA devices use fixed sample rates (typically 48KHz), certain video frame rates will
1436  // necessarily result in some frames having more audio samples than others. GetAudioSamplesPerFrame is
1437  // called to calculate the correct sample count for the current frame...
1438  const ULWord numSamples (::GetAudioSamplesPerFrame (frameRate, audioRate, mCurrentFrame));
1439  const double sampleRateHertz (::GetAudioSamplesPerSecond(audioRate));
1440 
1441  // Unlike NTV2Player::AddTone, NTV2Player4K::AddTone handles multi-link audio:
1442  ULWord bytesWritten(0), startSample(mCurrentSample);
1443  for (UWord linkNdx(0); linkNdx < mConfig.fNumAudioLinks; linkNdx++)
1444  {
1445  mCurrentSample = startSample;
1446  bytesWritten += ::AddAudioTone (audioBuffer + (bytesWritten/4), // audio buffer to fill
1447  mCurrentSample, // which sample for continuing the waveform
1448  numSamples, // number of samples to generate
1449  sampleRateHertz, // sample rate [Hz]
1450  0.50, // uniform amplitude
1451  mToneFrequency, // uniform tone frequency [Hz]
1452  31, // bits per sample
1453  false, // don't byte swap
1454  numChannels); // number of audio channels to generate
1455  } // for each SDI audio link
1456  return bytesWritten;
1457 
1458 } // AddTone
1459 
1460 
1462 {
1463  mDevice.AutoCirculateGetStatus (mConfig.fOutputChannel, outStatus);
1464 }
NTV2_XptFrameBuffer6YUV
@ NTV2_XptFrameBuffer6YUV
Definition: ntv2enums.h:2608
NTV2TestPatternGen::DrawTestPattern
virtual bool DrawTestPattern(const std::string &inTPName, const NTV2FormatDescriptor &inFormatDesc, NTV2Buffer &inBuffer)
Renders the given test pattern or color into a host raster buffer.
CNTV2Card::SubscribeOutputVerticalEvent
virtual bool SubscribeOutputVerticalEvent(const NTV2Channel inChannel)
Causes me to be notified when an output vertical blanking interrupt is generated for the given output...
Definition: ntv2subscriptions.cpp:25
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
NTV2_XptFrameBuffer4YUV
@ NTV2_XptFrameBuffer4YUV
Definition: ntv2enums.h:2563
NTV2_WgtHDMIOut1v5
@ NTV2_WgtHDMIOut1v5
Definition: ntv2enums.h:3008
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:4365
NTV2_XptHDMIOutInput
@ NTV2_XptHDMIOutInput
Definition: ntv2enums.h:2841
GetSDIOutputInputXpt
NTV2InputXptID GetSDIOutputInputXpt(const NTV2Channel inSDIOutput, const bool inIsDS2=false)
Definition: ntv2signalrouter.cpp:970
NTV2_Xpt425Mux1AInput
@ NTV2_Xpt425Mux1AInput
Definition: ntv2enums.h:2850
NTV2_XptDualLinkOut7Input
@ NTV2_XptDualLinkOut7Input
Definition: ntv2enums.h:2823
NTV2Player4K::RouteDLOutToSDIOut
virtual bool RouteDLOutToSDIOut(void)
Sets up board routing from the Dual Link outputs to the SDI outputs.
Definition: ntv2player4k.cpp:942
NTV2_Xpt425Mux2BRGB
@ NTV2_Xpt425Mux2BRGB
Definition: ntv2enums.h:2642
DeviceCapabilities::CanDoVideoFormat
bool CanDoVideoFormat(const NTV2VideoFormat inVF)
Definition: ntv2devicecapabilities.h:254
NTV2_XptDuallinkOut8DS2
@ NTV2_XptDuallinkOut8DS2
Definition: ntv2enums.h:2634
PlayerConfig::fDoHDMIOutput
bool fDoHDMIOutput
If true, enable HDMI output; otherwise, disable HDMI output.
Definition: ntv2democommon.h:336
NTV2Player4K::SetUpAudio
virtual AJAStatus SetUpAudio(void)
Performs all audio setup.
Definition: ntv2player4k.cpp:275
NTV2_AUDIO_LOOPBACK_OFF
@ NTV2_AUDIO_LOOPBACK_OFF
Embeds silence (zeroes) into the data stream.
Definition: ntv2enums.h:2016
NTV2FormatDescriptor::GetVideoWriteSize
ULWord GetVideoWriteSize(ULWord inPageSize=4096UL) const
Definition: ntv2formatdescriptor.cpp:957
NTV2_Xpt425Mux1ARGB
@ NTV2_Xpt425Mux1ARGB
Definition: ntv2enums.h:2636
CNTV2Card::GetAncRegionOffsetFromBottom
virtual bool GetAncRegionOffsetFromBottom(ULWord &outByteOffsetFromBottom, const NTV2AncillaryDataRegion inAncRegion=NTV2_AncRgn_All)
Answers with the byte offset to the start of an ancillary data region within a device frame buffer,...
Definition: ntv2dma.cpp:601
NTV2_CHANNEL8
@ NTV2_CHANNEL8
Specifies channel or FrameStore 8 (or the 8th item).
Definition: ntv2enums.h:1352
NTV2_TestPatt_CheckField
@ NTV2_TestPatt_CheckField
Definition: ntv2testpatterngen.h:34
ancillarydata_hdr_hlg.h
Declares the AJAAncillaryData_HDR_HLG class.
NTV2_Xpt425Mux1BRGB
@ NTV2_Xpt425Mux1BRGB
Definition: ntv2enums.h:2638
NTV2_REFERENCE_SFP1_PTP
@ NTV2_REFERENCE_SFP1_PTP
Specifies the PTP source on SFP 1.
Definition: ntv2enums.h:1454
NTV2_XptFrameBuffer1_DS2YUV
@ NTV2_XptFrameBuffer1_DS2YUV
Definition: ntv2enums.h:2651
NTV2_IS_VALID_TASK_MODE
#define NTV2_IS_VALID_TASK_MODE(__m__)
Definition: ntv2publicinterface.h:4401
NTV2_XptSDIOut4InputDS2
@ NTV2_XptSDIOut4InputDS2
Definition: ntv2enums.h:2792
NTV2Player4K::RouteCscTo4xSDIOut
virtual bool RouteCscTo4xSDIOut(void)
Sets up board routing from the Color Space Converters to the 4xSDI outputs.
Definition: ntv2player4k.cpp:994
NTV2_CHANNEL2
@ NTV2_CHANNEL2
Specifies channel or FrameStore 2 (or the 2nd item).
Definition: ntv2enums.h:1346
NTV2_VANCDATA_NORMAL
@ NTV2_VANCDATA_NORMAL
Definition: ntv2enums.h:3785
AJA_ThreadPriority_High
@ AJA_ThreadPriority_High
Definition: thread.h:44
CNTV2Card::SetHDMIOutVideoStandard
virtual bool SetHDMIOutVideoStandard(const NTV2Standard inNewValue)
Definition: ntv2hdmi.cpp:331
NTV2ACFrameRange::firstFrame
UWord firstFrame(void) const
Definition: ntv2utils.h:983
NTV2_WgtSDIMonOut1
@ NTV2_WgtSDIMonOut1
Definition: ntv2enums.h:2957
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
AJATimeCodeBurn::RenderTimeCodeFont
AJA_EXPORT bool RenderTimeCodeFont(AJA_PixelFormat pixelFormat, uint32_t numPixels, uint32_t numLines)
Definition: timecodeburn.cpp:447
NTV2_XptFrameBuffer2RGB
@ NTV2_XptFrameBuffer2RGB
Definition: ntv2enums.h:2535
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
NTV2_TestPatt_MultiBurst
@ NTV2_TestPatt_MultiBurst
Definition: ntv2testpatterngen.h:32
NTV2_AUDIO_BUFFER_BIG
@ NTV2_AUDIO_BUFFER_BIG
Definition: ntv2enums.h:1905
NTV2_XptSDIOut3InputDS2
@ NTV2_XptSDIOut3InputDS2
Definition: ntv2enums.h:2790
NTV2_XptDuallinkOut7
@ NTV2_XptDuallinkOut7
Definition: ntv2enums.h:2631
NTV2FormatDescriptor
Describes a video frame for a given video standard or format and pixel format, including the total nu...
Definition: ntv2formatdescriptor.h:41
NTV2FrameData
I encapsulate the video, audio and anc host buffers used in the AutoCirculate demos....
Definition: ntv2democommon.h:79
CRP188::GetRP188Reg
bool GetRP188Reg(RP188_STRUCT &outRP188) const
Definition: ntv2rp188.cpp:1240
NTV2_WgtHDMIOut1v4
@ NTV2_WgtHDMIOut1v4
Definition: ntv2enums.h:3007
NTV2_XptCSC7VidInput
@ NTV2_XptCSC7VidInput
Definition: ntv2enums.h:2769
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1343
NTV2Buffer
Describes a user-space buffer on the host computer. I have an address and a length,...
Definition: ntv2publicinterface.h:6141
NTV2_XptDuallinkOut1
@ NTV2_XptDuallinkOut1
Definition: ntv2enums.h:2531
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
NTV2_XptSDIOut5InputDS2
@ NTV2_XptSDIOut5InputDS2
Definition: ntv2enums.h:2794
NTV2Buffer::GetByteCount
ULWord GetByteCount(void) const
Definition: ntv2publicinterface.h:6215
NTV2_AUDIOSYSTEM_4
@ NTV2_AUDIOSYSTEM_4
This identifies the 4th Audio System.
Definition: ntv2enums.h:3870
NTV2_XptCSC4VidInput
@ NTV2_XptCSC4VidInput
Definition: ntv2enums.h:2763
GetNTV2FrameRateFromVideoFormat
NTV2FrameRate GetNTV2FrameRateFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:3534
NTV2_XptFrameBuffer3_DS2YUV
@ NTV2_XptFrameBuffer3_DS2YUV
Definition: ntv2enums.h:2655
NTV2Player4K::RouteFsToSDIOut
virtual bool RouteFsToSDIOut(void)
Sets up board routing from the Frame Stores to the SDI outputs.
Definition: ntv2player4k.cpp:851
AJAThread::Attach
virtual AJAStatus Attach(AJAThreadFunction *pThreadFunction, void *pUserContext)
Definition: thread.cpp:169
NTV2_Xpt425Mux3ARGB
@ NTV2_Xpt425Mux3ARGB
Definition: ntv2enums.h:2644
NTV2_AUDIO_48K
@ NTV2_AUDIO_48K
Definition: ntv2enums.h:1916
NTV2_XptDuallinkOut7DS2
@ NTV2_XptDuallinkOut7DS2
Definition: ntv2enums.h:2632
NTV2_Wgt4KDownConverter
@ NTV2_Wgt4KDownConverter
Definition: ntv2enums.h:2961
NTV2Player4K::Init
virtual AJAStatus Init(void)
Initializes me and prepares me to Run.
Definition: ntv2player4k.cpp:107
AJATimeCodeBurn::BurnTimeCode
AJA_EXPORT bool BurnTimeCode(void *pBaseVideoAddress, const std::string &inTimeCodeStr, const uint32_t inYPercent)
Definition: timecodeburn.cpp:45
NTV2_XptFrameBuffer8YUV
@ NTV2_XptFrameBuffer8YUV
Definition: ntv2enums.h:2612
NTV2_XptFrameBuffer4_DS2YUV
@ NTV2_XptFrameBuffer4_DS2YUV
Definition: ntv2enums.h:2657
NTV2_XptFrameBuffer3YUV
@ NTV2_XptFrameBuffer3YUV
Definition: ntv2enums.h:2561
gFrequencies
static const double gFrequencies[]
Definition: ntv2player4k.cpp:49
CNTV2Card::SetHDMIOutVideoFPS
virtual bool SetHDMIOutVideoFPS(const NTV2FrameRate inNewValue)
Definition: ntv2hdmi.cpp:370
NTV2Buffer::Deallocate
bool Deallocate(void)
Deallocates my user-space storage (if I own it – i.e. from a prior call to Allocate).
Definition: ntv2publicinterface.cpp:1803
AJA_STATUS_BUSY
@ AJA_STATUS_BUSY
Definition: types.h:391
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:329
CNTV2Card::SetSDIOut6GEnable
virtual bool SetSDIOut6GEnable(const NTV2Channel inChannel, const bool inEnable)
Definition: ntv2register.cpp:3885
NTV2_FRAMERATE_INVALID
@ NTV2_FRAMERATE_INVALID
Definition: ntv2enums.h:432
NTV2_Xpt425Mux2AYUV
@ NTV2_Xpt425Mux2AYUV
Definition: ntv2enums.h:2639
NTV2_AUDIOSYSTEM_1
@ NTV2_AUDIOSYSTEM_1
This identifies the first Audio System.
Definition: ntv2enums.h:3867
AJACircularBuffer::StartConsumeNextBuffer
FrameDataPtr StartConsumeNextBuffer(void)
The thread that's responsible for processing incoming frames – the consumer – calls this function to ...
Definition: circularbuffer.h:153
NTV2ACFrameRange::count
UWord count(void) const
Definition: ntv2utils.h:982
ntv2testpatterngen.h
Declares the NTV2TestPatternGen class.
AUTOCIRCULATE_TRANSFER::acAudioBuffer
NTV2Buffer acAudioBuffer
The host audio buffer. This field is owned by the client application, and thus is responsible for all...
Definition: ntv2publicinterface.h:8223
NTV2_TestPatt_ColorBars100
@ NTV2_TestPatt_ColorBars100
Definition: ntv2testpatterngen.h:28
CNTV2Card::ClearRouting
virtual bool ClearRouting(void)
Removes all existing signal path connections between any and all widgets on the AJA device.
Definition: ntv2regroute.cpp:313
NTV2Player4K::RouteTsiMuxTo4xSDIOut
virtual bool RouteTsiMuxTo4xSDIOut(void)
Sets up board routing from the Two Sample Interleave muxes to the 4xSDI outputs.
Definition: ntv2player4k.cpp:1155
DEC0N
#define DEC0N(__x__, __n__)
Definition: ntv2publicinterface.h:5696
NTV2_Xpt4KDCQ2Input
@ NTV2_Xpt4KDCQ2Input
Definition: ntv2enums.h:2847
NTV2_Xpt425Mux2BYUV
@ NTV2_Xpt425Mux2BYUV
Definition: ntv2enums.h:2641
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:524
NTV2_AncRgn_Field2
@ NTV2_AncRgn_Field2
Identifies the "normal" Field 2 ancillary data region.
Definition: ntv2enums.h:4199
NTV2Player4K::StartProducerThread
virtual void StartProducerThread(void)
Starts my producer thread.
Definition: ntv2player4k.cpp:1356
AJA_STATUS_MEMORY
@ AJA_STATUS_MEMORY
Definition: types.h:397
NTV2_XptSDIOut7Input
@ NTV2_XptSDIOut7Input
Definition: ntv2enums.h:2797
AUTOCIRCULATE_WITH_MULTILINK_AUDIO3
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO3
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 3.
Definition: ntv2publicinterface.h:5640
gAudMaxSizeBytes
static const uint32_t gAudMaxSizeBytes(256 *1024)
The maximum number of bytes of 48KHz audio that can be transferred for a single frame....
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
NTV2_Xpt4KDCQ4Input
@ NTV2_Xpt4KDCQ4Input
Definition: ntv2enums.h:2849
NTV2_XptCSC6VidYUV
@ NTV2_XptCSC6VidYUV
Definition: ntv2enums.h:2620
NTV2_XptFrameBuffer1RGB
@ NTV2_XptFrameBuffer1RGB
Definition: ntv2enums.h:2526
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:1769
NTV2_XptDuallinkOut6DS2
@ NTV2_XptDuallinkOut6DS2
Definition: ntv2enums.h:2630
NTV2Player4K::RouteTsiMuxToDLOut
virtual bool RouteTsiMuxToDLOut(void)
Sets up board routing from the Two Sample Interleave muxes to the Dual Link outputs.
Definition: ntv2player4k.cpp:1038
NTV2_XptHDMIOutQ3Input
@ NTV2_XptHDMIOutQ3Input
Definition: ntv2enums.h:2844
NTV2_XptSDIOut2InputDS2
@ NTV2_XptSDIOut2InputDS2
Definition: ntv2enums.h:2788
PlayerConfig::fDoMultiFormat
bool fDoMultiFormat
If true, enable device-sharing; otherwise take exclusive control of device.
Definition: ntv2democommon.h:331
NTV2Player4K::SetUpHostBuffers
virtual AJAStatus SetUpHostBuffers(void)
Sets up my host video & audio buffers.
Definition: ntv2player4k.cpp:331
NTV2_XptSDIOut8InputDS2
@ NTV2_XptSDIOut8InputDS2
Definition: ntv2enums.h:2800
NTV2_XptDualLinkOut5Input
@ NTV2_XptDualLinkOut5Input
Definition: ntv2enums.h:2821
TimecodeFormat
TimecodeFormat
Definition: ntv2rp188.h:27
NTV2_AUDIO_FORMAT_LPCM
@ NTV2_AUDIO_FORMAT_LPCM
Definition: ntv2enums.h:1939
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_XptSDIOut4Input
@ NTV2_XptSDIOut4Input
Definition: ntv2enums.h:2791
NTV2_CHANNEL1
@ NTV2_CHANNEL1
Specifies channel or FrameStore 1 (or the first item).
Definition: ntv2enums.h:1345
NTV2_XptFrameBuffer6_DS2RGB
@ NTV2_XptFrameBuffer6_DS2RGB
Definition: ntv2enums.h:2662
AUTOCIRCULATE_TRANSFER::SetOutputTimeCode
bool SetOutputTimeCode(const NTV2_RP188 &inTimecode, const NTV2TCIndex inTCIndex=NTV2_TCINDEX_SDI1)
Intended for playout, sets one element of my acOutputTimeCodes member.
Definition: ntv2publicinterface.cpp:2898
ntv2debug.h
NTV2_XptCSC7VidYUV
@ NTV2_XptCSC7VidYUV
Definition: ntv2enums.h:2623
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
NTV2FrameBufferFormatString
const char * NTV2FrameBufferFormatString(NTV2FrameBufferFormat fmt)
Definition: ntv2debug.cpp:205
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
NTV2_XptCSC1VidInput
@ NTV2_XptCSC1VidInput
Definition: ntv2enums.h:2757
NTV2_Xpt425Mux3AInput
@ NTV2_Xpt425Mux3AInput
Definition: ntv2enums.h:2854
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
AUTOCIRCULATE_STATUS::CanAcceptMoreOutputFrames
bool CanAcceptMoreOutputFrames(void) const
Definition: ntv2publicinterface.h:7392
NTV2_XptFrameBuffer3RGB
@ NTV2_XptFrameBuffer3RGB
Definition: ntv2enums.h:2562
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
PlayerConfig::fDoLinkGrouping
bool fDoLinkGrouping
If true, enables 6/12G output mode on IoX3/Kona5 (4K/8K)
Definition: ntv2democommon.h:339
NTV2Player4K::RouteCscToDLOut
virtual bool RouteCscToDLOut(void)
Sets up board routing from the Color Space Converters to the Dual Link outputs.
Definition: ntv2player4k.cpp:1016
NTV2_Xpt425Mux2BInput
@ NTV2_Xpt425Mux2BInput
Definition: ntv2enums.h:2853
NTV2FrameRate
NTV2FrameRate
Identifies a particular video frame rate.
Definition: ntv2enums.h:403
NTV2_CHANNEL6
@ NTV2_CHANNEL6
Specifies channel or FrameStore 6 (or the 6th item).
Definition: ntv2enums.h:1350
NTV2_Xpt4KDCQ3Input
@ NTV2_Xpt4KDCQ3Input
Definition: ntv2enums.h:2848
CNTV2Card::DMABufferLock
virtual bool DMABufferLock(const NTV2Buffer &inBuffer, bool inMap=(0), bool inRDMA=(0))
Page-locks the given host buffer to reduce transfer time and CPU usage of DMA transfers.
Definition: ntv2dma.cpp:429
NTV2_CHANNEL4
@ NTV2_CHANNEL4
Specifies channel or FrameStore 4 (or the 4th item).
Definition: ntv2enums.h:1348
NTV2_XptFrameBuffer2_DS2YUV
@ NTV2_XptFrameBuffer2_DS2YUV
Definition: ntv2enums.h:2653
PlayerConfig::fDoTsiRouting
bool fDoTsiRouting
If true, enable TSI routing; otherwise route for square division (4K/8K)
Definition: ntv2democommon.h:337
AUTOCIRCULATE_WITH_MULTILINK_AUDIO1
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO1
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 1.
Definition: ntv2publicinterface.h:5638
NTV2_CHANNEL5
@ NTV2_CHANNEL5
Specifies channel or FrameStore 5 (or the 5th item).
Definition: ntv2enums.h:1349
NTV2MakeAudioSystemSet
NTV2AudioSystemSet NTV2MakeAudioSystemSet(const NTV2AudioSystem inFirstAudioSystem, const UWord inCount=1)
Definition: ntv2publicinterface.cpp:3578
CNTV2Card::features
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:147
AJAThread
Definition: thread.h:69
AUTOCIRCULATE_WITH_ANC
#define AUTOCIRCULATE_WITH_ANC
Use this to AutoCirculate with ancillary data.
Definition: ntv2publicinterface.h:5634
AJAThread::Active
virtual bool Active()
Definition: thread.cpp:116
CNTV2Card::Enable4KDCRGBMode
virtual bool Enable4KDCRGBMode(bool inEnable)
Sets 4K Down Convert RGB mode.
Definition: ntv2register.cpp:4138
NTV2Player4K
I am an object that can play out a 4K or UHD test pattern (with timecode) to an output of an AJA devi...
Definition: ntv2player4k.h:24
CNTV2Card::DMABufferUnlockAll
virtual bool DMABufferUnlockAll()
Unlocks all previously-locked buffers used for DMA transfers.
Definition: ntv2dma.cpp:457
CNTV2Card::GetDisplayName
virtual std::string GetDisplayName(void)
Answers with this device's display name.
Definition: ntv2card.cpp:86
NTV2_XptFrameBuffer4_DS2RGB
@ NTV2_XptFrameBuffer4_DS2RGB
Definition: ntv2enums.h:2658
AJAStatus
AJAStatus
Definition: types.h:378
NTV2_TestPatt_White
@ NTV2_TestPatt_White
Definition: ntv2testpatterngen.h:38
NTV2_XptFrameBuffer1_DS2RGB
@ NTV2_XptFrameBuffer1_DS2RGB
Definition: ntv2enums.h:2652
NTV2_XptCSC3VidRGB
@ NTV2_XptCSC3VidRGB
Definition: ntv2enums.h:2581
NTV2Player4K::Quit
virtual void Quit(void)
Gracefully stops me from running.
Definition: ntv2player4k.cpp:84
NTV2_XptFrameBuffer2_DS2RGB
@ NTV2_XptFrameBuffer2_DS2RGB
Definition: ntv2enums.h:2654
NTV2FormatDescriptor::numPixels
ULWord numPixels
Width – total number of pixels per line.
Definition: ntv2formatdescriptor.h:367
process.h
Declares the AJAProcess class.
PlayerConfig::fFrames
NTV2ACFrameRange fFrames
AutoCirculate frame count or range.
Definition: ntv2democommon.h:326
NTV2_HDMI_V2_4K_PLAYBACK
@ NTV2_HDMI_V2_4K_PLAYBACK
Definition: ntv2enums.h:3974
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
NTV2Player4K::ProduceFrames
virtual void ProduceFrames(void)
My producer thread that repeatedly produces video frames.
Definition: ntv2player4k.cpp:1376
NTV2_XptDuallinkOut3
@ NTV2_XptDuallinkOut3
Definition: ntv2enums.h:2576
NTV2_XptCSC4VidRGB
@ NTV2_XptCSC4VidRGB
Definition: ntv2enums.h:2584
NTV2_TestPatt_Ramp
@ NTV2_TestPatt_Ramp
Definition: ntv2testpatterngen.h:31
NTV2Player4K::ProducerThreadStatic
static void ProducerThreadStatic(AJAThread *pThread, void *pContext)
This is the producer thread's static callback function that gets called when the producer thread star...
Definition: ntv2player4k.cpp:1366
NTV2_XptCSC1VidYUV
@ NTV2_XptCSC1VidYUV
Definition: ntv2enums.h:2521
NTV2_VANCMODE_OFF
@ NTV2_VANCMODE_OFF
This identifies the mode in which there are no VANC lines in the frame buffer.
Definition: ntv2enums.h:3769
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:3951
CNTV2Card::GetNumberAudioChannels
virtual bool GetNumberAudioChannels(ULWord &outNumChannels, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Returns the current number of audio channels being captured or played by a given Audio System on the ...
Definition: ntv2audio.cpp:180
AJATimeBase
Definition: timebase.h:18
AJA_STATUS_FEATURE
@ AJA_STATUS_FEATURE
Definition: types.h:393
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
NTV2_XptCSC5VidRGB
@ NTV2_XptCSC5VidRGB
Definition: ntv2enums.h:2568
ULWord
uint32_t ULWord
Definition: ajatypes.h:255
NTV2_TestPatt_FlatField
@ NTV2_TestPatt_FlatField
Definition: ntv2testpatterngen.h:35
CNTV2Card::EnableChannels
virtual bool EnableChannels(const NTV2ChannelSet &inChannels, const bool inDisableOthers=(0))
Enables the given FrameStore(s).
Definition: ntv2register.cpp:2107
CNTV2Card::GetDescription
virtual std::string GetDescription(void) const
Definition: ntv2card.cpp:143
NTV2FrameData::fVideoBuffer
NTV2Buffer fVideoBuffer
Host video buffer.
Definition: ntv2democommon.h:82
AUTOCIRCULATE_STATUS
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
Definition: ntv2publicinterface.h:7321
ntv2devicescanner.h
Declares the CNTV2DeviceScanner class.
NTV2_XptCSC4VidYUV
@ NTV2_XptCSC4VidYUV
Definition: ntv2enums.h:2583
NTV2_CHANNEL7
@ NTV2_CHANNEL7
Specifies channel or FrameStore 7 (or the 7th item).
Definition: ntv2enums.h:1351
AJAAncillaryData
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
Definition: ancillarydata.h:552
NTV2FormatDescriptor::numLines
ULWord numLines
Height – total number of lines.
Definition: ntv2formatdescriptor.h:366
NTV2_XptFrameBuffer1YUV
@ NTV2_XptFrameBuffer1YUV
Definition: ntv2enums.h:2525
NTV2_XptSDIOut2Input
@ NTV2_XptSDIOut2Input
Definition: ntv2enums.h:2787
NTV2_XptDuallinkOut2DS2
@ NTV2_XptDuallinkOut2DS2
Definition: ntv2enums.h:2566
NTV2_XptDuallinkOut1DS2
@ NTV2_XptDuallinkOut1DS2
Definition: ntv2enums.h:2565
CNTV2DemoCommon::SetDefaultPageSize
static size_t SetDefaultPageSize(void)
Definition: ntv2democommon.cpp:1553
NTV2_XptDuallinkOut4DS2
@ NTV2_XptDuallinkOut4DS2
Definition: ntv2enums.h:2579
NTV2ChannelToTimecodeIndex
NTV2TCIndex NTV2ChannelToTimecodeIndex(const NTV2Channel inChannel, const bool inEmbeddedLTC=false, const bool inIsF2=false)
Converts the given NTV2Channel value into the equivalent NTV2TCIndex value.
Definition: ntv2utils.cpp:5027
NTV2AudioSystemSet
std::set< NTV2AudioSystem > NTV2AudioSystemSet
A set of distinct NTV2AudioSystem values. New in SDK 16.2.
Definition: ntv2publicinterface.h:3915
CNTV2Card::SetSDIOutRGBLevelAConversion
virtual bool SetSDIOutRGBLevelAConversion(const UWord inOutputSpigot, const bool inEnable)
Enables or disables an RGB-over-3G-level-A conversion at the SDI output widget (assuming the AJA devi...
Definition: ntv2register.cpp:4333
AJAProcess::GetPid
static uint64_t GetPid()
Definition: process.cpp:35
PlayerConfig::fNumAudioLinks
UWord fNumAudioLinks
The number of audio systems to control for multi-link audio (4K/8K)
Definition: ntv2democommon.h:330
NTV2_TestPatt_ColorQuadrant
@ NTV2_TestPatt_ColorQuadrant
Definition: ntv2testpatterngen.h:43
NTV2Player4K::RouteTsiMuxToCsc
virtual bool RouteTsiMuxToCsc(void)
Sets up board routing from the Two Sample Interleave muxes to the color Space Converters.
Definition: ntv2player4k.cpp:1067
NTV2_TestPatt_ColorQuadrantBorder
@ NTV2_TestPatt_ColorQuadrantBorder
Definition: ntv2testpatterngen.h:44
NTV2Player4K::RouteTsiMuxTo2xSDIOut
virtual bool RouteTsiMuxTo2xSDIOut(void)
Sets up board routing from the Two Sample Interleave muxes to the 2xSDI outputs.
Definition: ntv2player4k.cpp:1126
NTV2_Xpt425Mux4BRGB
@ NTV2_Xpt425Mux4BRGB
Definition: ntv2enums.h:2650
NTV2Player4K::RouteOutputSignal
virtual bool RouteOutputSignal(void)
Performs all widget/signal routing for playout.
Definition: ntv2player4k.cpp:437
CNTV2Card::UnsubscribeOutputVerticalEvent
virtual bool UnsubscribeOutputVerticalEvent(const NTV2Channel inChannel)
Unregisters me so I'm no longer notified when an output VBI is signaled on the given output channel.
Definition: ntv2subscriptions.cpp:61
NTV2_CHANNEL3
@ NTV2_CHANNEL3
Specifies channel or FrameStore 3 (or the 3rd item).
Definition: ntv2enums.h:1347
UWord
uint16_t UWord
Definition: ajatypes.h:253
PlayerConfig::fVideoFormat
NTV2VideoFormat fVideoFormat
The video format to use.
Definition: ntv2democommon.h:328
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
NTV2_Xpt4KDCQ1Input
@ NTV2_Xpt4KDCQ1Input
Definition: ntv2enums.h:2846
NTV2_IS_4K_HFR_VIDEO_FORMAT
#define NTV2_IS_4K_HFR_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:785
NTV2_XptCSC7VidRGB
@ NTV2_XptCSC7VidRGB
Definition: ntv2enums.h:2624
BUFFER_PAGE_ALIGNED
static const bool BUFFER_PAGE_ALIGNED((!(0)))
NTV2_XptFrameBuffer6_DS2YUV
@ NTV2_XptFrameBuffer6_DS2YUV
Definition: ntv2enums.h:2661
NTV2FrameData::fNumAudioBytes
ULWord fNumAudioBytes
Actual number of captured audio bytes.
Definition: ntv2democommon.h:88
NTV2_XptCSC8VidInput
@ NTV2_XptCSC8VidInput
Definition: ntv2enums.h:2771
NTV2_REFERENCE_FREERUN
@ NTV2_REFERENCE_FREERUN
Specifies the device's internal clock.
Definition: ntv2enums.h:1445
NTV2_XptDualLinkOut4Input
@ NTV2_XptDualLinkOut4Input
Definition: ntv2enums.h:2820
AUTOCIRCULATE_TRANSFER
This object specifies the information that will be transferred to or from the AJA device in the CNTV2...
Definition: ntv2publicinterface.h:8208
PlayerConfig::fOutputChannel
NTV2Channel fOutputChannel
The device channel to use.
Definition: ntv2democommon.h:324
NTV2_XptCSC8VidRGB
@ NTV2_XptCSC8VidRGB
Definition: ntv2enums.h:2627
NTV2_XptCSC3VidInput
@ NTV2_XptCSC3VidInput
Definition: ntv2enums.h:2761
NTV2_WgtHDMIOut1v3
@ NTV2_WgtHDMIOut1v3
Definition: ntv2enums.h:2990
NTV2VideoFormatToString
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6798
NTV2Player4K::StartConsumerThread
virtual void StartConsumerThread(void)
Starts my consumer thread.
Definition: ntv2player4k.cpp:1198
NTV2FrameData::AudioBuffer
NTV2Buffer & AudioBuffer(void)
Definition: ntv2democommon.h:109
NTV2_TestPatt_Black
@ NTV2_TestPatt_Black
Definition: ntv2testpatterngen.h:37
NTV2_XptFrameBuffer5_DS2RGB
@ NTV2_XptFrameBuffer5_DS2RGB
Definition: ntv2enums.h:2660
NTV2_Xpt425Mux4AYUV
@ NTV2_Xpt425Mux4AYUV
Definition: ntv2enums.h:2647
NTV2_TestPatt_SlantRamp
@ NTV2_TestPatt_SlantRamp
Definition: ntv2testpatterngen.h:41
NTV2_XptSDIOut1InputDS2
@ NTV2_XptSDIOut1InputDS2
Definition: ntv2enums.h:2786
NTV2_TestPatt_ColorBars75
@ NTV2_TestPatt_ColorBars75
Definition: ntv2testpatterngen.h:30
NTV2_TASK_MODE_INVALID
@ NTV2_TASK_MODE_INVALID
Definition: ntv2publicinterface.h:4398
NTV2_Xpt425Mux2ARGB
@ NTV2_Xpt425Mux2ARGB
Definition: ntv2enums.h:2640
CNTV2DriverInterface::IsDeviceReady
virtual bool IsDeviceReady(const bool inCheckValid=(0))
Definition: ntv2driverinterface.cpp:1316
NTV2_TestPatt_ZonePlate
@ NTV2_TestPatt_ZonePlate
Definition: ntv2testpatterngen.h:42
DEVICE_ID_INVALID
@ DEVICE_ID_INVALID
Definition: ntv2enums.h:93
kDemoAppSignature
static const ULWord kDemoAppSignature((((uint32_t)( 'D'))<< 24)|(((uint32_t)( 'E'))<< 16)|(((uint32_t)( 'M'))<< 8)|(((uint32_t)( 'O'))<< 0))
NTV2_Xpt425Mux1AYUV
@ NTV2_Xpt425Mux1AYUV
Definition: ntv2enums.h:2635
NTV2_Xpt425Mux3BInput
@ NTV2_Xpt425Mux3BInput
Definition: ntv2enums.h:2855
NTV2_Xpt425Mux1BYUV
@ NTV2_Xpt425Mux1BYUV
Definition: ntv2enums.h:2637
NTV2ChannelSet
std::set< NTV2Channel > NTV2ChannelSet
A set of distinct NTV2Channel values.
Definition: ntv2publicinterface.h:3869
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
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
CRP188
Definition: ntv2rp188.h:55
NTV2Player4K::Run
virtual AJAStatus Run(void)
Runs me.
Definition: ntv2player4k.cpp:1184
CNTV2Card::SetEveryFrameServices
virtual bool SetEveryFrameServices(const NTV2EveryFrameTaskMode inMode)
Sets the device's task mode.
Definition: ntv2register.cpp:179
NTV2Player4K::AddTone
virtual uint32_t AddTone(ULWord *audioBuffer)
Inserts audio tone (based on my current tone frequency) into the given audio buffer.
Definition: ntv2player4k.cpp:1425
AJA_STATUS_UNSUPPORTED
@ AJA_STATUS_UNSUPPORTED
Definition: types.h:394
CNTV2Card::SetHDMIOutAudioRate
virtual bool SetHDMIOutAudioRate(const NTV2AudioRate inNewValue)
Sets the HDMI output's audio rate.
Definition: ntv2audio.cpp:972
AJA_NULL
#define AJA_NULL
Definition: ajatypes.h:199
AddAudioTone
bool AddAudioTone(ULWord &outNumBytesWritten, NTV2Buffer &inAudioBuffer, ULWord &inOutCurrentSample, const ULWord inNumSamples, const double inSampleRate, const double inAmplitude, const double inFrequency, const ULWord inNumBits, const bool inByteSwap, const ULWord inNumChannels)
Fills the given buffer with 32-bit (ULWord) audio tone samples.
Definition: ntv2utils.cpp:4483
NTV2_XptSDIOut5Input
@ NTV2_XptSDIOut5Input
Definition: ntv2enums.h:2793
CNTV2DemoCommon::GetAJAFrameRate
static AJA_FrameRate GetAJAFrameRate(const NTV2FrameRate inFrameRate)
Definition: ntv2democommon.cpp:1080
NTV2TestPatternGen
The NTV2 test pattern generator.
Definition: ntv2testpatterngen.h:69
NTV2Buffer::GetHostPointer
void * GetHostPointer(void) const
Definition: ntv2publicinterface.h:6198
NTV2Player4K::SetUpTestPatternBuffers
virtual AJAStatus SetUpTestPatternBuffers(void)
Creates my test pattern buffers.
Definition: ntv2player4k.cpp:378
NTV2_FORMAT_UNKNOWN
@ NTV2_FORMAT_UNKNOWN
Definition: ntv2enums.h:525
NTV2_XptSDIOut8Input
@ NTV2_XptSDIOut8Input
Definition: ntv2enums.h:2799
NTV2FrameData::fAudioBuffer
NTV2Buffer fAudioBuffer
Host audio buffer.
Definition: ntv2democommon.h:84
NTV2_Xpt4KDownConverterOut
@ NTV2_Xpt4KDownConverterOut
Definition: ntv2enums.h:2596
NTV2_XptFrameBuffer8RGB
@ NTV2_XptFrameBuffer8RGB
Definition: ntv2enums.h:2613
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_TestPatt_Border
@ NTV2_TestPatt_Border
Definition: ntv2testpatterngen.h:39
NTV2AudioRate
NTV2AudioRate
Definition: ntv2enums.h:1914
AJA_STATUS_INITIALIZE
@ AJA_STATUS_INITIALIZE
Definition: types.h:386
NTV2_LHIHDMIColorSpaceYCbCr
@ NTV2_LHIHDMIColorSpaceYCbCr
Definition: ntv2enums.h:3650
PlayerConfig::fDoRGBOnWire
bool fDoRGBOnWire
If true, produce RGB on the wire; otherwise output YUV.
Definition: ntv2democommon.h:338
gNumFrequencies
static const ULWord gNumFrequencies(sizeof(gFrequencies)/sizeof(double))
DEC
#define DEC(__x__)
Definition: ntv2publicinterface.h:5694
NTV2_XptFrameBuffer6RGB
@ NTV2_XptFrameBuffer6RGB
Definition: ntv2enums.h:2609
NTV2_AUDIOSYSTEM_3
@ NTV2_AUDIOSYSTEM_3
This identifies the 3rd Audio System.
Definition: ntv2enums.h:3869
false
#define false
Definition: ntv2devicefeatures.h:25
NTV2_XptFrameBuffer4RGB
@ NTV2_XptFrameBuffer4RGB
Definition: ntv2enums.h:2564
AUTOCIRCULATE_WITH_MULTILINK_AUDIO2
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO2
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 2.
Definition: ntv2publicinterface.h:5639
AUTOCIRCULATE_WITH_RP188
#define AUTOCIRCULATE_WITH_RP188
Use this to AutoCirculate with RP188.
Definition: ntv2publicinterface.h:5628
NTV2Player4K::RouteHDMIOutput
virtual bool RouteHDMIOutput(void)
Sets up board routing output via the HDMI (if available).
Definition: ntv2player4k.cpp:665
CNTV2Card::SetSDIOut12GEnable
virtual bool SetSDIOut12GEnable(const NTV2Channel inChannel, const bool inEnable)
Definition: ntv2register.cpp:3910
NTV2_Xpt425Mux4ARGB
@ NTV2_Xpt425Mux4ARGB
Definition: ntv2enums.h:2648
NTV2ACFrameRange::lastFrame
UWord lastFrame(void) const
Definition: ntv2utils.h:984
ancillarydata_hdr_hdr10.h
Declares the AJAAncillaryData_HDR_HDR10 class.
NTV2Player4K::~NTV2Player4K
virtual ~NTV2Player4K(void)
Definition: ntv2player4k.cpp:75
NTV2Player4K::RouteCscTo2xSDIOut
virtual bool RouteCscTo2xSDIOut(void)
Sets up board routing from the Color Space Converters to the 2xSDI outputs.
Definition: ntv2player4k.cpp:972
PlayerConfig::fDeviceSpec
std::string fDeviceSpec
The AJA device to use.
Definition: ntv2democommon.h:322
NTV2_XptDualLinkOut3Input
@ NTV2_XptDualLinkOut3Input
Definition: ntv2enums.h:2819
AJA_STATUS_BAD_PARAM
@ AJA_STATUS_BAD_PARAM
Definition: types.h:392
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
GetFrameBufferOutputXptFromChannel
#define GetFrameBufferOutputXptFromChannel
Definition: ntv2signalrouter.h:731
NTV2MakeChannelSet
NTV2ChannelSet NTV2MakeChannelSet(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
Definition: ntv2publicinterface.cpp:3523
NTV2_XptFrameBuffer2YUV
@ NTV2_XptFrameBuffer2YUV
Definition: ntv2enums.h:2534
std
Definition: json.hpp:5362
NTV2_RP188
This struct replaces the old RP188_STRUCT.
Definition: ntv2publicinterface.h:6918
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:8216
NTV2_XptFrameBuffer5RGB
@ NTV2_XptFrameBuffer5RGB
Definition: ntv2enums.h:2607
IsRGBFormat
bool IsRGBFormat(const NTV2FrameBufferFormat format)
Definition: ntv2utils.cpp:5475
NTV2_XptFrameBuffer5_DS2YUV
@ NTV2_XptFrameBuffer5_DS2YUV
Definition: ntv2enums.h:2659
NTV2_XptFrameBuffer7YUV
@ NTV2_XptFrameBuffer7YUV
Definition: ntv2enums.h:2610
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
CNTV2DemoCommon::GetAJAPixelFormat
static AJA_PixelFormat GetAJAPixelFormat(const NTV2PixelFormat inFormat)
Definition: ntv2democommon.cpp:1112
GetAudioSamplesPerFrame
ULWord GetAudioSamplesPerFrame(const NTV2FrameRate inFrameRate, const NTV2AudioRate inAudioRate, ULWord inCadenceFrame=0, bool inIsSMPTE372Enabled=false)
Returns the number of audio samples for a given video frame rate, audio sample rate,...
Definition: ntv2utils.cpp:2793
NTV2_WgtHDMIOut1v2
@ NTV2_WgtHDMIOut1v2
Definition: ntv2enums.h:2956
NTV2_XptSDIOut6Input
@ NTV2_XptSDIOut6Input
Definition: ntv2enums.h:2795
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
NTV2_XptDuallinkOut6
@ NTV2_XptDuallinkOut6
Definition: ntv2enums.h:2629
ntv2player4k.h
Header file for NTV2Player4K demonstration class.
NTV2Player4K::NTV2Player4K
NTV2Player4K(const PlayerConfig &inConfig)
Constructs me using the given configuration settings.
Definition: ntv2player4k.cpp:54
NTV2Player4K::RouteFsToDLOut
virtual bool RouteFsToDLOut(void)
Sets up board routing from the Frame Stores to the Dual Link out.
Definition: ntv2player4k.cpp:787
NTV2_XptDuallinkOut5DS2
@ NTV2_XptDuallinkOut5DS2
Definition: ntv2enums.h:2587
CIRCULAR_BUFFER_SIZE
static const size_t CIRCULAR_BUFFER_SIZE(10)
Number of NTV2FrameData's in our ring.
AJA_FALL_THRU
#define AJA_FALL_THRU
Definition: ajatypes.h:219
NTV2_XptCSC5VidYUV
@ NTV2_XptCSC5VidYUV
Definition: ntv2enums.h:2567
NTV2Player4K::RouteFsToTsiMux
virtual bool RouteFsToTsiMux(void)
Sets up board routing from the Frame Stores to the Two Sample Interleave muxes.
Definition: ntv2player4k.cpp:883
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:489
AJAAncillaryData::GenerateTransmitData
virtual AJAStatus GenerateTransmitData(uint8_t *pBuffer, const size_t inMaxBytes, uint32_t &outPacketSize)
Generates "raw" ancillary data from my internal ancillary data (playback) – see SDI Anc Buffer Data F...
Definition: ancillarydata.cpp:766
NTV2_XptCSC2VidRGB
@ NTV2_XptCSC2VidRGB
Definition: ntv2enums.h:2537
NTV2_XptDualLinkOut6Input
@ NTV2_XptDualLinkOut6Input
Definition: ntv2enums.h:2822
NTV2Player4K::RouteFsToCsc
virtual bool RouteFsToCsc(void)
Sets up board routing from the Frame Stores to the Color Space Converters.
Definition: ntv2player4k.cpp:809
NTV2_XptDualLinkOut2Input
@ NTV2_XptDualLinkOut2Input
Definition: ntv2enums.h:2818
DeviceCapabilities::CanDoWidget
bool CanDoWidget(const NTV2WidgetID inWgtID)
Definition: ntv2devicecapabilities.h:263
NTV2Player4K::ConsumeFrames
virtual void ConsumeFrames(void)
My consumer thread that repeatedly plays frames using AutoCirculate (until quit).
Definition: ntv2player4k.cpp:1220
NTV2_AudioChannel1_8
@ NTV2_AudioChannel1_8
This selects audio channels 1 thru 8.
Definition: ntv2enums.h:3295
NTV2_XptHDMIOutQ4Input
@ NTV2_XptHDMIOutQ4Input
Definition: ntv2enums.h:2845
CNTV2DriverInterface::GetDeviceID
virtual NTV2DeviceID GetDeviceID(void)
Definition: ntv2driverinterface.cpp:411
NTV2Player4K::SetUpVideo
virtual AJAStatus SetUpVideo(void)
Performs all video setup.
Definition: ntv2player4k.cpp:203
NTV2_Xpt425Mux4BInput
@ NTV2_Xpt425Mux4BInput
Definition: ntv2enums.h:2857
CNTV2Card::GetEveryFrameServices
virtual bool GetEveryFrameServices(NTV2EveryFrameTaskMode &outMode)
Retrieves the device's current "retail service" task mode.
Definition: ntv2register.cpp:184
NTV2Player4K::SetupSDITransmitters
virtual void SetupSDITransmitters(const NTV2Channel inFirstSDI, const UWord inNumSDIs)
Sets up bi-directional SDI transmitters.
Definition: ntv2player4k.cpp:597
CNTV2Card::GetAudioRate
virtual bool GetAudioRate(NTV2AudioRate &outRate, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Returns the current NTV2AudioRate for the given Audio System.
Definition: ntv2audio.cpp:226
CNTV2Card::GetFrameRate
virtual bool GetFrameRate(NTV2FrameRate &outValue, NTV2Channel inChannel=NTV2_CHANNEL1)
Returns the AJA device's currently configured frame rate via its "value" parameter.
Definition: ntv2register.cpp:1022
GetAudioSamplesPerSecond
double GetAudioSamplesPerSecond(const NTV2AudioRate inAudioRate)
Returns the audio sample rate as a number of audio samples per second.
Definition: ntv2utils.cpp:3207
NTV2_XptCSC3VidYUV
@ NTV2_XptCSC3VidYUV
Definition: ntv2enums.h:2580
CNTV2Card::SetHDMIV2Mode
virtual bool SetHDMIV2Mode(const NTV2HDMIV2Mode inMode)
Sets HDMI V2 mode for the device.
Definition: ntv2hdmi.cpp:592
NTV2ACFrameRange::valid
bool valid(void) const
Definition: ntv2utils.h:985
NTV2_XptHDMIOutQ2Input
@ NTV2_XptHDMIOutQ2Input
Definition: ntv2enums.h:2843
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
NTV2_IS_4K_4096_VIDEO_FORMAT
#define NTV2_IS_4K_4096_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:824
NTV2_TestPatt_MultiPattern
@ NTV2_TestPatt_MultiPattern
Definition: ntv2testpatterngen.h:36
NTV2_Xpt425Mux4AInput
@ NTV2_Xpt425Mux4AInput
Definition: ntv2enums.h:2856
NTV2_XptCSC1VidRGB
@ NTV2_XptCSC1VidRGB
Definition: ntv2enums.h:2522
PlayerConfig
Configures an NTV2Player instance.
Definition: ntv2democommon.h:319
CNTV2Card::SetHDMIOutAudioSource8Channel
virtual bool SetHDMIOutAudioSource8Channel(const NTV2Audio8ChannelSelect inNewValue, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Changes the HDMI output's 8-channel audio source.
Definition: ntv2audio.cpp:914
GetNTV2StandardFromVideoFormat
NTV2Standard GetNTV2StandardFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:2279
PlayerConfig::fPixelFormat
NTV2PixelFormat fPixelFormat
The pixel format to use.
Definition: ntv2democommon.h:327
NTV2Buffer::Fill
bool Fill(const T &inValue)
Fills me with the given scalar value.
Definition: ntv2publicinterface.h:6367
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
NTV2_XptCSC8VidYUV
@ NTV2_XptCSC8VidYUV
Definition: ntv2enums.h:2626
NTV2TestPatternGen::getTestPatternNames
static NTV2TestPatternNames getTestPatternNames(void)
Definition: ntv2testpatterngen.cpp:2542
NTV2_XptFrameBuffer3_DS2RGB
@ NTV2_XptFrameBuffer3_DS2RGB
Definition: ntv2enums.h:2656
NTV2_XptSDIOut7InputDS2
@ NTV2_XptSDIOut7InputDS2
Definition: ntv2enums.h:2798
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
PLNOTE
#define PLNOTE(_xpr_)
Definition: ntv2democommon.h:36
NTV2_Xpt425Mux3AYUV
@ NTV2_Xpt425Mux3AYUV
Definition: ntv2enums.h:2643
AJA_STATUS_OPEN
@ AJA_STATUS_OPEN
Definition: types.h:388
NTV2_XptCSC2VidYUV
@ NTV2_XptCSC2VidYUV
Definition: ntv2enums.h:2536
AJATimeBase::FramesToSeconds
double FramesToSeconds(int64_t frames) const
Definition: timebase.cpp:197
NTV2_XptCSC6VidRGB
@ NTV2_XptCSC6VidRGB
Definition: ntv2enums.h:2621
CNTV2DemoCommon::NTV2FrameRate2TimecodeFormat
static TimecodeFormat NTV2FrameRate2TimecodeFormat(const NTV2FrameRate inFrameRate)
Definition: ntv2democommon.cpp:1058
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
NTV2_TestPatt_LineSweep
@ NTV2_TestPatt_LineSweep
Definition: ntv2testpatterngen.h:33
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
ancillarydata_hdr_sdr.h
Declares the AJAAncillaryData_HDR_SDR class.
AJAThread::Start
virtual AJAStatus Start()
Definition: thread.cpp:91
PLFAIL
#define PLFAIL(_xpr_)
Definition: ntv2democommon.h:34
NTV2_XptDuallinkOut5
@ NTV2_XptDuallinkOut5
Definition: ntv2enums.h:2586
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5693
NTV2AudioSystem
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information.
Definition: ntv2enums.h:3865
AJA_FAILURE
#define AJA_FAILURE(_status_)
Definition: types.h:371
NTV2_AUDIO_RATE_INVALID
@ NTV2_AUDIO_RATE_INVALID
Definition: ntv2enums.h:1920
NTV2_XptFrameBuffer5YUV
@ NTV2_XptFrameBuffer5YUV
Definition: ntv2enums.h:2606
NTV2_XptDuallinkOut8
@ NTV2_XptDuallinkOut8
Definition: ntv2enums.h:2633
NTV2_XptCSC5VidInput
@ NTV2_XptCSC5VidInput
Definition: ntv2enums.h:2765
gAncMaxSizeBytes
static ULWord gAncMaxSizeBytes(NTV2_ANCSIZE_MAX)
The maximum number of bytes of ancillary data that can be transferred for a single field....
CNTV2Card::SetHDMIV2TxBypass
virtual bool SetHDMIV2TxBypass(const bool inBypass)
Definition: ntv2hdmi.cpp:348
DeviceCapabilities::CanDoFrameBufferFormat
bool CanDoFrameBufferFormat(const NTV2PixelFormat inPF)
Definition: ntv2devicecapabilities.h:226
NTV2_TestPatt_LinearRamp
@ NTV2_TestPatt_LinearRamp
Definition: ntv2testpatterngen.h:40
CNTV2Card::SetHDMIOutAudioFormat
virtual bool SetHDMIOutAudioFormat(const NTV2AudioFormat inNewValue)
Sets the HDMI output's audio format.
Definition: ntv2audio.cpp:984
NTV2ChannelToAudioSystem
NTV2AudioSystem NTV2ChannelToAudioSystem(const NTV2Channel inChannel)
Converts the given NTV2Channel value into its equivalent NTV2AudioSystem.
Definition: ntv2utils.cpp:4934
NTV2_Xpt425Mux3BRGB
@ NTV2_Xpt425Mux3BRGB
Definition: ntv2enums.h:2646
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:8234
NTV2_Xpt425Mux3BYUV
@ NTV2_Xpt425Mux3BYUV
Definition: ntv2enums.h:2645
NTV2_XptCSC2VidInput
@ NTV2_XptCSC2VidInput
Definition: ntv2enums.h:2759
NTV2_XptFrameBuffer7RGB
@ NTV2_XptFrameBuffer7RGB
Definition: ntv2enums.h:2611
NTV2FormatDescriptor::IsValid
bool IsValid(void) const
Definition: ntv2formatdescriptor.h:112
PLINFO
#define PLINFO(_xpr_)
Definition: ntv2democommon.h:37
CNTV2Card::SetLHIHDMIOutColorSpace
virtual bool SetLHIHDMIOutColorSpace(const NTV2LHIHDMIColorSpace inNewValue)
Definition: ntv2hdmi.cpp:435
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
NTV2_ANCSIZE_MAX
#define NTV2_ANCSIZE_MAX
Definition: ntv2democommon.h:47
NTV2_XptSDIOut1Input
@ NTV2_XptSDIOut1Input
Definition: ntv2enums.h:2785
PLWARN
#define PLWARN(_xpr_)
Definition: ntv2democommon.h:35
NTV2_Xpt425Mux1BInput
@ NTV2_Xpt425Mux1BInput
Definition: ntv2enums.h:2851
NTV2Player4K::GetACStatus
virtual void GetACStatus(AUTOCIRCULATE_STATUS &outStatus)
Provides status information about my output (playout) process.
Definition: ntv2player4k.cpp:1461
CNTV2Card::SetSDIOutLevelAtoLevelBConversion
virtual bool SetSDIOutLevelAtoLevelBConversion(const UWord inOutputSpigot, const bool inEnable)
Enables or disables 3G level A to 3G level B conversion at the SDI output widget (assuming the AJA de...
Definition: ntv2register.cpp:4301
CRP188::GetRP188Str
bool GetRP188Str(std::string &sRP188) const
Definition: ntv2rp188.cpp:917
NTV2Player4K::Route4KDownConverter
virtual bool Route4KDownConverter(void)
Sets up board routing for the 4K DownConverter to SDI Monitor (if available).
Definition: ntv2player4k.cpp:605
NTV2_XptSDIOut6InputDS2
@ NTV2_XptSDIOut6InputDS2
Definition: ntv2enums.h:2796
NTV2_OEM_TASKS
@ NTV2_OEM_TASKS
2: OEM (recommended): device configured by client application(s) with some driver involvement.
Definition: ntv2publicinterface.h:4397
NTV2_XptSDIOut3Input
@ NTV2_XptSDIOut3Input
Definition: ntv2enums.h:2789
NTV2_XptDuallinkOut4
@ NTV2_XptDuallinkOut4
Definition: ntv2enums.h:2578
NTV2TestPatternNames
NTV2StringList NTV2TestPatternNames
An ordered sequence of pattern names.
Definition: ntv2testpatterngen.h:21
NTV2_Xpt425Mux2AInput
@ NTV2_Xpt425Mux2AInput
Definition: ntv2enums.h:2852
NTV2Buffer::Set
bool Set(const void *pInUserPointer, const size_t inByteCount)
Sets (or resets) me from a client-supplied address and size.
Definition: ntv2publicinterface.cpp:1753
NTV2_XptDuallinkOut2
@ NTV2_XptDuallinkOut2
Definition: ntv2enums.h:2551
NTV2_Xpt425Mux4BYUV
@ NTV2_Xpt425Mux4BYUV
Definition: ntv2enums.h:2649
NTV2_XptDualLinkOut1Input
@ NTV2_XptDualLinkOut1Input
Definition: ntv2enums.h:2817
NTV2_XptDuallinkOut3DS2
@ NTV2_XptDuallinkOut3DS2
Definition: ntv2enums.h:2577
NTV2_XptCSC6VidInput
@ NTV2_XptCSC6VidInput
Definition: ntv2enums.h:2767
NTV2_XptDualLinkOut8Input
@ NTV2_XptDualLinkOut8Input
Definition: ntv2enums.h:2824
NTV2Player4K::ConsumerThreadStatic
static void ConsumerThreadStatic(AJAThread *pThread, void *pContext)
This is the consumer thread's static callback function that gets called when the consumer thread star...
Definition: ntv2player4k.cpp:1209
NTV2_AUDIOSYSTEM_INVALID
@ NTV2_AUDIOSYSTEM_INVALID
Definition: ntv2enums.h:3877
timebase.h
Declares the AJATimeBase class.