AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
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  // Check if HDR anc is permissible...
263  if (IS_KNOWN_AJAAncDataType(mConfig.fTransmitHDRType) && !mDevice.features().CanDoCustomAnc())
264  {cerr << "## WARNING: HDR Anc requested, but device can't do custom anc" << endl;
266 
267  // Get current per-field maximum Anc buffer size...
270 
271  // Set output clock reference...
272  mDevice.SetReference(mDevice.features().CanDo2110() ? NTV2_REFERENCE_SFP1_PTP : NTV2_REFERENCE_FREERUN);
273 
274  // At this point, video setup is complete (except for widget signal routing).
275  return AJA_STATUS_SUCCESS;
276 
277 } // SetUpVideo
278 
279 
281 {
282  uint16_t numAudioChannels (mDevice.features().GetMaxAudioChannels());
283 
284  // If there are 4096 pixels on a line instead of 3840, reduce the number of audio channels
285  // This is because HANC is narrower, and has space for only 8 channels
286  if (NTV2_IS_4K_4096_VIDEO_FORMAT(mConfig.fVideoFormat) && numAudioChannels > 8)
287  numAudioChannels = 8;
288 
289  // Use the NTV2AudioSystem that has the same ordinal value as the output FrameStore/Channel...
290  mAudioSystem = ::NTV2ChannelToAudioSystem(mConfig.fOutputChannel);
291 
292  if (mConfig.fNumAudioLinks > 1) // For users that want to send 32 or 64 audio channels on 2 or 4 SDI links
293  switch (mAudioSystem)
294  {
295  default:
296  case NTV2_AUDIOSYSTEM_1:
297  { const UWord numChan(NTV2_IS_4K_HFR_VIDEO_FORMAT(mConfig.fVideoFormat) ? 4 : 2);
298  const NTV2AudioSystemSet audSystems (::NTV2MakeAudioSystemSet (mAudioSystem, numChan));
299  for (UWord chan(0); chan < numChan; chan++)
300  mDevice.SetSDIOutputAudioSystem (NTV2Channel(chan), NTV2AudioSystem(chan));
301  mDevice.SetNumberAudioChannels (numAudioChannels, audSystems);
302  mDevice.SetAudioBufferSize (NTV2_AUDIO_BUFFER_BIG, audSystems);
303  mDevice.SetAudioLoopBack (NTV2_AUDIO_LOOPBACK_OFF, audSystems);
304  break;
305  }
306  case NTV2_AUDIOSYSTEM_3:
309  break;
310  }
311  else
312  {
313  NTV2ChannelSet sdiSpigots (::NTV2MakeChannelSet (mConfig.fOutputChannel, 1));
314  if (!mDevice.features().CanDo12gRouting())
315  sdiSpigots = ::NTV2MakeChannelSet (mAudioSystem == NTV2_AUDIOSYSTEM_1 || mAudioSystem == NTV2_AUDIOSYSTEM_3
316  ? NTV2_CHANNEL1
317  : NTV2_CHANNEL5, 4);
318  mDevice.SetSDIOutputAudioSystem (sdiSpigots, mAudioSystem);
319  mDevice.SetNumberAudioChannels (numAudioChannels, mAudioSystem);
320  mDevice.SetAudioBufferSize (NTV2_AUDIO_BUFFER_BIG, mAudioSystem);
321  mDevice.SetAudioLoopBack (NTV2_AUDIO_LOOPBACK_OFF, mAudioSystem);
322  }
323 
324  if (mConfig.fDoHDMIOutput)
325  {
329  }
330 
331  return AJA_STATUS_SUCCESS;
332 
333 } // SetUpAudio
334 
335 
337 {
338  CNTV2DemoCommon::SetDefaultPageSize(); // Set host-specific page size
339 
340  // Let my circular buffer know when it's time to quit...
341  mFrameDataRing.SetAbortFlag (&mGlobalQuit);
342 
343  // Multi-link audio uses stacked buffers for transferring to the board,
344  // the first byte after the end of the first audio link buffer is the start of the second audio link buffer.
345  const size_t audioBufferSize (gAudMaxSizeBytes * uint32_t(mConfig.fNumAudioLinks));
346 
347  // Allocate and add each in-host NTV2FrameData to my circular buffer member variable...
348  mHostBuffers.reserve(CIRCULAR_BUFFER_SIZE);
349  while (mHostBuffers.size() < CIRCULAR_BUFFER_SIZE)
350  {
351  mHostBuffers.push_back(NTV2FrameData()); // Make a new NTV2FrameData...
352  NTV2FrameData & frameData(mHostBuffers.back()); // ...and get a reference to it
353 
354  // Don't allocate a page-aligned video buffer here.
355  // Instead, the test pattern buffers are used (and re-used) in the consumer thread.
356  // This saves a LOT of memory and time spent copying data with these large 4K/UHD rasters.
357  // NOTE: This differs substantially from the NTV2Player demo, which pre-allocates the ring of video buffers
358  // here, then in its producer thread, copies a fresh, unmodified test pattern raster into the video
359  // buffer, blits timecode into it, then transfers it to the hardware in its consumer thread.
360 
361  // Allocate a page-aligned audio buffer (if transmitting audio)
362  if (mConfig.WithAudio())
363  if (!frameData.fAudioBuffer.Allocate (audioBufferSize, BUFFER_PAGE_ALIGNED))
364  {
365  PLFAIL("Failed to allocate " << xHEX0N(audioBufferSize,8) << "-byte audio buffer");
366  return AJA_STATUS_MEMORY;
367  }
368  if (frameData.fAudioBuffer)
369  {
370  frameData.fAudioBuffer.Fill(ULWord(0));
371  #ifdef NTV2_BUFFER_LOCKING
372  mDevice.DMABufferLock(frameData.fAudioBuffer, /*alsoPreLockSGL*/true);
373  #endif
374  }
375  mFrameDataRing.Add (&frameData);
376  } // for each NTV2FrameData
377 
378  return AJA_STATUS_SUCCESS;
379 
380 } // SetUpHostBuffers
381 
382 
384 {
385  vector<NTV2TestPatternSelect> testPatIDs;
386  testPatIDs.push_back(NTV2_TestPatt_ColorBars100);
387  testPatIDs.push_back(NTV2_TestPatt_ColorBars75);
388  testPatIDs.push_back(NTV2_TestPatt_Ramp);
389  testPatIDs.push_back(NTV2_TestPatt_MultiBurst);
390  testPatIDs.push_back(NTV2_TestPatt_LineSweep);
391  testPatIDs.push_back(NTV2_TestPatt_CheckField);
392  testPatIDs.push_back(NTV2_TestPatt_FlatField);
393  testPatIDs.push_back(NTV2_TestPatt_MultiPattern);
394  testPatIDs.push_back(NTV2_TestPatt_Black);
395  testPatIDs.push_back(NTV2_TestPatt_White);
396  testPatIDs.push_back(NTV2_TestPatt_Border);
397  testPatIDs.push_back(NTV2_TestPatt_LinearRamp);
398  testPatIDs.push_back(NTV2_TestPatt_SlantRamp);
399  testPatIDs.push_back(NTV2_TestPatt_ZonePlate);
400  testPatIDs.push_back(NTV2_TestPatt_ColorQuadrant);
401  testPatIDs.push_back(NTV2_TestPatt_ColorQuadrantBorder);
402 
403  mTestPatRasters.clear();
404  for (size_t tpNdx(0); tpNdx < testPatIDs.size(); tpNdx++)
405  mTestPatRasters.push_back(NTV2Buffer());
406 
407  if (!mFormatDesc.IsValid())
408  {PLFAIL("Bad format descriptor"); return AJA_STATUS_FAIL;}
409  if (mFormatDesc.IsVANC())
410  {PLFAIL("VANC incompatible with UHD/4K: " << mFormatDesc); return AJA_STATUS_FAIL;}
411 
412  // Set up one video buffer for each test pattern...
413  for (size_t tpNdx(0); tpNdx < testPatIDs.size(); tpNdx++)
414  {
415  // Allocate the buffer memory...
416  if (!mTestPatRasters.at(tpNdx).Allocate (mFormatDesc.GetVideoWriteSize(), BUFFER_PAGE_ALIGNED))
417  { PLFAIL("Test pattern buffer " << DEC(tpNdx+1) << " of " << DEC(testPatIDs.size()) << ": "
418  << xHEX0N(mFormatDesc.GetVideoWriteSize(),8) << "-byte page-aligned alloc failed");
419  return AJA_STATUS_MEMORY;
420  }
421 
422  // Fill the buffer with test pattern...
423  NTV2TestPatternGen testPatternGen;
424  if (!testPatternGen.DrawTestPattern (testPatIDs.at(tpNdx), mFormatDesc, mTestPatRasters.at(tpNdx)))
425  {
426  cerr << "## ERROR: DrawTestPattern " << DEC(tpNdx) << " failed: " << mFormatDesc << endl;
427  return AJA_STATUS_FAIL;
428  }
429 
430  #ifdef NTV2_BUFFER_LOCKING
431  // Try to prelock the memory, including its scatter-gather list...
432  if (!mDevice.DMABufferLock(mTestPatRasters.at(tpNdx), /*alsoLockSegmentMap=*/true))
433  PLWARN("Test pattern buffer " << DEC(tpNdx+1) << " of " << DEC(testPatIDs.size()) << ": failed to pre-lock");
434  #endif
435  } // loop for each predefined pattern
436 
437  return AJA_STATUS_SUCCESS;
438 
439 } // SetUpTestPatternBuffers
440 
441 
443 {
444  const bool isRGB (::IsRGBFormat(mConfig.fPixelFormat));
445  bool useLinkGrouping = false;
446  UWord failures(0); // tally of routing failures
447 
448  if (!mConfig.fDoMultiFormat)
449  mDevice.ClearRouting(); // Replace current signal routing
450 
451  // Construct switch value to avoid multiple if-then-else
452  int switchValue = 0;
454  switchValue += 8;
455  if (mConfig.fDoTsiRouting)
456  switchValue += 4;
457  if (isRGB)
458  switchValue += 2;
459  if (mConfig.fDoRGBOnWire)
460  switchValue += 1;
461  if (mDevice.features().CanDo12GSDI() && !mDevice.features().CanDo12gRouting())
462  {
463  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, false);
464  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, false);
465  if (mConfig.fDoLinkGrouping)
466  useLinkGrouping = true;
467  }
468 
469  switch (switchValue)
470  {
471  case 0: // Low Frame Rate, Square, Pixel YCbCr, Wire YCbCr
472  if (!RouteFsToSDIOut()) failures++;
474  break;
475  case 1: // Low Frame Rate, Square, Pixel YCbCr, Wire RGB
476  if (!RouteFsToCsc()) failures++;
477  if (!RouteCscToDLOut()) failures++;
478  if (!RouteDLOutToSDIOut()) failures++;
480  break;
481  case 2: // Low Frame Rate, Square, Pixel RGB, Wire YCbCr
482  if (!RouteFsToCsc()) failures++;
483  if (!RouteCscTo4xSDIOut()) failures++;
485  break;
486  case 3: // Low Frame Rate, Square, Pixel RGB, Wire RGB
487  if (!RouteFsToDLOut()) failures++;
488  if (!RouteDLOutToSDIOut()) failures++;
490  break;
491  case 4: // Low Frame Rate, Tsi, Pixel YCbCr, Wire YCbCr
492  if (!RouteFsToTsiMux()) failures++;
493  if (!RouteTsiMuxTo2xSDIOut()) failures++;
494  if (useLinkGrouping)
495  {
496  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, true);
498  }
499  else
501  break;
502  case 5: // Low Frame Rate, Tsi, Pixel YCbCr, Wire RGB
503  if (!RouteFsToTsiMux()) failures++;
504  if (!RouteTsiMuxToCsc()) failures++;
505  if (!RouteCscToDLOut()) failures++;
506  if (!RouteDLOutToSDIOut()) failures++;
507  if (useLinkGrouping)
508  {
509  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
511  }
512  else
514  break;
515  case 6: // Low Frame Rate, Tsi, Pixel RGB, Wire YCbCr
516  if (!RouteFsToTsiMux()) failures++;
517  if (!RouteTsiMuxToCsc()) failures++;
518  if (!RouteCscTo2xSDIOut()) failures++;
519  if (useLinkGrouping)
520  {
521  mDevice.SetSDIOut6GEnable(NTV2_CHANNEL3, true);
523  }
524  else
526  break;
527  case 7: // Low Frame Rate, Tsi, Pixel RGB, Wire RGB
528  if (!RouteFsToTsiMux()) failures++;
529  if (!RouteTsiMuxToDLOut()) failures++;
530  if (!RouteDLOutToSDIOut()) failures++;
531  if (useLinkGrouping)
532  {
533  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
535  }
536  else
538  break;
539  case 8: // High Frame Rate, Square, Pixel YCbCr, Wire YCbCr
540  if (!RouteFsToSDIOut()) failures++;
542  break;
543  case 9: // High Frame Rate, Square, Pixel YCbCr, Wire RGB
544  // No valid routing for this case
545  break;
546  case 10: // High Frame Rate, Square, Pixel RGB, Wire YCbCr
547  if (!RouteFsToCsc()) failures++;
548  if (!RouteCscTo4xSDIOut()) failures++;
550  break;
551  case 11: // High Frame Rate, Square, Pixel RGB, Wire RGB
552  // No valid routing for this case
553  break;
554  case 12: // High Frame Rate, Tsi, Pixel YCbCr, Wire YCbCr
555  if (!RouteFsToTsiMux()) failures++;
556  if (!RouteTsiMuxTo4xSDIOut()) failures++;
557  if (useLinkGrouping)
558  {
559  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
561  }
562  else
564  break;
565  case 13: // High Frame Rate, Tsi, Pixel YCbCr, Wire RGB
566  // No valid routing for this case
567  break;
568  case 14: // High Frame Rate, Tsi, Pixel RGB, Wire YCbCr
569  if (!RouteFsToTsiMux()) failures++;
570  if (!RouteTsiMuxToCsc()) failures++;
571  if (!RouteCscTo4xSDIOut()) failures++;
572  if(useLinkGrouping)
573  {
574  mDevice.SetSDIOut12GEnable(NTV2_CHANNEL3, true);
576  }
577  else
579  break;
580  case 15: // High Frame Rate, Tsi, Pixel RGB, Wire RGB
581  // No valid routing for this case
582  break;
583  default:
584  return false; // Fail
585  }
586 
587  if (mDevice.features().CanDo12gRouting())
588  mDevice.SetTsiFrameEnable (true, mConfig.fOutputChannel);
589  else if (mConfig.fDoTsiRouting)
590  mDevice.SetTsiFrameEnable (true, mConfig.fOutputChannel);
591  else
592  mDevice.Set4kSquaresEnable (true, mConfig.fOutputChannel);
593 
594  // Send signal to secondary outputs, if supported
595  if (!Route4KDownConverter()) failures++;
596  if (!RouteHDMIOutput()) failures++;
597  return failures == 0;
598 
599 } // RouteOutputSignal
600 
601 
602 void NTV2Player4K::SetupSDITransmitters (const NTV2Channel inFirstSDI, const UWord inNumSDIs)
603 {
604  if (mDevice.features().HasBiDirectionalSDI())
605  mDevice.SetSDITransmitEnable(::NTV2MakeChannelSet (inFirstSDI, mDevice.features().CanDo12gRouting() ? 1 : inNumSDIs),
606  /*transmit=*/true);
607 }
608 
609 
611 {
613  return true;
614 
615  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
616  UWord connectFailures (0);
617  if (::IsRGBFormat(mConfig.fPixelFormat))
618  {
619  mDevice.Enable4KDCRGBMode(true);
620 
621  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
622  {
623  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
624  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
625  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
626  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
627 
628  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
629  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
630  }
631  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
632  {
633  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
634  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
635  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
636  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
637 
638  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
639  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
640  }
641  }
642  else // YUV FBF
643  {
644  mDevice.Enable4KDCRGBMode (false);
645 
646  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
647  {
648  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
649  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
650  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
651  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
652 
653  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
654  }
655  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
656  {
657  if (!mDevice.Connect (NTV2_Xpt4KDCQ1Input, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
658  if (!mDevice.Connect (NTV2_Xpt4KDCQ2Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
659  if (!mDevice.Connect (NTV2_Xpt4KDCQ3Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
660  if (!mDevice.Connect (NTV2_Xpt4KDCQ4Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
661 
662  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt4KDownConverterOut, canVerify)) connectFailures++;
663  }
664  }
665  return connectFailures == 0;
666 
667 } // Route4KDownConverter
668 
669 
671 {
672  const bool isRGB (::IsRGBFormat(mConfig.fPixelFormat));
673  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
674  UWord connectFailures (0);
675 
676  if (mConfig.fDoHDMIOutput &&
680  || mDevice.features().CanDoWidget(NTV2_WgtHDMIOut1v5)) )
681  {
682  if (mDevice.features().CanDo12gRouting())
683  {
684  if (!mDevice.Connect (NTV2_XptHDMIOutInput, ::GetFrameBufferOutputXptFromChannel (mConfig.fOutputChannel, isRGB, false/*is425*/), canVerify))
685  connectFailures++;
686  }
687  else if(mConfig.fDoTsiRouting)
688  {
689  if (isRGB)
690  {
691  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
692  {
693  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
694  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
695  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
696  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
697  }
698  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
699  {
700  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
701  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
702  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
703  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
704  }
705  }
706  else
707  {
708  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
709  {
710  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
711  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
712  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
713  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
714  }
715  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
716  {
717  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
718  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
719  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
720  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
721  }
722  }
723  }
724  else
725  {
726  if (isRGB)
727  {
728  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
729  {
730  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
731  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
732 
733  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
734  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
735 
736  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
737  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
738 
739  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
740  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
741  }
742  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
743  {
744  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
745  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
746 
747  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
748  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
749 
750  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
751  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
752 
753  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
754  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
755  }
756  }
757  else
758  {
759  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
760  {
761  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
762  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
763  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
764  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
765  }
766  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
767  {
768  if (!mDevice.Connect (NTV2_XptHDMIOutInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
769  if (!mDevice.Connect (NTV2_XptHDMIOutQ2Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
770  if (!mDevice.Connect (NTV2_XptHDMIOutQ3Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
771  if (!mDevice.Connect (NTV2_XptHDMIOutQ4Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
772  }
773  }
774  }
775 
776  mDevice.SetHDMIV2TxBypass (false);
784  }
785  else
787  return connectFailures == 0;
788 
789 } // RouteHDMIOutput
790 
791 
793 {
794  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
795  UWord connectFailures (0);
796  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
797  {
798  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
799  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
800  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
801  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
802  }
803  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
804  {
805  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
806  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
807  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
808  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
809  }
810  return connectFailures == 0;
811 } // RouteFsToDLOut
812 
813 
815 {
816  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
817  UWord connectFailures (0);
818  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
819  {
820  if (::IsRGBFormat(mConfig.fPixelFormat))
821  {
822  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
823  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
824  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
825  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
826  }
827  else
828  {
829  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
830  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
831  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
832  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
833  }
834  }
835  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
836  {
837  if (::IsRGBFormat(mConfig.fPixelFormat))
838  {
839  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
840  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
841  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7RGB, canVerify)) connectFailures++;
842  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8RGB, canVerify)) connectFailures++;
843  }
844  else
845  {
846  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
847  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
848  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
849  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
850  }
851  }
852  return connectFailures == 0;
853 } // RouteFsToCsc
854 
855 
857 {
858  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
859  UWord connectFailures (0);
860  if (mDevice.features().CanDo12gRouting())
861  {
862  if (!mDevice.Connect ( ::GetSDIOutputInputXpt (mConfig.fOutputChannel, false/*isDS2*/),
863  ::GetFrameBufferOutputXptFromChannel (mConfig.fOutputChannel, false/*isRGB*/, false/*is425*/),
864  canVerify))
865  connectFailures++;
866  }
867  else
868  {
869  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
870  {
871  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
872  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
873  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
874  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
875  }
876  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
877  {
878  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
879  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
880  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptFrameBuffer7YUV, canVerify)) connectFailures++;
881  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptFrameBuffer8YUV, canVerify)) connectFailures++;
882  }
883  }
884  return connectFailures == 0;
885 } // RouteFsToSDIOut
886 
887 
889 {
890  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
891  UWord connectFailures (0);
892  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
893  {
894  if (::IsRGBFormat(mConfig.fPixelFormat))
895  {
896  if (!mDevice.Connect (NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1RGB, canVerify)) connectFailures++;
897  if (!mDevice.Connect (NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2RGB, canVerify)) connectFailures++;
898  if (!mDevice.Connect (NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2RGB, canVerify)) connectFailures++;
899  if (!mDevice.Connect (NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2RGB, canVerify)) connectFailures++;
900  }
901  else
902  {
903  if (!mDevice.Connect (NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1YUV, canVerify)) connectFailures++;
904  if (!mDevice.Connect (NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2YUV, canVerify)) connectFailures++;
905  if (!mDevice.Connect (NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2YUV, canVerify)) connectFailures++;
906  if (!mDevice.Connect (NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2YUV, canVerify)) connectFailures++;
907  }
908  }
909  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
910  {
911  if (::IsRGBFormat(mConfig.fPixelFormat))
912  {
913  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer3RGB, canVerify)) connectFailures++;
914  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer3_DS2RGB, canVerify)) connectFailures++;
915  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer4RGB, canVerify)) connectFailures++;
916  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer4_DS2RGB, canVerify)) connectFailures++;
917  }
918  else
919  {
920  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer3YUV, canVerify)) connectFailures++;
921  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer3_DS2YUV, canVerify)) connectFailures++;
922  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer4YUV, canVerify)) connectFailures++;
923  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer4_DS2YUV, canVerify)) connectFailures++;
924  }
925  }
926  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
927  {
928  if (::IsRGBFormat(mConfig.fPixelFormat))
929  {
930  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer5RGB, canVerify)) connectFailures++;
931  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer5_DS2RGB, canVerify)) connectFailures++;
932  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer6RGB, canVerify)) connectFailures++;
933  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer6_DS2RGB, canVerify)) connectFailures++;
934  }
935  else
936  {
937  if (!mDevice.Connect (NTV2_Xpt425Mux3AInput, NTV2_XptFrameBuffer5YUV, canVerify)) connectFailures++;
938  if (!mDevice.Connect (NTV2_Xpt425Mux3BInput, NTV2_XptFrameBuffer5_DS2YUV, canVerify)) connectFailures++;
939  if (!mDevice.Connect (NTV2_Xpt425Mux4AInput, NTV2_XptFrameBuffer6YUV, canVerify)) connectFailures++;
940  if (!mDevice.Connect (NTV2_Xpt425Mux4BInput, NTV2_XptFrameBuffer6_DS2YUV, canVerify)) connectFailures++;
941  }
942  }
943  return connectFailures == 0;
944 } // RouteFsToTsiMux
945 
946 
948 {
949  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
950  UWord connectFailures (0);
951  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
952  {
953  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptDuallinkOut1, canVerify)) connectFailures++;
954  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_XptDuallinkOut1DS2, canVerify)) connectFailures++;
955  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptDuallinkOut2, canVerify)) connectFailures++;
956  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_XptDuallinkOut2DS2, canVerify)) connectFailures++;
957  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptDuallinkOut3, canVerify)) connectFailures++;
958  if (!mDevice.Connect (NTV2_XptSDIOut3InputDS2, NTV2_XptDuallinkOut3DS2, canVerify)) connectFailures++;
959  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptDuallinkOut4, canVerify)) connectFailures++;
960  if (!mDevice.Connect (NTV2_XptSDIOut4InputDS2, NTV2_XptDuallinkOut4DS2, canVerify)) connectFailures++;
961  }
962  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
963  {
964  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptDuallinkOut5, canVerify)) connectFailures++;
965  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_XptDuallinkOut5DS2, canVerify)) connectFailures++;
966  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptDuallinkOut6, canVerify)) connectFailures++;
967  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_XptDuallinkOut6DS2, canVerify)) connectFailures++;
968  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptDuallinkOut7, canVerify)) connectFailures++;
969  if (!mDevice.Connect (NTV2_XptSDIOut7InputDS2, NTV2_XptDuallinkOut7DS2, canVerify)) connectFailures++;
970  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptDuallinkOut8, canVerify)) connectFailures++;
971  if (!mDevice.Connect (NTV2_XptSDIOut8InputDS2, NTV2_XptDuallinkOut8DS2, canVerify)) connectFailures++;
972  }
973  return connectFailures == 0;
974 } // RouteDLOutToSDIOut
975 
976 
978 {
979  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
980  UWord connectFailures (0);
981  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
982  {
983  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
984  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
985  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
986  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
987  }
988  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
989  {
990  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
991  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
992  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
993  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
994  }
995  return connectFailures == 0;
996 } // RouteCscTo2xSDIOut
997 
998 
1000 {
1001  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1002  UWord connectFailures (0);
1003  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1004  {
1005  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_XptCSC1VidYUV, canVerify)) connectFailures++;
1006  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_XptCSC2VidYUV, canVerify)) connectFailures++;
1007  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_XptCSC3VidYUV, canVerify)) connectFailures++;
1008  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_XptCSC4VidYUV, canVerify)) connectFailures++;
1009  }
1010  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1011  {
1012  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_XptCSC5VidYUV, canVerify)) connectFailures++;
1013  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_XptCSC6VidYUV, canVerify)) connectFailures++;
1014  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_XptCSC7VidYUV, canVerify)) connectFailures++;
1015  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_XptCSC8VidYUV, canVerify)) connectFailures++;
1016  }
1017  return connectFailures == 0;
1018 } // RouteCscTo4xSDIOut
1019 
1020 
1022 {
1023  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1024  UWord connectFailures (0);
1025  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1026  {
1027  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_XptCSC1VidRGB, canVerify)) connectFailures++;
1028  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_XptCSC2VidRGB, canVerify)) connectFailures++;
1029  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_XptCSC3VidRGB, canVerify)) connectFailures++;
1030  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_XptCSC4VidRGB, canVerify)) connectFailures++;
1031  }
1032  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1033  {
1034  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_XptCSC5VidRGB, canVerify)) connectFailures++;
1035  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_XptCSC6VidRGB, canVerify)) connectFailures++;
1036  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_XptCSC7VidRGB, canVerify)) connectFailures++;
1037  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_XptCSC8VidRGB, canVerify)) connectFailures++;
1038  }
1039  return connectFailures == 0;
1040 } // RouteCscToDLOut
1041 
1042 
1044 {
1045  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1046  UWord connectFailures (0);
1047  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1048  {
1049  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_Xpt425Mux1ARGB, canVerify)) connectFailures++;
1050  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_Xpt425Mux1BRGB, canVerify)) connectFailures++;
1051  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_Xpt425Mux2ARGB, canVerify)) connectFailures++;
1052  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_Xpt425Mux2BRGB, canVerify)) connectFailures++;
1053  }
1054  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1055  {
1056  if (!mDevice.Connect (NTV2_XptDualLinkOut1Input, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1057  if (!mDevice.Connect (NTV2_XptDualLinkOut2Input, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1058  if (!mDevice.Connect (NTV2_XptDualLinkOut3Input, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1059  if (!mDevice.Connect (NTV2_XptDualLinkOut4Input, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1060  }
1061  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1062  {
1063  if (!mDevice.Connect (NTV2_XptDualLinkOut5Input, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1064  if (!mDevice.Connect (NTV2_XptDualLinkOut6Input, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1065  if (!mDevice.Connect (NTV2_XptDualLinkOut7Input, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1066  if (!mDevice.Connect (NTV2_XptDualLinkOut8Input, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1067  }
1068  return connectFailures == 0;
1069 } // RouteTsiMuxToDLOut
1070 
1071 
1073 {
1074  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1075  UWord connectFailures (0);
1076  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1077  {
1078  if (::IsRGBFormat(mConfig.fPixelFormat))
1079  {
1080  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux1ARGB, canVerify)) connectFailures++;
1081  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux1BRGB, canVerify)) connectFailures++;
1082  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux2ARGB, canVerify)) connectFailures++;
1083  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux2BRGB, canVerify)) connectFailures++;
1084  }
1085  else
1086  {
1087  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1088  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1089  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1090  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1091  }
1092  }
1093  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1094  {
1095  if (::IsRGBFormat(mConfig.fPixelFormat))
1096  {
1097  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1098  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1099  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1100  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1101  }
1102  else
1103  {
1104  if (!mDevice.Connect (NTV2_XptCSC1VidInput, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1105  if (!mDevice.Connect (NTV2_XptCSC2VidInput, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1106  if (!mDevice.Connect (NTV2_XptCSC3VidInput, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1107  if (!mDevice.Connect (NTV2_XptCSC4VidInput, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1108  }
1109  }
1110  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1111  {
1112  if (::IsRGBFormat(mConfig.fPixelFormat))
1113  {
1114  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt425Mux3ARGB, canVerify)) connectFailures++;
1115  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_Xpt425Mux3BRGB, canVerify)) connectFailures++;
1116  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_Xpt425Mux4ARGB, canVerify)) connectFailures++;
1117  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_Xpt425Mux4BRGB, canVerify)) connectFailures++;
1118  }
1119  else
1120  {
1121  if (!mDevice.Connect (NTV2_XptCSC5VidInput, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1122  if (!mDevice.Connect (NTV2_XptCSC6VidInput, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1123  if (!mDevice.Connect (NTV2_XptCSC7VidInput, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1124  if (!mDevice.Connect (NTV2_XptCSC8VidInput, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1125  }
1126  }
1127  return connectFailures == 0;
1128 } // RouteTsiMuxToCsc
1129 
1130 
1132 {
1133  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1134  UWord connectFailures (0);
1135  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1136  {
1137  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1138  if (!mDevice.Connect (NTV2_XptSDIOut1InputDS2, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1139  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1140  if (!mDevice.Connect (NTV2_XptSDIOut2InputDS2, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1141  }
1142  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1143  {
1144  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1145  if (!mDevice.Connect (NTV2_XptSDIOut3InputDS2, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1146  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1147  if (!mDevice.Connect (NTV2_XptSDIOut4InputDS2, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1148  }
1149  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1150  {
1151  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1152  if (!mDevice.Connect (NTV2_XptSDIOut5InputDS2, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1153  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1154  if (!mDevice.Connect (NTV2_XptSDIOut6InputDS2, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1155  }
1156  return connectFailures == 0;
1157 } // RouteTsiMuxTo2xSDIOut
1158 
1159 
1161 {
1162  const bool canVerify (mDevice.features().HasCrosspointConnectROM());
1163  UWord connectFailures (0);
1164  if (mConfig.fOutputChannel == NTV2_CHANNEL1)
1165  {
1166  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux1AYUV, canVerify)) connectFailures++;
1167  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux1BYUV, canVerify)) connectFailures++;
1168  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux2AYUV, canVerify)) connectFailures++;
1169  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux2BYUV, canVerify)) connectFailures++;
1170  }
1171  else if (mConfig.fOutputChannel == NTV2_CHANNEL3)
1172  { // Io4k+ 12G output
1173  if (!mDevice.Connect (NTV2_XptSDIOut1Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1174  if (!mDevice.Connect (NTV2_XptSDIOut2Input, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1175  if (!mDevice.Connect (NTV2_XptSDIOut3Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1176  if (!mDevice.Connect (NTV2_XptSDIOut4Input, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1177  }
1178  else if (mConfig.fOutputChannel == NTV2_CHANNEL5)
1179  {
1180  if (!mDevice.Connect (NTV2_XptSDIOut5Input, NTV2_Xpt425Mux3AYUV, canVerify)) connectFailures++;
1181  if (!mDevice.Connect (NTV2_XptSDIOut6Input, NTV2_Xpt425Mux3BYUV, canVerify)) connectFailures++;
1182  if (!mDevice.Connect (NTV2_XptSDIOut7Input, NTV2_Xpt425Mux4AYUV, canVerify)) connectFailures++;
1183  if (!mDevice.Connect (NTV2_XptSDIOut8Input, NTV2_Xpt425Mux4BYUV, canVerify)) connectFailures++;
1184  }
1185  return connectFailures == 0;
1186 } // RouteTsiMuxTo4xSDIOut
1187 
1188 
1190 {
1191  // Start my consumer and producer threads...
1194  return AJA_STATUS_SUCCESS;
1195 
1196 } // Run
1197 
1198 
1199 
1201 // This is where the play thread starts
1202 
1204 {
1205  // Create and start the playout thread...
1206  mConsumerThread.Attach (ConsumerThreadStatic, this);
1207  mConsumerThread.SetPriority(AJA_ThreadPriority_High);
1208  mConsumerThread.Start();
1209 
1210 } // StartConsumerThread
1211 
1212 
1213 // The playout thread function
1214 void NTV2Player4K::ConsumerThreadStatic (AJAThread * pThread, void * pContext) // static
1215 { (void) pThread;
1216  // Grab the NTV2Player4K instance pointer from the pContext parameter,
1217  // then call its PlayFrames method...
1218  NTV2Player4K * pApp (reinterpret_cast<NTV2Player4K*>(pContext));
1219  if (pApp)
1220  pApp->ConsumeFrames();
1221 
1222 } // ConsumerThreadStatic
1223 
1224 
1226 {
1227  ULWord acOptions (AUTOCIRCULATE_WITH_RP188);
1228  AUTOCIRCULATE_TRANSFER outputXfer;
1229  AUTOCIRCULATE_STATUS outputStatus;
1230  AJAAncillaryData * pPkt (AJA_NULL);
1231  ULWord goodXfers(0), badXfers(0), prodWaits(0), noRoomWaits(0);
1232  const UWord numACFramesPerChannel(7);
1233 
1234  // Stop AutoCirculate, just in case someone else left it running...
1235  mDevice.AutoCirculateStop(mConfig.fOutputChannel);
1236  mDevice.WaitForOutputVerticalInterrupt(mConfig.fOutputChannel, 4); // Let it stop
1237  PLNOTE("Thread started");
1238 
1240  { // HDR anc doesn't change per-frame, so fill outputXfer.acANCBuffer with the packet data...
1241  static AJAAncillaryData_HDR_SDR sdrPkt;
1242  static AJAAncillaryData_HDR_HDR10 hdr10Pkt;
1243  static AJAAncillaryData_HDR_HLG hlgPkt;
1244 
1245  switch (mConfig.fTransmitHDRType)
1246  {
1247  case AJAAncDataType_HDR_SDR: pPkt = &sdrPkt; break;
1248  case AJAAncDataType_HDR_HDR10: pPkt = &hdr10Pkt; break;
1249  case AJAAncDataType_HDR_HLG: pPkt = &hlgPkt; break;
1250  default: break;
1251  }
1252  }
1253  if (pPkt)
1254  { // Allocate page-aligned host Anc buffer...
1255  uint32_t hdrPktSize (0);
1256  if (!outputXfer.acANCBuffer.Allocate(gAncMaxSizeBytes, BUFFER_PAGE_ALIGNED) || !outputXfer.acANCBuffer.Fill(0LL))
1257  PLWARN("Anc buffer " << xHEX0N(gAncMaxSizeBytes,8) << "(" << DEC(gAncMaxSizeBytes) << ")-byte allocate failed -- HDR anc insertion disabled");
1258  else if (AJA_FAILURE(pPkt->GenerateTransmitData (outputXfer.acANCBuffer, outputXfer.acANCBuffer, hdrPktSize)))
1259  {
1260  PLWARN("HDR anc insertion disabled -- GenerateTransmitData failed");
1261  outputXfer.acANCBuffer.Deallocate();
1262  }
1263  else
1264  acOptions |= AUTOCIRCULATE_WITH_ANC;
1265  }
1266 #ifdef NTV2_BUFFER_LOCKING
1267  if (outputXfer.acANCBuffer)
1268  mDevice.DMABufferLock(outputXfer.acANCBuffer, /*alsoLockSGL*/true);
1269 #endif
1270 
1271  // Calculate start & end frame numbers (if mConfig.fFrames not used)...
1272  UWord startNum(0), endNum(0);
1273  if (mDevice.features().CanDo12gRouting())
1274  startNum = numACFramesPerChannel * mConfig.fOutputChannel;
1275  else switch (mConfig.fOutputChannel)
1276  { default:
1277  case NTV2_CHANNEL1: if (mConfig.fNumAudioLinks > 1)
1278  {
1281  {
1284  }
1285  }
1286  AJA_FALL_THRU;
1287  case NTV2_CHANNEL2: startNum = numACFramesPerChannel * 0; break;
1288 
1289  case NTV2_CHANNEL3: if (mConfig.fNumAudioLinks > 1)
1291  AJA_FALL_THRU;
1292  case NTV2_CHANNEL4: startNum = numACFramesPerChannel * 1; break;
1293 
1295  case NTV2_CHANNEL6: startNum = numACFramesPerChannel * 2; break;
1296 
1298  case NTV2_CHANNEL8: startNum = numACFramesPerChannel * 3; break;
1299  }
1300  endNum = startNum + numACFramesPerChannel - 1;
1301 
1302  // Initialize & start AutoCirculate...
1303  bool initOK(false);
1304  if (mConfig.fFrames.valid()) // --frames option controls everything:
1305  initOK = mDevice.AutoCirculateInitForOutput (mConfig.fOutputChannel, mConfig.fFrames.count(), mAudioSystem, acOptions,
1306  1 /*numChannels*/, mConfig.fFrames.firstFrame(), mConfig.fFrames.lastFrame());
1307  else // --frames option not used -- explicitly specify start & end frame numbers (as calculated above)
1308  initOK = mDevice.AutoCirculateInitForOutput (mConfig.fOutputChannel, 0, mAudioSystem, acOptions,
1309  1 /*numChannels*/, startNum, endNum);
1310  if (!initOK)
1311  {PLFAIL("AutoCirculateInitForOutput failed"); mGlobalQuit = true;}
1312 
1313  while (!mGlobalQuit)
1314  {
1315  mDevice.AutoCirculateGetStatus (mConfig.fOutputChannel, outputStatus);
1316 
1317  // Check if there's room for another frame on the card...
1318  if (outputStatus.CanAcceptMoreOutputFrames())
1319  {
1320  // Device has at least one free frame buffer that can be filled.
1321  // Wait for the next frame in our ring to become ready to "consume"...
1322  NTV2FrameData * pFrameData (mFrameDataRing.StartConsumeNextBuffer());
1323  if (!pFrameData)
1324  {prodWaits++; continue;}
1325 
1326  // Unlike in the NTV2Player demo, I now burn the current timecode into the test pattern buffer that was noted
1327  // earlier into this FrameData in my Producer thread. This is done to avoid copying large 4K/UHD rasters.
1328  const NTV2FrameRate ntv2FrameRate (::GetNTV2FrameRateFromVideoFormat(mConfig.fVideoFormat));
1329  const TimecodeFormat tcFormat (CNTV2DemoCommon::NTV2FrameRate2TimecodeFormat(ntv2FrameRate));
1330  const CRP188 rp188Info (mCurrentFrame++, 0, 0, 10, tcFormat);
1331  NTV2_RP188 tcData;
1332  string timeCodeString;
1333 
1334  rp188Info.GetRP188Reg (tcData);
1335  rp188Info.GetRP188Str (timeCodeString);
1336  mTCBurner.BurnTimeCode (pFrameData->fVideoBuffer, timeCodeString.c_str(), 80);
1337 
1338  // Transfer the timecode-burned frame (plus audio) to the device for playout...
1339  outputXfer.acVideoBuffer.Set (pFrameData->fVideoBuffer, pFrameData->fVideoBuffer);
1340  outputXfer.acAudioBuffer.Set (pFrameData->fAudioBuffer, pFrameData->fNumAudioBytes);
1341  outputXfer.SetOutputTimeCode (tcData, ::NTV2ChannelToTimecodeIndex(mConfig.fOutputChannel, /*LTC=*/false, /*F2=*/false));
1342  outputXfer.SetOutputTimeCode (tcData, ::NTV2ChannelToTimecodeIndex(mConfig.fOutputChannel, /*LTC=*/true, /*F2=*/false));
1343 
1344  // Perform the DMA transfer to the device...
1345  if (mDevice.AutoCirculateTransfer (mConfig.fOutputChannel, outputXfer))
1346  goodXfers++;
1347  else
1348  badXfers++;
1349 
1350  if (goodXfers == 3)
1351  mDevice.AutoCirculateStart(mConfig.fOutputChannel);
1352 
1353  // Signal that the frame has been "consumed"...
1354  mFrameDataRing.EndConsumeNextBuffer();
1355  continue; // Back to top of while loop
1356  }
1357 
1358  // Wait for one or more buffers to become available on the device, which should occur at next VBI...
1359  noRoomWaits++;
1361  } // loop til quit signaled
1362 
1363  // Stop AutoCirculate...
1364  mDevice.AutoCirculateStop(mConfig.fOutputChannel);
1365  PLNOTE("Thread completed: " << DEC(goodXfers) << " xfers, " << DEC(badXfers) << " failed, "
1366  << DEC(prodWaits) << " starves, " << DEC(noRoomWaits) << " VBI waits");
1367 
1368 } // ConsumeFrames
1369 
1370 
1371 
1373 // This is where the producer thread starts
1374 
1376 {
1377  // Create and start the producer thread...
1378  mProducerThread.Attach(ProducerThreadStatic, this);
1379  mProducerThread.SetPriority(AJA_ThreadPriority_High);
1380  mProducerThread.Start();
1381 
1382 } // StartProducerThread
1383 
1384 
1385 void NTV2Player4K::ProducerThreadStatic (AJAThread * pThread, void * pContext) // static
1386 {
1387  (void) pThread;
1388  NTV2Player4K * pApp (reinterpret_cast<NTV2Player4K*>(pContext));
1389  if (pApp)
1390  pApp->ProduceFrames();
1391 
1392 } // ProducerThreadStatic
1393 
1394 
1396 {
1397  ULWord freqNdx(0), testPatNdx(0), badTally(0);
1398  double timeOfLastSwitch (0.0);
1399 
1402 
1403  PLNOTE("Thread started");
1404  while (!mGlobalQuit)
1405  {
1406  NTV2FrameData * pFrameData (mFrameDataRing.StartProduceNextBuffer());
1407  if (!pFrameData)
1408  { badTally++; // No frame available!
1409  AJATime::Sleep(10); // Wait a bit for the consumer thread to free one up for me...
1410  continue; // ...then try again
1411  }
1412 
1413  // Unlike NTV2Player::ProduceFrames, NTV2Player4K::ProduceFrames doesn't touch this frame's video buffer.
1414  // Instead, to avoid wasting time copying large 4K/UHD rasters, in this thread we simply note which test
1415  // pattern buffer is to be modified and subsequently transferred to the hardware. This happens later, in
1416  // NTV2Player4K::ConsumeFrames...
1417  NTV2Buffer & testPatVidBuffer(mTestPatRasters.at(testPatNdx));
1418  pFrameData->fVideoBuffer.Set(testPatVidBuffer.GetHostPointer(), testPatVidBuffer.GetByteCount());
1419 
1420  // If also playing audio...
1421  if (pFrameData->AudioBuffer()) // ...then generate audio tone data for this frame...
1422  pFrameData->fNumAudioBytes = AddTone(pFrameData->AudioBuffer()); // ...and remember number of audio bytes to xfer
1423 
1424  // Every few seconds, change the test pattern and tone frequency...
1425  const double currentTime (timeBase.FramesToSeconds(mCurrentFrame++));
1426  if (currentTime > timeOfLastSwitch + 4.0)
1427  {
1428  freqNdx = (freqNdx + 1) % gNumFrequencies;
1429  testPatNdx = (testPatNdx + 1) % ULWord(mTestPatRasters.size());
1430  mToneFrequency = gFrequencies[freqNdx];
1431  timeOfLastSwitch = currentTime;
1432  PLINFO("F" << DEC0N(mCurrentFrame,6) << ": tone=" << mToneFrequency << "Hz, pattern='" << tpNames.at(testPatNdx) << "'");
1433  } // if time to switch test pattern & tone frequency
1434 
1435  // Signal that I'm done producing this FrameData, making it immediately available for transfer/playout...
1436  mFrameDataRing.EndProduceNextBuffer();
1437 
1438  } // loop til mGlobalQuit goes true
1439  PLNOTE("Thread completed: " << DEC(mCurrentFrame) << " frame(s) produced, " << DEC(badTally) << " failed");
1440 
1441 } // ProduceFrames
1442 
1443 
1444 uint32_t NTV2Player4K::AddTone (ULWord * audioBuffer)
1445 {
1448  ULWord numChannels (0);
1449 
1450  mDevice.GetFrameRate (frameRate, mConfig.fOutputChannel);
1451  mDevice.GetAudioRate (audioRate, mAudioSystem);
1452  mDevice.GetNumberAudioChannels (numChannels, mAudioSystem);
1453 
1454  // Since audio on AJA devices use fixed sample rates (typically 48KHz), certain video frame rates will
1455  // necessarily result in some frames having more audio samples than others. GetAudioSamplesPerFrame is
1456  // called to calculate the correct sample count for the current frame...
1457  const ULWord numSamples (::GetAudioSamplesPerFrame (frameRate, audioRate, mCurrentFrame));
1458  const double sampleRateHertz (::GetAudioSamplesPerSecond(audioRate));
1459 
1460  // Unlike NTV2Player::AddTone, NTV2Player4K::AddTone handles multi-link audio:
1461  ULWord bytesWritten(0), startSample(mCurrentSample);
1462  for (UWord linkNdx(0); linkNdx < mConfig.fNumAudioLinks; linkNdx++)
1463  {
1464  mCurrentSample = startSample;
1465  bytesWritten += ::AddAudioTone (audioBuffer + (bytesWritten/4), // audio buffer to fill
1466  mCurrentSample, // which sample for continuing the waveform
1467  numSamples, // number of samples to generate
1468  sampleRateHertz, // sample rate [Hz]
1469  0.50, // uniform amplitude
1470  mToneFrequency, // uniform tone frequency [Hz]
1471  31, // bits per sample
1472  false, // don't byte swap
1473  numChannels); // number of audio channels to generate
1474  } // for each SDI audio link
1475  return bytesWritten;
1476 
1477 } // AddTone
1478 
1479 
1481 {
1482  mDevice.AutoCirculateGetStatus (mConfig.fOutputChannel, outStatus);
1483 }
NTV2_XptFrameBuffer6YUV
@ NTV2_XptFrameBuffer6YUV
Definition: ntv2enums.h:2597
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:2552
NTV2_WgtHDMIOut1v5
@ NTV2_WgtHDMIOut1v5
Definition: ntv2enums.h:2991
CNTV2Card::SetMultiFormatMode
virtual bool SetMultiFormatMode(const bool inEnable)
Enables or disables multi-format (per channel) device operation. If enabled, each device channel can ...
Definition: ntv2register.cpp:4379
NTV2_XptHDMIOutInput
@ NTV2_XptHDMIOutInput
Definition: ntv2enums.h:2824
GetSDIOutputInputXpt
NTV2InputXptID GetSDIOutputInputXpt(const NTV2Channel inSDIOutput, const bool inIsDS2=false)
Definition: ntv2signalrouter.cpp:942
NTV2_Xpt425Mux1AInput
@ NTV2_Xpt425Mux1AInput
Definition: ntv2enums.h:2833
NTV2_XptDualLinkOut7Input
@ NTV2_XptDualLinkOut7Input
Definition: ntv2enums.h:2806
NTV2Player4K::RouteDLOutToSDIOut
virtual bool RouteDLOutToSDIOut(void)
Sets up board routing from the Dual Link outputs to the SDI outputs.
Definition: ntv2player4k.cpp:947
NTV2_Xpt425Mux2BRGB
@ NTV2_Xpt425Mux2BRGB
Definition: ntv2enums.h:2631
DeviceCapabilities::CanDoVideoFormat
bool CanDoVideoFormat(const NTV2VideoFormat inVF)
Definition: ntv2devicecapabilities.h:251
NTV2_XptDuallinkOut8DS2
@ NTV2_XptDuallinkOut8DS2
Definition: ntv2enums.h:2623
PlayerConfig::fDoHDMIOutput
bool fDoHDMIOutput
If true, enable HDMI output; otherwise, disable HDMI output.
Definition: ntv2democommon.h:337
NTV2Player4K::SetUpAudio
virtual AJAStatus SetUpAudio(void)
Performs all audio setup.
Definition: ntv2player4k.cpp:280
NTV2_AUDIO_LOOPBACK_OFF
@ NTV2_AUDIO_LOOPBACK_OFF
Embeds silence (zeroes) into the data stream.
Definition: ntv2enums.h:2005
NTV2FormatDescriptor::GetVideoWriteSize
ULWord GetVideoWriteSize(ULWord inPageSize=4096UL) const
Definition: ntv2formatdescriptor.cpp:866
NTV2_Xpt425Mux1ARGB
@ NTV2_Xpt425Mux1ARGB
Definition: ntv2enums.h:2625
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 Frame Store 8 (or the 8th item).
Definition: ntv2enums.h:1343
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:2627
NTV2_REFERENCE_SFP1_PTP
@ NTV2_REFERENCE_SFP1_PTP
Specifies the PTP source on SFP 1.
Definition: ntv2enums.h:1443
NTV2_XptFrameBuffer1_DS2YUV
@ NTV2_XptFrameBuffer1_DS2YUV
Definition: ntv2enums.h:2640
NTV2_IS_VALID_TASK_MODE
#define NTV2_IS_VALID_TASK_MODE(__m__)
Definition: ntv2publicinterface.h:4296
NTV2_XptSDIOut4InputDS2
@ NTV2_XptSDIOut4InputDS2
Definition: ntv2enums.h:2775
NTV2Player4K::RouteCscTo4xSDIOut
virtual bool RouteCscTo4xSDIOut(void)
Sets up board routing from the Color Space Converters to the 4xSDI outputs.
Definition: ntv2player4k.cpp:999
NTV2_CHANNEL2
@ NTV2_CHANNEL2
Specifies channel or Frame Store 2 (or the 2nd item).
Definition: ntv2enums.h:1337
NTV2_VANCDATA_NORMAL
@ NTV2_VANCDATA_NORMAL
Definition: ntv2enums.h:3768
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:2940
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:2524
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:1894
AJAAncDataType_Unknown
@ AJAAncDataType_Unknown
Includes data that is valid, but we don't recognize.
Definition: ancillarydata.h:46
NTV2_XptSDIOut3InputDS2
@ NTV2_XptSDIOut3InputDS2
Definition: ntv2enums.h:2773
NTV2_XptDuallinkOut7
@ NTV2_XptDuallinkOut7
Definition: ntv2enums.h:2620
NTV2FormatDescriptor
Describes a video frame for a given video standard or format and pixel format, including the total nu...
Definition: ntv2formatdescriptor.h:41
IS_KNOWN_AJAAncDataType
#define IS_KNOWN_AJAAncDataType(_x_)
Definition: ancillarydata.h:65
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:1241
NTV2_WgtHDMIOut1v4
@ NTV2_WgtHDMIOut1v4
Definition: ntv2enums.h:2990
NTV2_XptCSC7VidInput
@ NTV2_XptCSC7VidInput
Definition: ntv2enums.h:2752
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1334
NTV2Buffer
A generic user-space buffer object that has an address and a length. Used most often to share an arbi...
Definition: ntv2publicinterface.h:6022
NTV2_XptDuallinkOut1
@ NTV2_XptDuallinkOut1
Definition: ntv2enums.h:2520
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
NTV2_XptSDIOut5InputDS2
@ NTV2_XptSDIOut5InputDS2
Definition: ntv2enums.h:2777
NTV2Buffer::GetByteCount
ULWord GetByteCount(void) const
Definition: ntv2publicinterface.h:6096
NTV2_AUDIOSYSTEM_4
@ NTV2_AUDIOSYSTEM_4
This identifies the 4th Audio System.
Definition: ntv2enums.h:3853
NTV2_XptCSC4VidInput
@ NTV2_XptCSC4VidInput
Definition: ntv2enums.h:2746
GetNTV2FrameRateFromVideoFormat
NTV2FrameRate GetNTV2FrameRateFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:3530
NTV2_XptFrameBuffer3_DS2YUV
@ NTV2_XptFrameBuffer3_DS2YUV
Definition: ntv2enums.h:2644
NTV2Player4K::RouteFsToSDIOut
virtual bool RouteFsToSDIOut(void)
Sets up board routing from the Frame Stores to the SDI outputs.
Definition: ntv2player4k.cpp:856
AJAThread::Attach
virtual AJAStatus Attach(AJAThreadFunction *pThreadFunction, void *pUserContext)
Definition: thread.cpp:169
NTV2_Xpt425Mux3ARGB
@ NTV2_Xpt425Mux3ARGB
Definition: ntv2enums.h:2633
NTV2_AUDIO_48K
@ NTV2_AUDIO_48K
Definition: ntv2enums.h:1905
NTV2_XptDuallinkOut7DS2
@ NTV2_XptDuallinkOut7DS2
Definition: ntv2enums.h:2621
NTV2_Wgt4KDownConverter
@ NTV2_Wgt4KDownConverter
Definition: ntv2enums.h:2944
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:2601
NTV2_XptFrameBuffer4_DS2YUV
@ NTV2_XptFrameBuffer4_DS2YUV
Definition: ntv2enums.h:2646
NTV2_XptFrameBuffer3YUV
@ NTV2_XptFrameBuffer3YUV
Definition: ntv2enums.h:2550
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:1681
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:374
CNTV2Card::SetSDIOut6GEnable
virtual bool SetSDIOut6GEnable(const NTV2Channel inChannel, const bool inEnable)
Definition: ntv2register.cpp:3885
NTV2_FRAMERATE_INVALID
@ NTV2_FRAMERATE_INVALID
Definition: ntv2enums.h:428
NTV2_Xpt425Mux2AYUV
@ NTV2_Xpt425Mux2AYUV
Definition: ntv2enums.h:2628
NTV2_AUDIOSYSTEM_1
@ NTV2_AUDIOSYSTEM_1
This identifies the first Audio System.
Definition: ntv2enums.h:3850
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:8017
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:278
NTV2Player4K::RouteTsiMuxTo4xSDIOut
virtual bool RouteTsiMuxTo4xSDIOut(void)
Sets up board routing from the Two Sample Interleave muxes to the 4xSDI outputs.
Definition: ntv2player4k.cpp:1160
DEC0N
#define DEC0N(__x__, __n__)
Definition: ntv2publicinterface.h:5608
NTV2_Xpt4KDCQ2Input
@ NTV2_Xpt4KDCQ2Input
Definition: ntv2enums.h:2830
NTV2_Xpt425Mux2BYUV
@ NTV2_Xpt425Mux2BYUV
Definition: ntv2enums.h:2630
CNTV2MacDriverInterface::ReleaseStreamForApplication
virtual bool ReleaseStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Releases exclusive use of the AJA device for the given process, permitting other processes to acquire...
Definition: ntv2macdriverinterface.cpp:516
NTV2_AncRgn_Field2
@ NTV2_AncRgn_Field2
Identifies the "normal" Field 2 ancillary data region.
Definition: ntv2enums.h:4182
NTV2Player4K::StartProducerThread
virtual void StartProducerThread(void)
Starts my producer thread.
Definition: ntv2player4k.cpp:1375
AJA_STATUS_MEMORY
@ AJA_STATUS_MEMORY
Definition: types.h:397
NTV2_XptSDIOut7Input
@ NTV2_XptSDIOut7Input
Definition: ntv2enums.h:2780
AUTOCIRCULATE_WITH_MULTILINK_AUDIO3
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO3
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 3.
Definition: ntv2publicinterface.h:5534
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:2832
NTV2_XptCSC6VidYUV
@ NTV2_XptCSC6VidYUV
Definition: ntv2enums.h:2609
NTV2_XptFrameBuffer1RGB
@ NTV2_XptFrameBuffer1RGB
Definition: ntv2enums.h:2515
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:1647
NTV2_XptDuallinkOut6DS2
@ NTV2_XptDuallinkOut6DS2
Definition: ntv2enums.h:2619
NTV2Player4K::RouteTsiMuxToDLOut
virtual bool RouteTsiMuxToDLOut(void)
Sets up board routing from the Two Sample Interleave muxes to the Dual Link outputs.
Definition: ntv2player4k.cpp:1043
NTV2_XptHDMIOutQ3Input
@ NTV2_XptHDMIOutQ3Input
Definition: ntv2enums.h:2827
NTV2_XptSDIOut2InputDS2
@ NTV2_XptSDIOut2InputDS2
Definition: ntv2enums.h:2771
PlayerConfig::fDoMultiFormat
bool fDoMultiFormat
If true, enable device-sharing; otherwise take exclusive control of device.
Definition: ntv2democommon.h:332
NTV2Player4K::SetUpHostBuffers
virtual AJAStatus SetUpHostBuffers(void)
Sets up my host video & audio buffers.
Definition: ntv2player4k.cpp:336
NTV2_XptSDIOut8InputDS2
@ NTV2_XptSDIOut8InputDS2
Definition: ntv2enums.h:2783
NTV2_XptDualLinkOut5Input
@ NTV2_XptDualLinkOut5Input
Definition: ntv2enums.h:2804
TimecodeFormat
TimecodeFormat
Definition: ntv2rp188.h:27
NTV2_AUDIO_FORMAT_LPCM
@ NTV2_AUDIO_FORMAT_LPCM
Definition: ntv2enums.h:1928
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:2774
NTV2_CHANNEL1
@ NTV2_CHANNEL1
Specifies channel or Frame Store 1 (or the first item).
Definition: ntv2enums.h:1336
NTV2_XptFrameBuffer6_DS2RGB
@ NTV2_XptFrameBuffer6_DS2RGB
Definition: ntv2enums.h:2651
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:2776
ntv2debug.h
NTV2_XptCSC7VidYUV
@ NTV2_XptCSC7VidYUV
Definition: ntv2enums.h:2612
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:2740
NTV2_Xpt425Mux3AInput
@ NTV2_Xpt425Mux3AInput
Definition: ntv2enums.h:2837
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:7264
NTV2_XptFrameBuffer3RGB
@ NTV2_XptFrameBuffer3RGB
Definition: ntv2enums.h:2551
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:340
NTV2Player4K::RouteCscToDLOut
virtual bool RouteCscToDLOut(void)
Sets up board routing from the Color Space Converters to the Dual Link outputs.
Definition: ntv2player4k.cpp:1021
NTV2_Xpt425Mux2BInput
@ NTV2_Xpt425Mux2BInput
Definition: ntv2enums.h:2836
NTV2FrameRate
NTV2FrameRate
Identifies a particular video frame rate.
Definition: ntv2enums.h:399
AJAAncillaryData_HDR_HDR10
This class handles "5251" Frame Status Information packets.
Definition: ancillarydata_hdr_hdr10.h:21
NTV2_CHANNEL6
@ NTV2_CHANNEL6
Specifies channel or Frame Store 6 (or the 6th item).
Definition: ntv2enums.h:1341
NTV2_Xpt4KDCQ3Input
@ NTV2_Xpt4KDCQ3Input
Definition: ntv2enums.h:2831
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 Frame Store 4 (or the 4th item).
Definition: ntv2enums.h:1339
NTV2_XptFrameBuffer2_DS2YUV
@ NTV2_XptFrameBuffer2_DS2YUV
Definition: ntv2enums.h:2642
PlayerConfig::fDoTsiRouting
bool fDoTsiRouting
If true, enable TSI routing; otherwise route for square division (4K/8K)
Definition: ntv2democommon.h:338
AUTOCIRCULATE_WITH_MULTILINK_AUDIO1
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO1
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 1.
Definition: ntv2publicinterface.h:5532
PlayerConfig::fTransmitHDRType
AJAAncDataType fTransmitHDRType
Specifies the HDR anc data packet to transmit, if any.
Definition: ntv2democommon.h:330
NTV2_CHANNEL5
@ NTV2_CHANNEL5
Specifies channel or Frame Store 5 (or the 5th item).
Definition: ntv2enums.h:1340
NTV2MakeAudioSystemSet
NTV2AudioSystemSet NTV2MakeAudioSystemSet(const NTV2AudioSystem inFirstAudioSystem, const UWord inCount=1)
Definition: ntv2publicinterface.cpp:3433
CNTV2Card::features
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:141
AJAThread
Definition: thread.h:69
AUTOCIRCULATE_WITH_ANC
#define AUTOCIRCULATE_WITH_ANC
Use this to AutoCirculate with ancillary data.
Definition: ntv2publicinterface.h:5528
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:4152
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:2647
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:2641
NTV2_XptCSC3VidRGB
@ NTV2_XptCSC3VidRGB
Definition: ntv2enums.h:2570
NTV2Player4K::Quit
virtual void Quit(void)
Gracefully stops me from running.
Definition: ntv2player4k.cpp:84
NTV2_XptFrameBuffer2_DS2RGB
@ NTV2_XptFrameBuffer2_DS2RGB
Definition: ntv2enums.h:2643
NTV2FormatDescriptor::numPixels
ULWord numPixels
Width – total number of pixels per line.
Definition: ntv2formatdescriptor.h:355
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:3957
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:1395
NTV2_XptDuallinkOut3
@ NTV2_XptDuallinkOut3
Definition: ntv2enums.h:2565
NTV2_XptCSC4VidRGB
@ NTV2_XptCSC4VidRGB
Definition: ntv2enums.h:2573
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:1385
NTV2_XptCSC1VidYUV
@ NTV2_XptCSC1VidYUV
Definition: ntv2enums.h:2510
NTV2_VANCMODE_OFF
@ NTV2_VANCMODE_OFF
This identifies the mode in which there are no VANC lines in the frame buffer.
Definition: ntv2enums.h:3752
CNTV2Card::SetSDIOutputAudioSystem
virtual bool SetSDIOutputAudioSystem(const NTV2Channel inSDIOutputConnector, const NTV2AudioSystem inAudioSystem)
Sets the device's NTV2AudioSystem that will provide audio for the given SDI output's audio embedder....
Definition: ntv2register.cpp:3949
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:2557
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:124
NTV2FrameData::fVideoBuffer
NTV2Buffer fVideoBuffer
Host video buffer.
Definition: ntv2democommon.h:82
AUTOCIRCULATE_STATUS
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
Definition: ntv2publicinterface.h:7193
ntv2devicescanner.h
Declares the CNTV2DeviceScanner class.
NTV2_XptCSC4VidYUV
@ NTV2_XptCSC4VidYUV
Definition: ntv2enums.h:2572
NTV2_CHANNEL7
@ NTV2_CHANNEL7
Specifies channel or Frame Store 7 (or the 7th item).
Definition: ntv2enums.h:1342
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:354
NTV2_XptFrameBuffer1YUV
@ NTV2_XptFrameBuffer1YUV
Definition: ntv2enums.h:2514
NTV2_XptSDIOut2Input
@ NTV2_XptSDIOut2Input
Definition: ntv2enums.h:2770
NTV2_XptDuallinkOut2DS2
@ NTV2_XptDuallinkOut2DS2
Definition: ntv2enums.h:2555
NTV2_XptDuallinkOut1DS2
@ NTV2_XptDuallinkOut1DS2
Definition: ntv2enums.h:2554
CNTV2DemoCommon::SetDefaultPageSize
static size_t SetDefaultPageSize(void)
Definition: ntv2democommon.cpp:1591
NTV2_XptDuallinkOut4DS2
@ NTV2_XptDuallinkOut4DS2
Definition: ntv2enums.h:2568
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:5022
NTV2AudioSystemSet
std::set< NTV2AudioSystem > NTV2AudioSystemSet
A set of distinct NTV2AudioSystem values. New in SDK 16.2.
Definition: ntv2publicinterface.h:3900
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:4347
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:331
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:1072
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:1131
NTV2_Xpt425Mux4BRGB
@ NTV2_Xpt425Mux4BRGB
Definition: ntv2enums.h:2639
NTV2Player4K::RouteOutputSignal
virtual bool RouteOutputSignal(void)
Performs all widget/signal routing for playout.
Definition: ntv2player4k.cpp:442
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 Frame Store 3 (or the 3rd item).
Definition: ntv2enums.h:1338
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:2829
NTV2_IS_4K_HFR_VIDEO_FORMAT
#define NTV2_IS_4K_HFR_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:776
NTV2_XptCSC7VidRGB
@ NTV2_XptCSC7VidRGB
Definition: ntv2enums.h:2613
BUFFER_PAGE_ALIGNED
static const bool BUFFER_PAGE_ALIGNED((!(0)))
NTV2_XptFrameBuffer6_DS2YUV
@ NTV2_XptFrameBuffer6_DS2YUV
Definition: ntv2enums.h:2650
NTV2FrameData::fNumAudioBytes
ULWord fNumAudioBytes
Actual number of captured audio bytes.
Definition: ntv2democommon.h:88
NTV2_XptCSC8VidInput
@ NTV2_XptCSC8VidInput
Definition: ntv2enums.h:2754
NTV2_REFERENCE_FREERUN
@ NTV2_REFERENCE_FREERUN
Specifies the device's internal clock.
Definition: ntv2enums.h:1434
NTV2_XptDualLinkOut4Input
@ NTV2_XptDualLinkOut4Input
Definition: ntv2enums.h:2803
AUTOCIRCULATE_TRANSFER
This object specifies the information that will be transferred to or from the AJA device in the CNTV2...
Definition: ntv2publicinterface.h:8002
PlayerConfig::fOutputChannel
NTV2Channel fOutputChannel
The device channel to use.
Definition: ntv2democommon.h:324
NTV2_XptCSC8VidRGB
@ NTV2_XptCSC8VidRGB
Definition: ntv2enums.h:2616
NTV2_XptCSC3VidInput
@ NTV2_XptCSC3VidInput
Definition: ntv2enums.h:2744
NTV2_WgtHDMIOut1v3
@ NTV2_WgtHDMIOut1v3
Definition: ntv2enums.h:2973
NTV2VideoFormatToString
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6793
NTV2Player4K::StartConsumerThread
virtual void StartConsumerThread(void)
Starts my consumer thread.
Definition: ntv2player4k.cpp:1203
AJAAncillaryData_HDR_HLG
This class handles "5251" Frame Status Information packets.
Definition: ancillarydata_hdr_hlg.h:21
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:2649
NTV2_Xpt425Mux4AYUV
@ NTV2_Xpt425Mux4AYUV
Definition: ntv2enums.h:2636
NTV2_TestPatt_SlantRamp
@ NTV2_TestPatt_SlantRamp
Definition: ntv2testpatterngen.h:41
NTV2_XptSDIOut1InputDS2
@ NTV2_XptSDIOut1InputDS2
Definition: ntv2enums.h:2769
NTV2_TestPatt_ColorBars75
@ NTV2_TestPatt_ColorBars75
Definition: ntv2testpatterngen.h:30
NTV2_TASK_MODE_INVALID
@ NTV2_TASK_MODE_INVALID
Definition: ntv2publicinterface.h:4293
NTV2_Xpt425Mux2ARGB
@ NTV2_Xpt425Mux2ARGB
Definition: ntv2enums.h:2629
CNTV2DriverInterface::IsDeviceReady
virtual bool IsDeviceReady(const bool inCheckValid=(0))
Definition: ntv2driverinterface.cpp:1312
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:2624
NTV2_Xpt425Mux3BInput
@ NTV2_Xpt425Mux3BInput
Definition: ntv2enums.h:2838
NTV2_Xpt425Mux1BYUV
@ NTV2_Xpt425Mux1BYUV
Definition: ntv2enums.h:2626
NTV2ChannelSet
std::set< NTV2Channel > NTV2ChannelSet
A set of distinct NTV2Channel values.
Definition: ntv2publicinterface.h:3854
AJACircularBuffer::EndConsumeNextBuffer
void EndConsumeNextBuffer(void)
The consumer thread calls this function to signal that it has finished processing the frame it obtain...
Definition: circularbuffer.h:266
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:1189
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:1444
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
AJAAncillaryData_HDR_SDR
This class handles "5251" Frame Status Information packets.
Definition: ancillarydata_hdr_sdr.h:21
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:4478
NTV2_XptSDIOut5Input
@ NTV2_XptSDIOut5Input
Definition: ntv2enums.h:2776
CNTV2DemoCommon::GetAJAFrameRate
static AJA_FrameRate GetAJAFrameRate(const NTV2FrameRate inFrameRate)
Definition: ntv2democommon.cpp:1118
NTV2TestPatternGen
The NTV2 test pattern generator.
Definition: ntv2testpatterngen.h:69
NTV2Buffer::GetHostPointer
void * GetHostPointer(void) const
Definition: ntv2publicinterface.h:6079
AJAAncDataType_HDR_SDR
@ AJAAncDataType_HDR_SDR
Definition: ancillarydata.h:57
NTV2Player4K::SetUpTestPatternBuffers
virtual AJAStatus SetUpTestPatternBuffers(void)
Creates my test pattern buffers.
Definition: ntv2player4k.cpp:383
NTV2_FORMAT_UNKNOWN
@ NTV2_FORMAT_UNKNOWN
Definition: ntv2enums.h:521
NTV2_XptSDIOut8Input
@ NTV2_XptSDIOut8Input
Definition: ntv2enums.h:2782
NTV2FrameData::fAudioBuffer
NTV2Buffer fAudioBuffer
Host audio buffer.
Definition: ntv2democommon.h:84
NTV2_Xpt4KDownConverterOut
@ NTV2_Xpt4KDownConverterOut
Definition: ntv2enums.h:2585
NTV2_XptFrameBuffer8RGB
@ NTV2_XptFrameBuffer8RGB
Definition: ntv2enums.h:2602
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:1903
AJA_STATUS_INITIALIZE
@ AJA_STATUS_INITIALIZE
Definition: types.h:386
NTV2_LHIHDMIColorSpaceYCbCr
@ NTV2_LHIHDMIColorSpaceYCbCr
Definition: ntv2enums.h:3633
PlayerConfig::fDoRGBOnWire
bool fDoRGBOnWire
If true, produce RGB on the wire; otherwise output YUV.
Definition: ntv2democommon.h:339
gNumFrequencies
static const ULWord gNumFrequencies(sizeof(gFrequencies)/sizeof(double))
DEC
#define DEC(__x__)
Definition: ntv2publicinterface.h:5606
NTV2_XptFrameBuffer6RGB
@ NTV2_XptFrameBuffer6RGB
Definition: ntv2enums.h:2598
NTV2_AUDIOSYSTEM_3
@ NTV2_AUDIOSYSTEM_3
This identifies the 3rd Audio System.
Definition: ntv2enums.h:3852
false
#define false
Definition: ntv2devicefeatures.h:25
NTV2_XptFrameBuffer4RGB
@ NTV2_XptFrameBuffer4RGB
Definition: ntv2enums.h:2553
AUTOCIRCULATE_WITH_MULTILINK_AUDIO2
#define AUTOCIRCULATE_WITH_MULTILINK_AUDIO2
Use this to AutoCirculate with base audiosystem controlling base AudioSystem + 2.
Definition: ntv2publicinterface.h:5533
AUTOCIRCULATE_WITH_RP188
#define AUTOCIRCULATE_WITH_RP188
Use this to AutoCirculate with RP188.
Definition: ntv2publicinterface.h:5522
NTV2Player4K::RouteHDMIOutput
virtual bool RouteHDMIOutput(void)
Sets up board routing output via the HDMI (if available).
Definition: ntv2player4k.cpp:670
CNTV2Card::SetSDIOut12GEnable
virtual bool SetSDIOut12GEnable(const NTV2Channel inChannel, const bool inEnable)
Definition: ntv2register.cpp:3910
NTV2_Xpt425Mux4ARGB
@ NTV2_Xpt425Mux4ARGB
Definition: ntv2enums.h:2637
NTV2ACFrameRange::lastFrame
UWord lastFrame(void) const
Definition: ntv2utils.h:984
ancillarydata_hdr_hdr10.h
Declares the AJAAncillaryData_HDR_HDR10 class.
GetFrameBufferOutputXptFromChannel
NTV2OutputXptID GetFrameBufferOutputXptFromChannel(const NTV2Channel inFrameStore, const bool inIsRGB=false, const bool inIs425=false)
Definition: ntv2signalrouter.cpp:845
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:977
PlayerConfig::fDeviceSpec
std::string fDeviceSpec
The AJA device to use.
Definition: ntv2democommon.h:322
NTV2_XptDualLinkOut3Input
@ NTV2_XptDualLinkOut3Input
Definition: ntv2enums.h:2802
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
NTV2MakeChannelSet
NTV2ChannelSet NTV2MakeChannelSet(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
Definition: ntv2publicinterface.cpp:3378
NTV2_XptFrameBuffer2YUV
@ NTV2_XptFrameBuffer2YUV
Definition: ntv2enums.h:2523
std
Definition: json.hpp:5362
NTV2_RP188
This struct replaces the old RP188_STRUCT.
Definition: ntv2publicinterface.h:6790
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:8010
NTV2_XptFrameBuffer5RGB
@ NTV2_XptFrameBuffer5RGB
Definition: ntv2enums.h:2596
IsRGBFormat
bool IsRGBFormat(const NTV2FrameBufferFormat format)
Definition: ntv2utils.cpp:5470
NTV2_XptFrameBuffer5_DS2YUV
@ NTV2_XptFrameBuffer5_DS2YUV
Definition: ntv2enums.h:2648
NTV2_XptFrameBuffer7YUV
@ NTV2_XptFrameBuffer7YUV
Definition: ntv2enums.h:2599
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:1150
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:2789
NTV2_WgtHDMIOut1v2
@ NTV2_WgtHDMIOut1v2
Definition: ntv2enums.h:2939
NTV2_XptSDIOut6Input
@ NTV2_XptSDIOut6Input
Definition: ntv2enums.h:2778
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:2618
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:792
NTV2_XptDuallinkOut5DS2
@ NTV2_XptDuallinkOut5DS2
Definition: ntv2enums.h:2576
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:2556
NTV2Player4K::RouteFsToTsiMux
virtual bool RouteFsToTsiMux(void)
Sets up board routing from the Frame Stores to the Two Sample Interleave muxes.
Definition: ntv2player4k.cpp:888
CNTV2MacDriverInterface::AcquireStreamForApplication
virtual bool AcquireStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Reserves exclusive use of the AJA device for a given process, preventing other processes on the host ...
Definition: ntv2macdriverinterface.cpp:481
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:767
NTV2_XptCSC2VidRGB
@ NTV2_XptCSC2VidRGB
Definition: ntv2enums.h:2526
NTV2_XptDualLinkOut6Input
@ NTV2_XptDualLinkOut6Input
Definition: ntv2enums.h:2805
NTV2Player4K::RouteFsToCsc
virtual bool RouteFsToCsc(void)
Sets up board routing from the Frame Stores to the Color Space Converters.
Definition: ntv2player4k.cpp:814
NTV2_XptDualLinkOut2Input
@ NTV2_XptDualLinkOut2Input
Definition: ntv2enums.h:2801
DeviceCapabilities::CanDoWidget
bool CanDoWidget(const NTV2WidgetID inWgtID)
Definition: ntv2devicecapabilities.h:260
NTV2Player4K::ConsumeFrames
virtual void ConsumeFrames(void)
My consumer thread that repeatedly plays frames using AutoCirculate (until quit).
Definition: ntv2player4k.cpp:1225
NTV2_AudioChannel1_8
@ NTV2_AudioChannel1_8
This selects audio channels 1 thru 8.
Definition: ntv2enums.h:3278
NTV2_XptHDMIOutQ4Input
@ NTV2_XptHDMIOutQ4Input
Definition: ntv2enums.h:2828
CNTV2DriverInterface::GetDeviceID
virtual NTV2DeviceID GetDeviceID(void)
Definition: ntv2driverinterface.cpp:407
NTV2Player4K::SetUpVideo
virtual AJAStatus SetUpVideo(void)
Performs all video setup.
Definition: ntv2player4k.cpp:203
NTV2_Xpt425Mux4BInput
@ NTV2_Xpt425Mux4BInput
Definition: ntv2enums.h:2840
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:602
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
AJAAncDataType_HDR_HLG
@ AJAAncDataType_HDR_HLG
Definition: ancillarydata.h:59
GetAudioSamplesPerSecond
double GetAudioSamplesPerSecond(const NTV2AudioRate inAudioRate)
Returns the audio sample rate as a number of audio samples per second.
Definition: ntv2utils.cpp:3203
NTV2_XptCSC3VidYUV
@ NTV2_XptCSC3VidYUV
Definition: ntv2enums.h:2569
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:2826
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:815
NTV2_TestPatt_MultiPattern
@ NTV2_TestPatt_MultiPattern
Definition: ntv2testpatterngen.h:36
NTV2_Xpt425Mux4AInput
@ NTV2_Xpt425Mux4AInput
Definition: ntv2enums.h:2839
NTV2_XptCSC1VidRGB
@ NTV2_XptCSC1VidRGB
Definition: ntv2enums.h:2511
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:2277
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:6248
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:2615
NTV2TestPatternGen::getTestPatternNames
static NTV2TestPatternNames getTestPatternNames(void)
Definition: ntv2testpatterngen.cpp:2542
NTV2_XptFrameBuffer3_DS2RGB
@ NTV2_XptFrameBuffer3_DS2RGB
Definition: ntv2enums.h:2645
NTV2_XptSDIOut7InputDS2
@ NTV2_XptSDIOut7InputDS2
Definition: ntv2enums.h:2781
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:2632
AJA_STATUS_OPEN
@ AJA_STATUS_OPEN
Definition: types.h:388
NTV2_XptCSC2VidYUV
@ NTV2_XptCSC2VidYUV
Definition: ntv2enums.h:2525
AJATimeBase::FramesToSeconds
double FramesToSeconds(int64_t frames) const
Definition: timebase.cpp:197
NTV2_XptCSC6VidRGB
@ NTV2_XptCSC6VidRGB
Definition: ntv2enums.h:2610
CNTV2DemoCommon::NTV2FrameRate2TimecodeFormat
static TimecodeFormat NTV2FrameRate2TimecodeFormat(const NTV2FrameRate inFrameRate)
Definition: ntv2democommon.cpp:1096
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:2575
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5605
NTV2AudioSystem
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information.
Definition: ntv2enums.h:3848
AJA_FAILURE
#define AJA_FAILURE(_status_)
Definition: types.h:371
NTV2_AUDIO_RATE_INVALID
@ NTV2_AUDIO_RATE_INVALID
Definition: ntv2enums.h:1909
NTV2_XptFrameBuffer5YUV
@ NTV2_XptFrameBuffer5YUV
Definition: ntv2enums.h:2595
NTV2_XptDuallinkOut8
@ NTV2_XptDuallinkOut8
Definition: ntv2enums.h:2622
NTV2_XptCSC5VidInput
@ NTV2_XptCSC5VidInput
Definition: ntv2enums.h:2748
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:223
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:4929
NTV2_Xpt425Mux3BRGB
@ NTV2_Xpt425Mux3BRGB
Definition: ntv2enums.h:2635
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:8028
NTV2_Xpt425Mux3BYUV
@ NTV2_Xpt425Mux3BYUV
Definition: ntv2enums.h:2634
NTV2_XptCSC2VidInput
@ NTV2_XptCSC2VidInput
Definition: ntv2enums.h:2742
NTV2_XptFrameBuffer7RGB
@ NTV2_XptFrameBuffer7RGB
Definition: ntv2enums.h:2600
NTV2FormatDescriptor::IsValid
bool IsValid(void) const
Definition: ntv2formatdescriptor.h:100
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:2768
PLWARN
#define PLWARN(_xpr_)
Definition: ntv2democommon.h:35
NTV2_Xpt425Mux1BInput
@ NTV2_Xpt425Mux1BInput
Definition: ntv2enums.h:2834
NTV2Player4K::GetACStatus
virtual void GetACStatus(AUTOCIRCULATE_STATUS &outStatus)
Provides status information about my output (playout) process.
Definition: ntv2player4k.cpp:1480
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:4315
CRP188::GetRP188Str
bool GetRP188Str(std::string &sRP188) const
Definition: ntv2rp188.cpp:918
NTV2Player4K::Route4KDownConverter
virtual bool Route4KDownConverter(void)
Sets up board routing for the 4K DownConverter to SDI Monitor (if available).
Definition: ntv2player4k.cpp:610
NTV2_XptSDIOut6InputDS2
@ NTV2_XptSDIOut6InputDS2
Definition: ntv2enums.h:2779
NTV2_OEM_TASKS
@ NTV2_OEM_TASKS
2: OEM: Device is configured by controlling application(s), with minimal driver involvement.
Definition: ntv2publicinterface.h:4292
NTV2_XptSDIOut3Input
@ NTV2_XptSDIOut3Input
Definition: ntv2enums.h:2772
NTV2_XptDuallinkOut4
@ NTV2_XptDuallinkOut4
Definition: ntv2enums.h:2567
NTV2TestPatternNames
NTV2StringList NTV2TestPatternNames
An ordered sequence of pattern names.
Definition: ntv2testpatterngen.h:21
AJAAncDataType_HDR_HDR10
@ AJAAncDataType_HDR_HDR10
Definition: ancillarydata.h:58
NTV2_Xpt425Mux2AInput
@ NTV2_Xpt425Mux2AInput
Definition: ntv2enums.h:2835
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:1631
NTV2_XptDuallinkOut2
@ NTV2_XptDuallinkOut2
Definition: ntv2enums.h:2540
NTV2_Xpt425Mux4BYUV
@ NTV2_Xpt425Mux4BYUV
Definition: ntv2enums.h:2638
NTV2_XptDualLinkOut1Input
@ NTV2_XptDualLinkOut1Input
Definition: ntv2enums.h:2800
NTV2_XptDuallinkOut3DS2
@ NTV2_XptDuallinkOut3DS2
Definition: ntv2enums.h:2566
NTV2_XptCSC6VidInput
@ NTV2_XptCSC6VidInput
Definition: ntv2enums.h:2750
NTV2_XptDualLinkOut8Input
@ NTV2_XptDualLinkOut8Input
Definition: ntv2enums.h:2807
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:1214
NTV2_AUDIOSYSTEM_INVALID
@ NTV2_AUDIOSYSTEM_INVALID
Definition: ntv2enums.h:3860
timebase.h
Declares the AJATimeBase class.