AJA NTV2 SDK  18.1.0.2439
NTV2 SDK 18.1.0.2439
ntv2registerexpert.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
7 #include "ntv2registerexpert.h"
8 #include "ntv2devicefeatures.hh"
9 #include "ntv2utils.h"
10 #include "ntv2debug.h"
11 #include "ntv2endian.h"
12 #include "ntv2vpid.h"
13 #include "ntv2bitfile.h"
14 #include "ntv2signalrouter.h"
15 #include "ajabase/common/common.h"
16 #include "ajabase/system/lock.h"
18 #include "ajabase/system/debug.h"
19 #include <algorithm>
20 #include <sstream>
21 #include <iterator>
22 #include <iomanip>
23 #include <map>
24 #include <math.h>
25 #include <ctype.h> // for isprint()
26 #if !defined(AJA_WINDOWS)
27 #include <unistd.h>
28 #endif
29 
30 
31 using namespace std;
32 
33 #define LOGGING_MAPPINGS (AJADebug::IsActive(AJA_DebugUnit_Enumeration))
34 #define HEX16(__x__) "0x" << hex << setw(16) << setfill('0') << uint64_t(__x__) << dec
35 #define INSTP(_p_) HEX16(uint64_t(_p_))
36 #define REiFAIL(__x__) AJA_sERROR (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
37 #define REiWARN(__x__) AJA_sWARNING(AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
38 #define REiNOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
39 #define REiINFO(__x__) AJA_sINFO (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
40 #define REiDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
41 
42 #define DEF_REGNAME(_num_) DefineRegName(_num_, #_num_)
43 #define DEF_REG(_num_, _dec_, _rw_, _c1_, _c2_, _c3_) DefineRegister((_num_), #_num_, _dec_, _rw_, _c1_, _c2_, _c3_)
44 
45 
48 static const string sSpace(" ");
49 static const string sNull;
50 
51 typedef enum
52 {
54  regNTV4FS_LineLengthPitch = regNTV4FS_FIRST, // Reg 0 - Raster bytes/line[31:16] & pitch[15:0]
55  regNTV4FS_ROIVHSize, // Reg 1 - ROI size: vert[27:16] horz[11:0]
56  regNTV4FS_ROIF1StartAddr, // Reg 2 - ROI F1 start address [31:0]
57  regNTV4FS_ROIF2StartAddr, // Reg 3 - ROI F2 end address [31:0]
58  regNTV4FS_ROIF1VHOffsets, // Reg 4 - ROI F1 byte offsets: vert[26:16] horz[11:0]
59  regNTV4FS_ROIF2VHOffsets, // Reg 5 - ROI F2 byte offsets: vert[26:16] horz[11:0]
60  regNTV4FS_DisplayHorzPixelsPerLine, // Reg 6 - Horiz display: total[27:16] active[11:0]
61  regNTV4FS_DisplayFID, // Reg 7 - FID bit transition lines: FID lo[26:16] hi[10:0]
62  regNTV4FS_F1ActiveLines, // Reg 8 - Disp F1 active lines: end[26:16] start[10:0]
63  regNTV4FS_F2ActiveLines, // Reg 9 - Disp F2 active lines: end[26:16] start[10:0]
64  regNTV4FS_RasterControl, // Reg 10 - Control: sync[21:20] pixclk[18:16] pixfmt[12:8] p[6] rgb8cvt[5] dither[4] fill[3] DRT[2] disable[1] capture[0]
65  regNTV4FS_RasterPixelSkip, // Reg 11 - Raster pixel skip (or unpacker H offset?)
66  regNTV4FS_RasterVideoFill_YCb_GB, // Reg 12 - Raster video fill YorG[31:16] CbOrB[15:0]
67  regNTV4FS_RasterVideoFill_Cr_AR, // Reg 13 - Raster video fill A[31:16] CrOrR[15:0]
68  regNTV4FS_RasterROIFillAlpha, // Reg 14 - ROI Fill Alpha[15:0]
69  regNTV4FS_Status, // Reg 15 - Status lineCount[31:16] oddField[0]
70  regNTV4FS_RasterOutputTimingPreset, // Reg 16 - Output timing preset[23:0]
71  regNTV4FS_RasterVTotalLines, // Reg 17 - Total lines
72  regNTV4FS_RasterSmpteFramePulse, // Reg 18 - SMPTE frame pulse
73  regNTV4FS_RasterOddLineStartAddress, // Reg 19 - UHD odd line start addr | Green playback component offset (int12_t)
74  regNTV4FS_RasterOffsetBlue, // Reg 20 - Blue playback component offset[12:0] (int12_t)
75  regNTV4FS_RasterOffsetRed, // Reg 21 - Red playback component offset[12:0] (int12_t)
76  regNTV4FS_RasterOffsetAlpha, // Reg 22 - Alpha playback component offset[12:0] (int12_t)
77  regNTV4FS_InputSourceSelect = 63, // Reg 63 - Input source select[7:0]
81 
82 static const std::string sNTV4FrameStoreRegNames[] = { "LineLengthPitch",
83  "ROIVHSize",
84  "ROIF1StartAddr",
85  "ROIF2StartAddr",
86  "ROIF1VHOffsets",
87  "ROIF2VHOffsets",
88  "DisplayHorzPixelsPerLine",
89  "DisplayFID",
90  "F1ActiveLines",
91  "F2ActiveLines",
92  "RasterControl",
93  "RasterPixelSkip",
94  "RasterVideoFill_YCb_GB",
95  "RasterVideoFill_Cr_AR",
96  "RasterROIFillAlpha",
97  "Status",
98  "RasterOutputTimingPreset",
99  "RasterVTotalLines",
100  "RasterSmpteFramePulse",
101  "RasterOddLineStartAddress",
102  "RasterOffsetBlue",
103  "RasterOffsetRed",
104  "RasterOffsetAlpha"};
105 static const ULWord kNTV4FrameStoreFirstRegNum (0x0000D000 / sizeof(ULWord)); // First FS reg num 13,312
106 static const ULWord kNumNTV4FrameStoreRegisters(regNTV4FS_REGISTER_COUNT); // 64 registers
107 
108 
111 static uint32_t gInstanceTally(0);
112 static uint32_t gLivingInstances(0);
113 
114 
123 {
124 public:
125  static RegisterExpertPtr GetInstance(const bool inCreateIfNecessary = true);
126  static bool DisposeInstance(void);
127 
128 private:
130  {
131  AJAAutoLock lock(&mGuardMutex);
134  // Name "Classic" registers using NTV2RegisterNameString...
135  for (ULWord regNum (0); regNum < kRegNumRegisters; regNum++)
136  DefineRegName (regNum, ::NTV2RegisterNameString(regNum));
137  // Now the rest...
138  SetupBasicRegs(); // Basic registers
139  SetupVPIDRegs(); // VPIDs
140  SetupAncInsExt(); // Anc Ins/Ext
141  SetupAuxInsExt(); // Aux Ins/Ext
142  SetupXptSelect(); // Xpt Select
143  SetupDMARegs(); // DMA
144  SetupTimecodeRegs(); // Timecode
145  SetupAudioRegs(); // Audio
146  SetupMRRegs(); // MultiViewer/MultiRaster
147  SetupMixerKeyerRegs(); // Mixer/Keyer
148  SetupHDMIRegs(); // HDMI
149  SetupSDIErrorRegs(); // SDIError
150  SetupCSCRegs(); // CSCs
151  SetupLUTRegs(); // LUTs
152  SetupBOBRegs(); // Break Out Board
153  SetupLEDRegs(); // Bracket LEDs
154  SetupCMWRegs(); // Clock Monitor Out
155  SetupNTV4FrameStoreRegs(); // NTV4 FrameStores
156  SetupLPRegs();
157  SetupVRegs(); // Virtuals
158  REiNOTE(DEC(gLivingInstances) << " extant, " << DEC(gInstanceTally) << " total");
159  if (LOGGING_MAPPINGS)
160  {
161  REiDBG("RegsToStrsMap=" << mRegNumToStringMap.size()
162  << " RegsToDecodersMap=" << mRegNumToDecoderMap.size()
163  << " ClassToRegsMMap=" << mRegClassToRegNumMMap.size()
164  << " StrToRegsMMap=" << mStringToRegNumMMap.size()
165  << " InpXptsToXptRegInfoMap=" << mInputXpt2XptRegNumMaskIndexMap.size()
166  << " XptRegInfoToInpXptsMap=" << mXptRegNumMaskIndex2InputXptMap.size()
167  << " RegClasses=" << mAllRegClasses.size());
168  }
169  } // constructor
170 public:
172  {
174  REiNOTE(DEC(gLivingInstances) << " extant, " << DEC(gInstanceTally) << " total");
175  } // destructor
176 
177 private:
178  // This class implements a functor that returns a string that contains a human-readable decoding
179  // of a register value, given its number and the ID of the device it came from.
180  struct Decoder
181  {
182  // The default reg decoder functor returns an empty string.
183  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
184  {
185  (void) inRegNum;
186  (void) inRegValue;
187  (void) inDeviceID;
188  return string();
189  }
190  } mDefaultRegDecoder;
191 
192  void DefineRegName(const uint32_t regNumber, const string & regName)
193  {
194  if (!regName.empty())
195  {
196  AJAAutoLock lock(&mGuardMutex);
197  if (mRegNumToStringMap.find(regNumber) == mRegNumToStringMap.end())
198  {
199  mRegNumToStringMap.insert (RegNumToStringPair(regNumber, regName));
200  string lowerCaseRegName(regName);
201  mStringToRegNumMMap.insert (StringToRegNumPair(aja::lower(lowerCaseRegName), regNumber));
202  }
203  }
204  }
205  inline void DefineRegDecoder(const uint32_t inRegNum, const Decoder & dec)
206  {
207  AJAAutoLock lock(&mGuardMutex);
208  mRegNumToDecoderMap.insert (RegNumToDecoderPair(inRegNum, &dec));
209  }
210  inline void DefineRegClass (const uint32_t inRegNum, const string & className)
211  {
212  if (!className.empty())
213  {
214  AJAAutoLock lock(&mGuardMutex);
215  mRegClassToRegNumMMap.insert(StringToRegNumPair(className, inRegNum));
216  }
217  }
218  void DefineRegReadWrite(const uint32_t inRegNum, const int rdWrt)
219  {
220  AJAAutoLock lock(&mGuardMutex);
221  if (rdWrt == READONLY)
222  {
223  NTV2_ASSERT (!IsRegisterWriteOnly(inRegNum));
224  DefineRegClass (inRegNum, kRegClass_ReadOnly);
225  }
226  if (rdWrt == WRITEONLY)
227  {
228  NTV2_ASSERT (!IsRegisterReadOnly(inRegNum));
229  DefineRegClass (inRegNum, kRegClass_WriteOnly);
230  }
231  }
232  void DefineRegister(const uint32_t inRegNum, const string & regName, const Decoder & dec, const int rdWrt, const string & className1, const string & className2, const string & className3)
233  {
234  DefineRegName (inRegNum, regName);
235  DefineRegDecoder (inRegNum, dec);
236  DefineRegReadWrite (inRegNum, rdWrt);
237  DefineRegClass (inRegNum, className1);
238  DefineRegClass (inRegNum, className2);
239  DefineRegClass (inRegNum, className3);
240  }
241  void DefineXptReg(const uint32_t inRegNum, const NTV2InputXptID xpt0, const NTV2InputXptID xpt1, const NTV2InputXptID xpt2, const NTV2InputXptID xpt3)
242  {
243  DefineRegister (inRegNum, sNull, mDecodeXptGroupReg, READWRITE, kRegClass_Routing, kRegClass_NULL, kRegClass_NULL);
244  const NTV2InputCrosspointID indexes [4] = {xpt0, xpt1, xpt2, xpt3};
245  for (int ndx(0); ndx < 4; ndx++)
246  {
247  if (indexes[ndx] == NTV2_INPUT_CROSSPOINT_INVALID)
248  continue;
249  const XptRegNumAndMaskIndex regNumAndNdx(inRegNum, ndx);
250  if (mXptRegNumMaskIndex2InputXptMap.find(regNumAndNdx) == mXptRegNumMaskIndex2InputXptMap.end())
251  mXptRegNumMaskIndex2InputXptMap [regNumAndNdx] = indexes[ndx];
252  if (mInputXpt2XptRegNumMaskIndexMap.find(indexes[ndx]) == mInputXpt2XptRegNumMaskIndexMap.end())
253  mInputXpt2XptRegNumMaskIndexMap[indexes[ndx]] = regNumAndNdx;
254  }
255  }
256 
257  void SetupBasicRegs(void)
258  {
259  AJAAutoLock lock(&mGuardMutex);
260  DefineRegister (kRegGlobalControl, "", mDecodeGlobalControlReg, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
261  DefineRegister (kRegGlobalControl2, "", mDecodeGlobalControl2, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
262  DefineRegister (kRegGlobalControl3, "", mDecodeGlobalControl3, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
263  DefineRegister (kRegGlobalControlCh2, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
264  DefineRegister (kRegGlobalControlCh3, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
265  DefineRegister (kRegGlobalControlCh4, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
266  DefineRegister (kRegGlobalControlCh5, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
267  DefineRegister (kRegGlobalControlCh6, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
268  DefineRegister (kRegGlobalControlCh7, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
269  DefineRegister (kRegGlobalControlCh8, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
270  DefineRegister (kRegCh1Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
271  DefineRegister (kRegCh2Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
272  DefineRegister (kRegCh3Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
273  DefineRegister (kRegCh4Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
274  DefineRegister (kRegCh5Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
275  DefineRegister (kRegCh6Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
276  DefineRegister (kRegCh7Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
277  DefineRegister (kRegCh8Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
278  #if 1 // PCIAccessFrame regs are obsolete
279  DefineRegister (kRegCh1PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
280  DefineRegister (kRegCh2PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
281  DefineRegister (kRegCh3PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
282  DefineRegister (kRegCh4PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
283  DefineRegister (kRegCh5PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
284  DefineRegister (kRegCh6PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
285  DefineRegister (kRegCh7PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
286  DefineRegister (kRegCh8PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
287  #endif // PCIAccessFrame regs are obsolete
288  DefineRegister (kRegCh1InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel1, kRegClass_NULL);
289  DefineRegister (kRegCh2InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel2, kRegClass_NULL);
290  DefineRegister (kRegCh3InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel3, kRegClass_NULL);
291  DefineRegister (kRegCh4InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel4, kRegClass_NULL);
292  DefineRegister (kRegCh5InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel5, kRegClass_NULL);
293  DefineRegister (kRegCh6InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel6, kRegClass_NULL);
294  DefineRegister (kRegCh7InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel7, kRegClass_NULL);
295  DefineRegister (kRegCh8InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel8, kRegClass_NULL);
296  DefineRegister (kRegCh1OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
297  DefineRegister (kRegCh2OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
298  DefineRegister (kRegCh3OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
299  DefineRegister (kRegCh4OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
300  DefineRegister (kRegCh5OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
301  DefineRegister (kRegCh6OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
302  DefineRegister (kRegCh7OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
303  DefineRegister (kRegCh8OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
304  DefineRegister (kRegSDIOut1Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
305  DefineRegister (kRegSDIOut2Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
306  DefineRegister (kRegSDIOut3Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
307  DefineRegister (kRegSDIOut4Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
308  DefineRegister (kRegSDIOut5Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
309  DefineRegister (kRegSDIOut6Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
310  DefineRegister (kRegSDIOut7Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
311  DefineRegister (kRegSDIOut8Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
312  DefineRegister (kRegSDIOut6Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
313  DefineRegister (kRegSDIOut7Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
314  DefineRegister (kRegSDIOut8Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
315 
316  DefineRegister (kRegOutputTimingControl, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
317  DefineRegister (kRegOutputTimingControlch2, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
318  DefineRegister (kRegOutputTimingControlch3, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
319  DefineRegister (kRegOutputTimingControlch4, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
320  DefineRegister (kRegOutputTimingControlch5, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
321  DefineRegister (kRegOutputTimingControlch6, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
322  DefineRegister (kRegOutputTimingControlch7, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
323 
324  DefineRegister (kRegCh1ControlExtended, "", mDecodeChannelControlExt, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
325  DefineRegister (kRegCh2ControlExtended, "", mDecodeChannelControlExt, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
326  DefineRegister (kRegBoardID, "", mDecodeBoardID, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
327  DefineRegister (kRegFirmwareUserID, "", mDecodeFirmwareUserID, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
328 
329  DefineRegister (kRegCanDoStatus, "", mDecodeCanDoStatus, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
330  DefineRegister (kRegBitfileDate, "", mDecodeBitfileDateTime, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
331  DefineRegister (kRegBitfileTime, "", mDecodeBitfileDateTime, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
332  DefineRegister (kRegCPLDVersion, "", mDecodeCPLDVersion, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
333 
334  DefineRegister (kRegVidIntControl, "", mDecodeVidIntControl, READWRITE, kRegClass_Interrupt, kRegClass_Channel1, kRegClass_Channel2);
335  DefineRegClass (kRegVidIntControl, kRegClass_Channel3);
336  DefineRegClass (kRegVidIntControl, kRegClass_Channel4);
337  DefineRegister (kRegStatus, "", mDecodeStatusReg, READWRITE, kRegClass_Interrupt, kRegClass_Channel1, kRegClass_Channel2);
338  DefineRegClass (kRegStatus, kRegClass_Timecode);
339  DefineRegister (kRegVidIntControl2, "", mDecodeVidIntControl2, READWRITE, kRegClass_Interrupt, kRegClass_Channel5, kRegClass_Channel5);
340  DefineRegClass (kRegVidIntControl2, kRegClass_Channel7);
341  DefineRegClass (kRegVidIntControl2, kRegClass_Channel8);
342  DefineRegister (kRegStatus2, "", mDecodeStatus2Reg, READWRITE, kRegClass_Interrupt, kRegClass_Channel3, kRegClass_Channel4);
343  DefineRegClass (kRegStatus2, kRegClass_Channel5);
344  DefineRegClass (kRegStatus2, kRegClass_Channel6);
345  DefineRegClass (kRegStatus2, kRegClass_Channel7);
346  DefineRegClass (kRegStatus2, kRegClass_Channel8);
347  DefineRegister (kRegInputStatus, "", mDecodeInputStatusReg, READONLY, kRegClass_Input, kRegClass_Channel1, kRegClass_Channel2);
348  DefineRegClass (kRegInputStatus, kRegClass_Audio);
349  DefineRegister (kRegSDIInput3GStatus, "", mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel1, kRegClass_Channel2);
350  DefineRegister (kRegSDIInput3GStatus2, "", mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel3, kRegClass_Channel4);
351  DefineRegister (kRegSDI5678Input3GStatus,"",mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel5, kRegClass_Channel6);
354  DefineRegister (kRegInputStatus2, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel3, kRegClass_Channel4); // 288
355  DefineRegister (kRegInput56Status, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel5, kRegClass_Channel6); // 458
356  DefineRegister (kRegInput78Status, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel7, kRegClass_Channel8); // 459
357 
358  DefineRegister (kRegFS1ReferenceSelect, "", mDecodeFS1RefSelectReg, READWRITE, kRegClass_Input, kRegClass_Timecode, kRegClass_NULL);
359  DefineRegister (kRegSysmonVccIntDieTemp,"", mDecodeSysmonVccIntDieTemp, READONLY, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
360  DefineRegister (kRegSDITransmitControl, "", mDecodeSDITransmitCtrl, READWRITE, kRegClass_Channel1, kRegClass_Channel2, kRegClass_Channel3);
361  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel4);
362  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel5);
363  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel6);
364  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel7);
365  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel8);
366 
367  DefineRegister (kRegConversionControl, "", mConvControlRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_Channel2);
368  DefineRegister (kRegSDIWatchdogControlStatus, "", mDecodeRelayCtrlStat, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
369  DefineRegister (kRegSDIWatchdogTimeout, "", mDecodeWatchdogTimeout, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
370  DefineRegister (kRegSDIWatchdogKick1, "", mDecodeWatchdogKick, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
371  DefineRegister (kRegSDIWatchdogKick2, "", mDecodeWatchdogKick, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
372  DefineRegister (kRegIDSwitch, "kRegIDSwitch", mDecodeIDSwitchStatus, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
373  DefineRegister (kRegPWMFanControl, "kRegPWMFanControl", mDecodePWMFanControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
374  DefineRegister (kRegPWMFanStatus, "kRegPWMFanStatus", mDecodePWMFanMonitor, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
375  }
376  void SetupBOBRegs(void)
377  {
378  AJAAutoLock lock(&mGuardMutex);
379  DefineRegister (kRegBOBStatus, "kRegBOBStatus", mDecodeBOBStatus, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
380  DefineRegister (kRegBOBGPIInData, "kRegBOBGPIInData", mDecodeBOBGPIIn, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
381  DefineRegister (kRegBOBGPIInterruptControl, "kRegBOBGPIInterruptControl", mDecodeBOBGPIInInterruptControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
382  DefineRegister (kRegBOBGPIOutData, "kRegBOBGPIOutData", mDecodeBOBGPIOut, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
383  DefineRegister (kRegBOBAudioControl, "kRegBOBAudioControl", mDecodeBOBAudioControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
384  }
385  void SetupLEDRegs(void)
386  {
387  AJAAutoLock lock(&mGuardMutex);
388  DefineRegister (kRegLEDReserved0, "kRegLEDReserved0", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
389  DefineRegister (kRegLEDClockDivide, "kRegLEDClockDivide", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
390  DefineRegister (kRegLEDReserved2, "kRegLEDReserved2", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
391  DefineRegister (kRegLEDReserved3, "kRegLEDReserved3", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
392  DefineRegister (kRegLEDSDI1Control, "kRegLEDSDI1Control", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
393  DefineRegister (kRegLEDSDI2Control, "kRegLEDSDI2Control", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
394  DefineRegister (kRegLEDHDMIInControl, "kRegLEDHDMIInControl", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
395  DefineRegister (kRegLEDHDMIOutControl, "kRegLEDHDMIOutControl", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
396  }
397  void SetupCMWRegs(void)
398  {
399  AJAAutoLock lock(&mGuardMutex);
400  DefineRegister (kRegCMWControl, "kRegCMWControl", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
401  DefineRegister (kRegCMW1485Out, "kRegCMW1485Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
402  DefineRegister (kRegCMW14835Out, "kRegCMW14835Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
403  DefineRegister (kRegCMW27Out, "kRegCMW27Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
404  DefineRegister (kRegCMW12288Out, "kRegCMW12288Out", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
405  DefineRegister (kRegCMWHDMIOut, "kRegCMWHDMIOut", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
406  }
407  void SetupVPIDRegs(void)
408  {
409  AJAAutoLock lock(&mGuardMutex);
410  DefineRegister (kRegSDIIn1VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel1);
411  DefineRegister (kRegSDIIn1VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel1);
412  DefineRegister (kRegSDIOut1VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
413  DefineRegister (kRegSDIOut1VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
414  DefineRegister (kRegSDIOut2VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
415  DefineRegister (kRegSDIOut2VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
416  DefineRegister (kRegSDIIn2VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel2);
417  DefineRegister (kRegSDIIn2VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel2);
418  DefineRegister (kRegSDIOut3VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel3);
419  DefineRegister (kRegSDIOut3VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel3);
420  DefineRegister (kRegSDIOut4VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel4);
421  DefineRegister (kRegSDIOut4VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel4);
422  DefineRegister (kRegSDIIn3VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel3);
423  DefineRegister (kRegSDIIn3VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel3);
424  DefineRegister (kRegSDIIn4VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel4);
425  DefineRegister (kRegSDIIn4VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel4);
426  DefineRegister (kRegSDIOut5VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel5);
427  DefineRegister (kRegSDIOut5VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel5);
428  DefineRegister (kRegSDIIn5VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel5);
429  DefineRegister (kRegSDIIn5VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel5);
430  DefineRegister (kRegSDIIn6VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel6);
431  DefineRegister (kRegSDIIn6VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel6);
432  DefineRegister (kRegSDIOut6VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel6);
433  DefineRegister (kRegSDIOut6VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel6);
434  DefineRegister (kRegSDIIn7VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel7);
435  DefineRegister (kRegSDIIn7VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel7);
436  DefineRegister (kRegSDIOut7VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel7);
437  DefineRegister (kRegSDIOut7VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel7);
438  DefineRegister (kRegSDIIn8VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel8);
439  DefineRegister (kRegSDIIn8VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel8);
440  DefineRegister (kRegSDIOut8VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel8);
441  DefineRegister (kRegSDIOut8VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel8);
442  }
443  void SetupTimecodeRegs(void)
444  {
445  AJAAutoLock lock(&mGuardMutex);
446  DefineRegister (kRegRP188InOut1DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
447  DefineRegister (kRegRP188InOut1Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
448  DefineRegister (kRegRP188InOut1Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
449  DefineRegister (kRegRP188InOut2DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
450  DefineRegister (kRegRP188InOut2Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
451  DefineRegister (kRegRP188InOut2Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
452  DefineRegister (kRegLTCOutBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Output);
453  DefineRegister (kRegLTCOutBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Output);
454  DefineRegister (kRegLTCInBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Input);
455  DefineRegister (kRegLTCInBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Input);
456  DefineRegister (kRegRP188InOut1Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
457  DefineRegister (kRegRP188InOut1Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
458  DefineRegister (kRegRP188InOut2Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
459  DefineRegister (kRegRP188InOut2Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
460  DefineRegister (kRegRP188InOut3Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
461  DefineRegister (kRegRP188InOut3Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
462  DefineRegister (kRegRP188InOut4Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
463  DefineRegister (kRegRP188InOut4Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
464  DefineRegister (kRegRP188InOut5Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
465  DefineRegister (kRegRP188InOut5Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
466  DefineRegister (kRegRP188InOut6Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
467  DefineRegister (kRegRP188InOut6Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
468  DefineRegister (kRegRP188InOut7Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
469  DefineRegister (kRegRP188InOut7Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
470  DefineRegister (kRegRP188InOut8Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
471  DefineRegister (kRegRP188InOut8Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
472  DefineRegister (kRegLTCStatusControl, "", mLTCStatusControlDecoder, READWRITE, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
473  DefineRegister (kRegLTC2EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
474  DefineRegister (kRegLTC2EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
475  DefineRegister (kRegLTC2AnalogBits0_31, "", mDefaultRegDecoder, READONLY, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
476  DefineRegister (kRegLTC2AnalogBits32_63, "", mDefaultRegDecoder, READONLY, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
477  DefineRegister (kRegRP188InOut3DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
478  DefineRegister (kRegRP188InOut3Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
479  DefineRegister (kRegRP188InOut3Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
480  DefineRegister (kRegRP188InOut4DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
481  DefineRegister (kRegRP188InOut4Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
482  DefineRegister (kRegRP188InOut4Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
483  DefineRegister (kRegLTC3EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
484  DefineRegister (kRegLTC3EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
485  DefineRegister (kRegLTC4EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
486  DefineRegister (kRegLTC4EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
487  DefineRegister (kRegRP188InOut5Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
488  DefineRegister (kRegRP188InOut5Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
489  DefineRegister (kRegRP188InOut5DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
490  DefineRegister (kRegLTC5EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
491  DefineRegister (kRegLTC5EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
492  DefineRegister (kRegRP188InOut6Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
493  DefineRegister (kRegRP188InOut6Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
494  DefineRegister (kRegRP188InOut6DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
495  DefineRegister (kRegLTC6EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
496  DefineRegister (kRegLTC6EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
497  DefineRegister (kRegRP188InOut7Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
498  DefineRegister (kRegRP188InOut7Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
499  DefineRegister (kRegRP188InOut7DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
500  DefineRegister (kRegLTC7EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
501  DefineRegister (kRegLTC7EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
502  DefineRegister (kRegRP188InOut8Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
503  DefineRegister (kRegRP188InOut8Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
504  DefineRegister (kRegRP188InOut8DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
505  DefineRegister (kRegLTC8EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
506  DefineRegister (kRegLTC8EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
507  } // SetupTimecodeRegs
508 
509  void SetupAudioRegs(void)
510  {
511  AJAAutoLock lock(&mGuardMutex);
512  DefineRegister (kRegAud1Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
513  DefineRegister (kRegAud2Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
514  DefineRegister (kRegAud3Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
515  DefineRegister (kRegAud4Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
516  DefineRegister (kRegAud5Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
517  DefineRegister (kRegAud6Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
518  DefineRegister (kRegAud7Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
519  DefineRegister (kRegAud8Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
520  DefineRegister (kRegAudioControl2, "", mDecodeAudControl2Reg, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
521  DefineRegister (kRegAud1Detect, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel1, kRegClass_Channel2);
522  DefineRegister (kRegAudDetect2, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel3, kRegClass_Channel4);
523  DefineRegister (kRegAudioDetect5678, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel8, kRegClass_Channel7);
524  DefineRegClass (kRegAudioDetect5678, kRegClass_Channel6);
525  DefineRegClass (kRegAudioDetect5678, kRegClass_Channel5);
526  DefineRegister (kRegAud1SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
527  DefineRegister (kRegAud2SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
528  DefineRegister (kRegAud3SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
529  DefineRegister (kRegAud4SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
530  DefineRegister (kRegAud5SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
531  DefineRegister (kRegAud6SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
532  DefineRegister (kRegAud7SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
533  DefineRegister (kRegAud8SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
534  DefineRegister (kRegAud1Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
535  DefineRegister (kRegAud2Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
536  DefineRegister (kRegAud3Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
537  DefineRegister (kRegAud4Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
538  DefineRegister (kRegAud5Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
539  DefineRegister (kRegAud6Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
540  DefineRegister (kRegAud7Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
541  DefineRegister (kRegAud8Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
542  DefineRegister (kRegAud1OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Output);
543  DefineRegister (kRegAud2OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_Output);
544  DefineRegister (kRegAud3OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_Output);
545  DefineRegister (kRegAud4OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_Output);
546  DefineRegister (kRegAud5OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Output);
547  DefineRegister (kRegAud6OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_Output);
548  DefineRegister (kRegAud7OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_Output);
549  DefineRegister (kRegAud8OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_Output);
550  DefineRegister (kRegAud1InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Input);
551  DefineRegister (kRegAud2InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_Input);
552  DefineRegister (kRegAud3InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_Input);
553  DefineRegister (kRegAud4InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_Input);
554  DefineRegister (kRegAud5InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Input);
555  DefineRegister (kRegAud6InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_Input);
556  DefineRegister (kRegAud7InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_Input);
557  DefineRegister (kRegAud8InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_Input);
558  DefineRegister (kRegPCMControl4321, "", mDecodePCMControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Channel2);
559  DefineRegClass (kRegPCMControl4321, kRegClass_Channel3);
560  DefineRegClass (kRegPCMControl4321, kRegClass_Channel4);
561  DefineRegister (kRegPCMControl8765, "", mDecodePCMControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Channel6);
562  DefineRegClass (kRegPCMControl8765, kRegClass_Channel7);
563  DefineRegClass (kRegPCMControl8765, kRegClass_Channel8);
564  DefineRegister (kRegAud1Counter, "", mDefaultRegDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
565  DefineRegister (kRegAudioOutputSourceMap,"",mDecodeAudOutputSrcMap, READWRITE, kRegClass_Audio, kRegClass_Output, kRegClass_AES);
566  DefineRegClass (kRegAudioOutputSourceMap, kRegClass_HDMI);
567 
568  DefineRegister (kRegAudioMixerInputSelects, "kRegAudioMixerInputSelects", mAudMxrInputSelDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
569  DefineRegister (kRegAudioMixerMainGain, "kRegAudioMixerMainGain", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
570  DefineRegister (kRegAudioMixerAux1GainCh1, "kRegAudioMixerAux1GainCh1", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
571  DefineRegister (kRegAudioMixerAux2GainCh1, "kRegAudioMixerAux2GainCh1", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
572  DefineRegister (kRegAudioMixerChannelSelect, "kRegAudioMixerChannelSelect", mAudMxrChanSelDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
573  DefineRegister (kRegAudioMixerMutes, "kRegAudioMixerMutes", mAudMxrMutesDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
574  DefineRegister (kRegAudioMixerAux1GainCh2, "kRegAudioMixerAux1GainCh2", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
575  DefineRegister (kRegAudioMixerAux2GainCh2, "kRegAudioMixerAux2GainCh2", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
576  DefineRegister (kRegAudioMixerAux1InputLevels, "kRegAudioMixerAux1InputLevels", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
577  DefineRegister (kRegAudioMixerAux2InputLevels, "kRegAudioMixerAux2InputLevels", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
578  DefineRegister (kRegAudioMixerMainInputLevelsPair0, "kRegAudioMixerMainInputLevelsPair0", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
579  DefineRegister (kRegAudioMixerMainInputLevelsPair1, "kRegAudioMixerMainInputLevelsPair1", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
580  DefineRegister (kRegAudioMixerMainInputLevelsPair2, "kRegAudioMixerMainInputLevelsPair2", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
581  DefineRegister (kRegAudioMixerMainInputLevelsPair3, "kRegAudioMixerMainInputLevelsPair3", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
582  DefineRegister (kRegAudioMixerMainInputLevelsPair4, "kRegAudioMixerMainInputLevelsPair4", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
583  DefineRegister (kRegAudioMixerMainInputLevelsPair5, "kRegAudioMixerMainInputLevelsPair5", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
584  DefineRegister (kRegAudioMixerMainInputLevelsPair6, "kRegAudioMixerMainInputLevelsPair6", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
585  DefineRegister (kRegAudioMixerMainInputLevelsPair7, "kRegAudioMixerMainInputLevelsPair7", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
586  DefineRegister (kRegAudioMixerMainOutputLevelsPair0, "kRegAudioMixerMainOutputLevelsPair0", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
587  DefineRegister (kRegAudioMixerMainOutputLevelsPair1, "kRegAudioMixerMainOutputLevelsPair1", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
588  DefineRegister (kRegAudioMixerMainOutputLevelsPair2, "kRegAudioMixerMainOutputLevelsPair2", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
589  DefineRegister (kRegAudioMixerMainOutputLevelsPair3, "kRegAudioMixerMainOutputLevelsPair3", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
590  DefineRegister (kRegAudioMixerMainOutputLevelsPair4, "kRegAudioMixerMainOutputLevelsPair4", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
591  DefineRegister (kRegAudioMixerMainOutputLevelsPair5, "kRegAudioMixerMainOutputLevelsPair5", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
592  DefineRegister (kRegAudioMixerMainOutputLevelsPair6, "kRegAudioMixerMainOutputLevelsPair6", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
593  DefineRegister (kRegAudioMixerMainOutputLevelsPair7, "kRegAudioMixerMainOutputLevelsPair7", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
594  }
595 
596  void SetupMRRegs(void)
597  {
598  AJAAutoLock lock(&mGuardMutex);
599  DefineRegister (kRegMRQ1Control, "kRegMRQ1Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
600  DefineRegister (kRegMRQ2Control, "kRegMRQ2Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
601  DefineRegister (kRegMRQ3Control, "kRegMRQ3Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
602  DefineRegister (kRegMRQ4Control, "kRegMRQ4Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
603  DefineRegister (kRegMROutControl, "kRegMROutControl", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
604  DefineRegister (kRegMRSupport, "kRegMRSupport", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
605  }
606 
607  void SetupDMARegs(void)
608  {
609  AJAAutoLock lock(&mGuardMutex);
610  DefineRegister (kRegDMA1HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
611  DefineRegister (kRegDMA1HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
612  DefineRegister (kRegDMA1LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
613  DefineRegister (kRegDMA1XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
614  DefineRegister (kRegDMA1NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
615  DefineRegister (kRegDMA1NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
616  DefineRegister (kRegDMA2HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
617  DefineRegister (kRegDMA2HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
618  DefineRegister (kRegDMA2LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
619  DefineRegister (kRegDMA2XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
620  DefineRegister (kRegDMA2NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
621  DefineRegister (kRegDMA2NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
622  DefineRegister (kRegDMA3HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
623  DefineRegister (kRegDMA3HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
624  DefineRegister (kRegDMA3LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
625  DefineRegister (kRegDMA3XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
626  DefineRegister (kRegDMA3NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
627  DefineRegister (kRegDMA3NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
628  DefineRegister (kRegDMA4HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
629  DefineRegister (kRegDMA4HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
630  DefineRegister (kRegDMA4LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
631  DefineRegister (kRegDMA4XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
632  DefineRegister (kRegDMA4NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
633  DefineRegister (kRegDMA4NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
634  DefineRegister (kRegDMAControl, "", mDMAControlRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
635  DefineRegister (kRegDMAIntControl, "", mDMAIntControlRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
636  }
637 
638  void SetupXptSelect(void)
639  {
640  AJAAutoLock lock(&mGuardMutex);
641  // RegNum 0-7 8-15 16-23 24-31
648  { // An additional input Xpt for kRegXptSelectGroup6 in mask index 2...
649  const XptRegNumAndMaskIndex regNumAndNdx (kRegXptSelectGroup6, 2);
650  if (mXptRegNumMaskIndex2InputXptMap.find (regNumAndNdx) == mXptRegNumMaskIndex2InputXptMap.end())
651  mXptRegNumMaskIndex2InputXptMap [regNumAndNdx] = NTV2_XptHDMIOutQ1Input;
652  if (mInputXpt2XptRegNumMaskIndexMap.find (NTV2_XptHDMIOutQ1Input) == mInputXpt2XptRegNumMaskIndexMap.end())
653  mInputXpt2XptRegNumMaskIndexMap[NTV2_XptHDMIOutQ1Input] = regNumAndNdx;
654  }
684 
685 
686  // Expose the CanConnect ROM registers:
688  { ostringstream regName; // used to synthesize reg name
689  const ULWord rawInputXpt ((regNum - ULWord(kRegFirstValidXptROMRegister)) / 4UL + ULWord(NTV2_FIRST_INPUT_CROSSPOINT));
690  const ULWord ndx ((regNum - ULWord(kRegFirstValidXptROMRegister)) % 4UL);
691  const NTV2InputXptID inputXpt (NTV2InputXptID(rawInputXpt+0));
692  if (NTV2_IS_VALID_InputCrosspointID(inputXpt))
693  {
694  string inputXptEnumName (::NTV2InputCrosspointIDToString(inputXpt,false)); // e.g. "NTV2_XptFrameBuffer1Input"
695  if (inputXptEnumName.empty())
696  regName << "kRegXptValid" << DEC0N(rawInputXpt,3) << "N" << DEC(ndx);
697  else
698  regName << "kRegXptValid" << aja::replace(inputXptEnumName, "NTV2_Xpt", "") << DEC(ndx);
699  }
700  else
701  regName << "kRegXptValue" << HEX0N(regNum,4);
702  DefineRegister (regNum, regName.str(), mDecodeXptValidReg, READONLY, kRegClass_XptROM, kRegClass_NULL, kRegClass_NULL);
703  }
704  } // SetupXptSelect
705 
706  void SetupAncInsExt(void)
707  {
708  static const string AncExtRegNames [] = { "Control", "F1 Start Address", "F1 End Address",
709  "F2 Start Address", "F2 End Address", "Field Cutoff Lines",
710  "Memory Total", "F1 Memory Usage", "F2 Memory Usage",
711  "V Blank Lines", "Lines Per Frame", "Field ID Lines",
712  "Ignore DID 1-4", "Ignore DID 5-8", "Ignore DID 9-12",
713  "Ignore DID 13-16", "Ignore DID 17-20", "Analog Start Line",
714  "Analog F1 Y Filter", "Analog F2 Y Filter", "Analog F1 C Filter",
715  "Analog F2 C Filter", "", "",
716  "", "", "",
717  "Analog Act Line Len"};
718  static const string AncInsRegNames [] = { "Field Bytes", "Control", "F1 Start Address",
719  "F2 Start Address", "Pixel Delay", "Active Start",
720  "Pixels Per Line", "Lines Per Frame", "Field ID Lines",
721  "Payload ID Control", "Payload ID", "Chroma Blank Lines",
722  "F1 C Blanking Mask", "F2 C Blanking Mask", "Field Bytes High",
723  "Reserved 15", "RTP Payload ID", "RTP SSRC",
724  "IP Channel"};
725  static const uint32_t AncExtPerChlRegBase [] = { 0x1000, 0x1040, 0x1080, 0x10C0, 0x1100, 0x1140, 0x1180, 0x11C0 };
726  static const uint32_t AncInsPerChlRegBase [] = { 0x1200, 0x1240, 0x1280, 0x12C0, 0x1300, 0x1340, 0x1380, 0x13C0 };
727 
728  NTV2_ASSERT(sizeof(AncExtRegNames[0]) == sizeof(AncExtRegNames[1]));
729  NTV2_ASSERT(size_t(regAncExt_LAST) == sizeof(AncExtRegNames)/sizeof(AncExtRegNames[0]));
730  NTV2_ASSERT(size_t(regAncIns_LAST) == sizeof(AncInsRegNames)/sizeof(string));
731 
732  AJAAutoLock lock(&mGuardMutex);
733  for (ULWord offsetNdx (0); offsetNdx < 8; offsetNdx++)
734  {
735  for (ULWord reg(regAncExtControl); reg < regAncExt_LAST; reg++)
736  {
737  if (AncExtRegNames[reg].empty()) continue;
738  ostringstream oss; oss << "Extract " << (offsetNdx+1) << " " << AncExtRegNames[reg];
739  DefineRegName (AncExtPerChlRegBase[offsetNdx] + reg, oss.str());
740  }
741  for (ULWord reg(regAncInsFieldBytes); reg < regAncIns_LAST; reg++)
742  {
743  ostringstream oss; oss << "Insert " << (offsetNdx+1) << " " << AncInsRegNames[reg];
744  DefineRegName (AncInsPerChlRegBase[offsetNdx] + reg, oss.str());
745  }
746  }
747  for (ULWord ndx (0); ndx < 8; ndx++)
748  {
749  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtControl, "", mDecodeAncExtControlReg, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
750  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
751  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
752  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
753  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
754  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFieldCutoffLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
755  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtTotalStatus, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
756  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
757  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
758  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFieldVBLStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
759  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtTotalFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
760  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFID, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
761  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_1_2_3_4, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
762  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_5_6_7_8, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
763  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_9_10_11_12, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
764  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_13_14_15_16, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
765  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_17_18_19_20, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
766  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtAnalogStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
767  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1AnalogYFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
768  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2AnalogYFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
769  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1AnalogCFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
770  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2AnalogCFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
771  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtAnalogActiveLineLength, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
772 
773  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytes, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
774  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsControl, "", mDecodeAncInsControlReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
775  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField1StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
776  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField2StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
777  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPixelDelay, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
778  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsActiveStart, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
779  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsLinePixels, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
780  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
781  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldIDLines, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
782  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadIDControl, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
783  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
784  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankCStartLine, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
785  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField1CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
786  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField2CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
787  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytesHigh, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
788  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
789  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpSSRC, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
790  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsIpChannel, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
791  }
792  } // SetupAncInsExt
793 
794  void SetupAuxInsExt(void)
795  {
796  static const string AuxExtRegNames [] = { "Control", "F1 Start Address", "F1 End Address",
797  "F2 Start Address", "", "",
798  "Memory Total", "F1 Memory Usage", "F2 Memory Usage",
799  "V Blank Lines", "Lines Per Frame", "Field ID Lines",
800  "Ignore DID 1-4", "Ignore DID 5-8", "Ignore DID 9-12",
801  "Ignore DID 13-16", "Buffer Fill"};
802  // static const string AncInsRegNames [] = { "Field Bytes", "Control", "F1 Start Address",
803  // "F2 Start Address", "Pixel Delay", "Active Start",
804  // "Pixels Per Line", "Lines Per Frame", "Field ID Lines",
805  // "Payload ID Control", "Payload ID", "Chroma Blank Lines",
806  // "F1 C Blanking Mask", "F2 C Blanking Mask", "Field Bytes High",
807  // "Reserved 15", "RTP Payload ID", "RTP SSRC",
808  // "IP Channel"};
809  static const uint32_t AuxExtPerChlRegBase [] = { 7616, 7680, 7744, 7808 };
810  static const uint32_t AuxInsPerChlRegBase [] = { 4608, 4672, 4736, 4800 };
811  NTV2_UNUSED(AuxInsPerChlRegBase);
812 
813  NTV2_ASSERT(sizeof(AuxExtRegNames[0]) == sizeof(AuxExtRegNames[1]));
814  NTV2_ASSERT(size_t(regAuxExt_LAST) == sizeof(AuxExtRegNames)/sizeof(AuxExtRegNames[0]));
815  //NTV2_ASSERT(size_t(regAncIns_LAST) == sizeof(AncInsRegNames)/sizeof(string));
816 
817  AJAAutoLock lock(&mGuardMutex);
818  for (ULWord offsetNdx (0); offsetNdx < 4; offsetNdx++)
819  {
820  for (ULWord reg(regAuxExtControl); reg < regAuxExt_LAST; reg++)
821  {
822  if (AuxExtRegNames[reg].empty()) continue;
823  ostringstream oss; oss << "Extract " << (offsetNdx+1) << " " << AuxExtRegNames[reg];
824  DefineRegName (AuxExtPerChlRegBase[offsetNdx] + reg, oss.str());
825  }
826  // for (ULWord reg(regAncInsFieldBytes); reg < regAncIns_LAST; reg++)
827  // {
828  // ostringstream oss; oss << "Insert " << (offsetNdx+1) << " " << AncInsRegNames[reg];
829  // DefineRegName (AncInsPerChlRegBase[offsetNdx] + reg, oss.str());
830  // }
831  }
832  for (ULWord ndx (0); ndx < 4; ndx++)
833  {
834  // Some of the decoders are shared with Anc
835  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtControl, "", mDecodeAuxExtControlReg, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
836  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
837  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
838  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField2StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
839  // DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExt4, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
840  // DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExt5, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
841  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtTotalStatus, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
842  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
843  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField2Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
844  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFieldVBLStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
845  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtTotalFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
846  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFID, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
847  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask0, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
848  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask1, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
849  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask2, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
850  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask3, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
851  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFillData, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
852 
853 
854  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytes, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
855  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsControl, "", mDecodeAncInsControlReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
856  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField1StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
857  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField2StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
858  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPixelDelay, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
859  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsActiveStart, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
860  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsLinePixels, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
861  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
862  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldIDLines, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
863  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadIDControl, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
864  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
865  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankCStartLine, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
866  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField1CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
867  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField2CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
868  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytesHigh, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
869  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
870  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpSSRC, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
871  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsIpChannel, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
872  }
873  } // SetupAuxInsExt
874 
875  void SetupHDMIRegs(void)
876  {
877  AJAAutoLock lock(&mGuardMutex);
878  DefineRegister (kRegHDMIOutControl, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
879  DefineRegister (kRegHDMIInputStatus, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
880  DefineRegister (kRegHDMIInputControl, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
881  DefineRegister (kRegHDMIHDRGreenPrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
882  DefineRegister (kRegHDMIHDRBluePrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
883  DefineRegister (kRegHDMIHDRRedPrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
884  DefineRegister (kRegHDMIHDRWhitePoint, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
885  DefineRegister (kRegHDMIHDRMasteringLuminence, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
886  DefineRegister (kRegHDMIHDRLightLevel, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
887  DefineRegister (kRegHDMIHDRControl, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
888  DefineRegister (kRegMRQ1Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
889  DefineRegister (kRegMRQ2Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
890  DefineRegister (kRegMRQ3Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
891  DefineRegister (kRegMRQ4Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
892  DefineRegister (kRegHDMIV2I2C1Control, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
893  DefineRegister (kRegHDMIV2I2C1Data, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
894  DefineRegister (kRegHDMIV2VideoSetup, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
895  DefineRegister (kRegHDMIV2HSyncDurationAndBackPorch, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
896  DefineRegister (kRegHDMIV2HActive, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
897  DefineRegister (kRegHDMIV2VSyncDurationAndBackPorchField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
898  DefineRegister (kRegHDMIV2VSyncDurationAndBackPorchField2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
899  DefineRegister (kRegHDMIV2VActiveField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
900  DefineRegister (kRegHDMIV2VActiveField2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
901  DefineRegister (kRegHDMIV2VideoStatus, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
902  DefineRegister (kRegHDMIV2HorizontalMeasurements, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
903  DefineRegister (kRegHDMIV2HBlankingMeasurements, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
904  DefineRegister (kRegHDMIV2HBlankingMeasurements1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
905  DefineRegister (kRegHDMIV2VerticalMeasurementsField0, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
906  DefineRegister (kRegHDMIV2VerticalMeasurementsField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
907  DefineRegister (kRegHDMIV2i2c2Control, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
908  DefineRegister (kRegHDMIV2i2c2Data, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
909 
910  DefineRegister (kVRegHDMIOutControl1, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
911  DefineRegister (kVRegHDMIInputStatus1, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
912  DefineRegister (kVRegHDMIInputControl1, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
913  DefineRegister (kVRegHDMIOutStatus1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
914  DefineRegister (kVRegHDMIOutHDRGreenPrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
915  DefineRegister (kVRegHDMIOutHDRBluePrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
916  DefineRegister (kVRegHDMIOutHDRRedPrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
917  DefineRegister (kVRegHDMIOutHDRWhitePoint1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
918  DefineRegister (kVRegHDMIOutHDRMasterLuminance1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
919  DefineRegister (kVRegHDMIOutHDRLightLevel1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
920  DefineRegister (kVRegHDMIOutHDRControl1, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
921 
922  DefineRegister (kVRegHDMIOutControl2, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
923  DefineRegister (kVRegHDMIInputStatus2, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
924  DefineRegister (kVRegHDMIInputControl2, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
925  DefineRegister (kVRegHDMIOutStatus2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
926  DefineRegister (kVRegHDMIOutHDRGreenPrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
927  DefineRegister (kVRegHDMIOutHDRBluePrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
928  DefineRegister (kVRegHDMIOutHDRRedPrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
929  DefineRegister (kVRegHDMIOutHDRWhitePoint2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
930  DefineRegister (kVRegHDMIOutHDRMasterLuminance2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
931  DefineRegister (kVRegHDMIOutHDRLightLevel2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
932  DefineRegister (kVRegHDMIOutHDRControl2, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
933 
934  DefineRegister (kVRegHDMIOutControl3, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
935  DefineRegister (kVRegHDMIInputStatus3, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
936  DefineRegister (kVRegHDMIInputControl3, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
937  DefineRegister (kVRegHDMIOutStatus3, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
938  DefineRegister (kVRegHDMIOutHDRGreenPrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
939  DefineRegister (kVRegHDMIOutHDRBluePrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
940  DefineRegister (kVRegHDMIOutHDRRedPrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
941  DefineRegister (kVRegHDMIOutHDRWhitePoint3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
942  DefineRegister (kVRegHDMIOutHDRMasterLuminance3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
943  DefineRegister (kVRegHDMIOutHDRLightLevel3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
944  DefineRegister (kVRegHDMIOutHDRControl3, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
945 
946  DefineRegister (kVRegHDMIOutControl4, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
947  DefineRegister (kVRegHDMIInputStatus4, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
948  DefineRegister (kVRegHDMIInputControl4, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
949  DefineRegister (kVRegHDMIOutStatus4, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
950  DefineRegister (kVRegHDMIOutHDRGreenPrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
951  DefineRegister (kVRegHDMIOutHDRBluePrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
952  DefineRegister (kVRegHDMIOutHDRRedPrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
953  DefineRegister (kVRegHDMIOutHDRWhitePoint4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
954  DefineRegister (kVRegHDMIOutHDRMasterLuminance4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
955  DefineRegister (kVRegHDMIOutHDRLightLevel4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
956  DefineRegister (kVRegHDMIOutHDRControl4, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
957 
958  DefineRegister (0x1d00, "reg_hdmiin4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
959  DefineRegister (0x1d01, "reg_hdmiin4_videodetect0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
960  DefineRegister (0x1d02, "reg_hdmiin4_videodetect1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
961  DefineRegister (0x1d03, "reg_hdmiin4_videodetect2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
962  DefineRegister (0x1d04, "reg_hdmiin4_videodetect3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
963  DefineRegister (0x1d05, "reg_hdmiin4_videodetect4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
964  DefineRegister (0x1d06, "reg_hdmiin4_videodetect5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
965  DefineRegister (0x1d07, "reg_hdmiin4_videodetect6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
966  DefineRegister (0x1d08, "reg_hdmiin4_videodetect7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
967  DefineRegister (0x1d09, "reg_hdmiin4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
968  DefineRegister (0x1d0a, "reg_hdmiin4_receiverstatus", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
969  DefineRegister (0x1d0b, "reg_hdmiin4_auxpacketignore0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
970  DefineRegister (0x1d0c, "reg_hdmiin4_auxpacketignore1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
971  DefineRegister (0x1d0d, "reg_hdmiin4_auxpacketignore2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
972  DefineRegister (0x1d0e, "reg_hdmiin4_auxpacketignore3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
973  DefineRegister (0x1d0f, "reg_hdmiin4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
974  DefineRegister (0x1d10, "reg_hdmiin4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
975  DefineRegister (0x1d11, "reg_hdmiin4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
976  DefineRegister (0x1d12, "reg_hdmiin4_rxclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
977  DefineRegister (0x1d13, "reg_hdmiin4_rxoversampling", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
978  DefineRegister (0x1d14, "reg_hdmiin4_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
979  DefineRegister (0x1d15, "reg_hdmiin4_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
980  DefineRegister (0x1d16, "reg_hdmiin4_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
981  DefineRegister (0x1d1e, "reg_hdmiin4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
982  DefineRegister (0x1d1f, "reg_hdmiin4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
983 
984  DefineRegister (0x2500, "reg_hdmiin4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
985  DefineRegister (0x2501, "reg_hdmiin4_videodetect0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
986  DefineRegister (0x2502, "reg_hdmiin4_videodetect1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
987  DefineRegister (0x2503, "reg_hdmiin4_videodetect2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
988  DefineRegister (0x2504, "reg_hdmiin4_videodetect3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
989  DefineRegister (0x2505, "reg_hdmiin4_videodetect4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
990  DefineRegister (0x2506, "reg_hdmiin4_videodetect5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
991  DefineRegister (0x2507, "reg_hdmiin4_videodetect6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
992  DefineRegister (0x2508, "reg_hdmiin4_videodetect7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
993  DefineRegister (0x2509, "reg_hdmiin4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
994  DefineRegister (0x250a, "reg_hdmiin4_receiverstatus", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
995  DefineRegister (0x250b, "reg_hdmiin4_auxpacketignore0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
996  DefineRegister (0x250c, "reg_hdmiin4_auxpacketignore1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
997  DefineRegister (0x250d, "reg_hdmiin4_auxpacketignore2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
998  DefineRegister (0x250e, "reg_hdmiin4_auxpacketignore3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
999  DefineRegister (0x250f, "reg_hdmiin4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1000  DefineRegister (0x2510, "reg_hdmiin4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1001  DefineRegister (0x2511, "reg_hdmiin4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1002  DefineRegister (0x2512, "reg_hdmiin4_rxclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1003  DefineRegister (0x2513, "reg_hdmiin4_rxoversampling", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1004  DefineRegister (0x2514, "reg_hdmiin4_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1005  DefineRegister (0x2515, "reg_hdmiin4_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1006  DefineRegister (0x2516, "reg_hdmiin4_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1007  DefineRegister (0x251e, "reg_hdmiin4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1008  DefineRegister (0x251f, "reg_hdmiin4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1009 
1010  DefineRegister (0x2c00, "reg_hdmiin_i2c_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1011  DefineRegister (0x2c01, "reg_hdmiin_i2c_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1012  DefineRegister (0x2c02, "reg_hdmiin_video_setup", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1013  DefineRegister (0x2c03, "reg_hdmiin_hsync_duration", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1014  DefineRegister (0x2c04, "reg_hdmiin_h_active", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1015  DefineRegister (0x2c05, "reg_hdmiin_vsync_duration_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1016  DefineRegister (0x2c06, "reg_hdmiin_vsync_duration_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1017  DefineRegister (0x2c07, "reg_hdmiin_v_active_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1018  DefineRegister (0x2c08, "reg_hdmiin_v_active_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1019  DefineRegister (0x2c09, "reg_hdmiin_video_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1020  DefineRegister (0x2c0a, "reg_hdmiin_horizontal_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1021  DefineRegister (0x2c0b, "reg_hdmiin_hblank_data0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1022  DefineRegister (0x2c0c, "reg_hdmiin_hblank_data1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1023  DefineRegister (0x2c0d, "reg_hdmiin_vertical_data_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1024  DefineRegister (0x2c0e, "reg_hdmiin_vertical_data_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1025  DefineRegister (0x2c0f, "reg_hdmiin_color_depth", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1026  DefineRegister (0x2c12, "reg_hdmiin_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1027  DefineRegister (0x2c13, "reg_hdmiin_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1028  DefineRegister (0x2c14, "reg_hdmiin_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1029 
1030  DefineRegister (0x3000, "reg_hdmiin_i2c_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1031  DefineRegister (0x3001, "reg_hdmiin_i2c_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1032  DefineRegister (0x3002, "reg_hdmiin_video_setup", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1033  DefineRegister (0x3003, "reg_hdmiin_hsync_duration", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1034  DefineRegister (0x3004, "reg_hdmiin_h_active", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1035  DefineRegister (0x3005, "reg_hdmiin_vsync_duration_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1036  DefineRegister (0x3006, "reg_hdmiin_vsync_duration_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1037  DefineRegister (0x3007, "reg_hdmiin_v_active_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1038  DefineRegister (0x3008, "reg_hdmiin_v_active_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1039  DefineRegister (0x3009, "reg_hdmiin_video_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1040  DefineRegister (0x300a, "reg_hdmiin_horizontal_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1041  DefineRegister (0x300b, "reg_hdmiin_hblank_data0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1042  DefineRegister (0x300c, "reg_hdmiin_hblank_data1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1043  DefineRegister (0x300d, "reg_hdmiin_vertical_data_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1044  DefineRegister (0x300e, "reg_hdmiin_vertical_data_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1045  DefineRegister (0x300f, "reg_hdmiin_color_depth", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1046  DefineRegister (0x3012, "reg_hdmiin_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1047  DefineRegister (0x3013, "reg_hdmiin_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1048  DefineRegister (0x3014, "reg_hdmiin_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1049 
1050  DefineRegister (0x1d40, "reg_hdmiout4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1051  DefineRegister (0x1d41, "reg_hdmiout4_videosetup0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1052  DefineRegister (0x1d42, "reg_hdmiout4_videosetup1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1053  DefineRegister (0x1d43, "reg_hdmiout4_videosetup2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1054  DefineRegister (0x1d44, "reg_hdmiout4_videosetup3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1055  DefineRegister (0x1d45, "reg_hdmiout4_videosetup4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1056  DefineRegister (0x1d46, "reg_hdmiout4_videosetup5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1057  DefineRegister (0x1d47, "reg_hdmiout4_videosetup6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1058  DefineRegister (0x1d48, "reg_hdmiout4_videosetup7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1059  DefineRegister (0x1d49, "reg_hdmiout4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1060  DefineRegister (0x1d4b, "reg_hdmiout4_audiocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1061  DefineRegister (0x1d4f, "reg_hdmiout4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1062  DefineRegister (0x1d50, "reg_hdmiout4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1063  DefineRegister (0x1d51, "reg_hdmiout4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1064  DefineRegister (0x1d52, "reg_hdmiout4_txclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1065  DefineRegister (0x1d53, "reg_hdmiout4_fpllclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1066  DefineRegister (0x1d54, "reg_hdmiout4_audio_cts1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1067  DefineRegister (0x1d55, "reg_hdmiout4_audio_cts2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1068  DefineRegister (0x1d56, "reg_hdmiout4_audio_cts3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1069  DefineRegister (0x1d57, "reg_hdmiout4_audio_cts4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1070  DefineRegister (0x1d58, "reg_hdmiout4_audio_n", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1071  DefineRegister (0x1d5e, "reg_hdmiout4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1072  DefineRegister (0x1d5f, "reg_hdmiout4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1073  DefineRegister (0x1d60, "reg_hdmiout4_i2ccontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1074  DefineRegister (0x1d61, "reg_hdmiout4_i2cedid", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1075 
1076  DefineRegister (0x1d80, "reg_hdmiout4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1077  DefineRegister (0x1d81, "reg_hdmiout4_videosetup0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1078  DefineRegister (0x1d82, "reg_hdmiout4_videosetup1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1079  DefineRegister (0x1d83, "reg_hdmiout4_videosetup2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1080  DefineRegister (0x1d84, "reg_hdmiout4_videosetup3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1081  DefineRegister (0x1d85, "reg_hdmiout4_videosetup4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1082  DefineRegister (0x1d86, "reg_hdmiout4_videosetup5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1083  DefineRegister (0x1d87, "reg_hdmiout4_videosetup6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1084  DefineRegister (0x1d88, "reg_hdmiout4_videosetup7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1085  DefineRegister (0x1d89, "reg_hdmiout4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1086  DefineRegister (0x1d8b, "reg_hdmiout4_audiocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1087  DefineRegister (0x1d8f, "reg_hdmiout4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1088  DefineRegister (0x1d90, "reg_hdmiout4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1089  DefineRegister (0x1d91, "reg_hdmiout4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1090  DefineRegister (0x1d92, "reg_hdmiout4_txclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1091  DefineRegister (0x1d93, "reg_hdmiout4_fpllclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1092  DefineRegister (0x1d94, "reg_hdmiout4_audio_cts1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1093  DefineRegister (0x1d95, "reg_hdmiout4_audio_cts2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1094  DefineRegister (0x1d96, "reg_hdmiout4_audio_cts3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1095  DefineRegister (0x1d97, "reg_hdmiout4_audio_cts4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1096  DefineRegister (0x1d98, "reg_hdmiout4_audio_n", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1097  DefineRegister (0x1d9e, "reg_hdmiout4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1098  DefineRegister (0x1d9f, "reg_hdmiout4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1099  DefineRegister (0x1da0, "reg_hdmiout4_i2ccontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1100  DefineRegister (0x1da1, "reg_hdmiout4_i2cedid", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1101  }
1102 
1103  void SetupSDIErrorRegs(void)
1104  {
1106  static const string suffixes [] = {"Status", "CRCErrorCount", "FrameCountLow", "FrameCountHigh", "FrameRefCountLow", "FrameRefCountHigh"};
1107  static const int perms [] = {READWRITE, READWRITE, READWRITE, READWRITE, READONLY, READONLY};
1108 
1109  AJAAutoLock lock(&mGuardMutex);
1110  for (ULWord chan (0); chan < 8; chan++)
1111  for (UWord ndx(0); ndx < 6; ndx++)
1112  {
1113  ostringstream ossName; ossName << "kRegRXSDI" << DEC(chan+1) << suffixes[ndx];
1114  const string & regName (ossName.str());
1115  const uint32_t regNum (baseNum[chan] + ndx);
1116  const int perm (perms[ndx]);
1117  if (ndx == 0)
1118  DefineRegister (regNum, regName, mSDIErrorStatusRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1119  else if (ndx == 1)
1120  DefineRegister (regNum, regName, mSDIErrorCountRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1121  else
1122  DefineRegister (regNum, regName, mDefaultRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1123  }
1124  DefineRegister (kRegRXSDIFreeRunningClockLow, "kRegRXSDIFreeRunningClockLow", mDefaultRegDecoder, READONLY, kRegClass_SDIError, kRegClass_NULL, kRegClass_NULL);
1125  DefineRegister (kRegRXSDIFreeRunningClockHigh, "kRegRXSDIFreeRunningClockHigh", mDefaultRegDecoder, READONLY, kRegClass_SDIError, kRegClass_NULL, kRegClass_NULL);
1126  } // SetupSDIErrorRegs
1127 
1128  void SetupLUTRegs (void)
1129  {
1130  AJAAutoLock lock(&mGuardMutex);
1131  }
1132 
1133  void SetupCSCRegs(void)
1134  {
1136 
1137  AJAAutoLock lock(&mGuardMutex);
1138  for (unsigned num(0); num < 8; num++)
1139  {
1140  ostringstream ossRegName; ossRegName << "kRegEnhancedCSC" << (num+1);
1141  const string & chanClass (sChan[num]); const string rootName (ossRegName.str());
1142  const string modeName (rootName + "Mode"); const string inOff01Name (rootName + "InOffset0_1"); const string inOff2Name (rootName + "InOffset2");
1143  const string coeffA0Name (rootName + "CoeffA0"); const string coeffA1Name (rootName + "CoeffA1"); const string coeffA2Name (rootName + "CoeffA2");
1144  const string coeffB0Name (rootName + "CoeffB0"); const string coeffB1Name (rootName + "CoeffB1"); const string coeffB2Name (rootName + "CoeffB2");
1145  const string coeffC0Name (rootName + "CoeffC0"); const string coeffC1Name (rootName + "CoeffC1"); const string coeffC2Name (rootName + "CoeffC2");
1146  const string outOffABName(rootName + "OutOffsetA_B"); const string outOffCName (rootName + "OutOffsetC");
1147  const string keyModeName (rootName + "KeyMode"); const string keyClipOffName (rootName + "KeyClipOffset"); const string keyGainName (rootName + "KeyGain");
1148  DefineRegister (64*num + kRegEnhancedCSC1Mode, modeName, mEnhCSCModeDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1149  DefineRegister (64*num + kRegEnhancedCSC1InOffset0_1, inOff01Name, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1150  DefineRegister (64*num + kRegEnhancedCSC1InOffset2, inOff2Name, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1151  DefineRegister (64*num + kRegEnhancedCSC1CoeffA0, coeffA0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1152  DefineRegister (64*num + kRegEnhancedCSC1CoeffA1, coeffA1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1153  DefineRegister (64*num + kRegEnhancedCSC1CoeffA2, coeffA2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1154  DefineRegister (64*num + kRegEnhancedCSC1CoeffB0, coeffB0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1155  DefineRegister (64*num + kRegEnhancedCSC1CoeffB1, coeffB1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1156  DefineRegister (64*num + kRegEnhancedCSC1CoeffB2, coeffB2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1157  DefineRegister (64*num + kRegEnhancedCSC1CoeffC0, coeffC0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1158  DefineRegister (64*num + kRegEnhancedCSC1CoeffC1, coeffC1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1159  DefineRegister (64*num + kRegEnhancedCSC1CoeffC2, coeffC2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1160  DefineRegister (64*num + kRegEnhancedCSC1OutOffsetA_B, outOffABName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1161  DefineRegister (64*num + kRegEnhancedCSC1OutOffsetC, outOffCName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1162  DefineRegister (64*num + kRegEnhancedCSC1KeyMode, keyModeName, mEnhCSCKeyModeDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1163  DefineRegister (64*num + kRegEnhancedCSC1KeyClipOffset, keyClipOffName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1164  DefineRegister (64*num + kRegEnhancedCSC1KeyGain, keyGainName, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1165  }
1174  for (unsigned chan(0); chan < 8; chan++)
1175  {
1176  const string & chanClass (sChan[chan]);
1177  DefineRegister (sECSCRegs[chan][0], "", mCSCoeff1234Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1178  DefineRegister (sECSCRegs[chan][1], "", mCSCoeff1234Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1179  DefineRegister (sECSCRegs[chan][2], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1180  DefineRegister (sECSCRegs[chan][3], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1181  DefineRegister (sECSCRegs[chan][4], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1182  }
1183 
1184  // LUT/ColorCorrection Registers...
1185  DefineRegister (kRegCh1ColorCorrectionControl, "", mLUTV1ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1186  DefineRegister (kRegCh2ColorCorrectionControl, "", mLUTV1ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1187  DefineRegister (kRegLUTV2Control, "", mLUTV2ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1188  // LUT tables...
1189 #if 1 // V2 tables need the appropriate Enable & Bank bits set in kRegLUTV2Control, otherwise they'll always readback zero!
1190  // So it's kinda pointless to read/decode them unless we do the "bank-select" dance immediately before reading them...
1192  for (ULWord ndx(0); ndx < 512; ndx++)
1193  {
1194  ostringstream regNameR, regNameG, regNameB;
1195  regNameR << "kRegLUTRed" << DEC0N(ndx,3); regNameG << "kRegLUTGreen" << DEC0N(ndx,3); regNameB << "kRegLUTBlue" << DEC0N(ndx,3);
1196  DefineRegister (REDreg + ndx, regNameR.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1197  DefineRegister (GRNreg + ndx, regNameG.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1198  DefineRegister (BLUreg + ndx, regNameB.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1199  }
1200 #endif
1201  } // SetupCSCRegs
1202 
1203  void SetupMixerKeyerRegs(void)
1204  {
1205  AJAAutoLock lock(&mGuardMutex);
1206  // VidProc/Mixer/Keyer
1207  DefineRegister (kRegVidProc1Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1208  DefineRegister (kRegVidProc2Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1209  DefineRegister (kRegVidProc3Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1210  DefineRegister (kRegVidProc4Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1211  DefineRegister (kRegSplitControl, "", mSplitControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_NULL);
1212  DefineRegister (kRegFlatMatteValue, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1213  DefineRegister (kRegFlatMatte2Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1214  DefineRegister (kRegFlatMatte3Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1215  DefineRegister (kRegFlatMatte4Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1216  DefineRegister (kRegMixer1Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1217  DefineRegister (kRegMixer2Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1218  DefineRegister (kRegMixer3Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1219  DefineRegister (kRegMixer4Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1220  }
1221 
1222  void SetupNTV4FrameStoreRegs(void)
1223  {
1224  AJAAutoLock lock(&mGuardMutex);
1225  for (ULWord fsNdx(0); fsNdx < 4; fsNdx++)
1226  {
1227  for (ULWord regNdx(0); regNdx < ULWord(regNTV4FS_LAST); regNdx++)
1228  {
1229  ostringstream regName; regName << "kRegNTV4FS" << DEC(fsNdx+1) << "_";
1230  const ULWord registerNumber (kNTV4FrameStoreFirstRegNum + fsNdx * kNumNTV4FrameStoreRegisters + regNdx);
1231  switch (NTV4FrameStoreRegs(regNdx))
1232  {
1234  case regNTV4FS_ROIVHSize:
1240  case regNTV4FS_DisplayFID:
1248  case regNTV4FS_Status:
1256  regName << sNTV4FrameStoreRegNames[regNdx];
1257  DefineRegister(registerNumber, regName.str(), mDecodeNTV4FSReg, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1258  break;
1260  regName << "InputSourceSelect";
1261  DefineRegister(registerNumber, regName.str(), mDecodeNTV4FSReg, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1262  break;
1263  default:
1264  regName << DEC(regNdx);
1265  DefineRegister(registerNumber, regName.str(), mDefaultRegDecoder, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1266  break;
1267  }
1268  } // for each FrameStore register
1269  } // for each FrameStore widget
1270  }
1271 
1272  void SetupLPRegs(void)
1273  { // LocalProc registers (IP25G)
1274  AJAAutoLock lock(&mGuardMutex);
1275  DEF_REG (kRegLPRJ45IP, mDecodeIPv4Reg, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1276  DEF_REG (kRegLPTunnelIP, mDecodeIPv4Reg, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1277  DEF_REG (kRegLPSFP1IP, mDecodeIPv4Reg, READWRITE, kRegClass_IP, kRegClass_Channel1, kRegClass_NULL);
1278  DEF_REG (kRegLPSFP2IP, mDecodeIPv4Reg, READWRITE, kRegClass_IP, kRegClass_Channel2, kRegClass_NULL);
1279  DEF_REG (kRegLPIPVidStatus, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1280  DEF_REG (kRegLPIPAudStatus, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1281  DEF_REG (kRegLPIPAncStatus, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1282  DEF_REG (kRegLPIPOut1Config, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Channel1, kRegClass_NULL);
1283  DEF_REG (kRegLPIPOut2Config, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Channel2, kRegClass_NULL);
1284  DEF_REG (kRegLPIPOut3Config, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Channel3, kRegClass_NULL);
1285  DEF_REG (kRegLPIPOut4Config, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Channel4, kRegClass_NULL);
1286  DEF_REG (kRegLPPTPSFPStatus, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1287  DEF_REG (kRegLPHeartBeat, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1288  DEF_REG (kRegLPFrameTask, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1289  }
1290 
1291  void SetupVRegs(void)
1292  {
1293  AJAAutoLock lock(&mGuardMutex);
1294  DEF_REG (kVRegDriverVersion, mDriverVersionDecoder, READWRITE, kRegClass_Virtual, kRegClass_NULL, kRegClass_NULL);
1302  DEF_REG (kVRegDriverType, mDecodeDriverType, READWRITE, kRegClass_Virtual, kRegClass_NULL, kRegClass_NULL);
1550  DEF_REG (kVRegAncField1Offset, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1551  DEF_REG (kVRegAncField2Offset, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1554  DEF_REG (kVRegCustomAncInputSelect, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1566 #if 0 // IoIP/KonaIP10g purge
1567  DEF_REG (kVRegIPAddrEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1568  DEF_REG (kVRegSubnetEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1569  DEF_REG (kVRegGatewayEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1570  DEF_REG (kVRegIPAddrEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1571  DEF_REG (kVRegSubnetEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1572  DEF_REG (kVRegGatewayEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1573  DEF_REG (kVRegRxcEnable1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1574  DEF_REG (kVRegRxcSfp1RxMatch1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1575  DEF_REG (kVRegRxcSfp1SourceIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1576  DEF_REG (kVRegRxcSfp1DestIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1577  DEF_REG (kVRegRxcSfp1SourcePort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1578  DEF_REG (kVRegRxcSfp1DestPort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1579  DEF_REG (kVRegRxcSfp1Vlan1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1580  DEF_REG (kVRegRxcSfp2RxMatch1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1581  DEF_REG (kVRegRxcSfp2SourceIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1582  DEF_REG (kVRegRxcSfp2DestIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1583  DEF_REG (kVRegRxcSfp2SourcePort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1584  DEF_REG (kVRegRxcSfp2DestPort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1585  DEF_REG (kVRegRxcSfp2Vlan1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1586  DEF_REG (kVRegRxcSsrc1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1587  DEF_REG (kVRegRxcPlayoutDelay1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1588  DEF_REG (kVRegRxcEnable2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1589  DEF_REG (kVRegRxcSfp1RxMatch2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1590  DEF_REG (kVRegRxcSfp1SourceIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1591  DEF_REG (kVRegRxcSfp1DestIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1592  DEF_REG (kVRegRxcSfp1SourcePort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1593  DEF_REG (kVRegRxcSfp1DestPort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1594  DEF_REG (kVRegRxcSfp1Vlan2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1595  DEF_REG (kVRegRxcSfp2RxMatch2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1596  DEF_REG (kVRegRxcSfp2SourceIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1597  DEF_REG (kVRegRxcSfp2DestIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1598  DEF_REG (kVRegRxcSfp2SourcePort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1599  DEF_REG (kVRegRxcSfp2DestPort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1600  DEF_REG (kVRegRxcSfp2Vlan2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1601  DEF_REG (kVRegRxcSsrc2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1602  DEF_REG (kVRegRxcPlayoutDelay2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1603  DEF_REG (kVRegTxcEnable3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1604  DEF_REG (kVRegTxcSfp1LocalPort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1605  DEF_REG (kVRegTxcSfp1RemoteIp3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1606  DEF_REG (kVRegTxcSfp1RemotePort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1607  DEF_REG (kVRegTxcSfp2LocalPort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1608  DEF_REG (kVRegTxcSfp2RemoteIp3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1609  DEF_REG (kVRegTxcSfp2RemotePort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1610  DEF_REG (kVRegTxcEnable4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1611  DEF_REG (kVRegTxcSfp1LocalPort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1612  DEF_REG (kVRegTxcSfp1RemoteIp4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1613  DEF_REG (kVRegTxcSfp1RemotePort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1614  DEF_REG (kVRegTxcSfp2LocalPort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1615  DEF_REG (kVRegTxcSfp2RemoteIp4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1616  DEF_REG (kVRegTxcSfp2RemotePort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1617 #endif // IoIP/KonaIP10g purge
1618  DEF_REG (kVRegMailBoxAcquire, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1619  DEF_REG (kVRegMailBoxRelease, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1620  DEF_REG (kVRegMailBoxAbort, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1621  DEF_REG (kVRegMailBoxTimeoutNS, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1622 #if 0 // IoIP/KonaIP10g purge
1623  DEF_REG (kVRegRxc_2DecodeSelectionMode1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1624  DEF_REG (kVRegRxc_2DecodeProgramNumber1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1625  DEF_REG (kVRegRxc_2DecodeProgramPID1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1626  DEF_REG (kVRegRxc_2DecodeAudioNumber1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1627  DEF_REG (kVRegRxc_2DecodeSelectionMode2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1628  DEF_REG (kVRegRxc_2DecodeProgramNumber2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1629  DEF_REG (kVRegRxc_2DecodeProgramPID2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1630  DEF_REG (kVRegRxc_2DecodeAudioNumber2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1631  DEF_REG (kVRegTxc_2EncodeVideoFormat1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1632  DEF_REG (kVRegTxc_2EncodeUllMode1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1633  DEF_REG (kVRegTxc_2EncodeBitDepth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1634  DEF_REG (kVRegTxc_2EncodeChromaSubSamp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1635  DEF_REG (kVRegTxc_2EncodeMbps1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1636  DEF_REG (kVRegTxc_2EncodeAudioChannels1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1637  DEF_REG (kVRegTxc_2EncodeStreamType1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1638  DEF_REG (kVRegTxc_2EncodeProgramPid1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1639  DEF_REG (kVRegTxc_2EncodeVideoPid1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1640  DEF_REG (kVRegTxc_2EncodePcrPid1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1641  DEF_REG (kVRegTxc_2EncodeAudio1Pid1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1642  DEF_REG (kVRegTxc_2EncodeVideoFormat2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1643  DEF_REG (kVRegTxc_2EncodeUllMode2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1644  DEF_REG (kVRegTxc_2EncodeBitDepth2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1645  DEF_REG (kVRegTxc_2EncodeChromaSubSamp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1646  DEF_REG (kVRegTxc_2EncodeMbps2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1647  DEF_REG (kVRegTxc_2EncodeAudioChannels2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1648  DEF_REG (kVRegTxc_2EncodeStreamType2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1649  DEF_REG (kVRegTxc_2EncodeProgramPid2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1650  DEF_REG (kVRegTxc_2EncodeVideoPid2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1651  DEF_REG (kVRegTxc_2EncodePcrPid2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1652  DEF_REG (kVRegTxc_2EncodeAudio1Pid2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1653  DEF_REG (kVReg2022_7Enable, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1654  DEF_REG (kVReg2022_7NetworkPathDiff, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1655  DEF_REGNAME (kVRegKIPRxCfgError);
1656  DEF_REGNAME (kVRegKIPTxCfgError);
1657  DEF_REGNAME (kVRegKIPEncCfgError);
1658  DEF_REGNAME (kVRegKIPDecCfgError);
1659  DEF_REGNAME (kVRegKIPNetCfgError);
1660 #endif // IoIP/KonaIP10g purge
1661  DEF_REG (kVRegUseHDMI420Mode, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_NULL, kRegClass_NULL);
1689 
1693 
1697 
1701 
1705 
1709 
1713 
1717 
1721 
1722  DEF_REG (kVRegUserColorimetry, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1723  DEF_REG (kVRegUserTransfer, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1724  DEF_REG (kVRegUserLuminance, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1725 
1726  DEF_REG (kVRegHdrColorimetryCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1727  DEF_REG (kVRegHdrTransferCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1728  DEF_REG (kVRegHdrLuminanceCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1729  DEF_REG (kVRegHdrGreenXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1730  DEF_REG (kVRegHdrGreenYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1731  DEF_REG (kVRegHdrBlueXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1732  DEF_REG (kVRegHdrBlueYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1733  DEF_REG (kVRegHdrRedXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1734  DEF_REG (kVRegHdrRedYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1735  DEF_REG (kVRegHdrWhiteXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1736  DEF_REG (kVRegHdrWhiteYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1737  DEF_REG (kVRegHdrMasterLumMaxCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1738  DEF_REG (kVRegHdrMasterLumMinCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1739  DEF_REG (kVRegHdrMaxCLLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1740  DEF_REG (kVRegHdrMaxFALLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1741  DEF_REG (kVRegHDROverrideState, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1743  DEF_REG (kVRegUserInColorimetry, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1744  DEF_REG (kVRegUserInTransfer, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1745  DEF_REG (kVRegUserInLuminance, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1747  DEF_REG (kVRegHdrInTransferCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1748  DEF_REG (kVRegHdrInLuminanceCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1749  DEF_REG (kVRegHdrInGreenXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1750  DEF_REG (kVRegHdrInGreenYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1751  DEF_REG (kVRegHdrInBlueXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1752  DEF_REG (kVRegHdrInBlueYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1753  DEF_REG (kVRegHdrInRedXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1754  DEF_REG (kVRegHdrInRedYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1755  DEF_REG (kVRegHdrInWhiteXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1756  DEF_REG (kVRegHdrInWhiteYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1759  DEF_REG (kVRegHdrInMaxCLLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1760  DEF_REG (kVRegHdrInMaxFALLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1761  DEF_REG (kVRegHDRInOverrideState, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1762  DEF_REG (kVRegNTV2VPIDRGBRange1, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1763  DEF_REG (kVRegNTV2VPIDRGBRange2, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1764  DEF_REG (kVRegNTV2VPIDRGBRange3, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1765  DEF_REG (kVRegNTV2VPIDRGBRange4, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1766  DEF_REG (kVRegNTV2VPIDRGBRange5, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1767  DEF_REG (kVRegNTV2VPIDRGBRange6, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1768  DEF_REG (kVRegNTV2VPIDRGBRange7, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1769  DEF_REG (kVRegNTV2VPIDRGBRange8, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1770 
1773  DEF_REG (kVRegAudioHeadphoneGain, mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
1778 
1779  DEF_REG (kVRegDmaTransferRateC2H1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1780  DEF_REG (kVRegDmaHardwareRateC2H1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1781  DEF_REG (kVRegDmaTransferRateH2C1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1782  DEF_REG (kVRegDmaHardwareRateH2C1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1783  DEF_REG (kVRegDmaTransferRateC2H2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1784  DEF_REG (kVRegDmaHardwareRateC2H2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1785  DEF_REG (kVRegDmaTransferRateH2C2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1786  DEF_REG (kVRegDmaHardwareRateH2C2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1787  DEF_REG (kVRegDmaTransferRateC2H3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1788  DEF_REG (kVRegDmaHardwareRateC2H3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1789  DEF_REG (kVRegDmaTransferRateH2C3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1790  DEF_REG (kVRegDmaHardwareRateH2C3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1791  DEF_REG (kVRegDmaTransferRateC2H4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1792  DEF_REG (kVRegDmaHardwareRateC2H4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1793  DEF_REG (kVRegDmaTransferRateH2C4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1794  DEF_REG (kVRegDmaHardwareRateH2C4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1795 
1796  DEF_REG (kVRegHDMIInAviInfo1, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1797  DEF_REG (kVRegHDMIInDrmInfo1, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1804 
1805  DEF_REG (kVRegHDMIInAviInfo2, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1806  DEF_REG (kVRegHDMIInDrmInfo2, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_HDR);
1813 
1815 
1816  DEF_REG (kVRegHDMIOutStatus1, mDecodeHDMIOutputStatus,READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_NULL);
1819  DEF_REG (kVRegPCILinkSpeed, mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1820  DEF_REG (kVRegPCILinkWidth, mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1821 
1865 
1898 
1899  DEF_REG(kVRegNTV2KeySignal1, mDefaultRegDecoder, READWRITE, kRegClass_Channel1, kRegClass_NULL, kRegClass_NULL);
1900  DEF_REG(kVRegNTV2KeySignal2, mDefaultRegDecoder, READWRITE, kRegClass_Channel2, kRegClass_NULL, kRegClass_NULL);
1901  DEF_REG(kVRegNTV2KeySignal3, mDefaultRegDecoder, READWRITE, kRegClass_Channel3, kRegClass_NULL, kRegClass_NULL);
1902  DEF_REG(kVRegNTV2KeySignal4, mDefaultRegDecoder, READWRITE, kRegClass_Channel4, kRegClass_NULL, kRegClass_NULL);
1903  DEF_REG(kVRegNTV2KeySignal5, mDefaultRegDecoder, READWRITE, kRegClass_Channel5, kRegClass_NULL, kRegClass_NULL);
1904  DEF_REG(kVRegNTV2KeySignal6, mDefaultRegDecoder, READWRITE, kRegClass_Channel6, kRegClass_NULL, kRegClass_NULL);
1905  DEF_REG(kVRegNTV2KeySignal7, mDefaultRegDecoder, READWRITE, kRegClass_Channel7, kRegClass_NULL, kRegClass_NULL);
1906  DEF_REG(kVRegNTV2KeySignal8, mDefaultRegDecoder, READWRITE, kRegClass_Channel8, kRegClass_NULL, kRegClass_NULL);
1915 
1918 
1919  for (ULWord ndx(1); ndx < 1024; ndx++) // <== Start at 1, kVRegDriverVersion already done
1920  {
1921  ostringstream oss; oss << "VIRTUALREG_START+" << ndx;
1922  const string regName (oss.str());
1923  const ULWord regNum (VIRTUALREG_START + ndx);
1924  if (mRegNumToStringMap.find(regNum) == mRegNumToStringMap.end())
1925  {
1926  mRegNumToStringMap.insert (RegNumToStringPair(regNum, regName));
1927  mStringToRegNumMMap.insert (StringToRegNumPair(ToLower(regName), regNum));
1928  }
1929  DefineRegDecoder (regNum, mDefaultRegDecoder);
1930  DefineRegReadWrite (regNum, READWRITE);
1931  DefineRegClass (regNum, kRegClass_Virtual);
1932  }
1933  DefineRegClass (kVRegAudioOutputToneSelect, kRegClass_Audio);
1934  DefineRegClass (kVRegMonAncField1Offset, kRegClass_Anc);
1935  DefineRegClass (kVRegMonAncField2Offset, kRegClass_Anc);
1936  DefineRegClass (kVRegAncField1Offset, kRegClass_Anc);
1937  DefineRegClass (kVRegAncField2Offset, kRegClass_Anc);
1938  } // SetupVRegs
1939 
1940 public:
1941  static ostream & PrintLabelValuePairs (ostream & oss, const AJALabelValuePairs & inLabelValuePairs)
1942  {
1943  for (AJALabelValuePairsConstIter it(inLabelValuePairs.begin()); it != inLabelValuePairs.end(); )
1944  {
1945  const string & label (it->first);
1946  const string & value (it->second);
1947  if (label.empty())
1948  ;
1949  else if (label.at(label.length()-1) != ' ' && label.at(label.length()-1) != ':') // C++11 "label.back()" would be better
1950  oss << label << ": " << value;
1951  else if (label.at(label.length()-1) == ':') // C++11 "label.back()" would be better
1952  oss << label << " " << value;
1953  else
1954  oss << label << value;
1955  if (++it != inLabelValuePairs.end())
1956  oss << endl;
1957  }
1958  return oss;
1959  }
1960 
1961  string RegNameToString (const uint32_t inRegNum) const
1962  {
1963  AJAAutoLock lock(&mGuardMutex);
1964  RegNumToStringMap::const_iterator iter (mRegNumToStringMap.find (inRegNum));
1965  if (iter != mRegNumToStringMap.end())
1966  return iter->second;
1967 
1968  ostringstream oss; oss << "Reg ";
1969  if (inRegNum <= kRegNumRegisters)
1970  oss << DEC(inRegNum);
1971  else if (inRegNum <= 0x0000FFFF)
1972  oss << xHEX0N(inRegNum,4);
1973  else
1974  oss << xHEX0N(inRegNum,8);
1975  return oss.str();
1976  }
1977 
1978  string RegValueToString (const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
1979  {
1980  AJAAutoLock lock(&mGuardMutex);
1981  RegNumToDecoderMap::const_iterator iter(mRegNumToDecoderMap.find(inRegNum));
1982  ostringstream oss;
1983  if (iter != mRegNumToDecoderMap.end() && iter->second)
1984  {
1985  const Decoder * pDecoder (iter->second);
1986  oss << (*pDecoder)(inRegNum, inRegValue, inDeviceID);
1987  }
1988  return oss.str();
1989  }
1990 
1991  bool IsRegInClass (const uint32_t inRegNum, const string & inClassName) const
1992  {
1993  AJAAutoLock lock(&mGuardMutex);
1994  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.find(inClassName)); it != mRegClassToRegNumMMap.end() && it->first == inClassName; ++it)
1995  if (it->second == inRegNum)
1996  return true;
1997  return false;
1998  }
1999 
2000  inline bool IsRegisterWriteOnly (const uint32_t inRegNum) const {return IsRegInClass (inRegNum, kRegClass_WriteOnly);}
2001  inline bool IsRegisterReadOnly (const uint32_t inRegNum) const {return IsRegInClass (inRegNum, kRegClass_ReadOnly);}
2002 
2004  {
2005  AJAAutoLock lock(&mGuardMutex);
2006  if (mAllRegClasses.empty())
2007  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.begin()); it != mRegClassToRegNumMMap.end(); ++it)
2008  if (mAllRegClasses.find(it->first) == mAllRegClasses.end())
2009  mAllRegClasses.insert(it->first);
2010  return mAllRegClasses;
2011  }
2012 
2013  NTV2StringSet GetRegisterClasses (const uint32_t inRegNum, const bool inRemovePrefix) const
2014  {
2015  AJAAutoLock lock(&mGuardMutex);
2016  NTV2StringSet result;
2017  NTV2StringSet allClasses (GetAllRegisterClasses());
2018  for (NTV2StringSetConstIter it(allClasses.begin()); it != allClasses.end(); ++it)
2019  if (IsRegInClass (inRegNum, *it))
2020  {
2021  string str(*it);
2022  if (inRemovePrefix)
2023  str.erase(0, 10); // Remove "kRegClass_" prefix
2024  if (result.find(str) == result.end())
2025  result.insert(str);
2026  }
2027  return result;
2028  }
2029 
2030  NTV2RegNumSet GetRegistersForClass (const string & inClassName) const
2031  {
2032  AJAAutoLock lock(&mGuardMutex);
2033  NTV2RegNumSet result;
2034  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.find(inClassName)); it != mRegClassToRegNumMMap.end() && it->first == inClassName; ++it)
2035  if (result.find(it->second) == result.end())
2036  result.insert(it->second);
2037  return result;
2038  }
2039 
2040  NTV2RegNumSet GetRegistersForDevice (const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude) const
2041  {
2042  NTV2RegNumSet result;
2043  const uint32_t maxRegNum (::NTV2DeviceGetMaxRegisterNumber(inDeviceID));
2044 
2045  for (uint32_t regNum (0); regNum <= maxRegNum; regNum++)
2046  result.insert(regNum);
2047 
2048  AJAAutoLock lock(&mGuardMutex);
2049 
2050  if (::NTV2DeviceCanDoCustomAnc(inDeviceID))
2051  {
2052  const NTV2RegNumSet ancRegs (GetRegistersForClass(kRegClass_Anc));
2053  const UWord numVideoInputs (::NTV2DeviceGetNumVideoInputs(inDeviceID));
2054  const UWord numVideoOutputs (::NTV2DeviceGetNumVideoOutputs(inDeviceID));
2055  const UWord numSpigots(numVideoInputs > numVideoOutputs ? numVideoInputs : numVideoOutputs);
2056  NTV2RegNumSet allChanRegs; // For just those channels it supports
2057  for (UWord num(0); num < numSpigots; num++)
2058  {
2059  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
2060  allChanRegs.insert(chRegs.begin(), chRegs.end());
2061  }
2062  std::set_intersection (ancRegs.begin(), ancRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
2063  }
2064 
2065  if (::NTV2DeviceCanDoCustomAux(inDeviceID))
2066  {
2067  const NTV2RegNumSet auxRegs (GetRegistersForClass(kRegClass_Aux));
2068  const UWord numVideoInputs (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID));
2069  const UWord numVideoOutputs (::NTV2DeviceGetNumHDMIVideoOutputs(inDeviceID));
2070  const UWord numSpigots(numVideoInputs > numVideoOutputs ? numVideoInputs : numVideoOutputs);
2071  NTV2RegNumSet allChanRegs; // For just those channels it supports
2072  for (UWord num(0); num < numSpigots; num++)
2073  {
2074  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
2075  allChanRegs.insert(chRegs.begin(), chRegs.end());
2076  }
2077  std::set_intersection (auxRegs.begin(), auxRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
2078  }
2079 
2080  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
2081  {
2082  const NTV2RegNumSet sdiErrRegs (GetRegistersForClass(kRegClass_SDIError));
2083  result.insert(sdiErrRegs.begin(), sdiErrRegs.end());
2084  }
2085 
2086  if (::NTV2DeviceCanDoAudioMixer(inDeviceID))
2087  {
2088  for (ULWord regNum(kRegAudioMixerInputSelects); regNum <= kRegAudioMixerAux2GainCh2; regNum++)
2089  result.insert(regNum);
2091  result.insert(regNum);
2092  }
2093 
2094  if (::NTV2DeviceHasXilinxDMA(inDeviceID))
2095  {
2096  }
2097 
2098  if (::NTV2DeviceCanDoEnhancedCSC(inDeviceID))
2099  {
2100  const NTV2RegNumSet ecscRegs (GetRegistersForClass(kRegClass_CSC));
2101  const UWord numCSCs (::NTV2DeviceGetNumCSCs(inDeviceID));
2102  NTV2RegNumSet allChanRegs; // For just those CSCs it supports
2103  for (UWord num(0); num < numCSCs; num++)
2104  {
2105  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
2106  allChanRegs.insert(chRegs.begin(), chRegs.end());
2107  }
2108  std::set_intersection (ecscRegs.begin(), ecscRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
2109  }
2110 
2111  if (::NTV2DeviceGetNumLUTs(inDeviceID))
2112  {
2113  const NTV2RegNumSet LUTRegs (GetRegistersForClass(kRegClass_LUT));
2114  result.insert(LUTRegs.begin(), LUTRegs.end());
2115  }
2116 
2117  if (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID) > 1) // KonaHDMI
2118  {
2119  for (ULWord regNum = 0x1d00; regNum <= 0x1d1f; regNum++)
2120  result.insert(regNum);
2121  for (ULWord regNum = 0x2500; regNum <= 0x251f; regNum++)
2122  result.insert(regNum);
2123  for (ULWord regNum = 0x2c00; regNum <= 0x2c1f; regNum++)
2124  result.insert(regNum);
2125  for (ULWord regNum = 0x3000; regNum <= 0x301f; regNum++)
2126  result.insert(regNum);
2127  }
2128  else if (::NTV2DeviceGetHDMIVersion(inDeviceID) > 3) // Io4KPlus, IoIP2022, IoIP2110, Kona5, KonaHDMI
2129  { // v4 HDMI: Io4K+, IoIP2022, IoIP2110, Kona5, KonaHDMI...
2130  for (ULWord regNum = 0x1d00; regNum <= 0x1d1f; regNum++)
2131  result.insert(regNum);
2132  for (ULWord regNum = 0x1d40; regNum <= 0x1d5f; regNum++)
2133  result.insert(regNum);
2134  for (ULWord regNum = 0x3C00; regNum <= 0x3C0A; regNum++)
2135  result.insert(regNum);
2136  }
2137 
2138  if (inDeviceID == DEVICE_ID_IOX3 || inDeviceID == DEVICE_ID_KONA5_8K_MV_TX)
2139  { // IoX3 and some Kona5 support MultiViewer/MultiRaster
2140  result.insert(ULWord(kRegMRQ1Control));
2141  result.insert(ULWord(kRegMRQ2Control));
2142  result.insert(ULWord(kRegMRQ3Control));
2143  result.insert(ULWord(kRegMRQ4Control));
2144  result.insert(ULWord(kRegMROutControl));
2145  result.insert(ULWord(kRegMRSupport));
2146  }
2147 
2148  if (::NTV2DeviceHasNTV4FrameStores(inDeviceID))
2149  {
2150  const NTV2RegNumSet ntv4FSRegs (GetRegistersForClass(kRegClass_NTV4FrameStore));
2151  const UWord numFrameStores (::NTV2DeviceGetNumFrameStores(inDeviceID));
2152  NTV2RegNumSet chanRegs; // Just the supported NTV4 FrameStores
2153  for (UWord num(0); num < numFrameStores; num++)
2154  {
2155  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
2156  chanRegs.insert(chRegs.begin(), chRegs.end());
2157  }
2158  std::set_intersection (ntv4FSRegs.begin(), ntv4FSRegs.end(), chanRegs.begin(), chanRegs.end(), std::inserter(result, result.begin()));
2159  }
2160 
2161  if (::NTV2DeviceCanDoIDSwitch(inDeviceID))
2162  {
2163  result.insert(ULWord(kRegIDSwitch));
2164  }
2165 
2166  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
2167  {
2168  result.insert(ULWord(kRegPWMFanControl));
2169  result.insert(ULWord(kRegPWMFanStatus));
2170  }
2171 
2172  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
2173  {
2174  result.insert(ULWord(kRegBOBStatus));
2175  result.insert(ULWord(kRegBOBGPIInData));
2176  result.insert(ULWord(kRegBOBGPIInterruptControl));
2177  result.insert(ULWord(kRegBOBGPIOutData));
2178  result.insert(ULWord(kRegBOBAudioControl));
2179  }
2180 
2181  if (::NTV2DeviceHasBracketLED(inDeviceID))
2182  {
2183  result.insert(ULWord(kRegLEDReserved0));
2184  result.insert(ULWord(kRegLEDClockDivide));
2185  result.insert(ULWord(kRegLEDReserved2));
2186  result.insert(ULWord(kRegLEDReserved3));
2187  result.insert(ULWord(kRegLEDSDI1Control));
2188  result.insert(ULWord(kRegLEDSDI2Control));
2189  result.insert(ULWord(kRegLEDHDMIInControl));
2190  result.insert(ULWord(kRegLEDHDMIOutControl));
2191  }
2192 
2193  if (::NTV2DeviceCanDoClockMonitor(inDeviceID))
2194  {
2195  result.insert(ULWord(kRegCMWControl));
2196  result.insert(ULWord(kRegCMW1485Out));
2197  result.insert(ULWord(kRegCMW14835Out));
2198  result.insert(ULWord(kRegCMW27Out));
2199  result.insert(ULWord(kRegCMW12288Out));
2200  result.insert(ULWord(kRegCMWHDMIOut));
2201  }
2202 
2203  if (::NTV2DeviceHasLPProductCode(inDeviceID))
2204  {
2205  result.insert(ULWord(kRegLPRJ45IP));
2206  result.insert(ULWord(kRegLPTunnelIP));
2207  result.insert(ULWord(kRegLPSFP1IP));
2208  result.insert(ULWord(kRegLPSFP2IP));
2209  result.insert(ULWord(kRegLPIPVidStatus));
2210  result.insert(ULWord(kRegLPIPAudStatus));
2211  result.insert(ULWord(kRegLPIPAncStatus));
2212  result.insert(ULWord(kRegLPIPOut1Config));
2213  result.insert(ULWord(kRegLPIPOut2Config));
2214  result.insert(ULWord(kRegLPIPOut3Config));
2215  result.insert(ULWord(kRegLPIPOut4Config));
2216  result.insert(ULWord(kRegLPPTPSFPStatus));
2217  result.insert(ULWord(kRegLPHeartBeat));
2218  result.insert(ULWord(kRegLPFrameTask));
2219  }
2220 
2221  if (inOtherRegsToInclude & kIncludeOtherRegs_VRegs)
2222  {
2223  const NTV2RegNumSet vRegs (GetRegistersForClass(kRegClass_Virtual));
2224  result.insert(vRegs.begin(), vRegs.end());
2225  }
2226 
2227  if (inOtherRegsToInclude & kIncludeOtherRegs_XptROM)
2228  {
2229  const NTV2RegNumSet xptMapRegs (GetRegistersForClass(kRegClass_XptROM));
2230  result.insert(xptMapRegs.begin(), xptMapRegs.end());
2231  }
2232  return result;
2233  }
2234 
2235 
2236  NTV2RegNumSet GetRegistersWithName (const string & inName, const int inMatchStyle = EXACTMATCH) const
2237  {
2238  NTV2RegNumSet result;
2239  string nameStr(inName);
2240  const size_t nameStrLen(aja::lower(nameStr).length());
2241  StringToRegNumConstIter it;
2242  AJAAutoLock lock(&mGuardMutex);
2243  if (inMatchStyle == EXACTMATCH)
2244  {
2245  it = mStringToRegNumMMap.find(nameStr);
2246  if (it != mStringToRegNumMMap.end())
2247  result.insert(it->second);
2248  return result;
2249  }
2250  // Inexact match...
2251  for (it = mStringToRegNumMMap.begin(); it != mStringToRegNumMMap.end(); ++it)
2252  {
2253  const size_t pos(it->first.find(nameStr));
2254  if (pos == string::npos)
2255  continue;
2256  switch (inMatchStyle)
2257  {
2258  case CONTAINS: result.insert(it->second); break;
2259  case STARTSWITH: if (pos == 0)
2260  {result.insert(it->second);}
2261  break;
2262  case ENDSWITH: if (pos+nameStrLen == it->first.length())
2263  {result.insert(it->second);}
2264  break;
2265  default: break;
2266  }
2267  }
2268  return result;
2269  }
2270 
2271  bool GetXptRegNumAndMaskIndex (const NTV2InputCrosspointID inInputXpt, uint32_t & outXptRegNum, uint32_t & outMaskIndex) const
2272  {
2273  AJAAutoLock lock(&mGuardMutex);
2274  outXptRegNum = 0xFFFFFFFF;
2275  outMaskIndex = 0xFFFFFFFF;
2276  InputXpt2XptRegNumMaskIndexMapConstIter iter (mInputXpt2XptRegNumMaskIndexMap.find (inInputXpt));
2277  if (iter == mInputXpt2XptRegNumMaskIndexMap.end())
2278  return false;
2279  outXptRegNum = iter->second.first;
2280  outMaskIndex = iter->second.second;
2281  return true;
2282  }
2283 
2284  NTV2InputCrosspointID GetInputCrosspointID (const uint32_t inXptRegNum, const uint32_t inMaskIndex) const
2285  {
2286  AJAAutoLock lock(&mGuardMutex);
2287  const XptRegNumAndMaskIndex key (inXptRegNum, inMaskIndex);
2288  XptRegNumMaskIndex2InputXptMapConstIter iter (mXptRegNumMaskIndex2InputXptMap.find (key));
2289  if (iter != mXptRegNumMaskIndex2InputXptMap.end())
2290  return iter->second;
2292  }
2293 
2294  ostream & Print (ostream & inOutStream) const
2295  {
2296  AJAAutoLock lock(&mGuardMutex);
2297  static const string sLineBreak (96, '=');
2298  static const uint32_t sMasks[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
2299 
2300  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegNumToStringMap: " << mRegNumToStringMap.size() << " mappings:" << endl << sLineBreak << endl;
2301  for (RegNumToStringMap::const_iterator it (mRegNumToStringMap.begin()); it != mRegNumToStringMap.end(); ++it)
2302  inOutStream << "reg " << setw(5) << it->first << "(" << HEX0N(it->first,8) << dec << ") => '" << it->second << "'" << endl;
2303 
2304  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegNumToDecoderMap: " << mRegNumToDecoderMap.size() << " mappings:" << endl << sLineBreak << endl;
2305  for (RegNumToDecoderMap::const_iterator it (mRegNumToDecoderMap.begin()); it != mRegNumToDecoderMap.end(); ++it)
2306  inOutStream << "reg " << setw(5) << it->first << "(" << HEX0N(it->first,8) << dec << ") => " << (it->second == &mDefaultRegDecoder ? "(default decoder)" : "Custom Decoder") << endl;
2307 
2308  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegClassToRegNumMMap: " << mRegClassToRegNumMMap.size() << " mappings:" << endl << sLineBreak << endl;
2309  for (RegClassToRegNumMMap::const_iterator it (mRegClassToRegNumMMap.begin()); it != mRegClassToRegNumMMap.end(); ++it)
2310  inOutStream << setw(32) << it->first << " => reg " << setw(5) << it->second << "(" << HEX0N(it->second,8) << dec << ") " << RegNameToString(it->second) << endl;
2311 
2312  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of StringToRegNumMMap: " << mStringToRegNumMMap.size() << " mappings:" << endl << sLineBreak << endl;
2313  for (StringToRegNumMMap::const_iterator it (mStringToRegNumMMap.begin()); it != mStringToRegNumMMap.end(); ++it)
2314  inOutStream << setw(32) << it->first << " => reg " << setw(5) << it->second << "(" << HEX0N(it->second,8) << dec << ") " << RegNameToString(it->second) << endl;
2315 
2316  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of InputXpt2XptRegNumMaskIndexMap: " << mInputXpt2XptRegNumMaskIndexMap.size() << " mappings:" << endl << sLineBreak << endl;
2317  for (InputXpt2XptRegNumMaskIndexMap::const_iterator it (mInputXpt2XptRegNumMaskIndexMap.begin()); it != mInputXpt2XptRegNumMaskIndexMap.end(); ++it)
2318  inOutStream << setw(32) << ::NTV2InputCrosspointIDToString(it->first) << "(" << HEX0N(it->first,2)
2319  << ") => reg " << setw(3) << it->second.first << "(" << HEX0N(it->second.first,3) << dec << "|" << setw(20) << RegNameToString(it->second.first)
2320  << ") mask " << it->second.second << "(" << HEX0N(sMasks[it->second.second],8) << ")" << endl;
2321 
2322  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of XptRegNumMaskIndex2InputXptMap: " << mXptRegNumMaskIndex2InputXptMap.size() << " mappings:" << endl << sLineBreak << endl;
2323  for (XptRegNumMaskIndex2InputXptMap::const_iterator it (mXptRegNumMaskIndex2InputXptMap.begin()); it != mXptRegNumMaskIndex2InputXptMap.end(); ++it)
2324  inOutStream << "reg " << setw(3) << it->first.first << "(" << HEX0N(it->first.first,4) << "|" << setw(20) << RegNameToString(it->first.first)
2325  << ") mask " << it->first.second << "(" << HEX0N(sMasks[it->first.second],8) << ") => "
2326  << setw(27) << ::NTV2InputCrosspointIDToString(it->second) << "(" << HEX0N(it->second,2) << ")" << endl;
2327  return inOutStream;
2328  }
2329 
2330 private:
2331  typedef std::map<uint32_t, string> RegNumToStringMap;
2332  typedef std::pair<uint32_t, string> RegNumToStringPair;
2333 
2334  static string ToLower (const string & inStr)
2335  {
2336  string result (inStr);
2337  std::transform (result.begin (), result.end (), result.begin (), ::tolower);
2338  return result;
2339  }
2340 
2341  struct DecodeGlobalControlReg : public Decoder
2342  {
2343  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2344  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2345  const NTV2FrameGeometry frameGeometry (NTV2FrameGeometry (((inRegValue & kRegMaskGeometry ) >> 3)));
2346  const NTV2Standard videoStandard (NTV2Standard ((inRegValue & kRegMaskStandard ) >> 7));
2347  const NTV2ReferenceSource referenceSource (NTV2ReferenceSource ((inRegValue & kRegMaskRefSource ) >> 10));
2348  const NTV2RegisterWriteMode registerWriteMode (NTV2RegisterWriteMode ((inRegValue & kRegMaskRegClocking ) >> 20));
2349  const NTV2FrameRate frameRate (NTV2FrameRate (((inRegValue & kRegMaskFrameRate ) >> kRegShiftFrameRate)
2350  | ((inRegValue & kRegMaskFrameRateHiBit) >> (kRegShiftFrameRateHiBit - 3))));
2351  ostringstream oss;
2352  oss << "Frame Rate: " << ::NTV2FrameRateToString (frameRate, true) << endl
2353  << "Frame Geometry: " << ::NTV2FrameGeometryToString (frameGeometry, true) << endl
2354  << "Standard: " << ::NTV2StandardToString (videoStandard, true) << endl
2355  << "Reference Source: " << ::NTV2ReferenceSourceToString (referenceSource, true) << endl
2356  << "Ch 2 link B 1080p 50/60: " << ((inRegValue & kRegMaskSmpte372Enable) ? "On" : "Off") << endl
2357  << "LEDs ";
2358  for (int led(0); led < 4; ++led)
2359  oss << (((inRegValue & kRegMaskLED) >> (16 + led)) ? "*" : ".");
2360  oss << endl
2361  << "Register Clocking: " << ::NTV2RegisterWriteModeToString (registerWriteMode, true).c_str() << endl
2362  << "Ch 1 RP-188 output: " << EnabDisab(inRegValue & kRegMaskRP188ModeCh1) << endl
2363  << "Ch 2 RP-188 output: " << EnabDisab(inRegValue & kRegMaskRP188ModeCh2) << endl
2364  << "Color Correction: " << "Channel: " << ((inRegValue & BIT(31)) ? "2" : "1")
2365  << " Bank " << ((inRegValue & BIT (30)) ? "1" : "0");
2366  return oss.str();
2367  }
2368  } mDecodeGlobalControlReg;
2369 
2370  // reg 267 aka kRegGlobalControl2
2371  struct DecodeGlobalControl2 : public Decoder
2372  {
2373  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2374  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2378  static const ULWord k425Masks[] = { kRegMask425FB12, kRegMask425FB34, kRegMask425FB56, kRegMask425FB78};
2380  ostringstream oss;
2381  oss << "Reference source bit 4: " << SetNotset(inRegValue & kRegMaskRefSource2) << endl
2382  << "Quad Mode Channel 1-4: " << SetNotset(inRegValue & kRegMaskQuadMode) << endl
2383  << "Quad Mode Channel 5-8: " << SetNotset(inRegValue & kRegMaskQuadMode2) << endl
2384  << "Independent Channel Mode: " << SetNotset(inRegValue & kRegMaskIndependentMode) << endl
2385  << "2MB Frame Support: " << SuppNotsupp(inRegValue & kRegMask2MFrameSupport) << endl
2386  << "Audio Mixer: " << PresNotPres(inRegValue & kRegMaskAudioMixerPresent) << endl
2387  << "Is DNXIV Product: " << YesNo(inRegValue & kRegMaskIsDNXIV) << endl;
2388  for (unsigned ch(0); ch < 8; ch++)
2389  oss << "Audio " << DEC(ch+1) << " Play/Capture Mode: " << OnOff(inRegValue & playCaptModes[ch]) << endl;
2390  for (unsigned ch(2); ch < 8; ch++)
2391  oss << "Ch " << DEC(ch+1) << " RP188 Output: " << EnabDisab(inRegValue & rp188Modes[ch]) << endl;
2392  for (unsigned ch(0); ch < 3; ch++)
2393  oss << "Ch " << DEC(2*(ch+2)) << " 1080p50/p60 Link-B Mode: " << EnabDisab(inRegValue & BLinkModes[ch]) << endl;
2394  for (unsigned ch(0); ch < 4; ch++)
2395  oss << "Ch " << DEC(ch*2+1) << "/" << DEC(ch*2+2) << " 2SI Mode: " << EnabDisab(inRegValue & k425Masks[ch]) << endl;
2396  oss << "2SI Min Align Delay 1-4: " << EnabDisab(inRegValue & BIT(24)) << endl
2397  << "2SI Min Align Delay 5-8: " << EnabDisab(inRegValue & BIT(25));
2398  return oss.str();
2399  }
2400  } mDecodeGlobalControl2;
2401 
2402  // reg 108 aka kRegGlobalControl3
2403  struct DecodeGlobalControl3 : public Decoder
2404  {
2405  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2406  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2407  ostringstream oss;
2408  oss << "Bidirectional analog audio 1-4: " << (inRegValue & kRegMaskAnalogIOControl_14 ? "Receive" : "Transmit") << endl
2409  << "Bidirectional analog audio 5-8: " << (inRegValue & kRegMaskAnalogIOControl_58 ? "Receive" : "Transmit") << endl
2410  << "VU Meter Audio Select: " << (inRegValue & kRegMaskVUMeterSelect ? "AudMixer" : "AudSys1") << endl
2411  << "Quad Quad Mode FrameStores 1-2: " << EnabDisab(inRegValue & kRegMaskQuadQuadMode) << endl
2412  << "Quad Quad Mode FrameStores 3-4: " << EnabDisab(inRegValue & kRegMaskQuadQuadMode2) << endl
2413  << "Quad Quad Squares Mode 1-4: " << EnabDisab(inRegValue & kRegMaskQuadQuadSquaresMode) << endl
2414  << "Frame Pulse Enable: " << EnabDisab(inRegValue & kRegMaskFramePulseEnable);
2415  if (inRegValue & kRegMaskFramePulseEnable)
2416  oss << endl
2417  << "Frame Pulse Ref Src: " << DEC((inRegValue & kRegMaskFramePulseRefSelect) >> kRegShiftFramePulseRefSelect);
2418  return oss.str();
2419  }
2420  } mDecodeGlobalControl3;
2421 
2422  // Regs 377,378,379,380,381,382,383 aka kRegGlobalControlCh2,kRegGlobalControlCh3,kRegGlobalControlCh4,kRegGlobalControlCh5,kRegGlobalControlCh6,kRegGlobalControlCh7,kRegGlobalControlCh8
2423  struct DecodeGlobalControlChanReg : public Decoder
2424  {
2425  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2426  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2427  ostringstream oss;
2428  const NTV2FrameGeometry frameGeometry = NTV2FrameGeometry((inRegValue & kRegMaskGeometry) >> 3);
2429  const NTV2Standard videoStandard = NTV2Standard((inRegValue & kRegMaskStandard) >> 7);
2430  const NTV2FrameRate frameRate = NTV2FrameRate(((inRegValue & kRegMaskFrameRate) >> kRegShiftFrameRate) | ((inRegValue & kRegMaskFrameRateHiBit) >> (kRegShiftFrameRateHiBit - 3)));
2431  oss << "Frame Rate: " << ::NTV2FrameRateToString (frameRate) << endl
2432  << "Frame Geometry: " << ::NTV2FrameGeometryToString (frameGeometry) << endl
2433  << "Standard: " << ::NTV2StandardToString (videoStandard);
2434  return oss.str();
2435  }
2436  } mDecodeGlobalControlChanRegs;
2437 
2438  // Regs 1/5/257/260/384/388/392/396 aka kRegCh1Control,kRegCh2Control,kRegCh3Control,kRegCh4Control,kRegCh5Control,kRegCh6Control,kRegCh7Control,kRegCh8Control
2439  struct DecodeChannelControlReg : public Decoder
2440  {
2441  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2442  {;
2443  ostringstream oss;
2444  const ULWord fbfUpper ((inRegValue & kRegMaskFrameFormatHiBit) >> 2);
2445  const ULWord fbfLower ((inRegValue & kRegMaskFrameFormat) >> 1);
2446  oss << "Mode: " << (inRegValue & kRegMaskMode ? "Capture" : "Display") << endl
2447  << "Format: " << ::NTV2FrameBufferFormatToString(NTV2PixelFormat(fbfUpper | fbfLower),false) << endl
2448  << "Channel: " << DisabEnab(inRegValue & kRegMaskChannelDisable) << endl
2449  << "Viper Squeeze: " << (inRegValue & BIT(9) ? "Squeeze" : "Normal") << endl
2450  << "Flip Vertical: " << (inRegValue & kRegMaskFrameOrientation ? "Upside Down" : "Normal") << endl
2451  << "DRT Display: " << OnOff(inRegValue & kRegMaskQuarterSizeMode) << endl
2452  << "Frame Buffer Mode: " << (inRegValue & kRegMaskFrameBufferMode ? "Field" : "Frame") << endl
2453  << "Dither: " << (inRegValue & kRegMaskDitherOn8BitInput ? "Dither 8-bit inputs" : "No dithering") << endl
2454  << "Frame Size: " << (1 << (((inRegValue & kK2RegMaskFrameSize) >> 20) + 1)) << " MB" << endl;
2455  if (inRegNum == kRegCh1Control && ::NTV2DeviceSoftwareCanChangeFrameBufferSize(inDeviceID))
2456  oss << "Frame Size Override: " << EnabDisab(inRegValue & kRegMaskFrameSizeSetBySW) << endl;
2457  oss << "RGB Range: " << (inRegValue & BIT(24) ? "Black = 0x40" : "Black = 0") << endl
2458  << "VANC Data Shift: " << (inRegValue & kRegMaskVidProcVANCShift ? "Enabled" : "Normal 8 bit conversion");
2459  return oss.str();
2460  }
2461  } mDecodeChannelControl;
2462 
2463  struct DecodeFBControlReg : public Decoder
2464  {
2465  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2466  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2467  const bool isOn ((inRegValue & (1 << 29)) != 0);
2468  const uint16_t format ((inRegValue >> 15) & 0x1F);
2469  ostringstream oss;
2470  oss << OnOff(isOn) << endl
2471  << "Format: " << xHEX0N(format,4) << " (" << DEC(format) << ")";
2472  return oss.str();
2473  }
2474  } mDecodeFBControlReg;
2475 
2476  struct DecodeChannelControlExtReg : public Decoder
2477  {
2478  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2479  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2480  ostringstream oss;
2481  oss << "Input Video 2:1 Decimate: " << EnabDisab(inRegValue & BIT(0)) << endl
2482  << "HDMI Rx Direct: " << EnabDisab(inRegValue & BIT(1)) << endl
2483  << "3:2 Pulldown Mode: " << EnabDisab(inRegValue & BIT(2));
2484  return oss.str();
2485  }
2486  } mDecodeChannelControlExt;
2487 
2488  struct DecodeSysmonVccIntDieTemp : public Decoder
2489  {
2490  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2491  { AJA_UNUSED(inRegNum);
2492  UWord rawDieTemp (0);
2493  double dieTempC (0);
2494  if (::NTV2DeviceCanDoVersalSysMon(inDeviceID))
2495  {
2496  rawDieTemp = (inRegValue & 0x0000FFFF);
2497  dieTempC = double(rawDieTemp) / 128.0;
2498  }
2499  else
2500  {
2501  rawDieTemp = ((inRegValue & 0x0000FFFF) >> 6);
2502  dieTempC = ((double(rawDieTemp)) * 503.975 / 1024.0 - 273.15 );
2503  }
2504  const UWord rawVoltage ((inRegValue >> 22) & 0x3FF);
2505  const double dieTempF (dieTempC * 9.0 / 5.0 + 32.0);
2506  const double voltage (double(rawVoltage)/ 1024.0 * 3.0);
2507  ostringstream oss;
2508  oss << "Die Temperature: " << fDEC(dieTempC,5,2) << " Celcius (" << fDEC(dieTempF,5,2) << " Fahrenheit)" << endl
2509  << "Core Voltage: " << fDEC(voltage,5,2) << " Volts DC";
2510  return oss.str();
2511  }
2512  } mDecodeSysmonVccIntDieTemp;
2513 
2514  struct DecodeSDITransmitCtrl : public Decoder
2515  {
2516  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2517  { AJA_UNUSED(inRegNum);
2518  const UWord numInputs (::NTV2DeviceGetNumVideoInputs(inDeviceID));
2519  const UWord numOutputs (::NTV2DeviceGetNumVideoOutputs(inDeviceID));
2520  const UWord numSpigots (numInputs > numOutputs ? numInputs : numOutputs);
2521  ostringstream oss;
2522  if (::NTV2DeviceHasBiDirectionalSDI(inDeviceID))
2523  {
2524  const uint32_t txEnableBits (((inRegValue & 0x0F000000) >> 20) | ((inRegValue & 0xF0000000) >> 28));
2525  if (numSpigots)
2526  for (UWord spigot(0); spigot < numSpigots; )
2527  {
2528  const uint32_t txEnabled (txEnableBits & BIT(spigot));
2529  oss << "SDI " << DEC(++spigot) << ": " << (txEnabled ? "Output/Transmit" : "Input/Receive");
2530  if (spigot < numSpigots)
2531  oss << endl;
2532  }
2533  else
2534  oss << "(No SDI inputs or outputs)";
2535  }
2536  else
2537  oss << "(Bi-directional SDI not supported)";
2538  // CRC checking
2539  return oss.str();
2540  }
2541  } mDecodeSDITransmitCtrl;
2542 
2543  struct DecodeConversionCtrl : public Decoder
2544  {
2545  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2546  { AJA_UNUSED(inRegNum);
2547  ostringstream oss;
2548  if (!::NTV2DeviceGetUFCVersion(inDeviceID))
2549  {
2550  const ULWord bitfileID((inRegValue & kK2RegMaskConverterInRate) >> kK2RegShiftConverterInRate);
2551  oss << "Bitfile ID: " << xHEX0N(bitfileID, 2) << endl
2552  << "Memory Test: Start: " << YesNo(inRegValue & BIT(28)) << endl
2553  << "Memory Test: Done: " << YesNo(inRegValue & BIT(29)) << endl
2554  << "Memory Test: Passed: " << YesNo(inRegValue & BIT(30));
2555  }
2556  else
2557  {
2558  const NTV2Standard inStd ( NTV2Standard( inRegValue & kK2RegMaskConverterInStandard ));
2565  oss << "Input Video Standard: " << ::NTV2StandardToString(inStd, true) << endl
2566  << "Input Video Frame Rate: " << ::NTV2FrameRateToString(inRate, true) << endl
2567  << "Output Video Standard: " << ::NTV2StandardToString(outStd, true) << endl
2568  << "Output Video Frame Rate: " << ::NTV2FrameRateToString(outRate, true) << endl
2569  << "Up Convert Mode: " << ::NTV2UpConvertModeToString(upCvtMode, true) << endl
2570  << "Down Convert Mode: " << ::NTV2DownConvertModeToString(dnCvtMode, true) << endl
2571  << "SD Anamorphic ISO Convert Mode: " << ::NTV2IsoConvertModeToString(isoCvtMode, true) << endl
2572  << "DownCvt 2-3 Pulldown: " << EnabDisab(inRegValue & kK2RegMaskConverterPulldown) << endl
2573  << "Vert Filter Preload: " << DisabEnab(inRegValue & BIT(7)) << endl
2574  << "Output Vid Std PsF (Deint Mode): " << EnabDisab(inRegValue & kK2RegMaskDeinterlaceMode) << endl
2575  << "Up Conv Line21 Pass|Blank Mode: " << DEC(ULWord(inRegValue & kK2RegMaskUCPassLine21) >> kK2RegShiftUCAutoLine21) << endl
2576  << "UFC Clock: " << EnabDisab(inRegValue & kK2RegMaskEnableConverter);
2577  }
2578  return oss.str();
2579  }
2580  } mConvControlRegDecoder;
2581 
2582  struct DecodeRelayCtrlStat : public Decoder
2583  {
2584  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2585  { AJA_UNUSED(inRegNum);
2586  ostringstream oss;
2587  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2588  {
2589  oss << "SDI1-SDI2 Relay Control: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayControl12) << endl
2590  << "SDI3-SDI4 Relay Control: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayControl34) << endl
2591  << "SDI1-SDI2 Relay Watchdog: " << EnabDisab(inRegValue & kRegMaskSDIWatchdogEnable12) << endl
2592  << "SDI3-SDI4 Relay Watchdog: " << EnabDisab(inRegValue & kRegMaskSDIWatchdogEnable34) << endl
2593  << "SDI1-SDI2 Relay Position: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayPosition12) << endl
2594  << "SDI3-SDI4 Relay Position: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayPosition34) << endl
2595  << "Watchdog Timer Status: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIWatchdogStatus);
2596  }
2597  else
2598  oss << "(SDI bypass relays not supported)";
2599  return oss.str();
2600  }
2601  } mDecodeRelayCtrlStat;
2602 
2603  struct DecodeWatchdogTimeout : public Decoder
2604  {
2605  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2606  { AJA_UNUSED(inRegNum);
2607  ostringstream oss;
2608  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2609  {
2610  const uint32_t ticks8nanos (inRegValue); // number of 8-nanosecond ticks
2611  const double microsecs (double(ticks8nanos) * 8.0 / 1000.0);
2612  const double millisecs (microsecs / 1000.0);
2613  oss << "Watchdog Timeout [8-ns ticks]: " << xHEX0N(ticks8nanos,8) << " (" << DEC(ticks8nanos) << ")" << endl
2614  << "Watchdog Timeout [usec]: " << microsecs << endl
2615  << "Watchdog Timeout [msec]: " << millisecs;
2616  }
2617  else
2618  oss << "(SDI bypass relays not supported)";
2619  return oss.str();
2620  }
2621  } mDecodeWatchdogTimeout;
2622 
2623  struct DecodeWatchdogKick : public Decoder
2624  {
2625  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2626  { AJA_UNUSED(inRegNum);
2627  ostringstream oss;
2628  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2629  {
2630  const uint32_t whichReg(inRegNum - kRegSDIWatchdogKick1);
2631  NTV2_ASSERT(whichReg < 2);
2632  const uint32_t expectedValue(whichReg ? 0x01234567 : 0xA5A55A5A);
2633  oss << xHEX0N(inRegValue,8);
2634  if (inRegValue == expectedValue)
2635  oss << " (Normal)";
2636  else
2637  oss << " (Not expected, should be " << xHEX0N(expectedValue,8) << ")";
2638  }
2639  else
2640  oss << "(SDI bypass relays not supported)";
2641  return oss.str();
2642  }
2643  } mDecodeWatchdogKick;
2644 
2645  struct DecodeInputVPID: public Decoder
2646  {
2647  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2648  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2649  const uint32_t regValue (NTV2EndianSwap32(inRegValue)); // Input VPID register values require endian-swap
2650  ostringstream oss;
2651  AJALabelValuePairs info;
2652  const CNTV2VPID ntv2vpid(regValue);
2653  PrintLabelValuePairs(oss, ntv2vpid.GetInfo(info));
2654  return oss.str();
2655  }
2656  } mVPIDInpRegDecoder;
2657 
2658  struct DecodeOutputVPID: public Decoder
2659  {
2660  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2661  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2662  ostringstream oss;
2663  AJALabelValuePairs info;
2664  const CNTV2VPID ntv2vpid(inRegValue);
2665  PrintLabelValuePairs(oss, ntv2vpid.GetInfo(info));
2666  return oss.str();
2667  }
2668  } mVPIDOutRegDecoder;
2669 
2670  struct DecodeBitfileDateTime : public Decoder
2671  {
2672  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2673  { AJA_UNUSED(inDeviceID);
2674  ostringstream oss;
2675  if (inRegNum == kRegBitfileDate)
2676  {
2677  const UWord yyyy ((inRegValue & 0xFFFF0000) >> 16);
2678  const UWord mm ((inRegValue & 0x0000FF00) >> 8);
2679  const UWord dd (inRegValue & 0x000000FF);
2680  if (yyyy > 0x2015 && mm > 0 && mm < 0x13 && dd > 0 && dd < 0x32)
2681  oss << "Bitfile Date: " << HEX0N(mm,2) << "/" << HEX0N(dd,2) << "/" << HEX0N(yyyy,4);
2682  else
2683  oss << "Bitfile Date: " << xHEX0N(inRegValue, 8);
2684  }
2685  else if (inRegNum == kRegBitfileTime)
2686  {
2687  const UWord hh ((inRegValue & 0x00FF0000) >> 16);
2688  const UWord mm ((inRegValue & 0x0000FF00) >> 8);
2689  const UWord ss (inRegValue & 0x000000FF);
2690  if (hh < 0x24 && mm < 0x60 && ss < 0x60)
2691  oss << "Bitfile Time: " << HEX0N(hh,2) << ":" << HEX0N(mm,2) << ":" << HEX0N(ss,2);
2692  else
2693  oss << "Bitfile Time: " << xHEX0N(inRegValue, 8);
2694  }
2695  else NTV2_ASSERT(false); // impossible
2696  return oss.str();
2697  }
2698  } mDecodeBitfileDateTime;
2699 
2700  struct DecodeBoardID : public Decoder
2701  {
2702  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2703  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2704  const string str1 (::NTV2DeviceIDToString(NTV2DeviceID(inRegValue), false));
2705  const string str2 (::NTV2DeviceIDToString(NTV2DeviceID(inRegValue), true));
2706  ostringstream oss;
2707  oss << "NTV2DeviceID: " << ::NTV2DeviceIDString(NTV2DeviceID(inRegValue)) << endl
2708  << "Device Name: '" << str1 << "'";
2709  if (str1 != str2)
2710  oss << endl
2711  << "Retail Device Name: '" << str2 << "'";
2712  return oss.str();
2713  }
2714  } mDecodeBoardID;
2715 
2716  struct DecodeDynFWUpdateCounts : public Decoder
2717  {
2718  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2719  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2720  ostringstream oss;
2721  oss << "# attempts: " << DEC(inRegValue >> 16) << endl
2722  << "# successes: " << DEC(inRegValue & 0x0000FFFF);
2723  return oss.str();
2724  }
2725  } mDecodeDynFWUpdateCounts;
2726 
2727  struct DecodeFWUserID : public Decoder
2728  {
2729  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2730  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2731  ostringstream oss;
2732  if (inRegValue)
2733  oss << "Current Design ID: " << xHEX0N(NTV2BitfileHeaderParser::GetDesignID(inRegValue),4) << endl
2734  << "Current Design Version: " << xHEX0N(NTV2BitfileHeaderParser::GetDesignVersion(inRegValue),4) << endl
2735  << "Current Bitfile ID: " << xHEX0N(NTV2BitfileHeaderParser::GetBitfileID(inRegValue),4) << endl
2736  << "Current Bitfile Version: " << xHEX0N(NTV2BitfileHeaderParser::GetBitfileVersion(inRegValue),4);
2737  return oss.str();
2738  }
2739  } mDecodeFirmwareUserID;
2740 
2741  struct DecodeCanDoStatus : public Decoder
2742  {
2743  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2744  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2745  ostringstream oss;
2746  oss << "Has CanConnect Xpt Route ROM: " << YesNo(inRegValue & BIT(0)) << endl
2747  << "AudioSystems can start on VBI: " << YesNo(inRegValue & BIT(1)) << endl
2748  << "Main Flash SPI Controller: " << YesNo(inRegValue & BIT(2)) << endl
2749  << "MB Flash SPI Controller: " << YesNo(inRegValue & BIT(3)) << endl
2750  << "Has Enhanced (NTV4) FrameStores: " << YesNo(inRegValue & BIT(4)) << endl
2751  << "Can report Mixer delay: " << YesNo(inRegValue & BIT(5)) << endl
2752  << "AncIns supports HANC insertion: " << YesNo(inRegValue & BIT(6));
2753  return oss.str();
2754  }
2755  } mDecodeCanDoStatus;
2756 
2757  struct DecodeVidControlReg : public Decoder // Bit31=Is16x9 | Bit30=IsMono
2758  {
2759  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2760  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2761  const bool is16x9 ((inRegValue & BIT(31)) != 0);
2762  const bool isMono ((inRegValue & BIT(30)) != 0);
2763  ostringstream oss;
2764  oss << "Aspect Ratio: " << (is16x9 ? "16x9" : "4x3") << endl
2765  << "Depth: " << (isMono ? "Monochrome" : "Color");
2766  return oss.str();
2767  }
2768  } mDecodeVidControlReg;
2769 
2770  struct DecodeVidIntControl : public Decoder
2771  {
2772  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2773  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2774  ostringstream oss;
2775  oss << "Output 1 Vertical Enable: " << YesNo(inRegValue & BIT(0)) << endl
2776  << "Input 1 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2777  << "Input 2 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2778  << "Audio Out Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(4)) << endl
2779  << "Audio In Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(5)) << endl
2780  << "Wrap Rate Interrupt Enable: " << YesNo(inRegValue & BIT(6)) << endl
2781  << "UART Tx Interrupt Enable" << YesNo(inRegValue & BIT(7)) << endl
2782  << "UART Rx Interrupt Enable" << YesNo(inRegValue & BIT(8)) << endl
2783  << "UART Rx Interrupt Clear" << ActInact(inRegValue & BIT(15)) << endl
2784  << "UART 2 Tx Interrupt Enable" << YesNo(inRegValue & BIT(17)) << endl
2785  << "Output 2 Vertical Enable: " << YesNo(inRegValue & BIT(18)) << endl
2786  << "Output 3 Vertical Enable: " << YesNo(inRegValue & BIT(19)) << endl
2787  << "Output 4 Vertical Enable: " << YesNo(inRegValue & BIT(20)) << endl
2788  << "Output 4 Vertical Clear: " << ActInact(inRegValue & BIT(21)) << endl
2789  << "Output 3 Vertical Clear: " << ActInact(inRegValue & BIT(22)) << endl
2790  << "Output 2 Vertical Clear: " << ActInact(inRegValue & BIT(23)) << endl
2791  << "UART Tx Interrupt Clear" << ActInact(inRegValue & BIT(24)) << endl
2792  << "Wrap Rate Interrupt Clear" << ActInact(inRegValue & BIT(25)) << endl
2793  << "UART 2 Tx Interrupt Clear" << ActInact(inRegValue & BIT(26)) << endl
2794  << "Audio Out Wrap Interrupt Clear" << ActInact(inRegValue & BIT(27)) << endl
2795  << "Input 2 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2796  << "Input 1 Vertical Clear: " << ActInact(inRegValue & BIT(30)) << endl
2797  << "Output 1 Vertical Clear: " << ActInact(inRegValue & BIT(31));
2798  return oss.str();
2799  }
2800  } mDecodeVidIntControl;
2801 
2802  struct DecodeVidIntControl2 : public Decoder
2803  {
2804  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2805  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2806  ostringstream oss;
2807  oss << "Input 3 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2808  << "Input 4 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2809  << "Input 5 Vertical Enable: " << YesNo(inRegValue & BIT(8)) << endl
2810  << "Input 6 Vertical Enable: " << YesNo(inRegValue & BIT(9)) << endl
2811  << "Input 7 Vertical Enable: " << YesNo(inRegValue & BIT(10)) << endl
2812  << "Input 8 Vertical Enable: " << YesNo(inRegValue & BIT(11)) << endl
2813  << "Output 5 Vertical Enable: " << YesNo(inRegValue & BIT(12)) << endl
2814  << "Output 6 Vertical Enable: " << YesNo(inRegValue & BIT(13)) << endl
2815  << "Output 7 Vertical Enable: " << YesNo(inRegValue & BIT(14)) << endl
2816  << "Output 8 Vertical Enable: " << YesNo(inRegValue & BIT(15)) << endl
2817  << "Output 8 Vertical Clear: " << ActInact(inRegValue & BIT(16)) << endl
2818  << "Output 7 Vertical Clear: " << ActInact(inRegValue & BIT(17)) << endl
2819  << "Output 6 Vertical Clear: " << ActInact(inRegValue & BIT(18)) << endl
2820  << "Output 5 Vertical Clear: " << ActInact(inRegValue & BIT(19)) << endl
2821  << "Input 8 Vertical Clear: " << ActInact(inRegValue & BIT(25)) << endl
2822  << "Input 7 Vertical Clear: " << ActInact(inRegValue & BIT(26)) << endl
2823  << "Input 6 Vertical Clear: " << ActInact(inRegValue & BIT(27)) << endl
2824  << "Input 5 Vertical Clear: " << ActInact(inRegValue & BIT(28)) << endl
2825  << "Input 4 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2826  << "Input 3 Vertical Clear: " << ActInact(inRegValue & BIT(30));
2827  return oss.str();
2828  }
2829  } mDecodeVidIntControl2;
2830 
2831  struct DecodeStatusReg : public Decoder
2832  {
2833  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2834  { AJA_UNUSED(inRegNum);
2835  ostringstream oss;
2836  oss << "Input 1 Vertical Blank: " << ActInact(inRegValue & BIT(20)) << endl
2837  << "Input 1 Field ID: " << (inRegValue & BIT(21) ? "1" : "0") << endl
2838  << "Input 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(30)) << endl
2839  << "Input 2 Vertical Blank: " << ActInact(inRegValue & BIT(18)) << endl
2840  << "Input 2 Field ID: " << (inRegValue & BIT(19) ? "1" : "0") << endl
2841  << "Input 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(29)) << endl
2842  << "Output 1 Vertical Blank: " << ActInact(inRegValue & BIT(22)) << endl
2843  << "Output 1 Field ID: " << (inRegValue & BIT(23) ? "1" : "0") << endl
2844  << "Output 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(31)) << endl
2845  << "Output 2 Vertical Blank: " << ActInact(inRegValue & BIT(4)) << endl
2846  << "Output 2 Field ID: " << (inRegValue & BIT(5) ? "1" : "0") << endl
2847  << "Output 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(8)) << endl;
2848  if (::NTV2DeviceGetNumVideoOutputs(inDeviceID) > 2)
2849  oss << "Output 3 Vertical Blank: " << ActInact(inRegValue & BIT(2)) << endl
2850  << "Output 3 Field ID: " << (inRegValue & BIT(3) ? "1" : "0") << endl
2851  << "Output 3 Vertical Interrupt: " << ActInact(inRegValue & BIT(7)) << endl
2852  << "Output 4 Vertical Blank: " << ActInact(inRegValue & BIT(0)) << endl
2853  << "Output 4 Field ID: " << (inRegValue & BIT(1) ? "1" : "0") << endl
2854  << "Output 4 Vertical Interrupt: " << ActInact(inRegValue & BIT(6)) << endl;
2855  oss << "Aux Vertical Interrupt: " << ActInact(inRegValue & BIT(12)) << endl
2856  << "I2C 1 Interrupt: " << ActInact(inRegValue & BIT(14)) << endl
2857  << "I2C 2 Interrupt: " << ActInact(inRegValue & BIT(13)) << endl
2858  << "Chunk Rate Interrupt: " << ActInact(inRegValue & BIT(16)) << endl;
2859  if (::NTV2DeviceGetNumSerialPorts(inDeviceID))
2860  oss << "Generic UART Interrupt: " << ActInact(inRegValue & BIT(9)) << endl
2861  << "Uart 1 Rx Interrupt: " << ActInact(inRegValue & BIT(15)) << endl
2862  << "Uart 1 Tx Interrupt: " << ActInact(inRegValue & BIT(24)) << endl;
2863  if (::NTV2DeviceGetNumSerialPorts(inDeviceID) > 1)
2864  oss << "Uart 2 Tx Interrupt: " << ActInact(inRegValue & BIT(26)) << endl;
2865  if (::NTV2DeviceGetNumLTCInputs(inDeviceID))
2866  oss << "LTC In 1 Present: " << YesNo(inRegValue & BIT(17)) << endl;
2867  oss << "Wrap Rate Interrupt: " << ActInact(inRegValue & BIT(25)) << endl
2868  << "Audio Out Wrap Interrupt: " << ActInact(inRegValue & BIT(27)) << endl
2869  << "Audio 50Hz Interrupt: " << ActInact(inRegValue & BIT(28));
2870  return oss.str();
2871  }
2872  } mDecodeStatusReg;
2873 
2874  struct DecodeCPLDVersion : public Decoder
2875  {
2876  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2877  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2878  ostringstream oss;
2879  oss << "CPLD Version: " << DEC(inRegValue & (BIT(0)|BIT(1))) << endl
2880  << "Failsafe Bitfile Loaded: " << (inRegValue & BIT(4) ? "Yes" : "No") << endl
2881  << "Force Reload: " << YesNo(inRegValue & BIT(8));
2882  ULWord pcbRev ((inRegValue & 0xF0000000) >> 28);
2883  if (pcbRev) oss << endl
2884  << "PCB Version: " << xHEX0N(pcbRev,2);
2885  return oss.str();
2886  }
2887  } mDecodeCPLDVersion;
2888 
2889  struct DecodeStatus2Reg : public Decoder
2890  {
2891  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2892  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2893  static const uint8_t bitNumsInputVBlank[] = {20, 18, 16, 14, 12, 10}; // Input 3/4/5/6/7/8 Vertical Blank
2894  static const uint8_t bitNumsInputFieldID[] = {21, 19, 17, 15, 13, 11}; // Input 3/4/5/6/7/8 Field ID
2895  static const uint8_t bitNumsInputVertInt[] = {30, 29, 28, 27, 26, 25}; // Input 3/4/5/6/7/8 Vertical Interrupt
2896  static const uint8_t bitNumsOutputVBlank[] = { 8, 6, 4, 2}; // Output 5/6/7/8 Vertical Blank
2897  static const uint8_t bitNumsOutputFieldID[] = { 9, 7, 5, 3}; // Output 5/6/7/8 Field ID
2898  static const uint8_t bitNumsOutputVertInt[] = {31, 24, 23, 22}; // Output 5/6/7/8 Vertical Interrupt
2899  ostringstream oss;
2900  for (unsigned ndx(0); ndx < 6; ndx++)
2901  oss << "Input " << (ndx+3) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsInputVBlank[ndx])) << endl
2902  << "Input " << (ndx+3) << " Field ID: " << (inRegValue & BIT(bitNumsInputFieldID[ndx]) ? "1" : "0") << endl
2903  << "Input " << (ndx+3) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsInputVertInt[ndx])) << endl;
2904  for (unsigned ndx(0); ndx < 4; ndx++)
2905  oss << "Output " << (ndx+5) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsOutputVBlank[ndx])) << endl
2906  << "Output " << (ndx+5) << " Field ID: " << (inRegValue & BIT(bitNumsOutputFieldID[ndx]) ? "1" : "0") << endl
2907  << "Output " << (ndx+5) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsOutputVertInt[ndx])) << endl;
2908  oss << "HDMI In Hot-Plug Detect Interrupt: " << ActInact(inRegValue & BIT(0)) << endl
2909  << "HDMI In Chip Interrupt: " << ActInact(inRegValue & BIT(1));
2910  return oss.str();
2911  }
2912  } mDecodeStatus2Reg;
2913 
2914  struct DecodeInputStatusReg : public Decoder
2915  {
2916  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2917  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
2918  NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
2919  NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
2920  NTV2FrameRate fRateRf (NTV2FrameRate(((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16) ));
2921  ostringstream oss;
2922  oss << "Input 1 Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
2923  << "Input 1 Geometry: ";
2924  if (BIT(30) & inRegValue)
2925  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2926  {
2927  case 0: oss << "2K x 1080"; break;
2928  case 1: oss << "2K x 1556"; break;
2929  default: oss << "Invalid HI"; break;
2930  }
2931  else
2932  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2933  {
2934  case 0: oss << "Unknown"; break;
2935  case 1: oss << "525"; break;
2936  case 2: oss << "625"; break;
2937  case 3: oss << "750"; break;
2938  case 4: oss << "1125"; break;
2939  case 5: oss << "1250"; break;
2940  case 6: case 7: oss << "Reserved"; break;
2941  default: oss << "Invalid LO"; break;
2942  }
2943  oss << endl
2944  << "Input 1 Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
2945  << "Input 2 Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
2946  << "Input 2 Geometry: ";
2947  if (BIT(31) & inRegValue)
2948  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2949  {
2950  case 0: oss << "2K x 1080"; break;
2951  case 1: oss << "2K x 1556"; break;
2952  default: oss << "Invalid HI"; break;
2953  }
2954  else
2955  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2956  {
2957  case 0: oss << "Unknown"; break;
2958  case 1: oss << "525"; break;
2959  case 2: oss << "625"; break;
2960  case 3: oss << "750"; break;
2961  case 4: oss << "1125"; break;
2962  case 5: oss << "1250"; break;
2963  case 6: case 7: oss << "Reserved"; break;
2964  default: oss << "Invalid LO"; break;
2965  }
2966  oss << endl
2967  << "Input 2 Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
2968  << "Reference Frame Rate: " << ::NTV2FrameRateToString(fRateRf, true) << endl
2969  << "Reference Geometry: ";
2970  switch (((BIT(20)|BIT(21)|BIT(22)) & inRegValue) >> 20) // Ref scan geometry
2971  {
2972  case 0: oss << "NTV2_SG_UNKNOWN"; break;
2973  case 1: oss << "NTV2_SG_525"; break;
2974  case 2: oss << "NTV2_SG_625"; break;
2975  case 3: oss << "NTV2_SG_750"; break;
2976  case 4: oss << "NTV2_SG_1125"; break;
2977  case 5: oss << "NTV2_SG_1250"; break;
2978  default: oss << "Invalid"; break;
2979  }
2980  oss << endl
2981  << "Reference Scan Mode: " << ((BIT(23) & inRegValue) ? "Progressive" : "Interlaced") << endl
2982  << "AES Channel 1-2: " << ((BIT(24) & inRegValue) ? "Invalid" : "Valid") << endl
2983  << "AES Channel 3-4: " << ((BIT(25) & inRegValue) ? "Invalid" : "Valid") << endl
2984  << "AES Channel 5-6: " << ((BIT(26) & inRegValue) ? "Invalid" : "Valid") << endl
2985  << "AES Channel 7-8: " << ((BIT(27) & inRegValue) ? "Invalid" : "Valid");
2986  return oss.str();
2987  }
2988  } mDecodeInputStatusReg;
2989 
2990  struct DecodeSDIInputStatusReg : public Decoder
2991  {
2992  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2993  {
2994  uint16_t numSpigots(0), startSpigot(0), doTsiMuxSync(0);
2995  ostringstream oss;
2996  switch (inRegNum)
2997  {
2998  case kRegSDIInput3GStatus: numSpigots = 2; startSpigot = 1; doTsiMuxSync = 1; break;
2999  case kRegSDIInput3GStatus2: numSpigots = 2; startSpigot = 3; break;
3000  case kRegSDI5678Input3GStatus: numSpigots = 4; startSpigot = 5; break;
3001  }
3002  if ((startSpigot-1) >= ::NTV2DeviceGetNumVideoInputs(inDeviceID))
3003  return oss.str(); // Skip if no such SDI inputs
3004 
3005  for (uint16_t spigotNdx(0); spigotNdx < numSpigots; )
3006  {
3007  const uint16_t spigotNum (spigotNdx + startSpigot);
3008  const uint8_t statusBits ((inRegValue >> (spigotNdx*8)) & 0xFF);
3009  const uint8_t speedBits (statusBits & 0xC1);
3010  ostringstream ossSpeed, ossSpigot;
3011  ossSpigot << "SDI In " << spigotNum << " ";
3012  const string spigotLabel (ossSpigot.str());
3013  if (speedBits & 0x01) ossSpeed << " 3G";
3014  if (::NTV2DeviceCanDo12GSDI(inDeviceID))
3015  {
3016  if (speedBits & 0x40) ossSpeed << " 6G";
3017  if (speedBits & 0x80) ossSpeed << " 12G";
3018  }
3019  if (speedBits == 0) ossSpeed << " 1.5G";
3020  oss << spigotLabel << "Link Speed:" << ossSpeed.str() << endl
3021  << spigotLabel << "SMPTE Level B: " << YesNo(statusBits & 0x02) << endl
3022  << spigotLabel << "Link A VPID Valid: " << YesNo(statusBits & 0x10) << endl
3023  << spigotLabel << "Link B VPID Valid: " << YesNo(statusBits & 0x20) << endl;
3024  if (::NTV2DeviceCanDo3GLevelConversion(inDeviceID))
3025  oss << spigotLabel << "3Gb-to-3Ga Conversion: " << EnabDisab(statusBits & 0x04);
3026  else
3027  oss << spigotLabel << "3Gb-to-3Ga Conversion: n/a";
3028  if (++spigotNdx < numSpigots)
3029  oss << endl;
3030  } // for each spigot
3031  if (doTsiMuxSync && ::NTV2DeviceCanDo425Mux(inDeviceID))
3032  for (UWord tsiMux(0); tsiMux < 4; ++tsiMux)
3033  oss << endl
3034  << "TsiMux" << DEC(tsiMux+1) << " Sync Fail: " << ((inRegValue & (0x00010000UL << tsiMux)) ? "FAILED" : "OK");
3035  return oss.str();
3036  }
3037  } mDecodeSDIInputStatusReg;
3038 
3039  struct DecodeSDIInputStatus2Reg : public Decoder
3040  {
3041  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3042  { AJA_UNUSED(inDeviceID);
3043  const string sOdd (inRegNum == kRegInputStatus2 ? "Input 3" : (inRegNum == kRegInput56Status ? "Input 5" : "Input 7"));
3044  const string sEven (inRegNum == kRegInputStatus2 ? "Input 4" : (inRegNum == kRegInput56Status ? "Input 6" : "Input 8"));
3045  const NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
3046  const NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
3047  ostringstream oss;
3048  oss << sOdd << " Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
3049  << sOdd << " Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
3050  << sOdd << " Geometry: ";
3051  if (BIT(30) & inRegValue) switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
3052  {
3053  case 0: oss << "2K x 1080"; break;
3054  case 1: oss << "2K x 1556"; break;
3055  default: oss << "Invalid HI"; break;
3056  }
3057  else switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
3058  {
3059  case 0: oss << "Unknown"; break;
3060  case 1: oss << "525"; break;
3061  case 2: oss << "625"; break;
3062  case 3: oss << "750"; break;
3063  case 4: oss << "1125"; break;
3064  case 5: oss << "1250"; break;
3065  case 6: case 7: oss << "Reserved"; break;
3066  default: oss << "Invalid LO"; break;
3067  }
3068  oss << endl
3069  << sEven << " Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
3070  << sEven << " Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
3071  << sEven << " Geometry: ";
3072  if (BIT(31) & inRegValue) switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
3073  {
3074  case 0: oss << "2K x 1080"; break;
3075  case 1: oss << "2K x 1556"; break;
3076  default: oss << "Invalid HI"; break;
3077  }
3078  else switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
3079  {
3080  case 0: oss << "Unknown"; break;
3081  case 1: oss << "525"; break;
3082  case 2: oss << "625"; break;
3083  case 3: oss << "750"; break;
3084  case 4: oss << "1125"; break;
3085  case 5: oss << "1250"; break;
3086  case 6: case 7: oss << "Reserved"; break;
3087  default: oss << "Invalid LO"; break;
3088  }
3089  return oss.str();
3090  }
3091  } mDecodeSDIInputStatus2Reg;
3092 
3093  struct DecodeFS1RefSelectReg : public Decoder
3094  {
3095  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3096  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID); // kRegFS1ReferenceSelect
3097  ostringstream oss;
3098  oss << "BNC Select(LHi): " << (inRegValue & 0x00000010 ? "LTCIn1" : "Ref") << endl
3099  << "Ref BNC (Corvid): " << EnabDisab(inRegValue & 0x00000020) << endl
3100  << "LTC Present (also Reg 21): " << YesNo(inRegValue & 0x00000040) << endl
3101  << "LTC Emb Out Enable: " << YesNo(inRegValue & 0x00000080) << endl
3102  << "LTC Emb In Enable: " << YesNo(inRegValue & 0x00000100) << endl
3103  << "LTC Emb In Received: " << YesNo(inRegValue & 0x00000200) << endl
3104  << "LTC BNC Out Source: " << (inRegValue & 0x00000400 ? "E-E" : "Reg112/113");
3105  return oss.str();
3106  }
3107  } mDecodeFS1RefSelectReg;
3108 
3109  struct DecodeLTCStatusControlReg : public Decoder
3110  {
3111  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3112  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID); // kRegLTCStatusControl
3113  const uint16_t LTC1InTimingSelect ((inRegValue >> 1) & 0x0000007);
3114  const uint16_t LTC2InTimingSelect ((inRegValue >> 9) & 0x0000007);
3115  const uint16_t LTC1OutTimingSelect ((inRegValue >> 16) & 0x0000007);
3116  const uint16_t LTC2OutTimingSelect ((inRegValue >> 20) & 0x0000007);
3117  ostringstream oss;
3118  oss << "LTC 1 Input Present: " << YesNo(inRegValue & 0x00000001) << endl
3119  << "LTC 1 Input FB Timing Select): " << xHEX0N(LTC1InTimingSelect,2) << " (" << DEC(LTC1InTimingSelect) << ")" << endl
3120  << "LTC 1 Bypass: " << EnabDisab(inRegValue & 0x00000010) << endl
3121  << "LTC 1 Bypass Select: " << DEC(ULWord((inRegValue >> 5) & 0x00000001)) << endl
3122  << "LTC 2 Input Present: " << YesNo(inRegValue & 0x00000100) << endl
3123  << "LTC 2 Input FB Timing Select): " << xHEX0N(LTC2InTimingSelect,2) << " (" << DEC(LTC2InTimingSelect) << ")" << endl
3124  << "LTC 2 Bypass: " << EnabDisab(inRegValue & 0x00001000) << endl
3125  << "LTC 2 Bypass Select: " << DEC(ULWord((inRegValue >> 13) & 0x00000001)) << endl
3126  << "LTC 1 Output FB Timing Select): " << xHEX0N(LTC1OutTimingSelect,2) << " (" << DEC(LTC1OutTimingSelect) << ")" << endl
3127  << "LTC 2 Output FB Timing Select): " << xHEX0N(LTC2OutTimingSelect,2) << " (" << DEC(LTC2OutTimingSelect) << ")";
3128  return oss.str();
3129  }
3130  } mLTCStatusControlDecoder;
3131 
3132  struct DecodeAudDetectReg : public Decoder
3133  {
3134  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3135  { AJA_UNUSED(inDeviceID);
3136  ostringstream oss;
3137  switch (inRegNum)
3138  {
3139  case kRegAud1Detect:
3140  case kRegAudDetect2:
3141  for (uint16_t num(0); num < 8; )
3142  {
3143  const uint16_t group (num / 2);
3144  const bool isChan34 (num & 1);
3145  oss << "Group " << group << " CH " << (isChan34 ? "3-4: " : "1-2: ") << (inRegValue & BIT(num) ? "Present" : "Absent");
3146  if (++num < 8)
3147  oss << endl;
3148  }
3149  break;
3150 
3151  case kRegAudioDetect5678:
3152  break;
3153  }
3154  return oss.str();
3155  }
3156  } mDecodeAudDetectReg;
3157 
3158  struct DecodeAudControlReg : public Decoder
3159  {
3160  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3161  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3162  static const string ChStrs [] = { "Ch 1/2", "Ch 3/4", "Ch 5/6", "Ch 7/8" };
3163  uint16_t sdiOutput (0);
3164  switch (inRegNum)
3165  { case kRegAud1Control: sdiOutput = 1; break;
3166  case kRegAud3Control: sdiOutput = 3; break;
3167  case kRegAud5Control: sdiOutput = 5; break;
3168  case kRegAud7Control: sdiOutput = 7; break;
3169  default: break;
3170  }
3171 
3172  ostringstream oss;
3173  oss << "Audio Capture: " << EnabDisab(BIT(0) & inRegValue) << endl
3174  << "Audio Loopback: " << EnabDisab(BIT(3) & inRegValue) << endl
3175  << "Audio Input: " << DisabEnab(BIT(8) & inRegValue) << endl
3176  << "Audio Output: " << DisabEnab(BIT(9) & inRegValue) << endl
3177  << "Output Paused: " << YesNo(BIT(11) & inRegValue) << endl;
3178  if (sdiOutput)
3179  oss << "Audio Embedder SDIOut" << sdiOutput << ": " << DisabEnab(BIT(13) & inRegValue) << endl
3180  << "Audio Embedder SDIOut" << (sdiOutput+1) << ": " << DisabEnab(BIT(15) & inRegValue) << endl;
3181 
3182  oss << "A/V Sync Mode: " << EnabDisab(BIT(15) & inRegValue) << endl
3183  << "AES Rate Converter: " << DisabEnab(BIT(19) & inRegValue) << endl
3184  << "Audio Buffer Format: " << (BIT(20) & inRegValue ? "16-Channel " : (BIT(16) & inRegValue ? "8-Channel " : "6-Channel ")) << endl
3185  << (BIT(18) & inRegValue ? "96kHz" : "48kHz") << endl
3186  << (BIT(18) & inRegValue ? "96kHz Support" : "48kHz Support") << endl
3187  // << (BIT(22) & inRegValue ? "Embedded Support" : "No Embedded Support") << endl // JeffL says this bit is obsolete
3188  << "Slave Mode (64-chl): " << EnabDisab(BIT(23) & inRegValue) << endl // Redeployed in 16.2 for 64-ch audio
3189  << "K-box, Monitor: " << ChStrs [(BIT(24) & BIT(25) & inRegValue) >> 24] << endl
3190  << "K-Box Input: " << (BIT(26) & inRegValue ? "XLR" : "BNC") << endl
3191  << "K-Box: " << (BIT(27) & inRegValue ? "Present" : "Absent") << endl
3192  << "Cable: " << (BIT(28) & inRegValue ? "XLR" : "BNC") << endl
3193  << "Audio Buffer Size: " << (BIT(31) & inRegValue ? "4 MB" : "1 MB");
3194  return oss.str();
3195  }
3196  } mDecodeAudControlReg;
3197 
3198  struct DecodeAudControl2Reg : public Decoder
3199  {
3200  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3201  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3202  ostringstream oss;
3203  ULWord val (inRegValue & 0x000000FF);
3204  NTV2StringList names;
3205  if (val)
3206  for (ULWord audSys(0); audSys < 8; audSys++)
3207  if (val & (1UL << audSys))
3208  { ostringstream nm;
3209  nm << "AudSys" << DEC(audSys+1);
3210  names.push_back(nm.str());
3211  }
3212  oss << "192kHz enabled Audio Systems: ";
3213  if (names.empty())
3214  oss << "none";
3215  else
3216  oss << aja::join(names, ", ");
3217  return oss.str();
3218  }
3219  } mDecodeAudControl2Reg;
3220 
3221  struct DecodeAudSourceSelectReg : public Decoder
3222  {
3223  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3224  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3225  static const string SrcStrs [] = { "AES Input", "Embedded Groups 1 and 2", "" };
3226  static const unsigned SrcStrMap [] = { 0, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
3227  const uint16_t vidInput = (inRegValue & BIT(23) ? 2 : 0) + (inRegValue & BIT(16) ? 1 : 0);
3228  // WARNING! BIT(23) had better be clear on 0 & 1-input boards!!
3229  ostringstream oss;
3230  oss << "Audio Source: " << SrcStrs [SrcStrMap [(BIT(0) | BIT(1) | BIT(2) | BIT(3)) & inRegValue]] << endl
3231  << "Embedded Source Select: Video Input " << (1 + vidInput) << endl
3232  << "AES Sync Mode bit (fib): " << EnabDisab(inRegValue & BIT(18)) << endl
3233  << "PCM disabled: " << YesNo(inRegValue & BIT(17)) << endl
3234  << "Erase head enable: " << YesNo(inRegValue & BIT(19)) << endl
3235  << "Embedded Clock Select: " << (inRegValue & BIT(22) ? "Video Input" : "Board Reference") << endl
3236  << "3G audio source: " << (inRegValue & BIT(21) ? "Data stream 2" : "Data stream 1");
3237  return oss.str();
3238  }
3239  } mDecodeAudSourceSelectReg;
3240 
3241  struct DecodeAudOutputSrcMap : public Decoder
3242  {
3243  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3244  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3245  static const string AESOutputStrs[] = { "AES Outputs 1-4", "AES Outputs 5-8", "AES Outputs 9-12", "AES Outputs 13-16", ""};
3246  static const string SrcStrs[] = { "AudSys1, Audio Channels 1-4", "AudSys1, Audio Channels 5-8",
3247  "AudSys1, Audio Channels 9-12", "AudSys1, Audio Channels 13-16",
3248  "AudSys2, Audio Channels 1-4", "AudSys2, Audio Channels 5-8",
3249  "AudSys2, Audio Channels 9-12", "AudSys2, Audio Channels 13-16",
3250  "AudSys3, Audio Channels 1-4", "AudSys3, Audio Channels 5-8",
3251  "AudSys3, Audio Channels 9-12", "AudSys3, Audio Channels 13-16",
3252  "AudSys4, Audio Channels 1-4", "AudSys4, Audio Channels 5-8",
3253  "AudSys4, Audio Channels 9-12", "AudSys4, Audio Channels 13-16", ""};
3254  static const unsigned AESChlMappingShifts [4] = {0, 4, 8, 12};
3255 
3256  ostringstream oss;
3257  const uint32_t AESOutMapping (inRegValue & 0x0000FFFF);
3258  const uint32_t AnlgMonInfo ((inRegValue & kRegMaskMonitorSource) >> kRegShiftMonitorSource);
3259  const NTV2AudioSystem AnlgMonAudSys (NTV2AudioSystem(AnlgMonInfo >> 4));
3260  const NTV2AudioChannelPair AnlgMonChlPair (NTV2AudioChannelPair(AnlgMonInfo & 0xF));
3261  for (unsigned AESOutputQuad(0); AESOutputQuad < 4; AESOutputQuad++)
3262  oss << AESOutputStrs[AESOutputQuad] << " Source: " << SrcStrs[(AESOutMapping >> AESChlMappingShifts[AESOutputQuad]) & 0x0000000F] << endl;
3263  oss << "Analog Audio Monitor Output Source: " << ::NTV2AudioSystemToString(AnlgMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(AnlgMonChlPair,true) << endl;
3264 
3265  // HDMI Audio Output Mapping -- interpretation depends on bit 29 of register 125 kRegHDMIOutControl MULTIREG_SPARSE_BITS
3266  const uint32_t HDMIMonInfo ((inRegValue & kRegMaskHDMIOutAudioSource) >> kRegShiftHDMIOutAudioSource);
3267  {
3268  // HDMI Audio 2-channel Mode:
3269  const NTV2AudioSystem HDMIMonAudSys (NTV2AudioSystem(HDMIMonInfo >> 4));
3270  const NTV2AudioChannelPair HDMIMonChlPair (NTV2AudioChannelPair(HDMIMonInfo & 0xF));
3271  oss << "HDMI 2-Chl Audio Output Source: " << ::NTV2AudioSystemToString(HDMIMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(HDMIMonChlPair,true) << endl;
3272  }
3273  {
3274  // HDMI Audio 8-channel Mode:
3275  const uint32_t HDMIMon1234Info (HDMIMonInfo & 0x0F);
3276  const NTV2AudioSystem HDMIMon1234AudSys (NTV2AudioSystem(HDMIMon1234Info >> 2));
3277  const NTV2Audio4ChannelSelect HDMIMon1234SrcPairs (NTV2Audio4ChannelSelect(HDMIMon1234Info & 0x3));
3278  const uint32_t HDMIMon5678Info ((HDMIMonInfo >> 4) & 0x0F);
3279  const NTV2AudioSystem HDMIMon5678AudSys (NTV2AudioSystem(HDMIMon5678Info >> 2));
3280  const NTV2Audio4ChannelSelect HDMIMon5678SrcPairs (NTV2Audio4ChannelSelect(HDMIMon5678Info & 0x3));
3281  oss << "or HDMI 8-Chl Audio Output 1-4 Source: " << ::NTV2AudioSystemToString(HDMIMon1234AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon1234SrcPairs,true) << endl
3282  << "or HDMI 8-Chl Audio Output 5-8 Source: " << ::NTV2AudioSystemToString(HDMIMon5678AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon5678SrcPairs,true);
3283  }
3284  return oss.str();
3285  }
3286  } mDecodeAudOutputSrcMap;
3287 
3288  struct DecodePCMControlReg : public Decoder
3289  {
3290  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3291  { AJA_UNUSED(inDeviceID);
3292  ostringstream oss;
3293  const UWord startAudioSystem (inRegNum == kRegPCMControl4321 ? 1 : 5);
3294  for (uint8_t audChan (0); audChan < 4; audChan++)
3295  {
3296  oss << "Audio System " << (startAudioSystem + audChan) << ": ";
3297  const uint8_t pcmBits (uint32_t(inRegValue >> (audChan * 8)) & 0x000000FF);
3298  if (pcmBits == 0x00)
3299  oss << "normal";
3300  else
3301  {
3302  oss << "non-PCM channels";
3303  for (uint8_t chanPair (0); chanPair < 8; chanPair++)
3304  if (pcmBits & (0x01 << chanPair))
3305  oss << " " << (chanPair*2+1) << "-" << (chanPair*2+2);
3306  }
3307  if (audChan < 3)
3308  oss << endl;
3309  }
3310  return oss.str();
3311  }
3312  } mDecodePCMControlReg;
3313 
3314  struct DecodeAudioMixerInputSelectReg : public Decoder
3315  { // kRegAudioMixerInputSelects
3316  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3317  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3318  const UWord mainInputSrc((inRegValue ) & 0x0000000F);
3319  const UWord aux1InputSrc((inRegValue >> 4) & 0x0000000F);
3320  const UWord aux2InputSrc((inRegValue >> 8) & 0x0000000F);
3321  ostringstream oss;
3322  oss << "Main Input Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(mainInputSrc)) << " (bits 0-3)" << endl
3323  << "Aux Input 1 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux1InputSrc)) << " (bits 4-7)" << endl
3324  << "Aux Input 2 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux2InputSrc)) << " (bits 8-11)";
3325  return oss.str();
3326  }
3327  } mAudMxrInputSelDecoder;
3328 
3329  struct DecodeAudioMixerGainRegs : public Decoder
3330  { // kRegAudioMixerMainGain,
3331  // kRegAudioMixerAux1GainCh1, kRegAudioMixerAux1GainCh2,
3332  // kRegAudioMixerAux2GainCh1, kRegAudioMixerAux2GainCh2
3333  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3334  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3335  static const double kUnityGain (0x00010000);
3336  const bool atUnity (inRegValue == 0x00010000);
3337  ostringstream oss;
3338  if (atUnity)
3339  oss << "Gain: 0 dB (Unity)";
3340  else
3341  {
3342  const double dValue (inRegValue);
3343  const bool aboveUnity (inRegValue >= 0x00010000);
3344  const string plusMinus (atUnity ? "" : (aboveUnity ? "+" : "-"));
3345  const string aboveBelow (atUnity ? "at" : (aboveUnity ? "above" : "below"));
3346  const uint32_t unityDiff (aboveUnity ? inRegValue - 0x00010000 : 0x00010000 - inRegValue);
3347  const double dB (double(20.0) * ::log10(dValue/kUnityGain));
3348  oss << "Gain: " << dB << " dB, " << plusMinus << xHEX0N(unityDiff,6)
3349  << " (" << plusMinus << DEC(unityDiff) << ") " << aboveBelow << " unity gain";
3350  }
3351  return oss.str();
3352  }
3353  } mAudMxrGainDecoder;
3354 
3355  struct DecodeAudioMixerChannelSelectReg : public Decoder
3356  { // kRegAudioMixerChannelSelect
3357  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3358  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3359  ostringstream oss;
3360  const uint32_t mainChanPair((inRegValue & kRegMaskAudioMixerChannelSelect ) >> kRegShiftAudioMixerChannelSelect );
3361  const uint32_t powerOfTwo ((inRegValue & kRegMaskAudioMixerLevelSampleCount) >> kRegShiftAudioMixerLevelSampleCount);
3362  oss << "Main Input Source Channel Pair: " << ::NTV2AudioChannelPairToString(NTV2AudioChannelPair(mainChanPair)) << " (bits 0-2)" << endl
3363  << "Level Measurement Sample Count: " << DEC(ULWord(1 << powerOfTwo)) << " (bits 8-15)";
3364  return oss.str();
3365  }
3366  } mAudMxrChanSelDecoder;
3367 
3368 
3369  struct DecodeAudioMixerMutesReg : public Decoder
3370  { // kRegAudioMixerMutes
3371  protected:
3372  typedef std::bitset<16> AudioChannelSet16;
3373  typedef std::bitset<2> AudioChannelSet2;
3374  static void SplitAudioChannelSet16(const AudioChannelSet16 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3375  {
3376  outSet.clear(); outClear.clear();
3377  for (size_t ndx(0); ndx < 16; ndx++)
3378  { ostringstream oss; oss << DEC(ndx+1);
3379  if (inChSet.test(ndx))
3380  outSet.push_back(oss.str());
3381  else
3382  outClear.push_back(oss.str());
3383  }
3384  if (outSet.empty()) outSet.push_back("<none>");
3385  if (outClear.empty()) outClear.push_back("<none>");
3386  }
3387  static void SplitAudioChannelSet2(const AudioChannelSet2 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3388  {
3389  outSet.clear(); outClear.clear(); static const string LR[] = {"L", "R"};
3390  for (size_t ndx(0); ndx < 2; ndx++)
3391  if (inChSet.test(ndx))
3392  outSet.push_back(LR[ndx]);
3393  else
3394  outClear.push_back(LR[ndx]);
3395  if (outSet.empty()) outSet.push_back("<none>");
3396  if (outClear.empty()) outClear.push_back("<none>");
3397  }
3398  public:
3399  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3400  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3401  uint32_t mainOutputMuteBits ((inRegValue & kRegMaskAudioMixerOutputChannelsMute) >> kRegShiftAudioMixerOutputChannelsMute); // Bits 0-15
3402  uint32_t mainInputMuteBits ((inRegValue & kRegMaskAudioMixerMainInputEnable ) >> kRegShiftAudioMixerMainInputEnable ); // Bits 16-17
3403  uint32_t aux1InputMuteBits ((inRegValue & kRegMaskAudioMixerAux1InputEnable ) >> kRegShiftAudioMixerAux1InputEnable ); // Bits 18-19
3404  uint32_t aux2InputMuteBits ((inRegValue & kRegMaskAudioMixerAux2InputEnable ) >> kRegShiftAudioMixerAux2InputEnable ); // Bits 20-21
3405  ostringstream oss;
3406  NTV2StringList mutedMainOut, unmutedMainOut, mutedMain, unmutedMain, mutedAux1, unmutedAux1, mutedAux2, unmutedAux2;
3407  SplitAudioChannelSet16(AudioChannelSet16(mainOutputMuteBits), mutedMainOut, unmutedMainOut);
3408  SplitAudioChannelSet2(AudioChannelSet2(mainInputMuteBits), mutedMain, unmutedMain);
3409  SplitAudioChannelSet2(AudioChannelSet2(aux1InputMuteBits), mutedAux1, unmutedAux1);
3410  SplitAudioChannelSet2(AudioChannelSet2(aux2InputMuteBits), mutedAux2, unmutedAux2);
3411  oss << "Main Output Muted/Disabled Channels: " << mutedMainOut << endl // bits[0:15]
3412  << "Main Output Unmuted/Enabled Channels: " << unmutedMainOut << endl;
3413  oss << "Main Input Muted/Disabled Channels: " << mutedMain << endl // bits[16:17]
3414  << "Main Input Unmuted/Enabled Channels: " << unmutedMain << endl;
3415  oss << "Aux Input 1 Muted/Disabled Channels: " << mutedAux1 << endl // bits[18:19]
3416  << "Aux Input 1 Unmuted/Enabled Channels: " << unmutedAux1 << endl;
3417  oss << "Aux Input 2 Muted/Disabled Channels: " << mutedAux2 << endl // bits[20-21]
3418  << "Aux Input 2 Unmuted/Enabled Channels: " << unmutedAux2;
3419  return oss.str();
3420  }
3421  } mAudMxrMutesDecoder;
3422 
3423  struct DecodeAudioMixerLevelsReg : public Decoder
3424  { // kRegAudioMixerAux1InputLevels, kRegAudioMixerAux2InputLevels,
3425  // kRegAudioMixerMainInputLevelsPair0 thru kRegAudioMixerMainInputLevelsPair7,
3426  // kRegAudioMixerMixedChannelOutputLevels
3427  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3428  { AJA_UNUSED(inDeviceID);
3429  static const string sLabels[] = { "Aux Input 1", "Aux Input 2", "Main Input Audio Channels 1|2", "Main Input Audio Channels 3|4",
3430  "Main Input Audio Channels 5|6", "Main Input Audio Channels 7|8", "Main Input Audio Channels 9|10",
3431  "Main Input Audio Channels 11|12", "Main Input Audio Channels 13|14", "Main Input Audio Channels 15|16",
3432  "Main Output Audio Channels 1|2", "Main Output Audio Channels 3|4", "Main Output Audio Channels 5|6",
3433  "Main Output Audio Channels 7|8", "Main Output Audio Channels 9|10", "Main Output Audio Channels 11|12",
3434  "Main Output Audio Channels 13|14", "Main Output Audio Channels 15|16"};
3436  const uint32_t labelOffset(inRegNum - kRegAudioMixerAux1InputLevels);
3437  NTV2_ASSERT(labelOffset < 18);
3438  const string & label(sLabels[labelOffset]);
3439  const uint16_t leftLevel ((inRegValue & kRegMaskAudioMixerInputLeftLevel) >> kRegShiftAudioMixerInputLeftLevel);
3440  const uint16_t rightLevel ((inRegValue & kRegMaskAudioMixerInputRightLevel) >> kRegShiftAudioMixerInputRightLevel);
3441  ostringstream oss;
3442  oss << label << " Left Level:" << xHEX0N(leftLevel, 4) << " (" << DEC(leftLevel) << ")" << endl // bits[0:15]
3443  << label << " Right Level:" << xHEX0N(rightLevel,4) << " (" << DEC(rightLevel) << ")"; // bits[16:31]
3444  return oss.str();
3445  }
3446  } mAudMxrLevelDecoder;
3447 
3448  struct DecodeAncExtControlReg : public Decoder
3449  {
3450  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3451  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3452  ostringstream oss;
3453  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3454  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3455  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3456  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3457  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3458  << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3459  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3460  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3461  << "SD Y+C Demux: " << EnabDisab(inRegValue & BIT(30)) << endl
3462  << "Metadata from: " << (inRegValue & BIT(31) ? "LSBs" : "MSBs");
3463  return oss.str();
3464  }
3465  } mDecodeAncExtControlReg;
3466 
3467  struct DecodeAuxExtControlReg : public Decoder
3468  {
3469  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3470  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3471  ostringstream oss;
3472  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3473  oss << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3474  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3475  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3476  << "Filter inclusion: " << EnabDisab(inRegValue & BIT(29));
3477  return oss.str();
3478  }
3479  } mDecodeAuxExtControlReg;
3480 
3481  // Also used for HDMI Aux regs: regAuxExtFieldVBLStartLine, regAuxExtFID
3482  struct DecodeAncExtFieldLinesReg : public Decoder
3483  {
3484  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3485  { AJA_UNUSED(inDeviceID);
3486  ostringstream oss;
3487  const uint32_t which (inRegNum & 0x1F);
3488  const uint32_t valueLow (inRegValue & 0xFFF);
3489  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFF);
3490  switch (which)
3491  {
3492  case 5: oss << "F1 cutoff line: " << valueLow << endl // regAncExtFieldCutoffLine
3493  << "F2 cutoff line: " << valueHigh;
3494  break;
3495  case 9: oss << "F1 VBL start line: " << valueLow << endl // regAncExtFieldVBLStartLine
3496  << "F2 VBL start line: " << valueHigh;
3497  break;
3498  case 11: oss << "Field ID high on line: " << valueLow << endl // regAncExtFID
3499  << "Field ID low on line: " << valueHigh;
3500  break;
3501  case 17: oss << "F1 analog start line: " << valueLow << endl // regAncExtAnalogStartLine
3502  << "F2 analog start line: " << valueHigh;
3503  break;
3504  default:
3505  oss << "Invalid register type";
3506  break;
3507  }
3508  return oss.str();
3509  }
3510  } mDecodeAncExtFieldLines;
3511 
3512  // Also used for HDMI Aux regs: regAuxExtTotalStatus, regAuxExtField1Status, regAuxExtField2Status
3513  struct DecodeAncExtStatusReg : public Decoder
3514  {
3515  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3516  { AJA_UNUSED(inDeviceID);
3517  ostringstream oss;
3518  const uint32_t which (inRegNum & 0x1F);
3519  const uint32_t byteTotal (inRegValue & 0xFFFFFF);
3520  const bool overrun ((inRegValue & BIT(28)) ? true : false);
3521  switch (which)
3522  {
3523  case 6: oss << "Total bytes: "; break;
3524  case 7: oss << "Total F1 bytes: "; break;
3525  case 8: oss << "Total F2 bytes: "; break;
3526  default: oss << "Invalid register type"; break;
3527  }
3528  oss << DEC(byteTotal) << endl
3529  << "Overrun: " << YesNo(overrun);
3530  return oss.str();
3531  }
3532  } mDecodeAncExtStatus;
3533 
3534  // Also used for HDMI Aux Packet filtering
3535  struct DecodeAncExtIgnoreDIDReg : public Decoder
3536  {
3537  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3538  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3539  ostringstream oss;
3540  oss << "Ignoring DIDs " << HEX0N((inRegValue >> 0) & 0xFF, 2)
3541  << ", " << HEX0N((inRegValue >> 8) & 0xFF, 2)
3542  << ", " << HEX0N((inRegValue >> 16) & 0xFF, 2)
3543  << ", " << HEX0N((inRegValue >> 24) & 0xFF, 2);
3544  return oss.str();
3545  }
3546  } mDecodeAncExtIgnoreDIDs;
3547 
3548  struct DecodeAncExtAnalogFilterReg : public Decoder
3549  {
3550  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3551  { AJA_UNUSED(inDeviceID);
3552  ostringstream oss;
3553  uint32_t which (inRegNum & 0x1F);
3554  oss << "Each 1 bit specifies capturing ";
3555  switch (which)
3556  {
3557  case 18: oss << "F1 Y"; break;
3558  case 19: oss << "F2 Y"; break;
3559  case 20: oss << "F1 C"; break;
3560  case 21: oss << "F2 C"; break;
3561  default: return "Invalid register type";
3562  }
3563  oss << " line as analog, else digital";
3564  return oss.str();
3565  }
3566  } mDecodeAncExtAnalogFilter;
3567 
3568  struct DecodeAncInsValuePairReg : public Decoder
3569  {
3570  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3571  { AJA_UNUSED(inDeviceID);
3572  ostringstream oss;
3573  const uint32_t which (inRegNum & 0x1F);
3574  const uint32_t valueLow (inRegValue & 0xFFFF);
3575  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFFF);
3576 
3577  switch (which)
3578  {
3579  case 0: oss << "F1 byte count low: " << valueLow << endl
3580  << "F2 byte count low: " << valueHigh;
3581  break;
3582  case 4: oss << "HANC pixel delay: " << (valueLow & 0x3FF) << endl
3583  << "VANC pixel delay: " << (valueHigh & 0x7FF);
3584  break;
3585  case 5: oss << "F1 first active line: " << (valueLow & 0x7FF) << endl
3586  << "F2 first active line: " << (valueHigh & 0x7FF);
3587  break;
3588  case 6: oss << "Active line length: " << (valueLow & 0x7FF) << endl
3589  << "Total line length: " << (valueHigh & 0xFFF);
3590  break;
3591  case 8: oss << "Field ID high on line: " << (valueLow & 0x7FF) << endl
3592  << "Field ID low on line: " << (valueHigh & 0x7FF);
3593  break;
3594  case 11: oss << "F1 chroma blnk start line: " << (valueLow & 0x7FF) << endl
3595  << "F2 chroma blnk start line: " << (valueHigh & 0x7FF);
3596  break;
3597  case 14: oss << "F1 byte count high: " << valueLow << endl
3598  << "F2 byte count high: " << valueHigh;
3599  break;
3600  default: return "Invalid register type";
3601  }
3602  return oss.str();
3603  }
3604  } mDecodeAncInsValuePairReg;
3605 
3606  struct DecodeAncInsControlReg : public Decoder
3607  {
3608  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3609  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3610  ostringstream oss;
3611  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3612  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3613  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3614  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3615  << "Payload Y insert: " << YesNo(inRegValue & BIT(16)) << endl
3616  << "Payload C insert: " << YesNo(inRegValue & BIT(17)) << endl
3617  << "Payload F1 insert: " << YesNo(inRegValue & BIT(20)) << endl
3618  << "Payload F2 insert: " << YesNo(inRegValue & BIT(21)) << endl
3619  << "Progressive video: " << YesNo(inRegValue & BIT(24)) << endl
3620  << "Memory reads: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3621  << "SD Packet Split: " << EnabDisab(inRegValue & BIT(31));
3622  return oss.str();
3623  }
3624  } mDecodeAncInsControlReg;
3625 
3626  struct DecodeAncInsChromaBlankReg : public Decoder
3627  {
3628  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3629  { AJA_UNUSED(inDeviceID);
3630  ostringstream oss;
3631  uint32_t which (inRegNum & 0x1F);
3632 
3633  oss << "Each 1 bit specifies if chroma in ";
3634  switch (which)
3635  {
3636  case 12: oss << "F1"; break;
3637  case 13: oss << "F2"; break;
3638  default: return "Invalid register type";
3639  }
3640  oss << " should be blanked or passed thru";
3641  return oss.str();
3642  }
3643  } mDecodeAncInsChromaBlankReg;
3644 
3645  struct DecodeXptGroupReg : public Decoder
3646  { // Every byte in the reg value is an NTV2OutputXptID
3647  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3648  {
3649  static unsigned sShifts[4] = {0, 8, 16, 24};
3650  NTV2StringList strs;
3651  for (unsigned ndx(0); ndx < 4; ndx++)
3652  {
3653  const NTV2InputCrosspointID inputXpt (CNTV2RegisterExpert::GetInputCrosspointID (inRegNum, ndx));
3654  const NTV2OutputCrosspointID outputXpt (NTV2OutputCrosspointID((inRegValue >> sShifts[ndx]) & 0xFF));
3655  if (NTV2_IS_VALID_InputCrosspointID(inputXpt))
3656  {
3657  if (outputXpt != NTV2_XptBlack)
3658  {
3660  ostringstream oss;
3661  oss << ::NTV2InputCrosspointIDToString(inputXpt, false);
3662  /* Don't bother with inputXpt check, since wgtID guaranteed valid for every inputXpt seen here:
3663  if (!CNTV2SignalRouter::GetWidgetForInput (inputXpt, wgtID, inDeviceID))
3664  oss << " (unimpl)";
3665  */
3666  oss << " <== " << ::NTV2OutputCrosspointIDToString(outputXpt, false);
3667  if (!CNTV2SignalRouter::GetWidgetForOutput (outputXpt, wgtID, inDeviceID))
3668  oss << " (unimpl)";
3669  strs.push_back(oss.str());
3670  }
3671  }
3672  }
3673  return aja::join(strs, "\n");
3674  }
3675  } mDecodeXptGroupReg;
3676 
3677  struct DecodeXptValidReg : public Decoder
3678  {
3679  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3680  {
3681  NTV2_ASSERT(inRegNum >= uint32_t(kRegFirstValidXptROMRegister));
3682  NTV2_ASSERT(inRegNum < uint32_t(kRegInvalidValidXptROMRegister));
3683  ostringstream oss;
3684  NTV2InputXptID inputXpt;
3685  NTV2OutputXptIDSet outputXpts;
3686  if (CNTV2SignalRouter::GetRouteROMInfoFromReg (inRegNum, inRegValue, inputXpt, outputXpts)
3687  && NTV2_IS_VALID_InputCrosspointID(inputXpt))
3688  {
3689  NTV2StringList outputXptNames;
3690  for (NTV2OutputXptIDSetConstIter it(outputXpts.begin()); it != outputXpts.end(); ++it)
3691  {
3692  const NTV2OutputXptID outputXpt(*it);
3693  const string name(::NTV2OutputCrosspointIDToString(outputXpt,true));
3694  ostringstream ss;
3695  if (name.empty())
3696  ss << xHEX0N(outputXpt,2) << "(" << DEC(outputXpt) << ")";
3697  else
3698  ss << "'" << name << "'";
3699  outputXptNames.push_back(ss.str());
3700  }
3701  if (!outputXptNames.empty())
3702  oss << "Valid Xpts: " << outputXptNames;
3703  return oss.str();
3704  }
3705  else
3706  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3707  }
3708  } mDecodeXptValidReg;
3709 
3710  struct DecodeNTV4FSReg : public Decoder
3711  {
3712  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3713  {
3714  static const string sPixClkSelects[] = {"27", "74.1758", "74.25", "148.3516", "148.5", "inv5", "inv6", "inv7"};
3715  static const string sSyncs[] = {"Sync to Frame", "Sync to Field", "Immediate", "Sync to External"};
3716  const ULWord ntv4RegNum ((inRegNum - kNTV4FrameStoreFirstRegNum) % kNumNTV4FrameStoreRegisters);
3717  ostringstream oss;
3718  switch (NTV4FrameStoreRegs(ntv4RegNum))
3719  {
3721  { const ULWord disabled (inRegValue & BIT(1));
3722  const ULWord sync ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3723  const ULWord pixClkSel((inRegValue & (BIT(16)|BIT(17)|BIT(18))) >> 16);
3724  const ULWord pixFmt((inRegValue & (BIT(8)|BIT(9)|BIT(10)|BIT(11)|BIT(12))) >> 8);
3725  if (!disabled)
3726  oss << "Enabled: " << YesNo(!disabled) << endl
3727  << "Mode: " << ((inRegValue & BIT( 0)) ? "Capture" : "Display") << endl
3728  << "DRT_DISP: " << OnOff(inRegValue & BIT( 2)) << endl
3729  << "Fill Bit: " << DEC((inRegValue & BIT( 3)) ? 1 : 0) << endl
3730  << "Dither: " << EnabDisab(inRegValue & BIT( 4)) << endl
3731  << "RGB8 Convert: " << ((inRegValue & BIT( 5)) ? "Use '00'" : "Copy MSBs") << endl
3732  << "Progressive: " << YesNo(inRegValue & BIT( 6)) << endl
3733  << "Pixel Format: " << DEC(pixFmt) << " " << ::NTV2FrameBufferFormatToString(NTV2PixelFormat(pixFmt)) << endl
3734  << "Pix Clk Sel: " << sPixClkSelects[pixClkSel] << " MHz" << endl
3735  << "Sync: " << sSyncs[sync];
3736  else
3737  oss << "Enabled: " << YesNo(!disabled);
3738  break;
3739  }
3740  case regNTV4FS_Status:
3741  { const ULWord lineCnt ((inRegValue & (0xFFFF0000)) >> 16);
3742  oss << "Field ID: " << OddEven(inRegValue & BIT( 0)) << endl
3743  << "Line Count: " << DEC(lineCnt);
3744  break;
3745  }
3747  { const int32_t xferByteCnt((inRegValue & 0xFFFF0000) >> 16), linePitch(inRegValue & 0x0000FFFF);
3748  oss << "Line Pitch: " << linePitch << (linePitch < 0 ? " (flipped)" : "") << endl
3749  << "Xfer Byte Count: " << xferByteCnt << " [bytes/line]" << (linePitch < 0 ? " (flipped)" : "");
3750  break;
3751  }
3752  case regNTV4FS_ROIVHSize:
3753  { const ULWord ROIVSize((inRegValue & (0x0FFF0000)) >> 16), ROIHSize(inRegValue & 0x00000FFF);
3754  oss << "ROI Horz Size: " << DEC(ROIHSize) << " [pixels]" << endl
3755  << "ROI Vert Size: " << DEC(ROIVSize) << " [lines]";
3756  break;
3757  }
3760  { const ULWord ROIVOff((inRegValue & (0x0FFF0000)) >> 16), ROIHOff(inRegValue & 0x00000FFF);
3761  const string fld(ntv4RegNum == regNTV4FS_ROIF1VHOffsets ? "F1" : "F2");
3762  oss << "ROI " << fld << " Horz Offset: " << DEC(ROIHOff) << endl
3763  << "ROI " << fld << " Vert Offset: " << DEC(ROIVOff);
3764  break;
3765  }
3767  { const ULWord tot((inRegValue & (0x0FFF0000)) >> 16), act(inRegValue & 0x00000FFF);
3768  oss << "Disp Horz Active: " << DEC(act) << endl
3769  << "Disp Horz Total: " << DEC(tot);
3770  break;
3771  }
3772  case regNTV4FS_DisplayFID:
3773  { const ULWord lo((inRegValue & (0x07FF0000)) >> 16), hi(inRegValue & 0x000007FF);
3774  oss << "Disp FID Lo: " << DEC(lo) << endl
3775  << "Disp FID Hi: " << DEC(hi);
3776  break;
3777  }
3780  { const ULWord actEnd((inRegValue & (0x07FF0000)) >> 16), actStart(inRegValue & 0x000007FF);
3781  const string fld(ntv4RegNum == regNTV4FS_F1ActiveLines ? "F1" : "F2");
3782  oss << "Disp " << fld << " Active Start: " << DEC(actStart) << endl
3783  << "Disp " << fld << " Active End: " << DEC(actEnd);
3784  break;
3785  }
3787  oss << "Unpacker Horz Offset: " << DEC(inRegValue & 0x0000FFFF);
3788  break;
3791  { const ULWord hi((inRegValue & (0xFFFF0000)) >> 16), lo(inRegValue & 0x0000FFFF);
3792  const string YGorA(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Y|G" : "A");
3793  const string CbBorCrR(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Cb|B" : "Cr|R");
3794  oss << "Disp Fill " << CbBorCrR << ": " << DEC(lo) << " " << xHEX0N(lo,4) << endl
3795  << "Disp Fill " << YGorA << ": " << DEC(hi) << " " << xHEX0N(hi,4);
3796  break;
3797  }
3799  { const ULWord lo(inRegValue & 0x0000FFFF);
3800  oss << "ROI Fill Alpha: " << DEC(lo) << " " << xHEX0N(lo,4);
3801  break;
3802  }
3804  oss << "Output Timing Frame Pulse Preset: " << DEC(inRegValue & 0x00FFFFFF) << " "
3805  << xHEX0N(inRegValue & 0x00FFFFFF,6);
3806  break;
3810  { const int32_t lo (inRegValue & 0x00001FFF);
3811  oss << "Output Video Offset: " << lo << " " << xHEX0N(lo,6);
3812  break;
3813  }
3814  default:
3815  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3816  }
3817  return oss.str();
3818  }
3819  } mDecodeNTV4FSReg;
3820 
3821  struct DecodeIPv4Reg : public Decoder
3822  {
3823  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3824  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3825  ostringstream oss;
3826  oss << DEC((inRegValue & 0xFF000000) >> 24) << "." << DEC((inRegValue & 0x00FF0000) >> 16) << "." << DEC((inRegValue & 0x0000FF00) >> 8) << "." << DEC(inRegValue & 0x000000FF);
3827  return oss.str();
3828  }
3829  } mDecodeIPv4Reg;
3830 
3831  struct DecodeHDMIOutputControl : public Decoder
3832  {
3833  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3834  { AJA_UNUSED(inRegNum);
3835  ostringstream oss;
3836  static const string sHDMIStdV1[] = { "1080i", "720p", "480i", "576i", "1080p", "SXGA", "", "", "", "", "", "", "", "", "", "" };
3837  static const string sHDMIStdV2V3[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
3838  static const string sVidRates[] = { "", "60.00", "59.94", "30.00", "29.97", "25.00", "24.00", "23.98", "50.00", "48.00", "47.95", "", "", "", "", "" };
3839  static const string sSrcSampling[] = { "YC422", "RGB", "YC420", "Unknown/invalid" };
3840  static const string sBitDepth[] = { "8", "10", "12", "Unknown/invalid" };
3841  const ULWord hdmiVers (::NTV2DeviceGetHDMIVersion(inDeviceID));
3842  const ULWord rawVideoStd (inRegValue & kRegMaskHDMIOutV2VideoStd);
3843  const string hdmiVidStdStr (hdmiVers > 1 ? sHDMIStdV2V3[rawVideoStd] : (hdmiVers == 1 ? sHDMIStdV1[rawVideoStd] : ""));
3844  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
3845  const uint32_t srcSampling ((inRegValue & kRegMaskHDMISampling) >> kRegShiftHDMISampling);
3846  const uint32_t srcBPC ((inRegValue & (BIT(16)|BIT(17))) >> 16);
3847  const uint32_t txBitDepth ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3848  oss << "Video Standard: " << hdmiVidStdStr;
3849  if (hdmiVidStdStr != vidStdStr)
3850  oss << " (" << vidStdStr << ")";
3851  oss << endl
3852  << "Color Mode: " << ((inRegValue & BIT( 8)) ? "RGB" : "YCbCr") << endl
3853  << "Video Rate: " << sVidRates[(inRegValue & kLHIRegMaskHDMIOutFPS) >> kLHIRegShiftHDMIOutFPS] << endl
3854  << "Scan Mode: " << ((inRegValue & BIT(13)) ? "Progressive" : "Interlaced") << endl
3855  << "Bit Depth: " << ((inRegValue & BIT(14)) ? "10-bit" : "8-bit") << endl
3856  << "Output Color Sampling: " << ((inRegValue & BIT(15)) ? "4:4:4" : "4:2:2") << endl
3857  << "Output Bit Depth: " << sBitDepth[txBitDepth] << endl
3858  << "Src Color Sampling: " << sSrcSampling[srcSampling] << endl
3859  << "Src Bits Per Component: " << sBitDepth[srcBPC] << endl
3860  << "Output Range: " << ((inRegValue & BIT(28)) ? "Full" : "SMPTE") << endl
3861  << "Audio Channels: " << ((inRegValue & BIT(29)) ? "8" : "2") << endl
3862  << "Output: " << ((inRegValue & BIT(30)) ? "DVI" : "HDMI");
3863  if (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID) && ::NTV2DeviceGetNumHDMIVideoOutputs(inDeviceID))
3864  oss << endl
3865  << "Audio Loopback: " << OnOff(inRegValue & BIT(31));
3866  return oss.str();
3867  }
3868  } mDecodeHDMIOutputControl;
3869 
3870  struct DecodeHDMIInputStatus : public Decoder
3871  {
3872  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3873  { AJA_UNUSED(inRegNum);
3874  ostringstream oss;
3875  const ULWord hdmiVers(::NTV2DeviceGetHDMIVersion (inDeviceID));
3876  const uint32_t vidStd (hdmiVers >= 2 ? (inRegValue & kRegMaskHDMIInV2VideoStd) >> kRegShiftHDMIInV2VideoStd : (inRegValue & kRegMaskInputStatusStd) >> kRegShiftInputStatusStd);
3877  const uint32_t rate ((inRegValue & kRegMaskInputStatusFPS) >> kRegShiftInputStatusFPS);
3878  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "SXGA", "2K1080p", "2K1080i", "3840p", "4096p"};
3879  static const string sRates[32] = {"invalid", "60.00", "59.94", "30.00", "29.97", "25.00", "24.00", "23.98", "50.00", "48.00", "47.95" };
3880  oss << "HDMI Input: " << (inRegValue & BIT(0) ? "Locked" : "Unlocked") << endl
3881  << "HDMI Input: " << (inRegValue & BIT(1) ? "Stable" : "Unstable") << endl
3882  << "Color Mode: " << (inRegValue & BIT(2) ? "RGB" : "YCbCr") << endl
3883  << "Bitdepth: " << (inRegValue & BIT(3) ? "10-bit" : "8-bit") << endl
3884  << "Audio Channels: " << (inRegValue & BIT(12) ? 2 : 8) << endl
3885  << "Scan Mode: " << (inRegValue & BIT(13) ? "Progressive" : "Interlaced") << endl
3886  << "Standard: " << (inRegValue & BIT(14) ? "SD" : "HD") << endl
3887  << "Video Standard: " << sStds[vidStd] << endl
3888  << "Protocol: " << (inRegValue & BIT(27) ? "DVI" : "HDMI") << endl
3889  << "Video Rate : " << (rate < 11 ? sRates[rate] : string("invalid"));
3890  return oss.str();
3891  }
3892  } mDecodeHDMIInputStatus;
3893 
3894  struct DecodeHDMIInputControl : public Decoder
3895  {
3896  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3897  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3898  ostringstream oss;
3899  const UWord chanPair ((inRegValue & (BIT(2) | BIT(3))) >> 2);
3900  const UWord txSrcSel ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
3901  const UWord txCh12Sel ((inRegValue & (BIT(29)|BIT(30))) >> 29);
3903  oss << "HDMI In EDID Write-Enable: " << EnabDisab(inRegValue & BIT(0)) << endl
3904  << "HDMI Force Output Params: " << SetNotset(inRegValue & BIT(1)) << endl
3905  << "HDMI In Audio Chan Select: " << ::NTV2AudioChannelPairToString(pairs[chanPair], true) << endl
3906  << "hdmi_rx_8ch_src_off: " << YesNo(inRegValue & BIT(4)) << endl
3907  << "Swap HDMI In Audio Ch. 3/4: " << YesNo(inRegValue & BIT(5)) << endl
3908  << "Swap HDMI Out Audio Ch. 3/4: " << YesNo(inRegValue & BIT(6)) << endl
3909  << "HDMI Prefer 420: " << SetNotset(inRegValue & BIT(7)) << endl
3910  << "hdmi_rx_spdif_err: " << SetNotset(inRegValue & BIT(8)) << endl
3911  << "hdmi_rx_afifo_under: " << SetNotset(inRegValue & BIT(9)) << endl
3912  << "hdmi_rx_afifo_empty: " << SetNotset(inRegValue & BIT(10)) << endl
3913  << "H polarity: " << (inRegValue & BIT(16) ? "Inverted" : "Normal") << endl
3914  << "V polarity: " << (inRegValue & BIT(17) ? "Inverted" : "Normal") << endl
3915  << "F polarity: " << (inRegValue & BIT(18) ? "Inverted" : "Normal") << endl
3916  << "DE polarity: " << (inRegValue & BIT(19) ? "Inverted" : "Normal") << endl
3917  << "Tx Src Sel: " << DEC(txSrcSel) << " (" << xHEX0N(txSrcSel,4) << ")" << endl
3918  << "Tx Center Cut: " << SetNotset(inRegValue & BIT(24)) << endl
3919  << "Tx 12 bit: " << SetNotset(inRegValue & BIT(26)) << endl
3920  << "RGB Input Gamut: " << (inRegValue & BIT(28) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3921  << "Tx_ch12_sel: " << DEC(txCh12Sel) << " (" << xHEX0N(txCh12Sel,4) << ")" << endl
3922  << "Input AVI Gamut: " << (inRegValue & BIT(31) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3923  << "EDID: " << SetNotset(inRegValue & BIT(31));
3924  return oss.str();
3925  }
3926  } mDecodeHDMIInputControl;
3927 
3928  struct DecodeHDMIOutputStatus : public Decoder
3929  {
3930  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3931  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
3932  const NTV2HDMIOutputStatus stat (inRegValue);
3933  ostringstream oss;
3934  stat.Print(oss);
3935  return oss.str();
3936  }
3937  } mDecodeHDMIOutputStatus;
3938 
3939  struct DecodeHDMIOutHDRPrimary : public Decoder
3940  {
3941  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3942  { AJA_UNUSED(inRegNum);
3943  ostringstream oss;
3944  if (::NTV2DeviceCanDoHDMIHDROut(inDeviceID))
3945  switch (inRegNum)
3946  {
3949  case kRegHDMIHDRRedPrimary:
3950  case kRegHDMIHDRWhitePoint:
3967  { // Asserts to validate this one code block will handle all cases:
3974  const uint16_t xPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryX) >> kRegShiftHDMIHDRRedPrimaryX);
3975  const uint16_t yPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryY) >> kRegShiftHDMIHDRRedPrimaryY);
3976  const double xFloat (double(xPrimary) * 0.00002);
3977  const double yFloat (double(yPrimary) * 0.00002);
3978  if (NTV2_IS_VALID_HDR_PRIMARY (xPrimary))
3979  oss << "X: " << fDEC(xFloat,7,5) << endl;
3980  else
3981  oss << "X: " << HEX0N(xPrimary, 4) << "(invalid)" << endl;
3982  if (NTV2_IS_VALID_HDR_PRIMARY (yPrimary))
3983  oss << "Y: " << fDEC(yFloat,7,5);
3984  else
3985  oss << "Y: " << HEX0N(yPrimary, 4) << "(invalid)";
3986  break;
3987  }
3993  {
3994  const uint16_t minValue ((inRegValue & kRegMaskHDMIHDRMinMasteringLuminance) >> kRegShiftHDMIHDRMinMasteringLuminance);
3995  const uint16_t maxValue ((inRegValue & kRegMaskHDMIHDRMaxMasteringLuminance) >> kRegShiftHDMIHDRMaxMasteringLuminance);
3996  const double minFloat (double(minValue) * 0.00001);
3997  const double maxFloat (maxValue);
3998  oss << "Min: " << fDEC(minFloat,7,5) << endl
3999  << "Max: " << fDEC(maxFloat,7,5);
4000  break;
4001  }
4002  case kRegHDMIHDRLightLevel:
4007  {
4008  const uint16_t cntValue ((inRegValue & kRegMaskHDMIHDRMaxContentLightLevel) >> kRegShiftHDMIHDRMaxContentLightLevel);
4009  const uint16_t frmValue ((inRegValue & kRegMaskHDMIHDRMaxFrameAverageLightLevel) >> kRegShiftHDMIHDRMaxFrameAverageLightLevel);
4010  const double cntFloat (cntValue);
4011  const double frmFloat (frmValue);
4012  oss << "Max Content Light Level: " << fDEC(cntFloat,7,5) << endl
4013  << "Max Frame Light Level: " << fDEC(frmFloat,7,5);
4014  break;
4015  }
4016  default: NTV2_ASSERT(false);
4017  }
4018  return oss.str();
4019  }
4020  } mDecodeHDMIOutHDRPrimary;
4021 
4022  struct DecodeHDMIOutHDRControl : public Decoder
4023  {
4024  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4025  { AJA_UNUSED(inRegNum);
4026  static const string sEOTFs[] = {"Trad Gamma SDR", "Trad Gamma HDR", "SMPTE ST 2084", "HLG"};
4027  ostringstream oss;
4028  if (::NTV2DeviceCanDoHDMIHDROut(inDeviceID))
4029  {
4030  const uint16_t EOTFvalue ((inRegValue & kRegMaskElectroOpticalTransferFunction) >> kRegShiftElectroOpticalTransferFunction);
4031  const uint16_t staticMetaDataDescID ((inRegValue & kRegMaskHDRStaticMetadataDescriptorID) >> kRegShiftHDRStaticMetadataDescriptorID);
4032  oss << "HDMI Out Dolby Vision Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDRDolbyVisionEnable) << endl
4033  << "HDMI HDR Out Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDREnable) << endl
4034  << "Constant Luminance: " << YesNo(inRegValue & kRegMaskHDMIHDRNonContantLuminance) << endl
4035  << "EOTF: " << sEOTFs[(EOTFvalue < 3) ? EOTFvalue : 3] << endl
4036  << "Static MetaData Desc ID: " << HEX0N(staticMetaDataDescID, 2) << " (" << DEC(staticMetaDataDescID) << ")";
4037  }
4038  return oss.str();
4039  }
4040  } mDecodeHDMIOutHDRControl;
4041 
4042  struct DecodeHDMIOutMRControl : public Decoder
4043  {
4044  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4045  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4046  ostringstream oss;
4047  static const string sMRStandard[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
4048  const ULWord rawVideoStd (inRegValue & kRegMaskMRStandard);
4049  const string hdmiVidStdStr (sMRStandard[rawVideoStd]);
4050  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
4051  oss << "Video Standard: " << hdmiVidStdStr;
4052  if (hdmiVidStdStr != vidStdStr)
4053  oss << " (" << vidStdStr << ")";
4054  oss << endl
4055  << "Capture Mode: " << ((inRegValue & kRegMaskMREnable) ? "Enabled" : "Disabled");
4056  return oss.str();
4057  }
4058  } mDecodeHDMIOutMRControl;
4059 
4060  struct DecodeSDIOutputControl : public Decoder
4061  {
4062  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4063  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4064  ostringstream oss;
4065  const uint32_t vidStd (inRegValue & (BIT(0)|BIT(1)|BIT(2)));
4066  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "6", "7"};
4067  oss << "Video Standard: " << sStds[vidStd] << endl
4068  << "2Kx1080 mode: " << (inRegValue & BIT(3) ? "2048x1080" : "1920x1080") << endl
4069  << "HBlank RGB Range: Black=" << (inRegValue & BIT(7) ? "0x40" : "0x04") << endl
4070  << "12G enable: " << YesNo(inRegValue & BIT(17)) << endl
4071  << "6G enable: " << YesNo(inRegValue & BIT(16)) << endl
4072  << "3G enable: " << YesNo(inRegValue & BIT(24)) << endl
4073  << "3G mode: " << (inRegValue & BIT(25) ? "b" : "a") << endl
4074  << "VPID insert enable: " << YesNo(inRegValue & BIT(26)) << endl
4075  << "VPID overwrite enable: " << YesNo(inRegValue & BIT(27)) << endl
4076  << "DS 1 audio source: " "AudSys";
4077  switch ((inRegValue & (BIT(28)|BIT(30))) >> 28)
4078  {
4079  case 0: oss << (inRegValue & BIT(18) ? 5 : 1); break;
4080  case 1: oss << (inRegValue & BIT(18) ? 7 : 3); break;
4081  case 4: oss << (inRegValue & BIT(18) ? 6 : 2); break;
4082  case 5: oss << (inRegValue & BIT(18) ? 8 : 4); break;
4083  }
4084  oss << endl << "DS 2 audio source: AudSys";
4085  switch ((inRegValue & (BIT(29)|BIT(31))) >> 29)
4086  {
4087  case 0: oss << (inRegValue & BIT(19) ? 5 : 1); break;
4088  case 1: oss << (inRegValue & BIT(19) ? 7 : 3); break;
4089  case 4: oss << (inRegValue & BIT(19) ? 6 : 2); break;
4090  case 5: oss << (inRegValue & BIT(19) ? 8 : 4); break;
4091  }
4092  return oss.str();
4093  }
4094  } mDecodeSDIOutputControl;
4095 
4096  struct DecodeSDIOutTimingCtrl : public Decoder
4097  {
4098  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4099  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4100  ostringstream oss;
4101  const uint32_t hMask(0x00001FFF), vMask(0x1FFF0000);
4102  const uint32_t hOffset(inRegValue & hMask), vOffset((inRegValue & vMask) >> 16);
4103  oss << "Horz Offset: " << xHEX0N(UWord(hOffset),4) << endl
4104  << "Vert Offset: " << xHEX0N(UWord(vOffset),4) << endl
4105  << "E-E Timing Override: " << EnabDisab(inRegValue & BIT(31));
4106  return oss.str();
4107  }
4108  } mDecodeSDIOutTimingCtrl;
4109 
4110  struct DecodeDMAControl : public Decoder
4111  {
4112  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4113  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4114  const uint16_t gen ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
4115  const uint16_t lanes ((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16);
4116  const uint16_t fwRev ((inRegValue & 0x0000FF00) >> 8);
4117  ostringstream oss;
4118  for (uint16_t engine(0); engine < 4; engine++)
4119  oss << "DMA " << (engine+1) << " Int Active?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4120  oss << "Bus Error Int Active?: " << YesNo(inRegValue & BIT(31)) << endl;
4121  for (uint16_t engine(0); engine < 4; engine++)
4122  oss << "DMA " << (engine+1) << " Busy?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4123  oss << "Strap: " << ((inRegValue & BIT(7)) ? "Installed" : "Not Installed") << endl
4124  << "Firmware Rev: " << xHEX0N(fwRev, 2) << " (" << DEC(fwRev) << ")" << endl
4125  << "Gen: " << gen << ((gen > 0 && gen < 4) ? "" : " <invalid>") << endl
4126  << "Lanes: " << DEC(lanes) << ((lanes < 9) ? "" : " <invalid>");
4127  return oss.str();
4128  }
4129  } mDMAControlRegDecoder;
4130 
4131  struct DecodeDMAIntControl : public Decoder
4132  {
4133  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4134  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4135  ostringstream oss;
4136  for (uint16_t eng(0); eng < 4; eng++)
4137  oss << "DMA " << (eng+1) << " Enabled?: " << YesNo(inRegValue & BIT(eng)) << endl;
4138  oss << "Bus Error Enabled?: " << YesNo(inRegValue & BIT(4)) << endl;
4139  for (uint16_t eng(0); eng < 4; eng++)
4140  oss << "DMA " << (eng+1) << " Active?: " << YesNo(inRegValue & BIT(27+eng)) << endl;
4141  oss << "Bus Error: " << YesNo(inRegValue & BIT(31));
4142  return oss.str();
4143  }
4144  } mDMAIntControlRegDecoder;
4145 
4146  struct DecodeDMAXferRate : public Decoder
4147  {
4148  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4149  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4150  ostringstream oss;
4151  oss << DEC(inRegValue) << " [MB/sec] [kB/ms] [B/us]";
4152  return oss.str();
4153  }
4154  } mDMAXferRateRegDecoder;
4155 
4156  struct DecodeRP188InOutDBB : public Decoder
4157  {
4158  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4159  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4160  const bool isReceivingRP188 (inRegValue & BIT(16));
4161  const bool isReceivingSelectedRP188 (inRegValue & BIT(17));
4162  const bool isReceivingLTC (inRegValue & BIT(18));
4163  const bool isReceivingVITC (inRegValue & BIT(19));
4164  ostringstream oss;
4165  oss << "RP188: " << (isReceivingRP188 ? (isReceivingSelectedRP188 ? "Selected" : "Unselected") : "No") << " RP-188 received"
4166  << (isReceivingLTC ? " +LTC" : "") << (isReceivingVITC ? " +VITC" : "") << endl
4167  << "Bypass: " << (inRegValue & BIT(23) ? (inRegValue & BIT(22) ? "SDI In 2" : "SDI In 1") : "Disabled") << endl
4168  << "Filter: " << HEX0N((inRegValue & 0xFF000000) >> 24, 2) << endl
4169  << "DBB: " << HEX0N((inRegValue & 0x0000FF00) >> 8, 2) << " " << HEX0N(inRegValue & 0x000000FF, 2);
4170  return oss.str();
4171  }
4172  } mRP188InOutDBBRegDecoder;
4173 
4174  struct DecodeVidProcControl : public Decoder
4175  {
4176  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4177  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4178  ostringstream oss;
4179  static const string sSplitStds [8] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "?6?", "?7?"};
4180  oss << "Mode: " << (inRegValue & kRegMaskVidProcMode ? ((inRegValue & BIT(24)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4181  << "FG Control: " << (inRegValue & kRegMaskVidProcFGControl ? ((inRegValue & BIT(20)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4182  << "BG Control: " << (inRegValue & kRegMaskVidProcBGControl ? ((inRegValue & BIT(22)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4183  << "VANC Pass-Thru: " << ((inRegValue & BIT(13)) ? "Background" : "Foreground") << endl
4184  << "FG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcFGMatteEnable) << endl
4185  << "BG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcBGMatteEnable) << endl
4186  << "Input Sync: " << (inRegValue & kRegMaskVidProcSyncFail ? "not in sync" : "in sync") << endl
4187  << "Limiting: " << ((inRegValue & BIT(11)) ? "Off" : ((inRegValue & BIT(12)) ? "Legal Broadcast" : "Legal SDI")) << endl
4188  << "Split Video Std: " << sSplitStds[inRegValue & kRegMaskVidProcSplitStd];
4189  return oss.str();
4190  }
4191  } mVidProcControlRegDecoder;
4192 
4193  struct DecodeSplitControl : public Decoder
4194  {
4195  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4196  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4197  ostringstream oss;
4198  const uint32_t startmask (0x0000FFFF); // 16 bits
4199  const uint32_t slopemask (0x3FFF0000); // 14 bits / high order byte
4200  const uint32_t fractionmask(0x00000007); // 3 bits for fractions
4201  oss << "Split Start: " << HEX0N((inRegValue & startmask) & ~fractionmask, 4) << " "
4202  << HEX0N((inRegValue & startmask) & fractionmask, 4) << endl
4203  << "Split Slope: " << HEX0N(((inRegValue & slopemask) >> 16) & ~fractionmask, 4) << " "
4204  << HEX0N(((inRegValue & slopemask) >> 16) & fractionmask, 4) << endl
4205  << "Split Type: " << ((inRegValue & BIT(30)) ? "Vertical" : "Horizontal");
4206  return oss.str();
4207  }
4208  } mSplitControlRegDecoder;
4209 
4210  struct DecodeFlatMatteValue : public Decoder
4211  {
4212  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4213  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4214  ostringstream oss;
4215  const uint32_t mask (0x000003FF); // 10 bits
4216  oss << "Flat Matte Cb: " << HEX0N(inRegValue & mask, 3) << endl
4217  << "Flat Matte Y: " << HEX0N(((inRegValue >> 10) & mask) - 0x40, 3) << endl
4218  << "Flat Matte Cr: " << HEX0N((inRegValue >> 20) & mask, 3);
4219  return oss.str();
4220  }
4221  } mFlatMatteValueRegDecoder;
4222 
4223  struct DecodeEnhancedCSCMode : public Decoder
4224  {
4225  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4226  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4227  static const string sFiltSel[] = {"Full", "Simple", "None", "?"};
4228  static const string sEdgeCtrl[] = {"black", "extended pixels"};
4229  static const string sPixFmts[] = {"RGB 4:4:4", "YCbCr 4:4:4", "YCbCr 4:2:2", "?"};
4230  const uint32_t filterSelect ((inRegValue >> 12) & 0x3);
4231  const uint32_t edgeControl ((inRegValue >> 8) & 0x1);
4232  const uint32_t outPixFmt ((inRegValue >> 4) & 0x3);
4233  const uint32_t inpPixFmt (inRegValue & 0x3);
4234  ostringstream oss;
4235  oss << "Filter select: " << sFiltSel[filterSelect] << endl
4236  << "Filter edge control: " << "Filter to " << sEdgeCtrl[edgeControl] << endl
4237  << "Output pixel format: " << sPixFmts[outPixFmt] << endl
4238  << "Input pixel format: " << sPixFmts[inpPixFmt];
4239  return oss.str();
4240  }
4241  } mEnhCSCModeDecoder;
4242 
4243  struct DecodeEnhancedCSCOffset : public Decoder
4244  {
4245  static string U10Dot6ToFloat (const uint32_t inOffset)
4246  {
4247  double result (double((inOffset >> 6) & 0x3FF));
4248  result += double(inOffset & 0x3F) / 64.0;
4249  ostringstream oss; oss << fDEC(result,12,5); string resultStr(oss.str());
4250  return aja::replace (resultStr, sSpace, sNull);
4251  }
4252  static string U12Dot4ToFloat (const uint32_t inOffset)
4253  {
4254  double result (double((inOffset >> 4) & 0xFFF));
4255  result += double(inOffset & 0xF) / 16.0;
4256  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4257  return aja::replace (resultStr, sSpace, sNull);
4258  }
4259  static string S13Dot2ToFloat (const uint32_t inOffset)
4260  {
4261  double result (double((inOffset >> 2) & 0x1FFF));
4262  result += double(inOffset & 0x3) / 4.0;
4263  if (inOffset & BIT(15))
4264  result = -result;
4265  ostringstream oss; oss << fDEC(result,12,2); string resultStr(oss.str());
4266  return aja::replace (resultStr, sSpace, sNull);
4267  }
4268  static string S11Dot4ToFloat (const uint32_t inOffset)
4269  {
4270  double result (double((inOffset >> 4) & 0x7FF));
4271  result += double(inOffset & 0xF) / 16.0;
4272  if (inOffset & BIT(15))
4273  result = -result;
4274  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4275  return aja::replace (resultStr, sSpace, sNull);
4276  }
4277  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4278  { AJA_UNUSED(inDeviceID);
4279  const uint32_t regNum (inRegNum & 0x1F);
4280  const uint32_t lo (inRegValue & 0x0000FFFF);
4281  const uint32_t hi ((inRegValue >> 16) & 0xFFFF);
4282  ostringstream oss;
4283  switch (regNum)
4284  {
4285  case 1: oss << "Component 0 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4286  << "Component 1 input offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4287  break;
4288  case 2: oss << "Component 2 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4289  break;
4290  case 12: oss << "Component A output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4291  << "Component B output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4292  break;
4293  case 13: oss << "Component C output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4294  break;
4295  case 15: oss << "Key input offset: " << S13Dot2ToFloat(lo) << " (12-bit), " << S11Dot4ToFloat(lo) << " (10-bit)" << endl
4296  << "Key output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4297  break;
4298  default: break;
4299  }
4300  return oss.str();
4301  }
4302  } mEnhCSCOffsetDecoder;
4303 
4304  struct DecodeEnhancedCSCKeyMode : public Decoder
4305  {
4306  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4307  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4308  static const string sSrcSel[] = {"Key Input", "Video Y Input"};
4309  static const string sRange[] = {"Full Range", "SMPTE Range"};
4310  const uint32_t keySrcSelect (inRegValue & 0x1);
4311  const uint32_t keyOutRange ((inRegValue >> 4) & 0x1);
4312  ostringstream oss;
4313  oss << "Key Source Select: " << sSrcSel[keySrcSelect] << endl
4314  << "Key Output Range: " << sRange[keyOutRange];
4315  return oss.str();
4316  }
4317  } mEnhCSCKeyModeDecoder;
4318 
4319  struct DecodeEnhancedCSCCoefficient : public Decoder
4320  {
4321  static string S2Dot15ToFloat (const uint32_t inCoefficient)
4322  {
4323  double result = (double((inCoefficient >> 15) & 0x3));
4324  result += double(inCoefficient & 0x7FFF) / 32768.0;
4325  if (inCoefficient & BIT(17))
4326  result = -result;
4327  ostringstream oss; oss << fDEC(result,12,10); string resultStr(oss.str());
4328  return aja::replace(resultStr, sSpace, sNull);
4329  }
4330  static string S12Dot12ToFloat (const uint32_t inCoefficient)
4331  {
4332  double result(double((inCoefficient >> 12) & 0xFFF));
4333  result += double(inCoefficient & 0xFFF) / 4096.0;
4334  if (inCoefficient & BIT(24))
4335  result = -result;
4336  ostringstream oss; oss << fDEC(result,12,6); string resultStr(oss.str());
4337  return aja::replace(resultStr, sSpace, sNull);
4338  }
4339  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4340  { AJA_UNUSED(inDeviceID);
4341  uint32_t regNum (inRegNum & 0x1F);
4342  ostringstream oss;
4343  if (regNum > 2 && regNum < 12)
4344  {
4345  regNum -= 3;
4346  static const string sCoeffNames[] = {"A0", "A1", "A2", "B0", "B1", "B2", "C0", "C1", "C2"};
4347  const uint32_t coeff ((inRegValue >> 9) & 0x0003FFFF);
4348  oss << sCoeffNames[regNum] << " coefficient: " << S2Dot15ToFloat(coeff) << " (" << xHEX0N(coeff,8) << ")";
4349  }
4350  else if (regNum == 16)
4351  {
4352  const uint32_t gain ((inRegValue >> 4) & 0x01FFFFFF);
4353  oss << "Key gain: " << S12Dot12ToFloat(gain) << " (" << HEX0N(gain,8) << ")";
4354  }
4355  return oss.str();
4356  }
4357  } mEnhCSCCoeffDecoder;
4358 
4359  struct DecodeCSCoeff1234 : public Decoder
4360  {
4361  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4362  { AJA_UNUSED(inDeviceID);
4363  const uint32_t coeff1 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4364  const uint32_t coeff2 ((inRegValue >> 14) & 0x00001FFF);
4365  uint16_t nCoeff1(1), nCoeff2(2);
4366  switch(inRegNum)
4367  {
4370  nCoeff1 = 3; nCoeff2 = 4; break;
4371  }
4372  // kRegCS?Coefficients1_2 kRegCS?Coefficients3_4
4373  // CSC 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
4374  // RegNum 142 147 291 296 347 460 465 470 143 148 292 297 348 461 466 471
4375  // kRegCS?Coefficients1_2: kK2RegMaskVidKeySyncStatus = BIT(28) 0=OK 1=SyncFail GetColorSpaceVideoKeySyncFail
4376  // kRegCS?Coefficients1_2: kK2RegMaskMakeAlphaFromKeySelect = BIT(29) 0=No 1=Yes GetColorSpaceMakeAlphaFromKey
4377  // kRegCS?Coefficients1_2: kK2RegMaskColorSpaceMatrixSelect = BIT(30) 0=Rec709 1=Rec601 GetColorSpaceMatrixSelect
4378  // kRegCS?Coefficients1_2: kK2RegMaskUseCustomCoefSelect = BIT(31) 0=No 1=Yes GetColorSpaceUseCustomCoefficient
4379  // kRegCS?Coefficients3_4: kK2RegMaskXena2RGBRange = BIT(31) 0=Full 1=SMPTE GetColorSpaceRGBBlackRange
4380  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients
4381  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients
4382  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients12Bit
4383  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients12Bit
4384  ostringstream oss;
4385  if (nCoeff1 == 1)
4386  oss << "Video Key Sync Status: " << (inRegValue & BIT(28) ? "SyncFail" : "OK") << endl
4387  << "Make Alpha From Key Input: " << EnabDisab(inRegValue & BIT(29)) << endl
4388  << "Matrix Select: " << (inRegValue & BIT(30) ? "Rec601" : "Rec709") << endl
4389  << "Use Custom Coeffs: " << YesNo(inRegValue & BIT(31)) << endl;
4390  else
4391  oss << "RGB Range: " << (inRegValue & BIT(31) ? "SMPTE (0x040-0x3C0)" : "Full (0x000-0x3FF)") << endl;
4392  oss << "Coefficient" << DEC(nCoeff1) << ": " << xHEX0N(coeff1, 4) << endl
4393  << "Coefficient" << DEC(nCoeff2) << ": " << xHEX0N(coeff2, 4);
4394  return oss.str();
4395  }
4396  } mCSCoeff1234Decoder;
4397 
4398  struct DecodeCSCoeff567890 : public Decoder
4399  {
4400  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4401  { AJA_UNUSED(inDeviceID);
4402  const uint32_t coeff5 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4403  const uint32_t coeff6 ((inRegValue >> 14) & 0x00001FFF);
4404  uint16_t nCoeff5(5), nCoeff6(6);
4405  switch(inRegNum)
4406  {
4409  nCoeff5 = 7; nCoeff6 = 8; break;
4412  nCoeff5 = 9; nCoeff6 = 10; break;
4413  }
4414  // kRegCS?Coefficients5_6 kRegCS?Coefficients7_8 kRegCS?Coefficients9_10
4415  // CSC 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
4416  // RegNum 143 148 292 297 348 461 466 471 144 149 293 298 349 462 467 472 145 150 294 299 350 463 468 473
4417  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients
4418  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients
4419  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients12Bit
4420  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients12Bit
4421  ostringstream oss;
4422  oss << "Coefficient" << DEC(nCoeff5) << ": " << xHEX0N(coeff5, 4) << endl
4423  << "Coefficient" << DEC(nCoeff6) << ": " << xHEX0N(coeff6, 4);
4424  return oss.str();
4425  }
4426  } mCSCoeff567890Decoder;
4427 
4428  struct DecodeLUTV1ControlReg : public Decoder // kRegCh1ColorCorrectionControl (68), kRegCh2ColorCorrectionControl (69)
4429  {
4430  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4431  {
4432  static const string sModes[] = {"Off", "RGB", "YCbCr", "3-Way", "Invalid"};
4433  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4434  const UWord saturation (UWord(inRegValue & kRegMaskSaturationValue));
4435  const UWord mode (UWord((inRegValue & kRegMaskCCMode) >> kRegShiftCCMode));
4436  const bool outBankSelect (((inRegValue & kRegMaskCCOutputBankSelect) >> kRegShiftCCOutputBankSelect) ? true : false);
4437  const bool cc5HostBank (((inRegValue & kRegMaskCC5HostAccessBankSelect) >> kRegShiftCC5HostAccessBankSelect) ? true : false);
4438  const bool cc5OutputBank (((inRegValue & kRegMaskCC5OutputBankSelect) >> kRegShiftCC5OutputBankSelect) ? true : false);
4439  const bool cc5Select (((inRegValue & kRegMaskLUT5Select) >> kRegShiftLUT5Select) ? true : false);
4440  const bool ccConfig2 (((inRegValue & kRegMaskLUTSelect) >> kRegShiftLUTSelect) ? true : false);
4441  const bool cc3BankSel (((inRegValue & kRegMaskCC3OutputBankSelect) >> kRegShiftCC3OutputBankSelect) ? true : false);
4442  const bool cc4BankSel (((inRegValue & kRegMaskCC4OutputBankSelect) >> kRegShiftCC4OutputBankSelect) ? true : false);
4443  NTV2_ASSERT(mode < 4);
4444  ostringstream oss;
4445  if (lutVersion != 1)
4446  oss << "(Register data relevant for V1 LUT, this device has V" << DEC(lutVersion) << " LUT)";
4447  else
4448  {
4449  oss << "LUT Saturation Value: " << xHEX0N(saturation,4) << " (" << DEC(saturation) << ")" << endl
4450  << "LUT Output Bank Select: " << SetNotset(outBankSelect) << endl
4451  << "LUT Mode: " << sModes[mode] << " (" << DEC(mode) << ")";
4452  if (inRegNum == kRegCh1ColorCorrectionControl)
4453  oss << endl
4454  << "LUT5 Host Bank Select: " << SetNotset(cc5HostBank) << endl
4455  << "LUT5 Output Bank Select: " << SetNotset(cc5OutputBank) << endl
4456  << "LUT5 Select: " << SetNotset(cc5Select) << endl
4457  << "Config 2nd LUT Set: " << YesNo(ccConfig2);
4458  }
4459  oss << endl
4460  << "LUT3 Bank Select: " << SetNotset(cc3BankSel) << endl
4461  << "LUT4 Bank Select: " << SetNotset(cc4BankSel);
4462  return oss.str();
4463  }
4464  } mLUTV1ControlRegDecoder;
4465 
4466  struct DecodeLUTV2ControlReg : public Decoder // kRegLUTV2Control 376
4467  {
4468  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4469  { AJA_UNUSED(inRegNum);
4470  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4471  ostringstream oss;
4472  if (lutVersion != 2)
4473  oss << "(Register data relevant for V2 LUT, this device has V" << DEC(lutVersion) << "LUT)";
4474  else
4475  {
4476  for (UWord lutNum(0); lutNum < 8; lutNum++)
4477  oss << "LUT" << DEC(lutNum+1) << " Enabled: " << (YesNo(inRegValue & (1<<lutNum))) << endl
4478  << "LUT" << DEC(lutNum+1) << " Host Access Bank Select: " << (inRegValue & (1<<(lutNum+8)) ? '1' : '0') << endl
4479  << "LUT" << DEC(lutNum+1) << " Output Bank Select: " << (inRegValue & (1<<(lutNum+16)) ? '1' : '0') << endl;
4480  oss << "12-Bit LUT mode: " << ((inRegValue & BIT(28)) ? "12-bit" : "10-bit") << endl
4481  << "12-Bit LUT page reg: " << DEC(UWord((inRegValue & (BIT(24)|BIT(25))) >> 24));
4482  }
4483  return oss.str();
4484  }
4485  } mLUTV2ControlRegDecoder;
4486 
4487  struct DecodeLUT : public Decoder
4488  {
4489  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4490  { AJA_UNUSED(inDeviceID);
4492  const bool isRed(inRegNum >= RedReg && inRegNum < GreenReg), isGreen(inRegNum >= GreenReg && inRegNum < BlueReg), isBlue(inRegNum>=BlueReg);
4493  NTV2_ASSERT(isRed||isGreen||isBlue);
4494  ostringstream oss;
4495  // Within each 32-bit LUT word are stored two 10-bit values:
4496  // - bits <31:22> ==> LUT[2i+1]
4497  // - bits <15:6> ==> LUT[2i]
4498  const string label(isRed ? "Red[" : (isGreen ? "Green[" : "Blue["));
4499  const ULWord ndx((inRegNum - (isRed ? RedReg : (isGreen ? GreenReg : BlueReg))) * 2);
4500  const ULWord lo((inRegValue >> kRegColorCorrectionLUTEvenShift) & 0x000003FF);
4501  const ULWord hi((inRegValue >> kRegColorCorrectionLUTOddShift) & 0x000003FF);
4502  oss << label << DEC0N(ndx+0,3) << "]: " << DEC0N(lo,3) << endl
4503  << label << DEC0N(ndx+1,3) << "]: " << DEC0N(hi,3);
4504  return oss.str();
4505  }
4506  } mLUTDecoder;
4507 
4508  struct DecodeSDIErrorStatus : public Decoder
4509  {
4510  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4511  { AJA_UNUSED(inRegNum);
4512  ostringstream oss;
4513  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4514  oss << "Unlock Tally: " << DEC(inRegValue & 0x7FFF) << endl
4515  << "Locked: " << YesNo(inRegValue & BIT(16)) << endl
4516  << "Link A VPID Valid: " << YesNo(inRegValue & BIT(20)) << endl
4517  << "Link B VPID Valid: " << YesNo(inRegValue & BIT(21)) << endl
4518  << "TRS Error Detected: " << YesNo(inRegValue & BIT(24));
4519  return oss.str();
4520  }
4521  } mSDIErrorStatusRegDecoder;
4522 
4523  struct DecodeSDIErrorCount : public Decoder
4524  {
4525  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4526  { AJA_UNUSED(inRegNum);
4527  ostringstream oss;
4528  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4529  oss << "Link A: " << DEC(inRegValue & 0x0000FFFF) << endl
4530  << "Link B: " << DEC((inRegValue & 0xFFFF0000) >> 16);
4531  return oss.str();
4532  }
4533  } mSDIErrorCountRegDecoder;
4534 
4535  struct DecodeDriverVersion : public Decoder
4536  {
4537  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4538  { AJA_UNUSED(inDeviceID);
4539  NTV2_ASSERT(inRegNum == kVRegDriverVersion);
4540  ULWord vMaj(NTV2DriverVersionDecode_Major(inRegValue)), vMin(NTV2DriverVersionDecode_Minor(inRegValue));
4541  ULWord vDot(NTV2DriverVersionDecode_Point(inRegValue)), vBld(NTV2DriverVersionDecode_Build(inRegValue));
4542  ULWord buildType((inRegValue >> 30) & 0x00000003);
4543  static const string sBuildTypes[] = { "Release", "Beta", "Alpha", "Development"};
4544  static const string sBldTypes[] = { "", "b", "a", "d"};
4545  ostringstream oss;
4546  oss << "Driver Version: " << DEC(vMaj) << "." << DEC(vMin) << "." << DEC(vDot);
4547  if (buildType) oss << sBldTypes[buildType] << DEC(vBld);
4548  oss << endl
4549  << "Major Version: " << DEC(vMaj) << endl
4550  << "Minor Version: " << DEC(vMin) << endl
4551  << "Point Version: " << DEC(vDot) << endl
4552  << "Build Type: " << sBuildTypes[buildType] << endl
4553  << "Build Number: " << DEC(vBld);
4554  return oss.str();
4555  }
4556  } mDriverVersionDecoder;
4557 
4558  struct DecodeFourCC : public Decoder
4559  {
4560  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4561  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4562  return NTV2_HEADER::FourCCToString(inRegValue);
4563  }
4564  } mDecodeFourCC;
4565 
4566  struct DecodeDriverType : public Decoder
4567  {
4568  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4569  { AJA_UNUSED(inDeviceID);
4570  ostringstream oss;
4571  #if defined(AJAMac)
4572  if (inRegValue == 0x44455854) // 'DEXT'
4573  oss << "DriverKit ('DEXT')";
4574  else if (inRegValue)
4575  oss << "(Unknown/Invalid " << xHEX0N(inRegValue,8) << ")";
4576  else
4577  oss << "Kernel Extension ('KEXT')";
4578  #else
4579  (void) inRegValue;
4580  oss << "(Normal)";
4581  #endif
4582  return oss.str();
4583  }
4584  } mDecodeDriverType;
4585 
4586  struct DecodeVDevReady : public Decoder
4587  {
4588  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4589  { AJA_UNUSED(inRegNum); AJA_UNUSED(inDeviceID);
4590  ostringstream oss;
4591  if (inRegValue)
4592  { string s (CNTV2RegisterExpert::GetDisplayName (inRegValue));
4593  oss << "VDev will set ";
4594  if (s.empty())
4595  oss << "register " << DEC(inRegValue);
4596  else
4597  oss << s;
4598  oss << " when 'IsReady'";
4599  }
4600  return oss.str();
4601  }
4602  } mDecodeVDevReady;
4603 
4604  struct DecodeIDSwitchStatus : public Decoder
4605  {
4606  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4607  { AJA_UNUSED(inRegNum);
4608  ostringstream oss;
4609  if (::NTV2DeviceCanDoIDSwitch(inDeviceID))
4610  {
4611  const uint32_t switchEnableBits (((inRegValue & 0x0F000000) >> 20) | ((inRegValue & 0xF0000000) >> 28));
4612  for (UWord idSwitch(0); idSwitch < 4; )
4613  {
4614  const uint32_t switchEnabled (switchEnableBits & BIT(idSwitch));
4615  oss << "Switch " << DEC(++idSwitch) << ": " << (switchEnabled ? "Enabled" : "Disabled");
4616  if (idSwitch < 4)
4617  oss << endl;
4618  }
4619  }
4620  else
4621  oss << "(ID Switch not supported)";
4622  return oss.str();
4623  }
4624  } mDecodeIDSwitchStatus;
4625 
4626  struct DecodePWMFanControl : public Decoder
4627  {
4628  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4629  { AJA_UNUSED(inRegNum);
4630  ostringstream oss;
4631  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4632  oss << "Fan Speed: " << DEC(inRegValue & kRegMaskPWMFanSpeed) << endl
4633  << "Fan Control Enabled: " << ((inRegValue & kRegMaskPWMFanSpeedControl) ? "Enabled" : "Disabled");
4634  return oss.str();
4635  }
4636  } mDecodePWMFanControl;
4637 
4638  struct DecodePWMFanMonitor : public Decoder
4639  {
4640  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4641  { AJA_UNUSED(inRegNum);
4642  ostringstream oss;
4643  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4644  oss << "Tach Period: " << DEC(inRegValue & kRegMaskPWMFanTachPeriodStatus) << endl
4645  << "Fan Status: " << ((inRegValue & kRegMaskPWMFanStatus) ? "Stopped" : "Running");
4646  return oss.str();
4647  }
4648  } mDecodePWMFanMonitor;
4649 
4650  struct DecodeBOBStatus : public Decoder
4651  {
4652  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4653  { AJA_UNUSED(inRegNum);
4654  ostringstream oss;
4655  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4656  oss << "Break Out Board: " << ((inRegValue & kRegMaskBOBAbsent) ? "Disconnected" : "Connected") << endl
4657  << "ADAV801 Initialization: " << ((inRegValue & kRegMaskBOBADAV801UpdateStatus) ? "Complete" : "In Progress") << endl
4658  << "ADAV801 DIR Locked(Debug): " << DEC(inRegValue & kRegMaskBOBADAV801DIRLocked);
4659  else
4660  oss << "Device does not support a breakout board";
4661  return oss.str();
4662  }
4663  } mDecodeBOBStatus;
4664 
4665  struct DecodeBOBGPIIn : public Decoder
4666  {
4667  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4668  { AJA_UNUSED(inRegNum);
4669  ostringstream oss;
4670  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4671  oss << "GPI In 1: " << DEC(inRegValue & kRegMaskBOBGPIIn1Data) << endl
4672  << "GPI In 2: " << DEC(inRegValue & kRegMaskBOBGPIIn2Data) << endl
4673  << "GPI In 3: " << DEC(inRegValue & kRegMaskBOBGPIIn3Data) << endl
4674  << "GPI In 4: " << DEC(inRegValue & kRegMaskBOBGPIIn4Data) ;
4675  else
4676  oss << "Device does not support a breakout board";
4677  return oss.str();
4678  }
4679  } mDecodeBOBGPIIn;
4680 
4681  struct DecodeBOBGPIInInterruptControl : public Decoder
4682  {
4683  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4684  { AJA_UNUSED(inRegNum);
4685  ostringstream oss;
4686  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4687  oss << "GPI In 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn1InterruptControl) << endl
4688  << "GPI In 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn2InterruptControl) << endl
4689  << "GPI In 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn3InterruptControl) << endl
4690  << "GPI In 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn4InterruptControl) ;
4691  else
4692  oss << "Device does not support a breakout board";
4693  return oss.str();
4694  }
4695  } mDecodeBOBGPIInInterruptControl;
4696 
4697  struct DecodeBOBGPIOut : public Decoder
4698  {
4699  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4700  { AJA_UNUSED(inRegNum);
4701  ostringstream oss;
4702  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4703  oss << "GPI Out 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut1Data) << endl
4704  << "GPI Out 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut2Data) << endl
4705  << "GPI Out 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut3Data) << endl
4706  << "GPI Out 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut4Data);
4707  else
4708  oss << "Device does not support a breakout board";
4709  return oss.str();
4710  }
4711  } mDecodeBOBGPIOut;
4712 
4713  struct DecodeBOBAudioControl : public Decoder
4714  {
4715  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4716  { AJA_UNUSED(inRegNum);
4717  ostringstream oss;
4718  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4719  {
4720  static const NTV2StringList dBuLabels = {"+24dBu", "+18dBu", "+12dBu", "+15dBu", ""};
4721  oss << "ADC/DAC Re-init: " << DEC(inRegValue & kRegMaskBOBADAV801Reset) << endl
4722  << "Analog Level Control: " << dBuLabels.at(inRegValue & kRegMaskBOBAnalogLevelControl) << endl
4723  << "Analog Select: " << DEC(inRegValue & kRegMaskBOBAnalogInputSelect);
4724  }
4725  else
4726  oss << "Device does not support a breakout board";
4727  return oss.str();
4728  }
4729  } mDecodeBOBAudioControl;
4730 
4731  struct DecodeLEDControl : public Decoder
4732  {
4733  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4734  { AJA_UNUSED(inRegNum);
4735  ostringstream oss;
4736  if (::NTV2DeviceHasBracketLED(inDeviceID))
4737  oss << "Blue: " << DEC(inRegValue & kRegMaskLEDBlueControl) << endl
4738  << "Green: " << DEC(inRegValue & kRegMaskLEDGreenControl) << endl
4739  << "Red: " << DEC(inRegValue & kRegMaskLEDRedControl);
4740  else
4741  oss << "Device does not support a breakout board";
4742  return oss.str();
4743  }
4744  } mDecodeLEDControl;
4745 
4746  static const int NOREADWRITE = 0;
4747  static const int READONLY = 1;
4748  static const int WRITEONLY = 2;
4749  static const int READWRITE = 3;
4750 
4751  static const int CONTAINS = 0;
4752  static const int STARTSWITH = 1;
4753  static const int ENDSWITH = 2;
4754  static const int EXACTMATCH = 3;
4755 
4756  typedef map <uint32_t, const Decoder *> RegNumToDecoderMap;
4757  typedef pair <uint32_t, const Decoder *> RegNumToDecoderPair;
4758  typedef multimap <string, uint32_t> RegClassToRegNumMMap, StringToRegNumMMap;
4759  typedef pair <string, uint32_t> StringToRegNumPair;
4760  typedef RegClassToRegNumMMap::const_iterator RegClassToRegNumConstIter;
4761  typedef StringToRegNumMMap::const_iterator StringToRegNumConstIter;
4762 
4763  typedef pair <uint32_t, uint32_t> XptRegNumAndMaskIndex; // First: register number; second: mask index (0=0x000000FF, 1=0x0000FF00, 2=0x00FF0000, 3=0xFF000000)
4764  typedef map <NTV2InputCrosspointID, XptRegNumAndMaskIndex> InputXpt2XptRegNumMaskIndexMap;
4765  typedef map <XptRegNumAndMaskIndex, NTV2InputCrosspointID> XptRegNumMaskIndex2InputXptMap;
4766  typedef InputXpt2XptRegNumMaskIndexMap::const_iterator InputXpt2XptRegNumMaskIndexMapConstIter;
4767  typedef XptRegNumMaskIndex2InputXptMap::const_iterator XptRegNumMaskIndex2InputXptMapConstIter;
4768 
4769 private: // INSTANCE DATA
4770  mutable AJALock mGuardMutex;
4771  RegNumToStringMap mRegNumToStringMap;
4772  RegNumToDecoderMap mRegNumToDecoderMap;
4773  RegClassToRegNumMMap mRegClassToRegNumMMap;
4774  StringToRegNumMMap mStringToRegNumMMap;
4775  mutable NTV2StringSet mAllRegClasses; // Mutable -- caches results from 'const' method GetAllRegisterClasses
4776  InputXpt2XptRegNumMaskIndexMap mInputXpt2XptRegNumMaskIndexMap;
4777  XptRegNumMaskIndex2InputXptMap mXptRegNumMaskIndex2InputXptMap;
4778 
4779 }; // RegisterExpert
4780 
4781 
4782 static RegisterExpertPtr gpRegExpert; // Points to Register Expert Singleton
4784 
4785 
4786 RegisterExpertPtr RegisterExpert::GetInstance(const bool inCreateIfNecessary)
4787 {
4789  if (!gpRegExpert && inCreateIfNecessary)
4791  return gpRegExpert;
4792 }
4793 
4795 {
4797  if (!gpRegExpert)
4798  return false;
4800  return true;
4801 }
4802 
4804 {
4807  return pInst ? true : false;
4808 }
4809 
4811 {
4814  return pInst ? true : false;
4815 }
4816 
4818 {
4821  return pInst ? pInst->DisposeInstance() : false;
4822 }
4823 
4824 string CNTV2RegisterExpert::GetDisplayName (const uint32_t inRegNum)
4825 {
4828  if (pRegExpert)
4829  return pRegExpert->RegNameToString(inRegNum);
4830 
4831  ostringstream oss; oss << "Reg ";
4832  if (inRegNum <= kRegNumRegisters)
4833  oss << DEC(inRegNum);
4834  else if (inRegNum <= 0x0000FFFF)
4835  oss << xHEX0N(inRegNum,4);
4836  else
4837  oss << xHEX0N(inRegNum,8);
4838  return oss.str();
4839 }
4840 
4841 string CNTV2RegisterExpert::GetDisplayValue (const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID)
4842 {
4845  return pRegExpert ? pRegExpert->RegValueToString(inRegNum, inRegValue, inDeviceID) : string();
4846 }
4847 
4848 bool CNTV2RegisterExpert::IsRegisterInClass (const uint32_t inRegNum, const string & inClassName)
4849 {
4852  return pRegExpert ? pRegExpert->IsRegInClass(inRegNum, inClassName) : false;
4853 }
4854 
4856 {
4859  return pRegExpert ? pRegExpert->GetAllRegisterClasses() : NTV2StringSet();
4860 }
4861 
4862 NTV2StringSet CNTV2RegisterExpert::GetRegisterClasses (const uint32_t inRegNum, const bool inRemovePrefix)
4863 {
4866  return pRegExpert ? pRegExpert->GetRegisterClasses(inRegNum, inRemovePrefix) : NTV2StringSet();
4867 }
4868 
4870 {
4873  return pRegExpert ? pRegExpert->GetRegistersForClass(inClassName) : NTV2RegNumSet();
4874 }
4875 
4877 {
4880  return NTV2_IS_VALID_CHANNEL(inChannel) ? (pRegExpert ? pRegExpert->GetRegistersForClass(gChlClasses[inChannel]):NTV2RegNumSet()) : NTV2RegNumSet();
4881 }
4882 
4883 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersForDevice (const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude)
4884 {
4887  return pRegExpert ? pRegExpert->GetRegistersForDevice(inDeviceID, inOtherRegsToInclude) : NTV2RegNumSet();
4888 }
4889 
4890 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersWithName (const string & inName, const int inSearchStyle)
4891 {
4894  return pRegExpert ? pRegExpert->GetRegistersWithName(inName, inSearchStyle) : NTV2RegNumSet();
4895 }
4896 
4897 NTV2InputCrosspointID CNTV2RegisterExpert::GetInputCrosspointID (const uint32_t inXptRegNum, const uint32_t inMaskIndex)
4898 {
4901  return pRegExpert ? pRegExpert->GetInputCrosspointID(inXptRegNum, inMaskIndex) : NTV2_INPUT_CROSSPOINT_INVALID;
4902 }
4903 
4904 bool CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo (const NTV2InputCrosspointID inInputXpt, uint32_t & outXptRegNum, uint32_t & outMaskIndex)
4905 {
4908  return pRegExpert ? pRegExpert->GetXptRegNumAndMaskIndex(inInputXpt, outXptRegNum, outMaskIndex) : false;
4909 }
Anc Field2 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
std::string NTV2FrameGeometryToString(const NTV2FrameGeometry inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6982
std::string NTV2AudioSystemToString(const NTV2AudioSystem inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:5749
static bool DisposeInstance(void)
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information...
Definition: ntv2enums.h:3901
Declares the AJALock class.
UWord NTV2DeviceGetNumLTCInputs(const NTV2DeviceID inDeviceID)
#define kRegColorCorrectionLUTOddShift
#define ActInact(__x__)
#define kRegClass_Channel2
static const ULWord kNumNTV4FrameStoreRegisters(regNTV4FS_REGISTER_COUNT)
#define kRegClass_VPID
NTV2InputCrosspointID GetInputCrosspointID(const uint32_t inXptRegNum, const uint32_t inMaskIndex) const
#define DEC0N(__x__, __n__)
Declares CNTV2SignalRouter class.
#define BIT(_x_)
Definition: ajatypes.h:496
#define kRegColorCorrectionLUTEvenShift
NTV2StringSet::const_iterator NTV2StringSetConstIter
Declares the AJADebug class.
#define kRegClass_AES
Declares the CNTV2VPID class. See SMPTE 352 standard for details.
#define EnabDisab(__x__)
#define kRegClass_Output
bool NTV2DeviceHasNTV4FrameStores(const NTV2DeviceID inDeviceID)
#define kRegClass_NULL
#define kColorCorrectionLUTOffset_Green
bool NTV2DeviceHasLPProductCode(const NTV2DeviceID inDeviceID)
ULWord NTV2DeviceGetLUTVersion(const NTV2DeviceID inDeviceID)
bool NTV2DeviceCanDo425Mux(const NTV2DeviceID inDeviceID)
static int32_t Decrement(int32_t volatile *pTarget)
Definition: atomic.cpp:95
#define kRegClass_Info
bool NTV2DeviceCanDo12GSDI(const NTV2DeviceID inDeviceID)
static NTV2RegNumSet GetRegistersForClass(const std::string &inClassName)
#define kColorCorrectionLUTOffset_Blue
#define kRegClass_Input
bool NTV2DeviceCanDoEnhancedCSC(const NTV2DeviceID inDeviceID)
UWord NTV2DeviceGetNumSerialPorts(const NTV2DeviceID inDeviceID)
static const std::string sNTV4FrameStoreRegNames[]
This selects audio channels 5 and 6 (Group 2 channels 1 and 2)
Definition: ntv2enums.h:3140
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:71
static const ULWord kNTV4FrameStoreFirstRegNum(0x0000D000/sizeof(ULWord))
#define kRegClass_IP
std::string NTV2DownConvertModeToString(const NTV2DownConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6609
UWord NTV2DeviceGetNumCSCs(const NTV2DeviceID inDeviceID)
if(!(riid==IID_IUnknown) &&!(riid==IID_IClassFactory))
Definition: dllentry.cpp:196
I am a reference-counted pointer template class. I am intended to be a proxy for an underlying object...
Definition: ajarefptr.h:89
Definition: lock.h:28
Defines a number of handy byte-swapping macros.
static bool Deallocate(void)
Explicitly deallocates the Register Expert singleton.
This selects audio channels 7 and 8 (Group 2 channels 3 and 4)
Definition: ntv2enums.h:3141
#define kRegClass_Timecode
Defines the AJARefPtr template class.
Definition: json.hpp:5362
AJALabelValuePairs::const_iterator AJALabelValuePairsConstIter
Definition: info.h:72
The last AJA virtual register slot.
uint32_t ULWord
Definition: ajatypes.h:236
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1361
bool NTV2DeviceCanDoAudioMixer(const NTV2DeviceID inDeviceID)
NTV2OutputXptIDSet::const_iterator NTV2OutputXptIDSetConstIter
A const iterator for iterating over an NTV2OutputXptIDSet.
#define DEF_REGNAME(_num_)
#define NTV2DriverVersionDecode_Major(__vers__)
static ULWord GetDesignVersion(const ULWord userID)
Definition: ntv2bitfile.h:55
#define kRegClass_SDIError
#define NTV2DriverVersionDecode_Point(__vers__)
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:489
#define SetNotset(__x__)
bool NTV2DeviceSoftwareCanChangeFrameBufferSize(const NTV2DeviceID inDeviceID)
NTV2FrameBufferFormat NTV2PixelFormat
An alias for NTV2FrameBufferFormat.
Definition: ntv2enums.h:264
#define kRegClass_Mixer
Anc Field1 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
AJARefPtr< RegisterExpert > RegisterExpertPtr
UWord NTV2DeviceGetNumHDMIVideoOutputs(const NTV2DeviceID inDeviceID)
static ULWord GetBitfileID(const ULWord userID)
Definition: ntv2bitfile.h:56
NTV2FrameRate
Identifies a particular video frame rate.
Definition: ntv2enums.h:416
std::string NTV2StandardToString(const NTV2Standard inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6914
std::string NTV2InputCrosspointIDToString(const NTV2InputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5818
#define true
std::string NTV2AudioChannelQuadToString(const NTV2Audio4ChannelSelect inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6447
NTV2Standard
Identifies a particular video standard.
Definition: ntv2enums.h:169
static bool GetRouteROMInfoFromReg(const ULWord inROMRegNum, const ULWord inROMRegValue, NTV2InputXptID &outInputXpt, NTV2OutputXptIDSet &outOutputXpts, const bool inAppendOutputXpts=false)
Answers with the NTV2InputXptID and NTV2OutputXptIDSet for the given ROM register value...
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
#define YesNo(__x__)
The first virtual register slot available for general use.
Monitor Anc Field2 byte offset from end of frame buffer (IoIP only, GUMP)
std::set< std::string > NTV2StringSet
NTV2ReferenceSource
These enum values identify a specific source for the device&#39;s (output) reference clock.
Definition: ntv2enums.h:1459
static uint32_t gInstanceTally(0)
static const string gChlClasses[]
UWord NTV2DeviceGetNumFrameStores(const NTV2DeviceID inDeviceID)
#define AJA_NULL
Definition: ajatypes.h:180
static NTV2StringSet GetAllRegisterClasses(void)
#define kRegClass_XptROM
#define PresNotPres(__x__)
bool NTV2DeviceHasPWMFanControl(const NTV2DeviceID inDeviceID)
Reports HDMI output status information.
#define kRegClass_Channel1
#define OnOff(__x__)
This selects audio channels 1 and 2 (Group 1 channels 1 and 2)
Definition: ntv2enums.h:3138
#define NTV2_IS_VALID_InputCrosspointID(__s__)
Definition: ntv2enums.h:2905
bool GetXptRegNumAndMaskIndex(const NTV2InputCrosspointID inInputXpt, uint32_t &outXptRegNum, uint32_t &outMaskIndex) const
#define kRegClass_NTV4FrameStore
static RegisterExpertPtr gpRegExpert
#define kRegClass_Channel5
NTV2RegisterNumberSet NTV2RegNumSet
A set of distinct NTV2RegisterNumbers.
NTV2AudioChannelPair
Identifies a pair of audio channels.
Definition: ntv2enums.h:3136
static const ULWord sMasks[]
static std::string FourCCToString(const ULWord in4CC, const char nonPrintable='?')
#define kRegClass_Routing
NTV2UpConvertMode
Definition: ntv2enums.h:2224
bool NTV2DeviceCanDo3GLevelConversion(const NTV2DeviceID inDeviceID)
#define kRegClass_Channel8
#define kRegClass_Virtual
static ULWord GetBitfileVersion(const ULWord userID)
Definition: ntv2bitfile.h:57
bool NTV2DeviceHasBiDirectionalSDI(const NTV2DeviceID inDeviceID)
ULWord NTV2DeviceGetHDMIVersion(const NTV2DeviceID inDeviceID)
#define NTV2_IS_VALID_HDR_PRIMARY(__val__)
ostream & Print(ostream &inOutStream) const
#define DisabEnab(__x__)
static int32_t Increment(int32_t volatile *pTarget)
Definition: atomic.cpp:82
static bool GetCrosspointSelectGroupRegisterInfo(const NTV2InputCrosspointID inInputXpt, uint32_t &outXptRegNum, uint32_t &outMaskIndex)
Answers with the crosspoint select register and mask information for a given widget input...
bool NTV2DeviceCanDoClockMonitor(const NTV2DeviceID inDeviceID)
ULWord NTV2DeviceGetUFCVersion(const NTV2DeviceID inDeviceID)
NTV2DownConvertMode
Definition: ntv2enums.h:2247
std::string NTV2IsoConvertModeToString(const NTV2IsoConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6634
#define AJA_UNUSED(_x_)
Definition: types.h:426
Declares NTV2DeviceCanDo... and NTV2DeviceGetNum... functions. This module is included at compile tim...
bool NTV2DeviceHasSDIRelays(const NTV2DeviceID inDeviceID)
static bool IsRegisterInClass(const uint32_t inRegNum, const std::string &inClassName)
#define kColorCorrectionLUTOffset_Red
UWord NTV2DeviceGetNumVideoInputs(const NTV2DeviceID inDeviceID)
#define LOGGING_MAPPINGS
std::string NTV2AudioChannelPairToString(const NTV2AudioChannelPair inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6435
static const string sNull
NTV2StringSet GetRegisterClasses(const uint32_t inRegNum, const bool inRemovePrefix) const
std::string NTV2UpConvertModeToString(const NTV2UpConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6595
NTV2StringSet GetAllRegisterClasses(void) const
#define kIncludeOtherRegs_XptROM
bool IsRegisterWriteOnly(const uint32_t inRegNum) const
string RegNameToString(const uint32_t inRegNum) const
static NTV2InputCrosspointID GetInputCrosspointID(const uint32_t inXptRegNum, const uint32_t inMaskIndex)
#define VIRTUALREG_START
#define NTV2_IS_VALID_CHANNEL(__x__)
Definition: ntv2enums.h:1375
#define OddEven(__x__)
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4608
static bool IsAllocated(void)
Monitor Anc Field1 byte offset from end of frame buffer (IoIP only, GUMP)
Originally 0x01. Changed to 0x00 in SDK 17.1.
Definition: ntv2enums.h:2759
bool NTV2DeviceCanDoIDSwitch(const NTV2DeviceID inDeviceID)
#define kRegClass_DMA
bool NTV2DeviceCanDoSDIErrorChecks(const NTV2DeviceID inDeviceID)
const char * NTV2RegisterNameString(const ULWord inRegNum)
Definition: ntv2debug.cpp:1174
bool IsRegisterReadOnly(const uint32_t inRegNum) const
static bool GetWidgetForOutput(const NTV2OutputXptID inOutputXpt, NTV2WidgetID &outWidgetID, const NTV2DeviceID inDeviceID=DEVICE_ID_NOTFOUND)
Returns the widget that "owns" the specified output crosspoint.
#define kRegClass_Channel6
#define kRegClass_Anc
static std::string GetDisplayValue(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID=DEVICE_ID_NOTFOUND)
#define kRegClass_Channel7
#define DEC(__x__)
NTV2RegisterNumber
NTV2FrameGeometry
Identifies a particular video frame geometry.
Definition: ntv2enums.h:352
static uint32_t gLivingInstances(0)
static RegisterExpertPtr GetInstance(const bool inCreateIfNecessary=true)
UWord NTV2DeviceGetNumLUTs(const NTV2DeviceID inDeviceID)
Declares numerous NTV2 utility functions.
#define kRegClass_CSC
string RegValueToString(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
ULWord NTV2DeviceGetMaxRegisterNumber(const NTV2DeviceID inDeviceID)
New in SDK 16.0.
Definition: ntv2enums.h:2878
NTV2OutputCrosspointID
Identifies a widget output, a signal source, that potentially can drive another widget&#39;s input (ident...
Definition: ntv2enums.h:2532
NTV2IsoConvertMode
Definition: ntv2enums.h:2258
NTV2InputCrosspointID
Identifies a widget input that potentially can accept a signal emitted from another widget&#39;s output (...
Definition: ntv2enums.h:2757
NTV2RegNumSet GetRegistersForDevice(const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude) const
static NTV2StringSet GetRegisterClasses(const uint32_t inRegNum, const bool inRemovePrefix=false)
#define NTV2_UNUSED(__p__)
Definition: ajatypes.h:145
Declares the CNTV2Bitfile class.
See Io X3.
Definition: ntv2enums.h:43
NTV2WidgetID
Definition: ntv2enums.h:2914
New in SDK 16.0.
Definition: ntv2enums.h:2800
uint16_t UWord
Definition: ajatypes.h:234
#define NTV2DriverVersionDecode_Build(__vers__)
std::string NTV2RegisterWriteModeToString(const NTV2RegisterWriteMode inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7115
std::string NTV2ReferenceSourceToString(const NTV2ReferenceSource inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7086
#define kRegClass_HDR
#define xHEX0N(__x__, __n__)
static NTV2RegNumSet GetRegistersForDevice(const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude=0)
static std::string GetDisplayName(const uint32_t inRegNum)
#define SuppNotsupp(__x__)
NTV2RegNumSet GetRegistersForClass(const string &inClassName) const
A convenience class that simplifies encoding or decoding the 4-byte VPID payload that can be read or ...
Definition: ntv2vpid.h:23
#define REiDBG(__x__)
std::string NTV2FrameBufferFormatToString(const NTV2FrameBufferFormat inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6940
NTV2RegisterWriteMode
These values are used to determine when certain register writes actually take effect. See CNTV2Card::SetRegisterWriteMode or Field/Frame Interrupts.
Definition: ntv2enums.h:1684
#define kRegClass_ReadOnly
#define kRegClass_Aux
#define NTV2DriverVersionDecode_Minor(__vers__)
static NTV2RegNumSet GetRegistersWithName(const std::string &inName, const int inSearchStyle=EXACTMATCH)
bool NTV2DeviceCanDoHDMIHDROut(const NTV2DeviceID inDeviceID)
static bool Allocate(void)
Explicitly allocates the Register Expert singleton.
bool NTV2DeviceCanDoBreakoutBoard(const NTV2DeviceID inDeviceID)
#define kRegClass_Interrupt
enum NTV2InputCrosspointID NTV2InputXptID
static NTV2RegNumSet GetRegistersForChannel(const NTV2Channel inChannel)
UWord NTV2DeviceGetNumVideoOutputs(const NTV2DeviceID inDeviceID)
Private include file for all ajabase sources.
#define fDEC(__x__, __w__, __p__)
bool NTV2DeviceCanDoCustomAnc(const NTV2DeviceID inDeviceID)
#define DEF_REG(_num_, _dec_, _rw_, _c1_, _c2_, _c3_)
static const string sSpace(" ")
std::string join(const std::vector< std::string > &parts, const std::string &delim)
Definition: common.cpp:468
std::string NTV2OutputCrosspointIDToString(const NTV2OutputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5961
const char * NTV2DeviceIDString(const NTV2DeviceID id)
Definition: ntv2debug.cpp:15
bool NTV2DeviceHasXilinxDMA(const NTV2DeviceID inDeviceID)
NTV2Audio4ChannelSelect
Identifies a contiguous, adjacent group of four audio channels.
Definition: ntv2enums.h:3276
#define ThruDeviceOrBypassed(__x__)
std::vector< std::string > NTV2StringList
#define HEX0N(__x__, __n__)
Definition: debug.cpp:1181
#define REiNOTE(__x__)
static AJALock gRegExpertGuardMutex
bool NTV2DeviceCanDoVersalSysMon(const NTV2DeviceID inDeviceID)
#define kRegClass_HDMI
static ostream & PrintLabelValuePairs(ostream &oss, const AJALabelValuePairs &inLabelValuePairs)
std::string & lower(std::string &str)
Definition: common.cpp:436
bool NTV2DeviceHasBracketLED(const NTV2DeviceID inDeviceID)
static ULWord GetDesignID(const ULWord userID)
Definition: ntv2bitfile.h:54
UWord NTV2DeviceGetNumHDMIVideoInputs(const NTV2DeviceID inDeviceID)
std::string & replace(std::string &str, const std::string &from, const std::string &to)
Definition: common.cpp:110
#define kRegClass_WriteOnly
std::set< NTV2OutputXptID > NTV2OutputXptIDSet
A collection of distinct NTV2OutputXptID values.
#define kRegClass_Audio
#define kRegClass_Channel3
#define kRegClass_LUT
#define NTV2EndianSwap32(__val__)
Definition: ntv2endian.h:19
enum NTV2OutputCrosspointID NTV2OutputXptID
This selects audio channels 3 and 4 (Group 1 channels 3 and 4)
Definition: ntv2enums.h:3139
bool NTV2DeviceCanDoCustomAux(const NTV2DeviceID inDeviceID)
Packed driver version – use NTV2DriverVersionEncode, NTV2DriverVersionDecode* macros to encode/decod...
#define kRegClass_Channel4
std::string NTV2FrameRateToString(const NTV2FrameRate inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7012
#define kIncludeOtherRegs_VRegs
NTV2RegNumSet GetRegistersWithName(const string &inName, const int inMatchStyle=EXACTMATCH) const
static const ULWord sShifts[]
Declares the CNTV2RegisterExpert class.
bool IsRegInClass(const uint32_t inRegNum, const string &inClassName) const
NTV4FrameStoreRegs