AJA NTV2 SDK  18.1.0.2439
NTV2 SDK 18.1.0.2439
ntv2supportlogger.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
7 #include "ntv2supportlogger.h"
8 #include "ntv2devicescanner.h"
9 #include "ntv2devicefeatures.h"
10 #include "ntv2konaflashprogram.h"
11 #include "ntv2registerexpert.h"
12 #include "ntv2rp188.h"
13 #include "ajabase/common/common.h"
14 #include "ajabase/persistence/persistence.h"
15 #include "ajabase/system/info.h"
16 #include <algorithm>
17 #include <sstream>
18 #include <vector>
19 #include <iterator>
20 
21 #if defined(MSWindows)
22  #define PATH_DELIMITER "\\"
23 #else
24  #define PATH_DELIMITER "/"
25 #endif
26 
27 using namespace std;
28 
29 
30 typedef map <NTV2Channel, AUTOCIRCULATE_STATUS> ChannelToACStatus;
31 typedef ChannelToACStatus::const_iterator ChannelToACStatusConstIter;
32 typedef pair <NTV2Channel, AUTOCIRCULATE_STATUS> ChannelToACStatusPair;
33 typedef map <uint16_t, NTV2TimeCodeList> FrameToTCList;
34 typedef FrameToTCList::const_iterator FrameToTCListConstIter;
35 typedef pair <uint16_t, NTV2TimeCodeList> FrameToTCListPair;
36 typedef map <NTV2Channel, FrameToTCList> ChannelToPerFrameTCList;
37 typedef ChannelToPerFrameTCList::const_iterator ChannelToPerFrameTCListConstIter;
38 typedef pair <NTV2Channel, FrameToTCList> ChannelToPerFrameTCListPair;
39 
40 
41 static string makeHeader(ostringstream & oss, const string & inName)
42 {
43  oss << setfill('=') << setw(96) << " " << inName << ":" << setfill(' ') << endl << endl;
44  return oss.str();
45 }
46 
47 static string timecodeToString (const NTV2_RP188 & inRP188)
48 {
49  ostringstream oss;
50  if (inRP188.IsValid())
51  {
52  const CRP188 foo(inRP188);
53  oss << foo;
54  }
55  else
56  oss << "---";
57  return oss.str();
58 }
59 
60 static string pidToString (const uint32_t inPID)
61 {
62  ostringstream oss;
63  #if defined (MSWindows)
64  oss << inPID;
65  //TCHAR filename [MAX_PATH];
66  //HANDLE processHandle (OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, inPID));
67  //if (processHandle)
68  //{
69  // if (GetModuleFileNameEx (processHandle, NULL, filename, MAX_PATH))
70  // oss << " (" << filename << ")";
71  // CloseHandle (processHandle);
72  //}
73  #elif defined (AJALinux)
74  oss << inPID;
75  #elif defined (AJAMac)
76  oss << inPID;
77  // char pathbuf [PROC_PIDPATHINFO_MAXSIZE];
78  // const int rc (::proc_pidpath (pid_t (inPID), pathbuf, sizeof (pathbuf)));
79  // if (rc == 0 && ::strlen (pathbuf))
80  // oss << " (" << string (pathbuf) << ")";
81  #else
82  oss << inPID;
83  #endif
84  return oss.str();
85 }
86 
87 // NTV2_AUDIO_BUFFER_SIZE_8MB 8MB buffer: 16-ch: 130,560 samples 8-ch: 261,120 samples 6-ch: 348,160 samples
88 // NTV2_AUDIO_BUFFER_SIZE_4MB 4MB buffer: 0x00400000(4,194,304 bytes) - 0x00004000(16,384 bytes) = 0x003FC000(4,177,920 bytes) 16-ch: 65,280 samples 8-ch: 130,560 samples 6-ch: 174,080 samples
89 // NTV2_AUDIO_BUFFER_SIZE_2MB 2MB buffer: 16-ch: 32,640 samples 8-ch: 65,280 samples 6-ch: 87,040 samples
90 // NTV2_AUDIO_BUFFER_SIZE_1MB 1MB buffer: 16-ch: 16,320 samples 8-ch: 32,640 samples 6-ch: 43,520 samples
91 // Returns the maximum number of samples for a given NTV2AudioBufferSize and maximum audio channel count...
92 static uint32_t maxSampleCountForNTV2AudioBufferSize (const NTV2AudioBufferSize inBufferSize, const uint16_t inChannelCount)
93 { // NTV2_AUDIO_BUFFER_SIZE_1MB NTV2_AUDIO_BUFFER_SIZE_4MB NTV2_AUDIO_BUFFER_SIZE_2MB NTV2_AUDIO_BUFFER_SIZE_8MB NTV2_AUDIO_BUFFER_INVALID
94  static uint32_t gMaxSampleCount16 [] = { 16320, 65280, 32640, 130560, 0 };
95  static uint32_t gMaxSampleCount8 [] = { 32640, 130560, 65280, 261120, 0 };
96  static uint32_t gMaxSampleCount6 [] = { 87040, 174080, 87040, 348160, 0 };
97  if (NTV2_IS_VALID_AUDIO_BUFFER_SIZE (inBufferSize))
98  switch (inChannelCount)
99  {
100  case 16: return gMaxSampleCount16 [inBufferSize];
101  case 8: return gMaxSampleCount8 [inBufferSize];
102  case 6: return gMaxSampleCount6 [inBufferSize];
103  default: break;
104  }
105  return 0;
106 }
107 
108 static NTV2VideoFormat getVideoFormat (CNTV2Card & device, const NTV2Channel inChannel)
109 {
111  device.GetVideoFormat(result, inChannel);
112  return result;
113 }
114 
115 static NTV2PixelFormat getPixelFormat (CNTV2Card & device, const NTV2Channel inChannel)
116 {
118  device.GetFrameBufferFormat(inChannel, result);
119  return result;
120 }
121 
122 static NTV2Mode getMode (CNTV2Card & device, const NTV2Channel inChannel)
123 {
124  NTV2Mode result(NTV2_MODE_INVALID);
125  device.GetMode(inChannel, result);
126  return result;
127 }
128 
129 static bool isEnabled (CNTV2Card & device, const NTV2Channel inChannel)
130 {
131  bool result(false);
132  device.IsChannelEnabled(inChannel, result);
133  return result;
134 }
135 
136 static ULWord getActiveFrame (CNTV2Card & device, const NTV2Channel inChannel)
137 {
138  ULWord frameNum(0);
139  if (NTV2_IS_INPUT_MODE(::getMode(device, inChannel)))
140  device.GetInputFrame(inChannel, frameNum);
141  else
142  device.GetOutputFrame(inChannel, frameNum);
143  return frameNum;
144 }
145 
146 static string getActiveFrameStr (CNTV2Card & device, const NTV2Channel inChannel)
147 {
148  if (!isEnabled(device, inChannel))
149  return "---";
150  ostringstream oss;
151  oss << DEC(::getActiveFrame(device, inChannel));
152  return oss.str();
153 }
154 
156 {
157  ULWord result(0);
158  if (NTV2_IS_OUTPUT_MODE (mode))
159  device.ReadAudioLastOut (result, audioSystem); // read head
160  else
161  device.ReadAudioLastIn (result, audioSystem); // write head
162  return result;
163 }
164 
165 static ULWord getNumAudioChannels (CNTV2Card & device, NTV2AudioSystem audioSystem)
166 {
167  ULWord numChannels = 1;
168  device.GetNumberAudioChannels(numChannels, audioSystem);
169  return numChannels;
170 }
171 
172 static ULWord bytesToSamples (CNTV2Card & device, NTV2AudioSystem audioSystem, const ULWord inBytes)
173 {
174  return inBytes / sizeof (uint32_t) / getNumAudioChannels(device, audioSystem);
175 }
176 
178 {
179  ULWord bytes = readCurrentAudioPosition(device, audioSystem, mode);
180  return bytesToSamples(device, audioSystem, bytes);
181 }
182 
183 static ULWord getMaxNumSamples (CNTV2Card & device, NTV2AudioSystem audioSystem)
184 {
185  NTV2AudioBufferSize bufferSize;
186  device.GetAudioBufferSize(bufferSize, audioSystem);
187 
188  return maxSampleCountForNTV2AudioBufferSize (bufferSize, uint16_t(getNumAudioChannels(device, audioSystem)));
189 }
190 
192 {
193  for (UWord chan (0); chan < ::NTV2DeviceGetNumVideoChannels (device.GetDeviceID()); chan++)
194  if (device.AutoCirculateGetStatus (NTV2Channel(chan), outStatus))
195  if (!outStatus.IsStopped())
196  if (outStatus.GetAudioSystem() == audioSystem)
197  {
199  device.GetMode(NTV2Channel(chan), mode);
200  if ((outStatus.IsInput() && NTV2_IS_INPUT_MODE (mode))
201  || (outStatus.IsOutput() && NTV2_IS_OUTPUT_MODE (mode)))
202  return NTV2Channel(chan);
203  }
204  return NTV2_CHANNEL_INVALID;
205 }
206 
207 static bool detectInputChannelPairs (CNTV2Card & device, const NTV2AudioSource inAudioSource,
208  const NTV2EmbeddedAudioInput inEmbeddedSource,
209  NTV2AudioChannelPairs & outChannelPairsPresent)
210 {
211  outChannelPairsPresent.clear();
212  switch (inAudioSource)
213  {
214  default: return false;
215 
216  case NTV2_AUDIO_EMBEDDED: return NTV2_IS_VALID_EMBEDDED_AUDIO_INPUT (inEmbeddedSource)
217  // Input detection is based on the audio de-embedder (as opposed to the SDI spigot)...
218  ? device.GetDetectedAudioChannelPairs (NTV2AudioSystem(inEmbeddedSource), outChannelPairsPresent)
219  : false;
220 
221  case NTV2_AUDIO_AES: return device.GetDetectedAESChannelPairs (outChannelPairsPresent);
222 
225  {outChannelPairsPresent.insert(NTV2_AudioChannel1_2); return true;} // Assume chls 1&2 if an analog signal present
226  break;
227 
229  {
231  if (!device.GetHDMIInputAudioChannels (hdmiChls))
232  return false;
235  chPair = NTV2AudioChannelPair(chPair + 1))
236  outChannelPairsPresent.insert (chPair);
237  return true;
238  }
239  break;
240  }
241  return false;
242 }
243 
244 static bool getBitfileDate (CNTV2Card & device, string & outDateString, NTV2XilinxFPGA whichFPGA)
245 {
246  BITFILE_INFO_STRUCT bitFileInfo;
247  memset(&bitFileInfo, 0, sizeof(BITFILE_INFO_STRUCT));
248  bitFileInfo.whichFPGA = whichFPGA;
249  bool bBitFileInfoAvailable = false; // BitFileInfo is implemented only on 5.2 and later drivers.
250  bBitFileInfoAvailable = device.DriverGetBitFileInformation(bitFileInfo);
251  if( bBitFileInfoAvailable )
252  {
253  outDateString = bitFileInfo.designNameStr;
254  if (outDateString.find(".ncd") != string::npos)
255  {
256  outDateString = outDateString.substr(0, outDateString.find(".ncd"));
257  outDateString += ".bit ";
258  outDateString += bitFileInfo.dateStr;
259  outDateString += " ";
260  outDateString += bitFileInfo.timeStr;
261  }
262  else if (outDateString.find(";") != string::npos)
263  {
264  outDateString = outDateString.substr(0, outDateString.find(";"));
265  outDateString += ".bit ";
266  outDateString += bitFileInfo.dateStr;
267  outDateString += " ";
268  outDateString += bitFileInfo.timeStr;
269  }
270  else if (outDateString.find(".bit") != string::npos && outDateString != ".bit")
271  {
272  outDateString = bitFileInfo.designNameStr;
273  outDateString += " ";
274  outDateString += bitFileInfo.dateStr;
275  outDateString += " ";
276  outDateString += bitFileInfo.timeStr;
277  }
278  else
279  {
280  outDateString = "bad bitfile date string";
281  return false;
282  }
283  }
284  else
285  return false;
286  return true;
287 }
288 
289 AJAExport ostream & operator << (ostream & outStream, const CNTV2SupportLogger & inData)
290 {
291  outStream << inData.ToString();
292  return outStream;
293 }
294 
296  : mDevice (card),
297  mDispose (false),
298  mSections (sections)
299 {
300 }
301 
303  : mDevice (*(new CNTV2Card(cardIndex))),
304  mDispose (true),
305  mSections (sections)
306 {
307 }
308 
310 {
311  if (mDispose)
312  delete &mDevice;
313 }
314 
316 {
317  // Bump this whenever the formatting of the support log changes drastically
318  return 2;
319 }
320 
321 void CNTV2SupportLogger::PrependToSection (uint32_t section, const string & sectionData)
322 {
323  if (mPrependMap.find(section) != mPrependMap.end())
324  {
325  mPrependMap.at(section).insert(0, "\n");
326  mPrependMap.at(section).insert(0, sectionData);
327  }
328  else
329  {
330  mPrependMap[section] = sectionData;
331  mPrependMap.at(section).append("\n");
332  }
333 }
334 
335 void CNTV2SupportLogger::AppendToSection (uint32_t section, const string & sectionData)
336 {
337  if (mAppendMap.find(section) != mAppendMap.end())
338  {
339  mAppendMap.at(section).append("\n");
340  mAppendMap.at(section).append(sectionData);
341  }
342  else
343  {
344  mAppendMap[section] = "\n";
345  mAppendMap.at(section).append(sectionData);
346  }
347 }
348 
349 void CNTV2SupportLogger::AddHeader (const string & sectionName, const string & sectionData)
350 {
351  ostringstream oss;
352  makeHeader(oss, sectionName);
353  oss << sectionData << "\n";
354  mHeaderStr.append(oss.str());
355 }
356 
357 void CNTV2SupportLogger::AddFooter (const string & sectionName, const string & sectionData)
358 {
359  ostringstream oss;
360  makeHeader(oss, sectionName);
361  oss << sectionData << "\n";
362  mFooterStr.append(oss.str());
363 }
364 
365 // Use this macro to handle generating text for each section
366 // - the header
367 // - the prepend if any
368 // - the method that fills the section
369 // - the append if any
370 #define LoggerSectionToFunctionMacro(_SectionEnum_, _SectionString_, _SectionMethod_) \
371  if (mSections & _SectionEnum_) \
372  { \
373  makeHeader(oss, _SectionString_); \
374  if (mPrependMap.find(_SectionEnum_) != mPrependMap.end()) \
375  oss << mPrependMap.at(_SectionEnum_); \
376  \
377  _SectionMethod_(oss); \
378  \
379  if (mAppendMap.find(_SectionEnum_) != mAppendMap.end()) \
380  oss << mAppendMap.at(_SectionEnum_); \
381  }
382 
383 string CNTV2SupportLogger::ToString (void) const
384 {
385  ostringstream oss;
386  vector<char> dateBufferLocal(128, 0);
387  vector<char> dateBufferUTC(128, 0);
388 
389  // get the wall time and format it
390  time_t now = time(AJA_NULL);
391  struct tm *localTimeinfo;
392  localTimeinfo = localtime(reinterpret_cast<const time_t*>(&now));
393  strcpy(&dateBufferLocal[0], "");
394  if (localTimeinfo)
395  ::strftime(&dateBufferLocal[0], dateBufferLocal.size(), "%B %d, %Y %I:%M:%S %p %Z (local)", localTimeinfo);
396 
397  struct tm *utcTimeinfo;
398  utcTimeinfo = gmtime(reinterpret_cast<const time_t*>(&now));
399  strcpy(&dateBufferUTC[0], "");
400  if (utcTimeinfo)
401  ::strftime(&dateBufferUTC[0], dateBufferUTC.size(), "%Y-%m-%dT%H:%M:%SZ UTC", utcTimeinfo);
402 
403  oss << "Begin NTV2 Support Log" << "\n" <<
404  "Version: " << CNTV2SupportLogger::Version() << "\n"
405  "Generated: " << &dateBufferLocal[0] <<
406  " " << &dateBufferUTC[0] << "\n\n" << flush;
407 
408  if (!mHeaderStr.empty())
409  oss << mHeaderStr;
410 
411  // Go ahead and show info even if the device is not open
413 
414  if (mDevice.IsOpen())
415  {
416  LoggerSectionToFunctionMacro(NTV2_SupportLoggerSectionAutoCirculate, "AutoCirculate", FetchAutoCirculateLog)
420  }
421 
422  if (!mFooterStr.empty())
423  oss << mFooterStr;
424  oss << endl << "End NTV2 Support Log";
425  return oss.str();
426 }
427 
428 void CNTV2SupportLogger::ToString (string & outString) const
429 {
430  outString = ToString();
431 }
432 
433 static inline string HEX0NStr (const uint32_t inNum, const uint16_t inWidth) {ostringstream oss; oss << HEX0N(inNum,inWidth); return oss.str();}
434 static inline string xHEX0NStr(const uint32_t inNum, const uint16_t inWidth) {ostringstream oss; oss << xHEX0N(inNum,inWidth); return oss.str();}
435 template <typename T> string DECStr (const T inT) {ostringstream oss; oss << DEC(inT); return oss.str();}
436 
437 void CNTV2SupportLogger::FetchInfoLog (ostringstream & oss) const
438 {
439  string str;
440  AJALabelValuePairs infoTable;
441  AJASystemInfo::append(infoTable, "SDK/DRIVER INFO", "");
442  AJASystemInfo::append(infoTable, "NTV2 SDK Version", ::NTV2GetVersionString(true));
443  AJASystemInfo::append(infoTable, "supportlog Built", string(__DATE__ " at " __TIME__));
444  if (mDevice.IsOpen())
445  {
446  AJASystemInfo::append(infoTable, "Driver Version", mDevice.GetDriverVersionString());
447 
448  // Driver Type
449  ULWord drvrType(0), dextType(0x44455854), vdevType(0x56444556); // 'DEXT', 'VDEV'
450  mDevice.ReadRegister(kVRegDriverType, drvrType);
451  if (!drvrType)
452  #if defined(AJAMac)
453  str = "AJA Kernel Extension ('KEXT')";
454  #else
455  str = "AJA Kernel Driver";
456  #endif
457  else if (drvrType == dextType)
458  str = "AJA DriverKit Extension ('DEXT')";
459  else if (drvrType == vdevType)
460  str = "No Driver (AJA Virtual Device)";
461  else
462  { ostringstream oss;
463  oss << "(Unknown/Invalid " << NTV2_HEADER::FourCCToString(drvrType) << ")";
464  str = oss.str();
465  }
466  AJASystemInfo::append(infoTable, "Driver Type", str);
467  }
468  AJASystemInfo::append(infoTable, "Watcher Nub Protocol Version", "Built-in RPC support");
469 
470  if (mDevice.IsOpen())
471  {
472  AJASystemInfo::append(infoTable, "DEVICE INFO", "");
473  AJASystemInfo::append(infoTable, "Device", mDevice.GetDisplayName());
474  str = xHEX0NStr(mDevice.GetDeviceID(),8) + " (" + string(::NTV2DeviceIDString(mDevice.GetDeviceID())) + ")";
475  AJASystemInfo::append(infoTable, "Device ID", str);
476  AJASystemInfo::append(infoTable, "Serial Number", (mDevice.GetSerialNumberString(str) ? str : "Not programmed"));
477  AJASystemInfo::append(infoTable, "Video Bitfile", (getBitfileDate(mDevice, str, eFPGAVideoProc) ? str : "Not available"));
478  AJASystemInfo::append(infoTable, "PCI FPGA Version", mDevice.GetPCIFPGAVersionString());
479  ULWord numBytes(0);
480  string dateStr, timeStr, connType;
481  if (mDevice.GetInstalledBitfileInfo(numBytes, dateStr, timeStr))
482  {
483  AJASystemInfo::append(infoTable, "Installed Bitfile ByteCount", DECStr(numBytes));
484  AJASystemInfo::append(infoTable, "Installed Bitfile Build Date", dateStr + " " + timeStr);
485  }
486 
487  if (mDevice.features().HasLPProductCode())
488  {
489  AJASystemInfo::append(infoTable, "URL INFO", "");
490  std::string urlString;
491  bool hasIP = mDevice.GetLPTunnelConfigurationURLString(urlString);
492  AJASystemInfo::append(infoTable, "Tunnel URL", hasIP ? urlString : "No URL");
493  hasIP = mDevice.GetLPExternalConfigurationURLString(urlString);
494  AJASystemInfo::append(infoTable, "External URL", hasIP ? urlString : "No URL");
495  std::vector<std::string> sfpURLStings;
496  int numSFPs = mDevice.GetSFPConfigurationURLStrings(sfpURLStings);
497  for (int i = 0; i < numSFPs; i++)
498  {
499  AJASystemInfo::append(infoTable, "SFP URL", sfpURLStings[i]);
500  }
501  }
502 #if 0 // IP10G purge
503  if (mDevice.features().CanDoIP())
504  {
505  PACKAGE_INFO_STRUCT pkgInfo;
506  if (mDevice.GetPackageInformation(pkgInfo))
507  {
508  AJASystemInfo::append(infoTable, "Package", pkgInfo.packageNumber);
509  AJASystemInfo::append(infoTable, "Build", pkgInfo.buildNumber);
510  AJASystemInfo::append(infoTable, "Build Date", pkgInfo.date);
511  AJASystemInfo::append(infoTable, "Build Time", pkgInfo.time);
512  }
513 
514  CNTV2KonaFlashProgram ntv2Card(mDevice.GetIndexNumber());
515  MacAddr mac1, mac2;
516  if (ntv2Card.ReadMACAddresses(mac1, mac2))
517  {
518  AJASystemInfo::append(infoTable, "MAC1", mac1.AsString());
519  AJASystemInfo::append(infoTable, "MAC2", mac2.AsString());
520  }
521 
522  ULWord cfg(0);
523  mDevice.ReadRegister((kRegSarekFwCfg + SAREK_REGS), cfg);
524  if (cfg & SAREK_2022_2)
525  {
526  ULWord dnaLo(0), dnaHi(0);
527  if (ntv2Card.ReadRegister(kRegSarekDNALow + SAREK_REGS, dnaLo))
528  if (ntv2Card.ReadRegister(kRegSarekDNAHi + SAREK_REGS, dnaHi))
529  AJASystemInfo::append(infoTable, "Device DNA", string(HEX0NStr(dnaHi,8)+HEX0NStr(dnaLo,8)));
530  }
531 
532  string licenseInfo;
533  ntv2Card.ReadLicenseInfo(licenseInfo);
534  AJASystemInfo::append(infoTable, "License", licenseInfo);
535 
536  if (cfg & SAREK_2022_2)
537  {
538  ULWord licenseStatus(0);
539  ntv2Card.ReadRegister(kRegSarekLicenseStatus + SAREK_REGS, licenseStatus);
540  AJASystemInfo::append(infoTable, "License Present", licenseStatus & SAREK_LICENSE_PRESENT ? "Yes" : "No");
541  AJASystemInfo::append(infoTable, "License Status", licenseStatus & SAREK_LICENSE_VALID ? "License is valid" : "License NOT valid");
542  AJASystemInfo::append(infoTable, "License Enable Mask", xHEX0NStr(licenseStatus & 0xff,2));
543  }
544  } // if IsIPDevice
545 #endif // IP10G purge
546  #if defined(AJAMac)
547  connType = mDevice.GetConnectionType();
548  if (!connType.empty())
549  AJASystemInfo::append(infoTable, "Driver Connection", connType);
550  #endif // AJAMac
551  if (mDevice.IsRemote())
552  {
553  if (!mDevice.GetHostName().empty())
554  AJASystemInfo::append(infoTable, "Host Name", mDevice.GetHostName());
555  if (!mDevice.GetDescription().empty())
556  AJASystemInfo::append(infoTable, "Device Description", mDevice.GetDescription());
557  }
558  } // if IsOpen
559 
560  AJASystemInfo hostInfo;
561 
562  // append the system info from AJASystemInfo
563  AJASystemInfo::append(infoTable, "HOST INFO");
564  hostInfo.GetLabelValuePairs(infoTable, false);
565 
566 #if 1 // ** BEGIN ** ** FUTURE ** REPLACE THIS SECTION WITH CALL TO NEW STATIC FUNCTION IN libajaretail
567  // append the health status of the persistence database files
568  std::vector<std::pair<std::string, bool> > persistenceChecks;
569  persistenceChecks.push_back(std::pair<std::string, bool>("User Persistence Health", false));
570  persistenceChecks.push_back(std::pair<std::string, bool>("System Persistence Health", true));
571  std::vector<std::pair<std::string, bool> >::const_iterator it(persistenceChecks.begin());
572  int errCode = 0;
573  std::string errMessage;
574  for (; it != persistenceChecks.end(); ++it)
575  {
576  std::string label(it->first);
577  bool shared(it->second);
578  AJAPersistence p("com.aja.devicesettings", "Unknown", "00000000", shared);
579  if (p.StorageHealthCheck(errCode, errMessage))
580  {
581  AJASystemInfo::append(infoTable, label, "exists and is good");
582  }
583  else
584  {
585  if (shared && errCode == -1)
586  AJASystemInfo::append(infoTable, label, "doesn't exist (this one is optional)");
587  else
588  AJASystemInfo::append(infoTable, label, std::string("err(") + aja::to_string(errCode) + ") '" + errMessage + "'");
589  }
590  }
591 #endif // ** END ** ** FUTURE ** REPLACE THIS SECTION WITH CALL TO NEW STATIC FUNCTION IN libajaretail
592 
593  oss << AJASystemInfo::ToString(infoTable) << endl;
594 
595  if (mDevice.IsOpen() && mDevice.IsRemote())
596  {
597  const NTV2Dictionary params (mDevice.ConnectParams());
598  if (!params.empty())
599  {
600  infoTable.clear();
601  AJASystemInfo::append(infoTable, "CONNECT PARAMETERS");
602  const NTV2StringSet kys(params.keys());
603  for (NTV2StringSetConstIter pKey(kys.begin()); pKey != kys.end(); ++pKey)
604  AJASystemInfo::append(infoTable, *pKey, params.valueForKey(*pKey));
605  oss << AJASystemInfo::ToString(infoTable) << endl;
606  }
607  } // if remote/virtual/software device
608 } // FetchInfoLog
609 
610 
611 void CNTV2SupportLogger::FetchRegisterLog (ostringstream & oss) const
612 {
613  NTV2RegisterReads regs;
614  const NTV2DeviceID deviceID (mDevice.GetDeviceID());
616  static const string sDashes (96, '-');
617 
619  oss << endl << deviceRegs.size() << " Device Registers " << sDashes << endl << endl;
620  regs = ::FromRegNumSet (deviceRegs);
621  if (!mDevice.ReadRegisters (regs))
622  oss << "## NOTE: Driver failed to return one or more registers (those will be zero)" << endl;
623  for (NTV2RegisterReadsConstIter it (regs.begin()); it != regs.end(); ++it)
624  {
625  oss << endl;
626  it->PrintLog(oss, deviceID);
627  }
628 } // FetchRegisterLog
629 
630 
631 void CNTV2SupportLogger::FetchAutoCirculateLog (ostringstream & oss) const
632 {
633  ULWord appSignature (0);
634  int32_t appPID (0);
635  ChannelToACStatus perChannelStatus; // Per-channel AUTOCIRCULATE_STATUS
636  ChannelToPerFrameTCList perChannelTCs; // Per-channel collection of per-frame TCs
637  NTV2TaskMode taskMode (NTV2_DISABLE_TASKS);
638  const NTV2DeviceID deviceID (mDevice.GetDeviceID());
639  const ULWord numChannels (::NTV2DeviceGetNumVideoChannels(deviceID));
640  static const string dashes (25, '-');
641 
642  // This code block takes a snapshot of the current AutoCirculate state of the device...
643  mDevice.GetTaskMode(taskMode);
645 
646  // Grab A/C status for each channel...
647  for (NTV2Channel chan(NTV2_CHANNEL1); chan < NTV2Channel(numChannels); chan = NTV2Channel(chan+1))
648  {
649  FrameToTCList perFrameTCs;
650  AUTOCIRCULATE_STATUS acStatus;
651  mDevice.AutoCirculateGetStatus (chan, acStatus);
653  mDevice.WaitForInputVerticalInterrupt(chan);
654  else
655  mDevice.WaitForOutputVerticalInterrupt(chan);
656  mDevice.AutoCirculateGetStatus (chan, acStatus);
657  perChannelStatus.insert(ChannelToACStatusPair(chan, acStatus));
658  if (!acStatus.IsStopped())
659  {
660  for (uint16_t frameNum (acStatus.GetStartFrame()); frameNum <= acStatus.GetEndFrame(); frameNum++)
661  {
662  FRAME_STAMP frameStamp;
663  NTV2TimeCodeList timecodes;
664  mDevice.AutoCirculateGetFrameStamp (chan, frameNum, frameStamp);
665  frameStamp.GetInputTimeCodes(timecodes);
666  perFrameTCs.insert(FrameToTCListPair(frameNum, timecodes));
667  } // for each A/C frame
668  perChannelTCs.insert(ChannelToPerFrameTCListPair(chan, perFrameTCs));
669  } // if not stopped
670  } // for each channel
671 
672  bool multiFormatMode(false);
673  if (::NTV2DeviceCanDoMultiFormat(deviceID) && mDevice.GetMultiFormatMode(multiFormatMode))
674  {
675  if (!multiFormatMode)
676  oss << "UniFormat: " << ::NTV2VideoFormatToString(::getVideoFormat(mDevice, NTV2_CHANNEL1)) << endl;
677  else
678  oss << "MultiFormat Mode" << endl;
679  }
680  else
681  oss << "Board Format: " << ::NTV2VideoFormatToString(::getVideoFormat(mDevice, NTV2_CHANNEL1)) << endl;
682 
683  oss << "Task mode: " << ::NTV2TaskModeToString(taskMode) << ", PID=" << pidToString(uint32_t(appPID)) << ", signature: " << NTV2_HEADER::FourCCToString(appSignature) << endl
684  << endl
685  << "Chan/FrameStore State Start End Act FrmProc FrmDrop BufLvl Audio RP188 LTC FBFch FBOch Color VidPr Anc HDMIx Field VidFmt PixFmt" << endl
686  << "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" << endl;
687  for (ChannelToACStatusConstIter iter (perChannelStatus.begin()); iter != perChannelStatus.end(); ++iter)
688  {
689  const NTV2Channel chan(iter->first);
690  const AUTOCIRCULATE_STATUS & status(iter->second);
691  // The following should mirror what ntv2watcher/pages/page_autocirculate::fetchSupportLogInfo does...
692  oss << ::NTV2ChannelToString(chan, true) << ": "
693  << (::isEnabled(mDevice,chan) ? NTV2_IS_INPUT_MODE(::getMode(mDevice,chan)) ? "Input " : "Output" : "Off ")
694  << setw(12) << status[0] // State
695  << setw( 7) << status[1] // Start
696  << setw( 6) << status[2] // End
697  << setw( 6) << (status.IsStopped() ? ::getActiveFrameStr(mDevice,chan) : status[4]) // Act
698  << setw(10) << status[9] // FrmProc
699  << setw(10) << status[10] // FrmDrop
700  << setw( 7) << status[11] // BufLvl
701  << setw( 9) << status[12] // Audio
702  << setw( 8) << status[13] // RP188
703  << setw( 8) << status[14] // LTC
704  << setw( 8) << status[15] // FBFchg
705  << setw( 8) << status[16] // FBOchg
706  << setw( 8) << status[17] // ColCor
707  << setw( 8) << status[18] // VidProc
708  << setw( 8) << status[19] // Anc
709  << setw( 8) << status[20] // HDMIAux
710  << setw( 8) << status[21]; // Fld
711  if (!status.IsStopped() || isEnabled(mDevice,chan))
712  oss << setw(12) << ::NTV2VideoFormatToString(::getVideoFormat(mDevice, chan))
713  << setw(13) << ::NTV2FrameBufferFormatToString(::getPixelFormat(mDevice, chan), true)
714  << endl;
715  else
716  oss << setw(12) << "---"
717  << setw(13) << "---"
718  << endl;
719  if (!status.IsStopped() && status.WithAudio())
720  { // Not stopped and AutoCirculating audio -- check if audio buffer capacity will be exceeded...
721  ULWord audChlsPerSample(0);
724  mDevice.GetNumberAudioChannels (audChlsPerSample, status.GetAudioSystem());
725  if (mDevice.GetFrameRate (fr, status.GetChannel()) && NTV2_IS_SUPPORTED_NTV2FrameRate(fr))
726  if (mDevice.GetAudioRate (ar, status.GetAudioSystem()) && NTV2_IS_VALID_AUDIO_RATE(ar))
727  {
728  const double framesPerSecond (double(::GetScaleFromFrameRate(fr)) / 100.00);
729  const double samplesPerSecond (double(::GetAudioSamplesPerSecond(ar)));
730  const double bytesPerChannel (4.0);
731  const double channelsPerSample (double(audChlsPerSample+0));
732  const double bytesPerFrame (samplesPerSecond * bytesPerChannel * channelsPerSample / framesPerSecond);
733  const ULWord maxVideoFrames (4UL * 1024UL * 1024UL / ULWord(bytesPerFrame));
734  if (status.GetFrameCount() > maxVideoFrames)
735  oss << "## WARNING: " << DEC(status.GetFrameCount()) << " frames (" << DEC(status.GetStartFrame())
736  << " thru " << DEC(status.GetEndFrame()) << ") exceeds " << DEC(maxVideoFrames)
737  << "-frame max audio buffer capacity" << endl;
738  }
739  }
740  } // for each channel
741 
742  SDRAMAuditor ramMapper;
743  oss << endl << "Device SDRAM Map (8MB frms):" << endl;
744  ramMapper.AssessDevice(mDevice, /* ignore unused audio buffers */ true);
745  ramMapper.DumpBlocks(oss);
746  oss << endl;
747 
748  // Dump the A/C timecodes...
749  for (ChannelToACStatusConstIter iter (perChannelStatus.begin()); iter != perChannelStatus.end(); ++iter)
750  {
751  const NTV2Channel chan(iter->first);
752  const AUTOCIRCULATE_STATUS & status(iter->second);
753  if (status.IsStopped())
754  continue; // Not initialized/started/paused/running -- skip this channel
755 
756  ChannelToPerFrameTCListConstIter it(perChannelTCs.find(chan));
757  if (it == perChannelTCs.end())
758  continue; // Channel not in perChannelTCs
759 
760  const FrameToTCList perFrameTCs(it->second);
761  oss << endl << dashes << " " << (NTV2_IS_INPUT_CROSSPOINT(status.acCrosspoint) ? "Input " : "Output ") << DEC(chan+1) << " Per-Frame Valid Timecodes:" << endl;
762  for (FrameToTCListConstIter i(perFrameTCs.begin()); i != perFrameTCs.end(); ++i)
763  {
764  const uint16_t frameNum(i->first);
765  const NTV2TimeCodeList & timecodes(i->second);
766  oss << "Frame " << frameNum << ":" << endl;
767  for (uint16_t tcNdx(0); tcNdx < timecodes.size(); tcNdx++)
768  {
769  const NTV2_RP188 tcVal(timecodes[tcNdx]);
770  if (!tcVal.IsValid())
771  continue; // skip invalid timecodes
772  const string tcStr (timecodeToString(tcVal));
773  oss << "\t" << setw(10) << ::NTV2TCIndexToString(NTV2TimecodeIndex(tcNdx), true) << setw(0) << ":\t"
774  << setw(12) << tcStr << setw(0) << "\t" << tcVal << endl;
775  } // for each timecode
776  } // for each frame
777  } // for each channel
778 } // FetchAutoCirculateLog
779 
780 
781 void CNTV2SupportLogger::FetchAudioLog (ostringstream & oss) const
782 {
783  const NTV2DeviceID devID (mDevice.GetDeviceID());
784  const UWord maxNumChannels (::NTV2DeviceGetMaxAudioChannels(devID));
785  const UWord numAudSys (::NTV2DeviceGetNumAudioSystems(devID));
786  oss << " Device:\t" << mDevice.GetDisplayName() << endl;
787 
788  // loop over all the audio systems
789  for (NTV2AudioSystem audSys(NTV2_AUDIOSYSTEM_1); audSys < NTV2AudioSystem(numAudSys); audSys = NTV2AudioSystem(audSys+1))
790  {
791  AUTOCIRCULATE_STATUS acStatus;
792  NTV2Channel acChan (findActiveACChannel(mDevice, audSys, acStatus));
793  if (acChan != NTV2_CHANNEL_INVALID)
794  {
795  NTV2AudioSource audioSource (NTV2_AUDIO_EMBEDDED);
797  mDevice.GetAudioSystemInputSource(audSys, audioSource, embeddedSource);
799  mDevice.GetMode(acChan, mode);
800  NTV2AudioRate audioRate (NTV2_AUDIO_48K);
801  mDevice.GetAudioRate(audioRate, audSys);
802  NTV2AudioBufferSize audioBufferSize;
803  mDevice.GetAudioBufferSize(audioBufferSize, audSys);
805  mDevice.GetAudioLoopBack(loopbackMode, audSys);
806 
807  NTV2AudioChannelPairs channelPairsPresent;
808  if (NTV2_IS_INPUT_MODE(mode))
809  {
810  detectInputChannelPairs(mDevice, audioSource, embeddedSource, channelPairsPresent);
811  }
812  else if (NTV2_IS_OUTPUT_MODE(mode))
813  {
814  bool isEmbedderEnabled = false;
815  mDevice.GetSDIOutputAudioEnabled(NTV2Channel(audSys), isEmbedderEnabled);
816  UWord inChannelCount = isEmbedderEnabled ? maxNumChannels : 0;
817 
818  // Generates a NTV2AudioChannelPairs set for the given number of audio channels...
819  for (UWord audioChannel (0); audioChannel < inChannelCount; audioChannel++)
820  {
821  if (audioChannel & 1)
822  continue;
823  channelPairsPresent.insert(NTV2AudioChannelPair(audioChannel/2));
824  }
825  }
826 
827  if (::NTV2DeviceCanDoPCMDetection(devID))
828  mDevice.GetInputAudioChannelPairsWithPCM(acChan, channelPairsPresent);
829 
830  NTV2AudioChannelPairs nonPCMChannelPairs;
831  mDevice.GetInputAudioChannelPairsWithoutPCM(acChan, nonPCMChannelPairs);
832  bool isNonPCM (true);
833  //end temp
834 
835  const ULWord currentPosSampleNdx (getCurrentPositionSamples(mDevice, audSys, mode));
836  const ULWord maxSamples (getMaxNumSamples(mDevice, audSys));
837  oss << endl
838  << " Audio system:\t" << ::NTV2AudioSystemToString (audSys, true) << endl
839  << " Sample Rate:\t" << ::NTV2AudioRateToString (audioRate, true) << endl
840  << " Buffer Size:\t" << ::NTV2AudioBufferSizeToString (audioBufferSize, true) << endl
841  << " Audio Channels:\t" << getNumAudioChannels(mDevice, audSys);
842  if (getNumAudioChannels(mDevice, audSys) == maxNumChannels)
843  oss << " (max)" << endl;
844  else
845  oss << " (" << maxNumChannels << " (max))" << endl;
846  oss << " Total Samples:\t[" << DEC0N(maxSamples,6) << "]" << endl
847  << " Direction:\t" << ::NTV2ModeToString (mode, true) << endl
848  << " AutoCirculate:\t" << ::NTV2ChannelToString (acChan, true) << endl
849  << " Loopback Mode:\t" << ::NTV2AudioLoopBackToString (loopbackMode, true) << endl;
850  if (NTV2_IS_INPUT_MODE(mode))
851  {
852  oss << "Write Head Position:\t[" << DEC0N(currentPosSampleNdx,6) << "]" << endl
853  << " Audio source:\t" << ::NTV2AudioSourceToString(audioSource, true);
854  if (NTV2_AUDIO_SOURCE_IS_EMBEDDED(audioSource))
855  oss << " (" << ::NTV2EmbeddedAudioInputToString(embeddedSource, true) << ")";
856  oss << endl
857  << " Channels Present:\t" << channelPairsPresent << endl
858  << " Non-PCM Channels:\t" << nonPCMChannelPairs << endl;
859  }
860  else if (NTV2_IS_OUTPUT_MODE(mode))
861  {
862  oss << " Read Head Position:\t[" << DEC0N(currentPosSampleNdx,6) << "]" << endl;
863  if (::NTV2DeviceCanDoPCMControl(mDevice.GetDeviceID()))
864  oss << " Non-PCM Channels:\t" << nonPCMChannelPairs << endl;
865  else
866  oss << " Non-PCM Channels:\t" << (isNonPCM ? "All Channel Pairs" : "Normal") << endl;
867  }
868  }
869  }
870 } // FetchAudioLog
871 
872 void CNTV2SupportLogger::FetchRoutingLog (ostringstream & oss) const
873 {
874  // Dump routing info...
875  CNTV2SignalRouter router;
876  mDevice.GetRouting (router);
877  oss << "(NTV2InputCrosspointID <== NTV2OutputCrosspointID)" << endl;
878  router.Print (oss, false);
879  oss << endl;
892 }
893 
895 {
897  string registerStr;
898 };
900 {
999 };
1000 
1001 bool CNTV2SupportLogger::LoadFromLog (const string & inLogFilePath, const bool bForceLoad)
1002 {
1003  ifstream fileInput;
1004  fileInput.open(inLogFilePath.c_str());
1005  string lineContents;
1006  int i = 0, numLines = 0;
1007  int size = sizeof(registerToLoadStrings)/sizeof(registerToLoadString);
1008  string searchString;
1009  bool isCompatible = false;
1010 
1011  while(getline(fileInput, lineContents))
1012  numLines++;
1013  if(size > numLines)
1014  return false;
1015  fileInput.clear();
1016  fileInput.seekg(0, ios::beg);
1017  while(getline(fileInput, lineContents) && i < size && !bForceLoad)
1018  {
1019  searchString = "Device: ";
1020  searchString.append(NTV2DeviceIDToString(mDevice.GetDeviceID()));
1021  if (lineContents.find(searchString, 0) != string::npos)
1022  {
1023  cout << NTV2DeviceIDToString(mDevice.GetDeviceID()) << " is compatible with the log." << endl;
1024  isCompatible = true;
1025  break;
1026  }
1027  else
1028  {
1029  continue;
1030  }
1031  }
1032 
1033  if(!isCompatible)
1034  return false;
1035 
1036  while(i < size)
1037  {
1038  getline(fileInput, lineContents);
1039  if(fileInput.eof())
1040  {
1041  //Did not find the register reset stream to begin
1042  fileInput.clear();
1043  fileInput.seekg(0, ios::beg);
1044  i++;
1045  continue;
1046  }
1047  searchString = "Register Name: ";
1048  searchString.append(registerToLoadStrings[i].registerStr);
1049  if (lineContents.find(searchString, 0) != string::npos)
1050  {
1051  getline(fileInput, lineContents);
1052  getline(fileInput, lineContents);
1053  searchString = "Register Value: ";
1054  size_t start = lineContents.find(searchString);
1055  if(start != string::npos)
1056  {
1057  size_t end = lineContents.find(" : ");
1058  stringstream registerValueString(lineContents.substr(start + searchString.length(), end));
1059  uint32_t registerValue = 0;
1060  registerValueString >> registerValue;
1061  cout << "Writing register: " << registerToLoadStrings[i].registerStr << " " << registerValue << endl;
1062  mDevice.WriteRegister(registerToLoadStrings[i].registerNum, registerValue);
1063  }
1064  else
1065  {
1066  cout << "The format of the log file is not compatible with this option." << endl;
1067  return false;
1068  }
1069  }
1070  else
1071  {
1072  continue;
1073  }
1074  i++;
1075  }
1076 
1077  return true;
1078 }
1079 
1080 string CNTV2SupportLogger::InventLogFilePathAndName (CNTV2Card & inDevice, const string inPrefix, const string inExtension) // STATIC
1081 {
1082  string homePath;
1083  AJASystemInfo info;
1084  time_t rawtime;
1085  ostringstream oss;
1086  const string deviceName (CNTV2DeviceScanner::GetDeviceRefName(inDevice));
1087 
1088  info.GetValue(AJA_SystemInfoTag_Path_UserHome, homePath);
1089  if (!homePath.empty())
1090  oss << homePath << PATH_DELIMITER;
1091  oss << inPrefix << "_" << deviceName << "_" << ::time(&rawtime) << "." << inExtension;
1092  return oss.str();
1093 }
1094 
1095 bool CNTV2SupportLogger::DumpDeviceSDRAM (CNTV2Card & inDevice, const string & inFilePath, ostream & msgStrm) // STATIC
1096 {
1097  if (!inDevice.IsOpen())
1098  return false;
1099  if (inFilePath.empty())
1100  return false;
1102  const ULWord maxBytes(::NTV2DeviceGetActiveMemorySize(inDevice.GetDeviceID()));
1103  inDevice.GetFrameBufferSize(NTV2_CHANNEL1, frmsz);
1104  const ULWord byteCount(::NTV2FramesizeToByteCount(frmsz)), megs(byteCount/1024/1024), numFrames(maxBytes / byteCount);
1105  NTV2Buffer buffer(byteCount);
1106  NTV2ULWordVector goodFrames, badDMAs, badWrites;
1107  ofstream ofs(inFilePath.c_str(), ofstream::out | ofstream::binary);
1108  if (!ofs)
1109  {msgStrm << "## ERROR: Unable to open '" << inFilePath << "' for writing" << endl; return false;}
1110 
1111  for (ULWord frameNdx(0); frameNdx < numFrames; frameNdx++)
1112  {
1113  if (!inDevice.DMAReadFrame(frameNdx, buffer, byteCount, NTV2_CHANNEL1))
1114  {badDMAs.push_back(frameNdx); continue;}
1115  if (!ofs.write(buffer, streamsize(buffer.GetByteCount())).good())
1116  {badWrites.push_back(frameNdx); continue;}
1117  goodFrames.push_back(frameNdx);
1118  } // for each frame
1119  if (!badDMAs.empty())
1120  {
1121  msgStrm << "## ERROR: DMARead failed for " << DEC(badDMAs.size()) << " " << DEC(megs) << "MB frame(s): ";
1122  ::NTV2PrintULWordVector(badDMAs, msgStrm); msgStrm << endl;
1123  }
1124  if (!badWrites.empty())
1125  {
1126  msgStrm << "## ERROR: Write failures for " << DEC(badWrites.size()) << " " << DEC(megs) << "MB frame(s): ";
1127  ::NTV2PrintULWordVector(badWrites, msgStrm); msgStrm << endl;
1128  }
1129  msgStrm << "## NOTE: " << DEC(goodFrames.size()) << " x " << DEC(megs) << "MB frames from device '"
1130  << CNTV2DeviceScanner::GetDeviceRefName(inDevice) << "' written to '" << inFilePath << "'" << endl;
1131  return true;
1132 }
NTV2RegisterNumber registerNum
std::string NTV2AudioBufferSizeToString(const NTV2AudioBufferSize inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5773
#define NTV2_IS_INPUT_MODE(__mode__)
Definition: ntv2enums.h:1253
std::string NTV2AudioSystemToString(const NTV2AudioSystem inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:5749
virtual bool IsSupported(const NTV2BoolParamID inParamID)
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information...
Definition: ntv2enums.h:3901
virtual bool GetLPTunnelConfigurationURLString(std::string &outURLString)
Definition: ntv2card.cpp:462
map< NTV2Channel, FrameToTCList > ChannelToPerFrameTCList
virtual bool GetMultiFormatMode(bool &outIsEnabled)
Answers if the device is operating in multiple-format per channel (independent channel) mode or not...
virtual bool GetAudioLoopBack(NTV2AudioLoopBack &outMode, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Answers if NTV2AudioLoopBack mode is currently on or off for the given NTV2AudioSystem.
Definition: ntv2audio.cpp:322
std::string NTV2ModeToString(const NTV2Mode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6497
virtual bool GetVideoFormat(NTV2VideoFormat &outValue, NTV2Channel inChannel=NTV2_CHANNEL1)
virtual bool GetDetectedAESChannelPairs(NTV2AudioChannelPairs &outDetectedChannelPairs)
Answers which AES/EBU audio channel pairs are present on the device.
Definition: ntv2audio.cpp:1439
#define Enum2Str(e)
Definition: ntv2utils.h:24
virtual ~CNTV2SupportLogger()
My default destructor.
NTV2AudioBufferSize
Represents the size of the audio buffer used by a device audio system for storing captured samples or...
Definition: ntv2enums.h:1919
static ULWord getNumAudioChannels(CNTV2Card &device, NTV2AudioSystem audioSystem)
#define DEC0N(__x__, __n__)
bool NTV2DeviceCanDoPCMControl(const NTV2DeviceID inDeviceID)
static string HEX0NStr(const uint32_t inNum, const uint16_t inWidth)
I interrogate and control an AJA video/audio capture/playout device.
Definition: ntv2card.h:28
NTV2FrameBufferFormat
Identifies a particular video frame buffer pixel format. See Device Frame Buffer Formats for details...
Definition: ntv2enums.h:223
NTV2TaskMode
Describes the task mode state. See also: NTV2 Device Sharing.
Obtain audio samples from the device AES inputs, if available.
Definition: ntv2enums.h:2013
bool AssessDevice(CNTV2Card &inDevice, const bool inIgnoreStoppedAudioBuffers=(0))
Assesses the given device.
Definition: ntv2card.cpp:1028
NTV2StringSet::const_iterator NTV2StringSetConstIter
Obtain audio samples from the device HDMI input, if available.
Definition: ntv2enums.h:2015
ULWord NTV2DeviceGetActiveMemorySize(const NTV2DeviceID inDeviceID)
virtual UWord GetIndexNumber(void) const
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
Audits an NTV2 device&#39;s SDRAM utilization, and can report contiguous regions of SDRAM, whether unused/free, those being read/written by AutoCirculate, those being read/written by non-AutoCirculating FrameStores, those that are in conflict (AutoCirculate, FrameStore and/or Audio collisions), plus invalid/out-of-bounds regions being accessed.
Definition: ntv2card.h:7019
Declares the CNTV2SupportLogger class.
#define NTV2_IS_VALID_AUDIO_RATE(_x_)
Definition: ntv2enums.h:1942
static std::string InventLogFilePathAndName(CNTV2Card &inDevice, std::string inPrefix="aja_supportlog", std::string inExtension="log")
virtual bool GetAudioSystemInputSource(const NTV2AudioSystem inAudioSystem, NTV2AudioSource &outAudioSource, NTV2EmbeddedAudioInput &outEmbeddedSource)
Answers with the device&#39;s current NTV2AudioSource (and also possibly its NTV2EmbeddedAudioInput) for ...
Definition: ntv2audio.cpp:516
bool NTV2DeviceCanDoMultiFormat(const NTV2DeviceID inDeviceID)
virtual bool GetAudioRate(NTV2AudioRate &outRate, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Returns the current NTV2AudioRate for the given Audio System.
Definition: ntv2audio.cpp:227
bool IsValid(void) const
Answers true if I&#39;m valid, or false if I&#39;m not valid.
ULWord GetByteCount(void) const
virtual bool GetOutputFrame(const NTV2Channel inChannel, ULWord &outValue)
Answers with the current output frame number for the given FrameStore (expressed as an NTV2Channel)...
std::ostream & NTV2PrintULWordVector(const NTV2ULWordVector &inObj, std::ostream &inOutStream=std::cout)
Streams a human-readable dump of the given NTV2ULWordVector into the specified output stream...
#define NTV2_IS_VALID_AUDIO_BUFFER_SIZE(_x_)
Definition: ntv2enums.h:1930
static bool isEnabled(CNTV2Card &device, const NTV2Channel inChannel)
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:71
virtual bool GetInputAudioChannelPairsWithoutPCM(const NTV2Channel inSDIInputConnector, NTV2AudioChannelPairs &outChannelPairs)
For the given SDI input (specified as a channel number), returns the set of audio channel pairs that ...
Definition: ntv2audio.cpp:1604
static ULWord getCurrentPositionSamples(CNTV2Card &device, NTV2AudioSystem audioSystem, NTV2Mode mode)
Obtain audio samples from the audio that&#39;s embedded in the video HANC.
Definition: ntv2enums.h:2012
static ULWord readCurrentAudioPosition(CNTV2Card &device, NTV2AudioSystem audioSystem, NTV2Mode mode)
#define NTV2_AUDIO_SOURCE_IS_EMBEDDED(_x_)
Definition: ntv2enums.h:2021
FrameToTCList::const_iterator FrameToTCListConstIter
static string makeHeader(ostringstream &oss, const string &inName)
virtual std::string GetConnectionType(void) const
virtual bool GetFrameBufferSize(const NTV2Channel inChannel, NTV2Framesize &outValue)
Answers with the frame size currently being used on the device.
Generates a standard support log (register log) for any NTV2 device attached to the host...
Definition: json.hpp:5362
NTV2HDMIAudioChannels
Indicates or specifies the HDMI audio channel count.
Definition: ntv2enums.h:3673
NTV2SupportLoggerSections
map< NTV2Channel, AUTOCIRCULATE_STATUS > ChannelToACStatus
#define false
uint32_t ULWord
Definition: ajatypes.h:236
virtual bool AutoCirculateGetStatus(const NTV2Channel inChannel, AUTOCIRCULATE_STATUS &outStatus)
Returns the current AutoCirculate status for the given channel.
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1361
virtual NTV2Dictionary ConnectParams(void) const
pair< NTV2Channel, FrameToTCList > ChannelToPerFrameTCListPair
This class is a collection of widget input-to-output connections that can be applied all-at-once to a...
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:148
ChannelToPerFrameTCList::const_iterator ChannelToPerFrameTCListConstIter
std::set< NTV2AudioChannelPair > NTV2AudioChannelPairs
A set of distinct NTV2AudioChannelPair values.
static bool DumpDeviceSDRAM(CNTV2Card &inDevice, const std::string &inFilePath, std::ostream &msgStream)
CNTV2SupportLogger(CNTV2Card &card, NTV2SupportLoggerSections sections=NTV2_SupportLoggerSectionsAll)
Construct from CNTV2Card instance.
virtual bool GetInstalledBitfileInfo(ULWord &outNumBytes, std::string &outDateStr, std::string &outTimeStr)
Returns the bitfile size and time/date stamp from the header of the bitfile that&#39;s currently installe...
Definition: ntv2card.cpp:320
#define PATH_DELIMITER
bool GetInputTimeCodes(NTV2TimeCodeList &outValues) const
Returns all RP188 timecodes associated with the frame in NTV2TCIndex order.
virtual bool LoadFromLog(const std::string &inLogFilePath, const bool bForceLoad)
Obtain audio samples from the device analog input(s), if available.
Definition: ntv2enums.h:2014
NTV2RegWritesConstIter NTV2RegisterReadsConstIter
This struct replaces the old RP188_STRUCT.
virtual NTV2VideoFormat GetHDMIInputVideoFormat(NTV2Channel inHDMIInput=NTV2_CHANNEL1)
int32_t appPID(0)
pair< NTV2Channel, AUTOCIRCULATE_STATUS > ChannelToACStatusPair
virtual bool IsRemote(void) const
NTV2XilinxFPGA
Definition: ntv2enums.h:3852
virtual bool GetTaskMode(NTV2TaskMode &outMode)
Retrieves the device&#39;s current task mode.
#define kIncludeOtherRegs_None
virtual void PrependToSection(uint32_t section, const std::string &sectionData)
Prepends arbitrary string data to my support log, ahead of a given section.
NTV2FrameRate
Identifies a particular video frame rate.
Definition: ntv2enums.h:416
virtual std::string GetPCIFPGAVersionString(void)
Definition: ntv2card.cpp:131
#define true
0: Disabled (never recommended): device configured exclusively by client application(s).
Playout (output) mode, which reads from device SDRAM.
Definition: ntv2enums.h:1245
virtual std::string GetDescription(void) const
Definition: ntv2card.cpp:139
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
static NTV2VideoFormat getVideoFormat(CNTV2Card &device, const NTV2Channel inChannel)
virtual bool IsOpen(void) const
The invalid mode.
Definition: ntv2enums.h:1249
static string pidToString(const uint32_t inPID)
std::string to_string(bool val)
Definition: common.cpp:180
static ULWord bytesToSamples(CNTV2Card &device, NTV2AudioSystem audioSystem, const ULWord inBytes)
std::set< std::string > NTV2StringSet
std::string NTV2TaskModeToString(const NTV2TaskMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6357
virtual bool ReadRegisters(NTV2RegisterReads &inOutValues)
Reads the register(s) specified by the given NTV2RegInfo sequence.
#define AJA_NULL
Definition: ajatypes.h:180
virtual bool GetSerialNumberString(std::string &outSerialNumberString)
Answers with a string that contains my human-readable serial number.
Definition: ntv2card.cpp:229
virtual std::string GetDisplayName(void)
Answers with this device&#39;s display name.
Definition: ntv2card.cpp:88
Declares the CRP188 class. See SMPTE RP188 standard for details.
NTV2AudioLoopBack
This enum value determines/states if an audio output embedder will embed silence (zeroes) or de-embed...
Definition: ntv2enums.h:2033
void clear(void)
Removes all of my key/value pairs.
std::vector< ULWord > NTV2ULWordVector
An ordered sequence of ULWords.
std::string NTV2GetVersionString(const bool inDetailed=false)
Definition: ntv2utils.cpp:7540
This selects audio channels 1 and 2 (Group 1 channels 1 and 2)
Definition: ntv2enums.h:3138
virtual NTV2VideoFormat GetAnalogInputVideoFormat(void)
Returns the video format of the signal that is present on the device&#39;s analog video input...
ULWord NTV2FramesizeToByteCount(const NTV2Framesize inFrameSize)
Converts the given NTV2Framesize value into an exact byte count.
Definition: ntv2utils.cpp:5291
bool IsStopped(void) const
NTV2RegisterNumberSet NTV2RegNumSet
A set of distinct NTV2RegisterNumbers.
NTV2AudioChannelPair
Identifies a pair of audio channels.
Definition: ntv2enums.h:3136
virtual std::string ToString(void) const
virtual std::string GetDriverVersionString(void)
Answers with this device&#39;s driver&#39;s version as a human-readable string.
Definition: ntv2card.cpp:162
virtual bool ReadAudioLastIn(ULWord &outValue, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
For the given Audio System, answers with the byte offset to the last byte of the latest chunk of 4-by...
Definition: ntv2audio.cpp:466
static uint32_t maxSampleCountForNTV2AudioBufferSize(const NTV2AudioBufferSize inBufferSize, const uint16_t inChannelCount)
NTV2RegWrites NTV2RegisterReads
static std::string FourCCToString(const ULWord in4CC, const char nonPrintable='?')
virtual bool GetInputFrame(const NTV2Channel inChannel, ULWord &outValue)
Answers with the current input frame index number for the given FrameStore. This identifies which par...
#define NTV2_IS_INPUT_CROSSPOINT(__x__)
Definition: ntv2enums.h:1729
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6750
Embeds silence (zeroes) into the data stream.
Definition: ntv2enums.h:2035
virtual bool GetLPExternalConfigurationURLString(std::string &outURLString)
Definition: ntv2card.cpp:436
virtual bool GetAudioBufferSize(NTV2AudioBufferSize &outSize, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
Retrieves the size of the input or output audio buffer being used for a given Audio System on the AJA...
Definition: ntv2audio.cpp:269
bool NTV2DeviceCanDoPCMDetection(const NTV2DeviceID inDeviceID)
virtual NTV2DeviceID GetDeviceID(void)
std::string NTV2TCIndexToString(const NTV2TCIndex inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6398
virtual bool GetDetectedAudioChannelPairs(const NTV2AudioSystem inAudioSystem, NTV2AudioChannelPairs &outDetectedChannelPairs)
Answers which audio channel pairs are present in the given Audio System&#39;s input stream.
Definition: ntv2audio.cpp:1421
Declares the CNTV2DeviceScanner class.
#define kIncludeOtherRegs_XptROM
#define LoggerSectionToFunctionMacro(_SectionEnum_, _SectionString_, _SectionMethod_)
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device...
NTV2Framesize
Kona2/Xena2 specific enums.
Definition: ntv2enums.h:2121
virtual bool GetRouting(CNTV2SignalRouter &outRouting)
Answers with the current signal routing between any and all widgets on the AJA device.
UWord NTV2DeviceGetNumAudioSystems(const NTV2DeviceID inDeviceID)
Describes a user-space buffer on the host computer. I have an address and a length, plus some optional attributes (allocated by SDK?, page-aligned? etc.).
virtual bool DriverGetBitFileInformation(BITFILE_INFO_STRUCT &outBitFileInfo, const NTV2BitFileType inBitFileType=NTV2_VideoProcBitFile)
defined(NTV2_DEPRECATE_17_2)
NTV2Mode
Used to identify the mode of a widget_framestore, or the direction of an AutoCirculate stream: either...
Definition: ntv2enums.h:1243
uint16_t GetEndFrame(void) const
virtual int GetSFPConfigurationURLStrings(std::vector< std::string > &sfpURLStrings)
Definition: ntv2card.cpp:488
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4608
static NTV2Channel findActiveACChannel(CNTV2Card &device, NTV2AudioSystem audioSystem, AUTOCIRCULATE_STATUS &outStatus)
True if device has a crosspoint connection ROM (New in SDK 17.0)
virtual bool AutoCirculateGetFrameStamp(const NTV2Channel inChannel, const ULWord inFrameNumber, FRAME_STAMP &outFrameInfo)
Returns precise timing information for the given frame and channel that&#39;s currently AutoCirculating...
virtual bool ReadAudioLastOut(ULWord &outValue, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_1)
For the given Audio System, answers with the byte offset of the tail end of the last chunk of audio s...
Definition: ntv2audio.cpp:473
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:181
virtual bool GetHDMIInputAudioChannels(NTV2HDMIAudioChannels &outValue, const NTV2Channel inHDMIInput=NTV2_CHANNEL1)
Answers with the current number of audio channels being received on the given HDMI input...
Definition: ntv2hdmi.cpp:280
#define NTV2_IS_VALID_EMBEDDED_AUDIO_INPUT(_x_)
Definition: ntv2enums.h:1986
static AJALabelValuePairs & append(AJALabelValuePairs &inOutTable, const std::string &inLabel, const std::string &inValue=std::string())
A convenience function that appends the given label and value strings to the provided AJALabelValuePa...
Definition: info.h:170
virtual bool GetFrameBufferFormat(NTV2Channel inChannel, NTV2FrameBufferFormat &outValue)
Returns the current frame buffer format for the given FrameStore on the AJA device.
#define DEC(__x__)
NTV2RegisterNumber
#define AJAExport
Definition: export.h:33
virtual NTV2VideoFormat GetAnalogCompositeInputVideoFormat(void)
Returns the video format of the signal that is present on the device&#39;s composite video input...
This identifies the first Audio System.
Definition: ntv2enums.h:3903
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 ...
const registerToLoadString registerToLoadStrings[]
virtual std::ostream & Print(std::ostream &inOutStream, const bool inForRetailDisplay=false) const
Prints me in a human-readable format to the given output stream.
double GetAudioSamplesPerSecond(const NTV2AudioRate inAudioRate)
Returns the audio sample rate as a number of audio samples per second.
Definition: ntv2utils.cpp:3303
Declares the AJASystemInfo class.
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
std::vector< NTV2_RP188 > NTV2TimeCodeList
An ordered sequence of zero or more NTV2_RP188 structures. An NTV2TCIndex enum value can be used as a...
std::string NTV2AudioRateToString(const NTV2AudioRate inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5760
ostream & operator<<(ostream &outStream, const CNTV2SupportLogger &inData)
static ULWord getMaxNumSamples(CNTV2Card &device, NTV2AudioSystem audioSystem)
uint16_t UWord
Definition: ajatypes.h:234
virtual bool WriteRegister(const ULWord inRegNum, const ULWord inValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Updates or replaces all or part of the 32-bit contents of a specific register (real or virtual) on th...
static bool detectInputChannelPairs(CNTV2Card &device, const NTV2AudioSource inAudioSource, const NTV2EmbeddedAudioInput inEmbeddedSource, NTV2AudioChannelPairs &outChannelPairsPresent)
Specifies channel or FrameStore 1 (or the first item).
Definition: ntv2enums.h:1363
ULWord appSignature(0)
#define xHEX0N(__x__, __n__)
static NTV2RegNumSet GetRegistersForDevice(const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude=0)
A simple (not thread-safe) set of key/value pairs. (New in SDK 16.3)
std::string NTV2AudioSourceToString(const NTV2AudioSource inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6735
string DECStr(const T inT)
static std::string GetDeviceRefName(CNTV2Card &inDevice)
#define NTV2_IS_SUPPORTED_NTV2FrameRate(__r__)
Definition: ntv2enums.h:449
virtual bool GetSDIOutputAudioEnabled(const NTV2Channel inSDIOutput, bool &outIsEnabled)
Answers with the current state of the audio output embedder for the given SDI output connector (speci...
Definition: ntv2audio.cpp:1640
virtual bool GetFrameRate(NTV2FrameRate &outValue, NTV2Channel inChannel=NTV2_CHANNEL1)
Returns the AJA device&#39;s currently configured frame rate via its "value" parameter.
std::string NTV2FrameBufferFormatToString(const NTV2FrameBufferFormat inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6940
virtual bool IsChannelEnabled(const NTV2Channel inChannel, bool &outEnabled)
Answers whether or not the given FrameStore is enabled.
Declares the CNTV2KonaFlashProgram class.
static int Version(void)
NTV2AudioSource
This enum value determines/states where an audio system will obtain its audio samples.
Definition: ntv2enums.h:2010
virtual bool GetInputAudioChannelPairsWithPCM(const NTV2Channel inSDIInputConnector, NTV2AudioChannelPairs &outChannelPairs)
For the given SDI input (specified as a channel number), returns the set of audio channel pairs that ...
Definition: ntv2audio.cpp:1576
virtual void AddFooter(const std::string &sectionName, const std::string &sectionData)
Adds footer text to my log.
virtual AJAStatus GetLabelValuePairs(AJALabelValuePairs &outTable, bool clearTable=false) const
Generates a "table" of label/value pairs that contains the complete host system info table...
Definition: info.cpp:175
#define NTV2_IS_OUTPUT_MODE(__mode__)
Definition: ntv2enums.h:1254
Private include file for all ajabase sources.
This class/object reports information about the current and/or requested AutoCirculate frame...
virtual bool DMAReadFrame(const ULWord inFrameNumber, ULWord *pOutFrameBuffer, const ULWord inByteCount)
Transfers a single frame from the AJA device to the host.
Definition: ntv2dma.cpp:41
NTV2AudioRate
Definition: ntv2enums.h:1933
#define NTV2_IS_VALID_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:729
virtual AJAStatus GetValue(const AJASystemInfoTag inTag, std::string &outValue) const
Answers with the host system info value string for the given AJASystemInfoTag.
Definition: info.cpp:153
ULWord NTV2DeviceGetNumVideoChannels(const NTV2DeviceID inDeviceID)
std::string NTV2AudioLoopBackToString(const NTV2AudioLoopBack inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5785
const char * NTV2DeviceIDString(const NTV2DeviceID id)
Definition: ntv2debug.cpp:15
std::ostream & DumpBlocks(std::ostream &oss) const
Dumps all 8MB blocks/frames and their tags, if any, into the given stream.
Definition: ntv2card.cpp:1073
8 audio channels
Definition: ntv2enums.h:3676
virtual void AppendToSection(uint32_t section, const std::string &sectionData)
Appends arbitrary string data to my support log, after a given section.
#define HEX0N(__x__, __n__)
Definition: debug.cpp:1181
static string xHEX0NStr(const uint32_t inNum, const uint16_t inWidth)
std::string NTV2ChannelToString(const NTV2Channel inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5731
static bool getBitfileDate(CNTV2Card &device, string &outDateString, NTV2XilinxFPGA whichFPGA)
map< uint16_t, NTV2TimeCodeList > FrameToTCList
std::string NTV2EmbeddedAudioInputToString(const NTV2EmbeddedAudioInput inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6717
UWord NTV2DeviceGetMaxAudioChannels(const NTV2DeviceID inDeviceID)
NTV2AudioSystem GetAudioSystem(void) const
pair< uint16_t, NTV2TimeCodeList > FrameToTCListPair
NTV2RegisterReads FromRegNumSet(const NTV2RegNumSet &inRegNumSet)
Definition: ntv2utils.cpp:7743
This selects audio channels 9 and 10 (Group 3 channels 1 and 2)
Definition: ntv2enums.h:3142
static NTV2PixelFormat getPixelFormat(CNTV2Card &device, const NTV2Channel inChannel)
NTV2Crosspoint acCrosspoint
The crosspoint (channel number with direction)
virtual bool GetStreamingApplication(ULWord &outAppType, int32_t &outProcessID)
Answers with the four-CC type and process ID of the application that currently "owns" the AJA device ...
NTV2EmbeddedAudioInput
This enum value determines/states which SDI video input will be used to supply audio samples to an au...
Definition: ntv2enums.h:1972
virtual void ToString(std::string &outAllLabelsAndValues) const
Answers with a multi-line string that contains the complete host system info table.
static string getActiveFrameStr(CNTV2Card &device, const NTV2Channel inChannel)
static ULWord getActiveFrame(CNTV2Card &device, const NTV2Channel inChannel)
ChannelToACStatus::const_iterator ChannelToACStatusConstIter
uint16_t GetStartFrame(void) const
virtual std::string GetHostName(void) const
Declares device capability functions.
This selects audio channels 3 and 4 (Group 1 channels 3 and 4)
Definition: ntv2enums.h:3139
virtual bool WaitForInputVerticalInterrupt(const NTV2Channel inChannel=NTV2_CHANNEL1, UWord inRepeatCount=1)
Efficiently sleeps the calling thread/process until the next one or more field (interlaced video) or ...
static NTV2Mode getMode(CNTV2Card &device, const NTV2Channel inChannel)
#define kIncludeOtherRegs_VRegs
virtual bool GetMode(const NTV2Channel inChannel, NTV2Mode &outValue)
Answers with the current NTV2Mode of the given FrameStore on the AJA device.
enum NTV2TCIndex NTV2TimecodeIndex
Declares the CNTV2RegisterExpert class.
ULWord GetScaleFromFrameRate(const NTV2FrameRate inFrameRate)
Definition: ntv2utils.cpp:3454
virtual void AddHeader(const std::string &sectionName, const std::string &sectionData)
Adds header text to my log.
static string timecodeToString(const NTV2_RP188 &inRP188)