AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
ntv2outputtestpattern.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 // Includes
10 #include "ntv2outputtestpattern.h"
11 #include "ntv2devicescanner.h"
12 #include "ntv2testpatterngen.h"
13 #include "ajabase/system/process.h"
14 
15 #define AsULWordPtr(_p_) reinterpret_cast<const ULWord*> (_p_)
16 
17 
18 using namespace std;
19 
20 
21 const uint32_t kAppSignature (NTV2_FOURCC('T','e','s','t'));
22 
23 
24 AJALabelValuePairs TestPatConfig::Get (const bool inCompact) const
25 {
26  AJALabelValuePairs result (PlayerConfig::Get (inCompact));
27  AJASystemInfo::append(result, "Background Pattern", fTestPatternName);
28  return result;
29 }
30 
31 std::ostream & operator << (std::ostream & ioStrm, const TestPatConfig & inObj)
32 {
33  return ioStrm << AJASystemInfo::ToString(inObj.Get());
34 }
35 
36 
38  : mConfig (inConfig),
39  mDeviceID (DEVICE_ID_NOTFOUND),
40  mSavedTaskMode (NTV2_TASK_MODE_INVALID),
41  mSavedConnections ()
42 {
43 } // constructor
44 
45 
47 {
48  if (!mConfig.fDoMultiFormat)
49  mDevice.ApplySignalRoute(mSavedConnections, /*replace?*/true); // Restore prior widget routing
50 
51  // Restore the prior service level, and release the device...
52  mDevice.SetTaskMode(mSavedTaskMode);
53  mDevice.ReleaseStreamForApplication (kAppSignature, static_cast<int32_t>(AJAProcess::GetPid()));
54 
55 } // destructor
56 
57 
59 {
60  // Open the device...
62  {cerr << "## ERROR: Device '" << mConfig.fDeviceSpec << "' not found" << endl; return AJA_STATUS_OPEN;}
63  mDeviceID = mDevice.GetDeviceID(); // Keep this ID handy -- it's used frequently
64 
65  if (!mDevice.IsDeviceReady(false))
66  {cerr << "## ERROR: Device '" << mDevice.GetDisplayName() << "' not ready" << endl; return AJA_STATUS_INITIALIZE;}
67  if (!mDevice.features().CanDoPlayback())
68  {cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' is capture-only" << endl; return AJA_STATUS_FEATURE;}
69 
70  const UWord maxNumChannels (mDevice.features().GetNumFrameStores());
71 
72  if ((mConfig.fOutputChannel == NTV2_CHANNEL1) && (!mDevice.features().CanDoFrameStore1Display()))
73  { // Some older devices (e.g. Corvid1) can only output from FrameStore 2...
74  mConfig.fOutputChannel = NTV2_CHANNEL2;
75  cerr << "## WARNING: '" << mDevice.GetDisplayName() << "' switched to Ch2 (Ch1 is input-only)" << endl;
76  }
77  if (UWord(mConfig.fOutputChannel) >= maxNumChannels)
78  {
79  cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' can't use Ch" << DEC(mConfig.fOutputChannel+1)
80  << " -- only supports Ch1" << (maxNumChannels > 1 ? string("-Ch") + string(1, char(maxNumChannels+'0')) : "") << endl;
82  }
83 
84  mDevice.GetTaskMode(mSavedTaskMode); // Save current task mode
85  if (!mConfig.fDoMultiFormat)
86  {
87  mDevice.GetConnections(mSavedConnections); // Save current routing, so it can be restored later
89  return AJA_STATUS_BUSY; // Device is in use by another app -- fail
90  }
91  mDevice.SetTaskMode(NTV2_OEM_TASKS); // Set OEM service level
92 
93  if (mDevice.features().CanDoMultiFormat())
94  mDevice.SetMultiFormatMode(mConfig.fDoMultiFormat);
95  else
96  mConfig.fDoMultiFormat = false;
97 
98  // Set up the desired video configuration...
99  AJAStatus status (SetUpVideo());
100  if (AJA_FAILURE(status))
101  return status;
102 
103  #if defined(_DEBUG)
104  AJALabelValuePairs info(mConfig.Get());
105  if (!mDevice.GetDescription().empty())
106  for (AJALabelValuePairsConstIter it(info.begin()); it != info.end(); ++it)
107  if (it->first.find("Device Specifier") == 0)
108  {info.insert(++it, AJALabelValuePair("Device Description", mDevice.GetDescription())); break;}
109  cerr << AJASystemInfo::ToString(info);
110  #endif // defined(_DEBUG)
111  return AJA_STATUS_SUCCESS;
112 
113 } // Init
114 
115 
117 {
118  if (mConfig.fVideoFormat == NTV2_FORMAT_UNKNOWN)
119  {
120  // User didn't specify a video format.
121  // Get the device's current video format and use it to create the test pattern...
122  bool enabled(false);
123  mDevice.IsChannelEnabled(mConfig.fOutputChannel, enabled);
124  if (!enabled)
125  if (!mDevice.GetVideoFormat (mConfig.fVideoFormat, mConfig.fOutputChannel))
126  return AJA_STATUS_FAIL;
127 
128  // Read the current VANC mode, as this can affect the NTV2FormatDescriptor and host frame buffer size...
129  if (!mDevice.GetVANCMode (mConfig.fVancMode, mConfig.fOutputChannel))
130  return AJA_STATUS_FAIL;
131  }
132 
133  if (mConfig.fVideoFormat != NTV2_FORMAT_UNKNOWN)
134  {
135  // User specified a video format -- is it legal for this device?
136  if (!mDevice.features().CanDoVideoFormat(mConfig.fVideoFormat))
137  { cerr << "## ERROR: '" << mDevice.GetDisplayName() << "' cannot do " << ::NTV2VideoFormatToString(mConfig.fVideoFormat) << endl;
138  return AJA_STATUS_UNSUPPORTED;
139  }
140 
141  // Set the video format -- is it legal for this device?
142  if (!mDevice.SetVideoFormat (mConfig.fVideoFormat, /*retail?*/false, /*keepVANC*/false, mConfig.fOutputChannel))
143  { cerr << "## ERROR: SetVideoFormat '" << ::NTV2VideoFormatToString(mConfig.fVideoFormat) << "' failed" << endl;
144  return AJA_STATUS_FAIL;
145  }
146 
147  // Set the VANC mode
149  { cerr << "## ERROR: SetEnableVANCData '" << ::NTV2VANCModeToString(mConfig.fVancMode,true) << "' failed" << endl;
150  return AJA_STATUS_FAIL;
151  }
152  }
153 
154  // 4K/UHD is allowed, but only for devices that can do 12G routing...
155  if (NTV2_IS_4K_VIDEO_FORMAT(mConfig.fVideoFormat) && !mDevice.features().CanDo12gRouting())
156  { cerr << "## ERROR: '" << ::NTV2VideoFormatToString(mConfig.fVideoFormat) << "' requires 12G routing, but '" << mDevice.GetDisplayName() << "' doesn't support it" << endl;
157  return AJA_STATUS_UNSUPPORTED;
158  }
159  // This demo won't do 8K/UHD2
161  { cerr << "## ERROR: This demo only supports SD/HD/2K1080, not '" << ::NTV2VideoFormatToString(mConfig.fVideoFormat) << "'" << endl;
162  return AJA_STATUS_UNSUPPORTED;
163  }
164 
165  // This is a "playback" application, so set the board reference to free run...
166  if (!mDevice.SetReference(NTV2_REFERENCE_FREERUN))
167  return AJA_STATUS_FAIL;
168 
169  // Set the FrameStore's pixel format...
170  if (!mDevice.SetFrameBufferFormat (mConfig.fOutputChannel, mConfig.fPixelFormat))
171  return AJA_STATUS_FAIL;
172 
173  // Enable the FrameStore (if currently disabled)...
174  mDevice.EnableChannel(mConfig.fOutputChannel);
175  if (!mConfig.fDoMultiFormat)
176  { // Disable all other FrameStores...
178  frmStores.erase(frmStores.find(mConfig.fOutputChannel));
179  mDevice.DisableChannels(frmStores);
180  }
181 
182  // Set the FrameStore mode to "playout" (not capture)...
183  if (!mDevice.SetMode (mConfig.fOutputChannel, NTV2_MODE_DISPLAY))
184  return AJA_STATUS_FAIL;
185 
186  // Enable SDI output from the channel being used, but only if the device supports bi-directional SDI...
187  if (mDevice.features().HasBiDirectionalSDI())
188  mDevice.SetSDITransmitEnable (mConfig.fOutputChannel, true);
189 
190  return AJA_STATUS_SUCCESS;
191 
192 } // SetUpVideo
193 
194 
196 {
198  const bool isRGBPixFormat (::IsRGBFormat(mConfig.fPixelFormat));
199 
200  // Build a set of crosspoint connections (input-to-output)
201  // between the relevant signal processing widgets on the device.
202  // By default, the main output crosspoint that feeds the output widget(s) is the FrameStore's video output:
203  NTV2OutputXptID sourceXpt (::GetFrameStoreOutputXptFromChannel(mConfig.fOutputChannel, isRGBPixFormat));
204  if (isRGBPixFormat)
205  { // This code block allows this demo to work with RGB frame buffers, which
206  // necessitate inserting a CSC between the FrameStore and the video output(s)...
207  NTV2Connection csc_framestore (::GetCSCInputXptFromChannel(mConfig.fOutputChannel), sourceXpt);
208  connections.insert(csc_framestore); // CSC video input to FrameStore output
209  sourceXpt = ::GetCSCOutputXptFromChannel(mConfig.fOutputChannel); // CSC output will feed all output widget(s)
210  }
211 
212  // Route sourceXpt to SDI output(s)...
213  const NTV2ChannelSet sdiOutputs (mConfig.fDoMultiFormat ? ::NTV2MakeChannelSet (mConfig.fOutputChannel, 1)
215  mDevice.features().GetNumVideoOutputs()));
216  const NTV2Standard videoStd (::GetNTV2StandardFromVideoFormat(mConfig.fVideoFormat));
217  const NTV2ChannelList sdiOuts (::NTV2MakeChannelList(sdiOutputs));
218 
219  // For every SDI output, set video standard, and disable level A/B conversion...
220  mDevice.SetSDIOutputStandard (sdiOutputs, videoStd);
221  mDevice.SetSDIOutLevelAtoLevelBConversion (sdiOutputs, false);
222  mDevice.SetSDIOutRGBLevelAConversion (sdiOutputs, false);
223 
224  // Connect each SDI output to the main output crosspoint...
225  bool canCheck(mDevice.features().HasCrosspointConnectROM());
226  for (size_t ndx(0); ndx < sdiOutputs.size(); ndx++)
227  {
228  const NTV2Connection sdiConnection(::GetSDIOutputInputXpt(sdiOuts.at(ndx)), sourceXpt);
229  bool canConnect(true);
230  if (!canCheck || (canCheck && mDevice.CanConnect(sdiConnection, canConnect) && canConnect))
231  connections.insert(sdiConnection);
232  if (mDevice.features().HasBiDirectionalSDI()) // If device has bi-directional SDIs...
233  mDevice.SetSDITransmitEnable (sdiOutputs, true); // ... be sure it's set to "transmit"
234  }
235 
236  // Add analog video output, if the device has one...
237  if (!mConfig.fDoMultiFormat && mDevice.features().GetNumAnalogVideoOutputs())
239 
240  // Add HDMI video output, if the device has one...
241  if (!mConfig.fDoMultiFormat && mDevice.features().GetNumHDMIVideoOutputs())
243 
244  // Apply all the accumulated connections...
245  mDevice.ApplySignalRoute(connections, /*replaceExistingRoutes*/true);
246 
247 } // RouteOutputSignal
248 
249 
251 {
252  // Connect the FrameStore to the video output...
254 
255  // Allocate a host video buffer that will hold our test pattern raster...
256  NTV2FormatDescriptor fd (mConfig.fVideoFormat, mConfig.fPixelFormat, mConfig.fVancMode);
257  NTV2Buffer hostBuffer (fd.GetTotalBytes());
258  if (hostBuffer.IsNULL())
259  return AJA_STATUS_MEMORY;
260 
261  // Write the requested test pattern into host buffer...
262  NTV2TestPatternGen testPatternGen;
263  testPatternGen.setVANCToLegalBlack(fd.IsVANC());
264  if (!testPatternGen.DrawTestPattern (mConfig.fTestPatternName, fd, hostBuffer))
265  return AJA_STATUS_FAIL;
266 
267  // Find out which frame is currently being output from the frame store...
268  uint32_t currentOutputFrame(0);
269  if (!mDevice.GetOutputFrame (mConfig.fOutputChannel, currentOutputFrame))
270  return AJA_STATUS_FAIL; // ReadRegister failure?
271 
272  // Now simply transfer the contents of the host buffer to the device's current output frame...
273  if (!mDevice.DMAWriteFrame (currentOutputFrame, // Device frame number
274  AsULWordPtr(fd.GetRowAddress(hostBuffer.GetHostPointer(), 0)), // Host buffer address
275  hostBuffer.GetByteCount())) // # bytes to xfer
276  return AJA_STATUS_FAIL;
277 
278  return AJA_STATUS_SUCCESS;
279 
280 } // EmitPattern
AJALabelValuePairs Get(const bool inCompact=(0)) const
Renders a human-readable representation of me.
#define NTV2_IS_VANCMODE_TALLER(__v__)
Definition: ntv2enums.h:3807
virtual bool SetTaskMode(const NTV2TaskMode inMode)
Sets the device&#39;s task mode.
bool setVANCToLegalBlack(void) const
AJAStatus Init(void)
Initializes me and prepares me to Run.
virtual bool GetVideoFormat(NTV2VideoFormat &outValue, NTV2Channel inChannel=NTV2_CHANNEL1)
Specifies the device&#39;s internal clock.
Definition: ntv2enums.h:1459
AJALabelValuePairs Get(const bool inCompact=(0)) const
virtual bool SetReference(const NTV2ReferenceSource inRefSource, const bool inKeepFramePulseSelect=(0))
Sets the device&#39;s clock reference source. See Video Output Clocking & Synchronization for more inform...
virtual bool ReleaseStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Releases exclusive use of the AJA device for the given process, permitting other processes to acquire...
The NTV2 test pattern generator.
virtual bool SetVideoFormat(const NTV2VideoFormat inVideoFormat, const bool inIsAJARetail=(!(0)), const bool inKeepVancSettings=(0), const NTV2Channel inChannel=NTV2_CHANNEL1)
Configures the AJA device to handle a specific video format.
AJAStatus
Definition: types.h:380
NTV2VANCMode fVancMode
VANC mode to use.
virtual bool IsDeviceReady(const bool inCheckValid=(0))
Configures an NTV2OutputTestPattern instance.
static uint64_t GetPid()
Definition: process.cpp:35
std::string fTestPatternName
Name of the test pattern to use.
#define AJA_FAILURE(_status_)
Definition: types.h:373
Declares the NTV2TestPatternGen class.
virtual bool DMAWriteFrame(const ULWord inFrameNumber, const ULWord *pInFrameBuffer, const ULWord inByteCount)
Transfers a single frame from the host to the AJA device.
Definition: ntv2dma.cpp:65
virtual bool GetOutputFrame(const NTV2Channel inChannel, ULWord &outValue)
Answers with the current output frame number for the given FrameStore (expressed as an NTV2Channel)...
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:71
#define NTV2_IS_4K_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:783
#define NTV2_FOURCC(_a_, _b_, _c_, _d_)
ULWord GetTotalBytes(void) const
#define NTV2_IS_8K_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:893
Definition: json.hpp:5362
AJALabelValuePairs::const_iterator AJALabelValuePairsConstIter
Definition: info.h:72
std::string fDeviceSpec
The AJA device to use.
std::pair< NTV2InputXptID, NTV2OutputXptID > NTV2Connection
This links an NTV2InputXptID and an NTV2OutputXptID.
virtual bool SetFrameBufferFormat(NTV2Channel inChannel, NTV2FrameBufferFormat inNewFormat, bool inIsAJARetail=(!(0)), NTV2HDRXferChars inXferChars=NTV2_VPID_TC_SDR_TV, NTV2HDRColorimetry inColorimetry=NTV2_VPID_Color_Rec709, NTV2HDRLuminance inLuminance=NTV2_VPID_Luminance_YCbCr)
Sets the frame buffer format for the given FrameStore on the AJA device.
const void * GetRowAddress(const void *pInStartAddress, const ULWord inRowIndex0, const UWord inPlaneIndex0=0) const
virtual class DeviceCapabilities & features(void)
Definition: ntv2card.h:148
virtual bool SetMultiFormatMode(const bool inEnable)
Enables or disables multi-format (per channel) device operation. If enabled, each device channel can ...
NTV2ChannelList NTV2MakeChannelList(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
virtual bool GetTaskMode(NTV2TaskMode &outMode)
Retrieves the device&#39;s current task mode.
virtual bool DrawTestPattern(const std::string &inTPName, const NTV2FormatDescriptor &inFormatDesc, NTV2Buffer &inBuffer)
Renders the given test pattern or color into a host raster buffer.
NTV2Standard
Identifies a particular video standard.
Definition: ntv2enums.h:165
virtual bool CanConnect(const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, bool &outCanConnect)
Answers whether or not the given widget signal input (sink) can legally be connected to the given sig...
Playout (output) mode, which reads from device SDRAM.
Definition: ntv2enums.h:1241
virtual std::string GetDescription(void) const
Definition: ntv2card.cpp:139
virtual bool SetMode(const NTV2Channel inChannel, const NTV2Mode inNewValue, const bool inIsRetail=(!(0)))
Determines if a given FrameStore on the AJA device will be used to capture or playout video...
NTV2InputXptID GetOutputDestInputXpt(const NTV2OutputDestination inOutputDest, const bool inIsSDI_DS2=false, const UWord inHDMI_Quadrant=99)
NTV2OutputTestPattern(const TestPatConfig &inConfig)
Constructs me using the given configuration settings.
Invalid or "not found".
Definition: ntv2enums.h:98
static bool GetFirstDeviceFromArgument(const std::string &inArgument, CNTV2Card &outDevice)
Rescans the host, and returns an open CNTV2Card instance for the AJA device that matches a command li...
virtual bool SetSDITransmitEnable(const NTV2Channel inChannel, const bool inEnable)
Sets the specified bidirectional SDI connector to act as an input or an output.
virtual bool AcquireStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Reserves exclusive use of the AJA device for a given process, preventing other processes on the host ...
virtual bool GetVANCMode(NTV2VANCMode &outVancMode, const NTV2Channel inChannel=NTV2_CHANNEL1)
Retrieves the current VANC mode for the given FrameStore.
virtual std::string GetDisplayName(void)
Answers with this device&#39;s display name.
Definition: ntv2card.cpp:88
NTV2InputXptID GetCSCInputXptFromChannel(const NTV2Channel inCSC, const bool inIsKeyInput=false)
Describes a video frame for a given video standard or format and pixel format, including the total nu...
NTV2PixelFormat fPixelFormat
The pixel format to use.
2: OEM (recommended): device configured by client application(s) with some driver involvement...
std::string NTV2VANCModeToString(const NTV2VANCMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6505
virtual bool ApplySignalRoute(const CNTV2SignalRouter &inRouter, const bool inReplace=(0))
Applies the given routing table to the AJA device.
NTV2XptConnections connections
Definition: ntv2vcam.cpp:1011
NTV2VideoFormat fVideoFormat
The video format to use.
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6746
Specifies channel or FrameStore 2 (or the 2nd item).
Definition: ntv2enums.h:1360
virtual NTV2DeviceID GetDeviceID(void)
const uint32_t kAppSignature(((((uint32_t)( 'T'))<< 24)|(((uint32_t)( 'e'))<< 16)|(((uint32_t)( 's'))<< 8)|(((uint32_t)( 't'))<< 0)))
#define NTV2_IS_VANCMODE_ON(__v__)
Definition: ntv2enums.h:3808
Declares the CNTV2DeviceScanner class.
Declares the AJAProcess class.
AJAStatus EmitPattern(void)
Generates, transfers and displays the test pattern on the output.
Describes a user-space buffer on the host computer. I have an address and a length, plus some optional attributes (allocated by SDK?, page-aligned? etc.).
bool fDoMultiFormat
If true, enable device-sharing; otherwise take exclusive control of device.
bool IsRGBFormat(const NTV2FrameBufferFormat format)
Definition: ntv2utils.cpp:5410
static AJALabelValuePairs & append(AJALabelValuePairs &inOutTable, const std::string &inLabel, const std::string &inValue=std::string())
A convenience function that appends the given label and value strings to the provided AJALabelValuePa...
Definition: info.h:170
#define DEC(__x__)
std::set< NTV2Channel > NTV2ChannelSet
A set of distinct NTV2Channel values.
NTV2Channel fOutputChannel
The device channel to use.
static const ULWord kDemoAppSignature((((uint32_t)( 'D'))<< 24)|(((uint32_t)( 'E'))<< 16)|(((uint32_t)( 'M'))<< 8)|(((uint32_t)( 'O'))<< 0))
virtual bool DisableChannels(const NTV2ChannelSet &inChannels)
Disables the given FrameStore(s).
virtual bool SetSDIOutRGBLevelAConversion(const UWord inOutputSpigot, const bool inEnable)
Enables or disables an RGB-over-3G-level-A conversion at the SDI output widget (assuming the AJA devi...
AJAStatus SetUpVideo(void)
Sets up my AJA device to play video.
virtual bool SetSDIOutLevelAtoLevelBConversion(const UWord inOutputSpigot, const bool inEnable)
Enables or disables 3G level A to 3G level B conversion at the SDI output widget (assuming the AJA de...
NTV2OutputXptID GetFrameStoreOutputXptFromChannel(const NTV2Channel inFrameStore, const bool inIsRGB=false, const bool inIs425=false)
uint16_t UWord
Definition: ajatypes.h:221
Specifies channel or FrameStore 1 (or the first item).
Definition: ntv2enums.h:1359
virtual bool SetEnableVANCData(const bool inVANCenabled, const bool inTallerVANC, const NTV2Standard inStandard, const NTV2FrameGeometry inGeometry, const NTV2Channel inChannel=NTV2_CHANNEL1)
#define AsULWordPtr(_p_)
UWord GetNumAnalogVideoOutputs(void)
virtual bool IsChannelEnabled(const NTV2Channel inChannel, bool &outEnabled)
Answers whether or not the given FrameStore is enabled.
NTV2ChannelSet NTV2MakeChannelSet(const NTV2Channel inFirstChannel, const UWord inNumChannels=1)
NTV2Standard GetNTV2StandardFromVideoFormat(const NTV2VideoFormat inVideoFormat)
Definition: ntv2utils.cpp:2375
std::vector< NTV2Channel > NTV2ChannelList
An ordered sequence of NTV2Channel values.
void RouteOutputSignal(void)
Sets up board routing for playout.
std::map< NTV2InputXptID, NTV2OutputXptID > NTV2XptConnections
std::ostream & operator<<(std::ostream &ioStrm, const TestPatConfig &inObj)
bool CanDoVideoFormat(const NTV2VideoFormat inVF)
std::pair< std::string, std::string > AJALabelValuePair
A pair of strings comprising a label and a value.
Definition: info.h:70
virtual bool SetSDIOutputStandard(const UWord inOutputSpigot, const NTV2Standard inValue)
Sets the SDI output spigot&#39;s video standard.
NTV2InputXptID GetSDIOutputInputXpt(const NTV2Channel inSDIOutput, const bool inIsDS2=false)
virtual void ToString(std::string &outAllLabelsAndValues) const
Answers with a multi-line string that contains the complete host system info table.
enum NTV2OutputCrosspointID NTV2OutputXptID
virtual bool GetConnections(NTV2XptConnections &outConnections)
Answers with the device&#39;s current widget routing connections.
NTV2OutputXptID GetCSCOutputXptFromChannel(const NTV2Channel inCSC, const bool inIsKey=false, const bool inIsRGB=false)
virtual bool EnableChannel(const NTV2Channel inChannel)
Enables the given FrameStore.