AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
ntv2qtmultiinput.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2qtmultiinput.h"
9 #include "ntv2devicefeatures.h"
10 
11 //
12 // This array maps SDI input numbers 0 thru 3 to an NTV2InputSource...
13 //
15 {
24 
25 };
26 
27 
28 NTV2QtMultiInput::NTV2QtMultiInput (QWidget * parent, Qt::WindowFlags flags)
29  : QDialog (parent, flags)
30 {
31  ::memset (mDeviceInputCounts, 0, sizeof(mDeviceInputCounts));
32  ::memset (mFrameGrabbers, 0, sizeof(mFrameGrabbers));
33 
34  // Build the device selector popup menu...
35  CNTV2Card card;
36  mDeviceChoicePopupMenu = new QComboBox;
37  for (ULWord ndx(0); CNTV2DeviceScanner::GetDeviceAtIndex(ndx, card); ndx++)
38  {
39  mDeviceInputCounts[ndx] = card.features().GetNumVideoInputs();
40  mDeviceChoicePopupMenu->addItem(card.GetDisplayName().c_str());
41  } // for each AJA device found
42  if (!mDeviceChoicePopupMenu->count())
43  mDeviceChoicePopupMenu->addItem("No Devices Found");
44 
45  // Default to the first quad-input device (if any)...
46  uint32_t numInputs(4);
47 
48  for (ULWord ndx(0); ndx < ULWord(mDeviceChoicePopupMenu->count()); ndx++)
49  if (mDeviceInputCounts[ndx] == 8)
50  numInputs = 8; // NOTE: hardcode for now
51  QObject::connect (mDeviceChoicePopupMenu, SIGNAL(currentIndexChanged(int)),
52  this, SLOT(RequestDeviceChange(const int)));
53  mDeviceChoicePopupMenu->setCurrentIndex(0);
54 
55  // Set up each of the preview widgets and frame grabber threads...
56  QSignalMapper * signalMapper = new QSignalMapper(this);
57  for (uint32_t inputNumber(0); inputNumber < numInputs; inputNumber++)
58  {
59  mPreviewGroupBoxes[inputNumber] = new QGroupBox(this);
60  mPreviewWidgets[inputNumber] = new AJAPreviewWidget(this);
61  mPreviewWidgets[inputNumber]->setMinimumWidth (AJAPREVIEW_WIDGET_X / (numInputs/2));
62  mPreviewWidgets[inputNumber]->setMinimumHeight (AJAPREVIEW_WIDGET_Y / (numInputs/2));
63  mPreviewWidgets[inputNumber]->setSizePolicy (QSizePolicy ::Expanding, QSizePolicy ::Expanding);
64  mFrameGrabbers[inputNumber] = new NTV2FrameGrabber(this);
65  mInputLabels[inputNumber] = new QLabel("", this);
66  mWithAudioCheckBoxes[inputNumber] = new QCheckBox("Audio", this);
67  signalMapper->setMapping (mWithAudioCheckBoxes [inputNumber], inputNumber);
68  #if defined (INCLUDE_AJACC)
69  mWithCaptionsCheckBoxes [inputNumber] = new QCheckBox ("CC", this);
70  #endif
71 
72  QVBoxLayout * layout = new QVBoxLayout;
73  layout->addWidget (mPreviewWidgets [inputNumber]);
74  layout->addWidget (mInputLabels [inputNumber]);
75 
76  QHBoxLayout * bottomLayout (new QHBoxLayout);
77  bottomLayout->setContentsMargins (0, 0, 0, 0);
78  bottomLayout->addWidget (mWithAudioCheckBoxes [inputNumber]);
79  #if defined (INCLUDE_AJACC)
80  bottomLayout->addWidget (mWithCaptionsCheckBoxes [inputNumber]);
81  #endif
82  layout->addLayout (bottomLayout);
83 
84  mPreviewGroupBoxes[inputNumber]->setLayout (layout);
85 
86  connect (mFrameGrabbers[inputNumber], SIGNAL(newFrame(const QImage&, bool)),
87  mPreviewWidgets[inputNumber], SLOT(updateFrame(const QImage&, bool)));
88 
89  connect (mFrameGrabbers[inputNumber], SIGNAL(newStatusString(const QString)),
90  mInputLabels[inputNumber], SLOT(setText(const QString)));
91 
92  connect (mWithAudioCheckBoxes [inputNumber], SIGNAL(clicked()),
93  signalMapper, SLOT(map()));
94  #if defined (INCLUDE_AJACC)
95  //connect (mWithCaptionsCheckBoxes [inputNumber], SIGNAL (clicked ()), signalMapper, SLOT (map ()));
96  #endif
97  } // for each video input
98 
99  // Map all "with audio" checkbox clicks to a single handler...
100 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
101  connect (signalMapper, SIGNAL (mappedInt (int)), this, SLOT (SlotAudioCheckBox (int)));
102 #else
103  connect (signalMapper, SIGNAL (mapped (int)), this, SLOT (SlotAudioCheckBox (int)));
104 #endif
105 
106  // Lay out everything...
107  QGridLayout * glayout = new QGridLayout;
108  if (numInputs == 4)
109  {
110  glayout->addWidget (mPreviewGroupBoxes [0], 0, 0);
111  glayout->addWidget (mPreviewGroupBoxes [1], 0, 1);
112  glayout->addWidget (mPreviewGroupBoxes [2], 1, 0);
113  glayout->addWidget (mPreviewGroupBoxes [3], 1, 1);
114  }
115  else
116  {
117  glayout->addWidget (mPreviewGroupBoxes [0], 0, 0);
118  glayout->addWidget (mPreviewGroupBoxes [1], 0, 1);
119  glayout->addWidget (mPreviewGroupBoxes [2], 0, 2);
120  glayout->addWidget (mPreviewGroupBoxes [3], 0, 3);
121  glayout->addWidget (mPreviewGroupBoxes [4], 1, 0);
122  glayout->addWidget (mPreviewGroupBoxes [5], 1, 1);
123  glayout->addWidget (mPreviewGroupBoxes [6], 1, 2);
124  glayout->addWidget (mPreviewGroupBoxes [7], 1, 3);
125  }
126 
127  QVBoxLayout * vlayout = new QVBoxLayout;
128  vlayout->addWidget (mDeviceChoicePopupMenu);
129  vlayout->addLayout (glayout);
130 
131  setLayout (vlayout);
132 
133  // Set up the frame grabber threads...
134  for (uint32_t inputNumber (0); inputNumber < numInputs; inputNumber++)
135  {
136  mFrameGrabbers [inputNumber]->SetInputSource (gInputNumberToInputSource [inputNumber]);
137  mFrameGrabbers [inputNumber]->SetWithAudio (false);
138  mFrameGrabbers [inputNumber]->start ();
139  }
140 
142 
143 } // constructor
144 
145 
147 {
148  qDebug ("## NOTE: Leaving");
149 }
150 
151 
152 void NTV2QtMultiInput::SlotAudioCheckBox (const int inputNum)
153 {
154  mFrameGrabbers [inputNum]->SetWithAudio (mWithAudioCheckBoxes [inputNum]->isChecked ());
155 }
156 
157 
158 void NTV2QtMultiInput::SlotCaptionsCheckBox (const int inputNum)
159 {
160  (void) inputNum;
161  //mFrameGrabbers [inputNum]->changeCaptionChannel (mWithAudioCheckBoxes [inputNum]->isChecked () ? NTV2_CC608_CC1 : NTV2_CC608_ChannelInvalid);
162 }
163 
164 
165 void NTV2QtMultiInput::RequestDeviceChange (const int inDeviceIndexNum)
166 {
167  // Notify each frame grabber to change devices...
168  CNTV2Card dev;
169  if (CNTV2DeviceScanner::GetDeviceAtIndex(inDeviceIndexNum, dev))
170  {
171  for (uint32_t inputNumber(0); inputNumber < mDeviceInputCounts[inDeviceIndexNum]; inputNumber++)
172  if (mFrameGrabbers[inputNumber])
173  mFrameGrabbers[inputNumber]->SetDeviceIndex (dev.GetIndexNumber());
174  qDebug ("## NOTE: Device changed to %d", inDeviceIndexNum);
175  }
176 } // RequestDeviceChange
#define AJAPREVIEW_WIDGET_Y
Identifies the 5th SDI video input.
Definition: ntv2enums.h:1273
I interrogate and control an AJA video/audio capture/playout device.
Definition: ntv2card.h:28
virtual UWord GetIndexNumber(void) const
void SetInputSource(const NTV2InputSource inInputSource)
Sets the input to be used for capture on the AJA device being used.
uint32_t ULWord
Definition: ajatypes.h:223
NTV2QtMultiInput(QWidget *parent=0, Qt::WindowFlags flags=Qt::WindowFlags())
Identifies the 8th SDI video input.
Definition: ntv2enums.h:1276
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:148
Identifies the 2nd SDI video input.
Definition: ntv2enums.h:1270
#define AJAPREVIEW_WIDGET_X
virtual std::string GetDisplayName(void)
Answers with this device&#39;s display name.
Definition: ntv2card.cpp:88
Identifies the 3rd SDI video input.
Definition: ntv2enums.h:1271
void SetDeviceIndex(const UWord inDeviceIndex)
Sets the AJA device to be used for capture.
void SlotAudioCheckBox(const int inputNum)
This gets called when any "audio" checkbox is clicked.
static bool GetDeviceAtIndex(const ULWord inDeviceIndexNumber, CNTV2Card &outDevice)
Rescans the host, and returns an open CNTV2Card instance for the AJA device having the given zero-bas...
void SetWithAudio(const bool inWithAudio)
Enables or disables host audio playback.
Identifies the 4th SDI video input.
Definition: ntv2enums.h:1272
NTV2InputSource
Identifies a specific video input source.
Definition: ntv2enums.h:1262
A QThread that captures audio/video from NTV2-compatible AJA devices and uses Qt signals to emit ARGB...
Identifies the 6th SDI video input.
Definition: ntv2enums.h:1274
Identifies the 7th SDI video input.
Definition: ntv2enums.h:1275
static const NTV2InputSource gInputNumberToInputSource[]
Header file for NTV2QtMultiInput demonstration application. Demonstrates how to capture several SDI A...
void RequestDeviceChange(const int inDeviceIndexNum)
This gets called when the user selects a different device from the device selector popup menu...
Identifies the 1st SDI video input.
Definition: ntv2enums.h:1269
void SlotCaptionsCheckBox(const int inputNum)
This gets called when any "CC" checkbox is clicked.
Declares device capability functions.