AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
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
gInputNumberToInputSource
static const NTV2InputSource gInputNumberToInputSource[]
Definition: ntv2qtmultiinput.cpp:14
NTV2_INPUTSOURCE_SDI4
@ NTV2_INPUTSOURCE_SDI4
Identifies the 4th SDI video input.
Definition: ntv2enums.h:1254
NTV2QtMultiInput::SlotAudioCheckBox
void SlotAudioCheckBox(const int inputNum)
This gets called when any "audio" checkbox is clicked.
Definition: ntv2qtmultiinput.cpp:152
NTV2_INPUTSOURCE_SDI6
@ NTV2_INPUTSOURCE_SDI6
Identifies the 6th SDI video input.
Definition: ntv2enums.h:1256
ntv2devicefeatures.h
Declares device capability functions.
NTV2_INPUTSOURCE_SDI7
@ NTV2_INPUTSOURCE_SDI7
Identifies the 7th SDI video input.
Definition: ntv2enums.h:1257
nlohmann::json_abiNLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON_v3_11_NLOHMANN_JSON_VERSION_PATCH::detail::void
j template void())
Definition: json.hpp:4893
NTV2QtMultiInput::RequestDeviceChange
void RequestDeviceChange(const int inDeviceIndexNum)
This gets called when the user selects a different device from the device selector popup menu.
Definition: ntv2qtmultiinput.cpp:165
CNTV2Card::features
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:141
NTV2_INPUTSOURCE_SDI1
@ NTV2_INPUTSOURCE_SDI1
Identifies the 1st SDI video input.
Definition: ntv2enums.h:1251
CNTV2Card::GetDisplayName
virtual std::string GetDisplayName(void)
Answers with this device's display name.
Definition: ntv2card.cpp:86
NTV2QtMultiInput::SlotCaptionsCheckBox
void SlotCaptionsCheckBox(const int inputNum)
This gets called when any "CC" checkbox is clicked.
Definition: ntv2qtmultiinput.cpp:158
NTV2FrameGrabber::SetWithAudio
void SetWithAudio(const bool inWithAudio)
Enables or disables host audio playback.
Definition: ntv2framegrabber.h:70
ULWord
uint32_t ULWord
Definition: ajatypes.h:255
NTV2QtMultiInput::~NTV2QtMultiInput
~NTV2QtMultiInput()
Definition: ntv2qtmultiinput.cpp:146
NTV2_INPUTSOURCE_SDI5
@ NTV2_INPUTSOURCE_SDI5
Identifies the 5th SDI video input.
Definition: ntv2enums.h:1255
CNTV2Card
I interrogate and control an AJA video/audio capture/playout device.
Definition: ntv2card.h:28
AJAPREVIEW_WIDGET_X
#define AJAPREVIEW_WIDGET_X
Definition: ajapreviewwidget.h:22
NTV2InputSource
NTV2InputSource
Identifies a specific video input source.
Definition: ntv2enums.h:1244
NTV2FrameGrabber
A QThread that captures audio/video from NTV2-compatible AJA devices and uses Qt signals to emit ARGB...
Definition: ntv2framegrabber.h:46
CNTV2DeviceScanner::GetDeviceAtIndex
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...
Definition: ntv2devicescanner.cpp:274
NTV2QtMultiInput::NTV2QtMultiInput
NTV2QtMultiInput(QWidget *parent=0, Qt::WindowFlags flags=Qt::WindowFlags())
Definition: ntv2qtmultiinput.cpp:28
NTV2_INPUTSOURCE_SDI8
@ NTV2_INPUTSOURCE_SDI8
Identifies the 8th SDI video input.
Definition: ntv2enums.h:1258
NTV2FrameGrabber::SetInputSource
void SetInputSource(const NTV2InputSource inInputSource)
Sets the input to be used for capture on the AJA device being used.
Definition: ntv2framegrabber.cpp:74
NTV2_INPUTSOURCE_SDI2
@ NTV2_INPUTSOURCE_SDI2
Identifies the 2nd SDI video input.
Definition: ntv2enums.h:1252
AJAPREVIEW_WIDGET_Y
#define AJAPREVIEW_WIDGET_Y
Definition: ajapreviewwidget.h:23
AJAPreviewWidget
Definition: ajapreviewwidget.h:36
NTV2FrameGrabber::SetDeviceIndex
void SetDeviceIndex(const UWord inDeviceIndex)
Sets the AJA device to be used for capture.
Definition: ntv2framegrabber.cpp:88
ntv2qtmultiinput.h
Header file for NTV2QtMultiInput demonstration application. Demonstrates how to capture several SDI A...
NTV2_INPUTSOURCE_SDI3
@ NTV2_INPUTSOURCE_SDI3
Identifies the 3rd SDI video input.
Definition: ntv2enums.h:1253