16 #define NTV2_BUFFER_LOCK 18 #define NTV2_AUDIOSIZE_MAX (401 * 1024) 19 #define NTV2_ANCILLARYSIZE_MAX (256 * 1024) 54 while (mConsumerThread.
Active())
57 while (mProducerThread.
Active())
77 cerr <<
"## ERROR: Device '" << mConfig.
fDeviceSpec <<
"' not found" << endl;
86 { cerr <<
"## ERROR: '" << mDevice.
GetDescription() <<
"' doesn't support '" 100 cerr <<
"## ERROR: Unable to acquire '" << mDevice.
GetDescription() <<
"' because another app (pid " <<
appPID <<
") owns it" << endl;
145 #endif // defined(_DEBUG) 212 ULWord F1AncSize(0), F2AncSize(0);
213 ULWord F1OffsetFromEnd(0), F2OffsetFromEnd(0);
217 F1AncSize = F2OffsetFromEnd > F1OffsetFromEnd ? 0 : F1OffsetFromEnd - F2OffsetFromEnd;
218 F2AncSize = F2OffsetFromEnd > F1OffsetFromEnd ? F2OffsetFromEnd - F1OffsetFromEnd : F2OffsetFromEnd;
228 frameData.fAudioBuffer.Allocate(audioBufferSize);
229 frameData.fAncBuffer.Allocate(F1AncSize);
230 frameData.fAncBuffer2.Allocate(F2AncSize);
231 mAVCircularBuffer.
Add(&frameData);
233 #ifdef NTV2_BUFFER_LOCK 235 if (frameData.fVideoBuffer)
237 if (frameData.fAncBuffer)
239 if (frameData.fAncBuffer2)
281 mConsumerThread.
Start();
302 uint64_t ancTally(0);
303 uint64_t audioTally(0);
304 uint64_t dolbyTally(0);
322 for (i = 0; i < pFrameData->AncBufferSize(); i += 32)
324 if (pData[i] == 0xff)
327 uint32_t audioSize =
RecoverAudio(pFrameData->AncBuffer(), pFrameData->AncBufferSize() , pFrameData->AudioBuffer());
328 cout <<
"f1 size reg " <<
DEC(pFrameData->NumCapturedAncBytes()) <<
" ffs " <<
DEC(i) <<
" samples " <<
DEC(audioSize/4) << endl << flush;
333 uint8_t* pData = (uint8_t*)pFrameData->AncBuffer2().GetHostAddress(0);
335 for (i = 0; i < pFrameData->AncBuffer2Size(); i += 32)
337 if (pData[i] == 0xff)
340 uint32_t audioSize =
RecoverAudio(pFrameData->AncBuffer2(), pFrameData->AncBuffer2Size() , pFrameData->AudioBuffer());
341 cout <<
"f2 size reg " <<
DEC(pFrameData->NumCapturedAnc2Bytes()) <<
" ffs " <<
DEC(i) <<
" samples " <<
DEC(audioSize/4) << endl << flush;
344 if (pOFS && pFrameData->AncBuffer())
346 if (pOFS && !ancTally++)
348 pOFS->write(pFrameData->AncBuffer(), streamsize(pFrameData->NumCapturedAncBytes()));
350 if ( pFrameData->AncBuffer2())
352 if (pOFS && pFrameData->AncBuffer2())
353 pOFS->write(pFrameData->AncBuffer2(), streamsize(pFrameData->NumCapturedAnc2Bytes()));
357 if (pAFS && pFrameData->AncBuffer() && pFrameData->AudioBuffer())
359 if (pAFS && !audioTally++)
361 uint32_t audioSize =
RecoverAudio(pFrameData->AncBuffer(), pFrameData->NumCapturedAncBytes(), pFrameData->AudioBuffer());
362 pAFS->write(pFrameData->AudioBuffer(), streamsize(audioSize));
364 if ( pFrameData->AncBuffer2())
366 audioSize =
RecoverAudio(pFrameData->AncBuffer2(), pFrameData->NumCapturedAnc2Bytes(), pFrameData->AudioBuffer());
367 pAFS->write(pFrameData->AudioBuffer(), streamsize(audioSize));
371 if (pDFS && pFrameData->AncBuffer() && pFrameData->AudioBuffer())
373 if (pDFS && !dolbyTally++)
375 uint32_t audioSize =
RecoverAudio(pFrameData->AncBuffer(), pFrameData->NumCapturedAncBytes(), pFrameData->AudioBuffer());
376 uint32_t dolbySize =
RecoverDolby(pFrameData->AudioBuffer(), audioSize, pFrameData->AncBuffer());
377 pDFS->write(pFrameData->AncBuffer(), streamsize(dolbySize));
379 if ( pFrameData->AncBuffer2())
381 audioSize =
RecoverAudio(pFrameData->AncBuffer2(), pFrameData->NumCapturedAnc2Bytes(), pFrameData->AudioBuffer());
382 dolbySize =
RecoverDolby(pFrameData->AudioBuffer(), audioSize, pFrameData->AncBuffer2());
383 pDFS->write(pFrameData->AncBuffer2(), streamsize(dolbySize));
391 {
delete pOFS; cerr <<
"Wrote " <<
DEC(ancTally) <<
" frames of raw anc data" << endl; }
393 {
delete pAFS; cerr <<
"Wrote " <<
DEC(audioTally) <<
" frames of raw audio data" << endl; }
395 {
delete pDFS; cerr <<
"Wrote " <<
DEC(dolbyTally) <<
" frames of dolby data" << endl; }
396 CAPNOTE(
"Thread completed, will exit");
409 mProducerThread.
Start();
430 ULWord acOptions (0), overruns(0);
490 {
bool overrun(
false);
493 {overruns++;
CAPWARN(overruns <<
" aux overrun(s)");}
497 stale.
Fill(uint8_t(0));
504 stale.
Fill(uint8_t(0));
522 CAPNOTE(
"Thread completed, will exit");
538 const uint8_t * pInAncData(inAncBuffer);
539 uint8_t * pOutAudioData(outAudioBuffer);
540 uint32_t audioSize(0);
543 for (uint32_t num(0); num < ancSize / 32; num++)
546 if (pInAncData[0] == 0x02)
549 if ((pInAncData[1] & 0x01))
552 if ((pInAncData[2] & 0x01))
554 *pOutAudioData++ = 0;
555 *pOutAudioData++ = 0;
556 *pOutAudioData++ = 0;
557 *pOutAudioData++ = 0;
561 *pOutAudioData++ = pInAncData[4];
562 *pOutAudioData++ = pInAncData[5];
563 *pOutAudioData++ = pInAncData[7];
564 *pOutAudioData++ = pInAncData[8];
570 if ((pInAncData[1] & 0x10) == 0)
573 if ((pInAncData[1] & 0x02))
576 if ((pInAncData[2] & 0x02))
578 *pOutAudioData++ = 0;
579 *pOutAudioData++ = 0;
580 *pOutAudioData++ = 0;
581 *pOutAudioData++ = 0;
585 *pOutAudioData++ = pInAncData[11];
586 *pOutAudioData++ = pInAncData[12];
587 *pOutAudioData++ = pInAncData[14];
588 *pOutAudioData++ = pInAncData[15];
594 if ((pInAncData[1] & 0x04))
597 if ((pInAncData[2] & 0x04))
599 *pOutAudioData++ = 0;
600 *pOutAudioData++ = 0;
601 *pOutAudioData++ = 0;
602 *pOutAudioData++ = 0;
606 *pOutAudioData++ = pInAncData[18];
607 *pOutAudioData++ = pInAncData[19];
608 *pOutAudioData++ = pInAncData[21];
609 *pOutAudioData++ = pInAncData[22];
615 if ((pInAncData[1] & 0x08))
618 if ((pInAncData[2] & 0x08))
620 *pOutAudioData++ = 0;
621 *pOutAudioData++ = 0;
622 *pOutAudioData++ = 0;
623 *pOutAudioData++ = 0;
627 *pOutAudioData++ = pInAncData[25];
628 *pOutAudioData++ = pInAncData[26];
629 *pOutAudioData++ = pInAncData[28];
630 *pOutAudioData++ = pInAncData[29];
643 const uint16_t * pInAudioData(inAudioBuffer);
644 uint16_t * pOutDolbyData(outDolbyBuffer);
645 uint32_t dolbySize(0);
648 for (uint32_t cnt(0); cnt < inAudioSize / 2; cnt++)
653 case 0: mDolbyState = (*pInAudioData == 0xf872) ? 1 : 0;
656 case 1: mDolbyState = (*pInAudioData == 0x4e1f) ? 2 : 0;
660 case 2: mDolbyState = ((*pInAudioData & 0xff) == 0x15) ? 3 : 0;
664 case 3: mDolbyLength = uint32_t(*pInAudioData / 2);
669 case 4:
if (mDolbyLength)
674 *pOutDolbyData = (*pInAudioData >> 8) & 0xff;
675 *pOutDolbyData |= (*pInAudioData & 0xff) << 8;
685 default: mDolbyState = 0;
690 return dolbySize * 2;
NTV2Channel NTV2InputSourceToChannel(const NTV2InputSource inInputSource)
Converts a given NTV2InputSource to its equivalent NTV2Channel value.
Anc Field2 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
virtual bool SetTaskMode(const NTV2TaskMode inMode)
Sets the device's task mode.
bool Allocate(const size_t inByteCount, const bool inPageAligned=false)
Allocates (or re-allocates) my user-space storage using the given byte count. I assume full responsib...
virtual bool SetReference(const NTV2ReferenceSource inRefSource, const bool inKeepFramePulseSelect=(0))
Sets the device'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...
bool WithCustomAnc(void) const
AJAStatus Add(FrameDataPtr pInFrameData)
Appends a new frame buffer to me, increasing my frame storage capacity by one frame.
virtual bool AncSetFrameBufferSize(const ULWord inF1Size, const ULWord inF2Size)
Sets the capacity of the SDI ANC or HDMI AUX buffers in device frame memory. (Call NTV2DeviceCanDoCus...
ULWord AncBuffer2Size(void) const
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.
virtual void CaptureFrames(void)
Repeatedly captures frames using AutoCirculate (until global quit flag set).
ULWord VideoBufferSize(void) const
bool fDoMultiFormat
If true, use multi-format/multi-channel mode, if device supports it; otherwise normal mode...
virtual bool IsDeviceReady(const bool inCheckValid=(0))
Identifies the 1st HDMI video input.
ULWord GetBufferLevel(void) const
#define AJA_FAILURE(_status_)
#define NTV2_VIDEO_FORMAT_HAS_PROGRESSIVE_PICTURE(__f__)
NTV2InputSource NTV2ChannelToInputSource(const NTV2Channel inChannel, const NTV2IOKinds inKinds=NTV2_IOKINDS_SDI)
ULWord GetByteCount(void) const
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
virtual void SetupHostBuffers(void)
Sets up my circular buffers.
#define NTV2_IS_4K_VIDEO_FORMAT(__f__)
virtual AJAStatus SetPriority(AJAThreadPriority priority)
virtual void StartConsumerThread(void)
Starts my frame consumer thread.
Specifies HDMI input/output kinds.
NTV2DolbyCapture(const DolbyCaptureConfig &inConfig)
Constructs me using the given settings.
FrameDataPtr StartConsumeNextBuffer(void)
The thread that's responsible for processing incoming frames – the consumer – calls this function t...
UWord firstFrame(void) const
virtual AJAStatus Start()
virtual bool EnableInputInterrupt(const NTV2Channel channel=NTV2_CHANNEL1)
Allows the CNTV2Card instance to wait for and respond to input vertical blanking interrupts originati...
void EndConsumeNextBuffer(void)
The consumer thread calls this function to signal that it has finished processing the frame it obtain...
virtual bool AutoCirculateGetStatus(const NTV2Channel inChannel, AUTOCIRCULATE_STATUS &outStatus)
Returns the current AutoCirculate status for the given channel.
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.
virtual class DeviceCapabilities & features(void)
bool fDoFrameStats
if true, output per frame statistics
bool CanDoInputSource(const NTV2InputSource inSrc)
virtual bool SetMultiFormatMode(const bool inEnable)
Enables or disables multi-format (per channel) device operation. If enabled, each device channel can ...
virtual void StartProducerThread(void)
Starts my capture thread.
virtual bool GetHDMIInputColor(NTV2LHIHDMIColorSpace &outValue, const NTV2Channel inHDMIInput=NTV2_CHANNEL1)
Answers with the current colorspace for the given HDMI input.
ULWord GetProcessedFrameCount(void) const
Anc Field1 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
NTV2Channel fInputChannel
The device channel to use.
bool Fill(const T &inValue)
Fills me with the given scalar value.
virtual bool GetTaskMode(NTV2TaskMode &outMode)
Retrieves the device's current task mode.
std::string NTV2InputSourceToString(const NTV2InputSource inValue, const bool inForRetailDisplay=false)
0: Disabled (never recommended): device configured exclusively by client application(s).
virtual std::string GetDescription(void) const
std::string fAncDataFilePath
Optional path to Anc binary data file.
virtual AJAStatus SetupVideo(void)
Sets up everything I need for capturing video.
ULWord AncBufferSize(void) const
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...
#define NTV2_INPUT_SOURCE_IS_HDMI(_inpSrc_)
virtual bool AutoCirculateTransfer(const NTV2Channel inChannel, AUTOCIRCULATE_TRANSFER &transferInfo)
Transfers all or part of a frame as specified in the given AUTOCIRCULATE_TRANSFER object to/from the ...
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 DMABufferLock(const NTV2Buffer &inBuffer, bool inMap=(0), bool inRDMA=(0))
Page-locks the given host buffer to reduce transfer time and CPU usage of DMA transfers.
std::ostream & operator<<(std::ostream &ioStrm, const DolbyCaptureConfig &inObj)
NTV2Buffer & AncBuffer2(void)
NTV2LHIHDMIColorSpace inputColorSpace(NTV2_LHIHDMIColorSpaceYCbCr)
void SetAbortFlag(const bool *pAbortFlag)
Tells me the boolean variable I should monitor such that when it gets set to "true" will cause any th...
NTV2Buffer & AncBuffer(void)
virtual bool SubscribeInputVerticalEvent(const NTV2Channel inChannel=NTV2_CHANNEL1)
Causes me to be notified when an input vertical blanking interrupt occurs on the given input channel...
virtual NTV2VideoFormat GetInputVideoFormat(const NTV2InputSource inVideoSource=NTV2_INPUTSOURCE_SDI1, const bool inIsProgressive=(0))
Returns the video format of the signal that is present on the given input source. ...
static void Sleep(const int32_t inMilliseconds)
Suspends execution of the current thread for a given number of milliseconds.
2: OEM (recommended): device configured by client application(s) with some driver involvement...
virtual AJAStatus SetupAudio(void)
Sets up everything I need for capturing audio.
bool CanDoHDMIAuxCapture(void)
virtual bool ApplySignalRoute(const CNTV2SignalRouter &inRouter, const bool inReplace=(0))
Applies the given routing table to the AJA device.
NTV2XptConnections connections
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
bool fDoAudioFilter
If true, capture only audio anc.
NTV2Buffer & VideoBuffer(void)
ULWord GetDroppedFrameCount(void) const
virtual bool SetTsiFrameEnable(const bool inIsEnabled, const NTV2Channel inChannel)
Enables or disables SMPTE 425 two-sample interleave (Tsi) frame mode on the device.
static void ConsumerThreadStatic(AJAThread *pThread, void *pContext)
This is the consumer thread's static callback function that gets called when the consumer thread runs...
NTV2Buffer fAncBuffer
Host ancillary data buffer.
#define AUTOCIRCULATE_WITH_ANC
Use this to AutoCirculate with ancillary data.
ULWord fNumAnc2Bytes
Actual number of captured F2 anc bytes.
#define NTV2_ANCILLARYSIZE_MAX
std::string fDolbyDataFilePath
Optional path to Dolby binary data file.
Declares the CNTV2DeviceScanner class.
NTV2Buffer fAncBuffer2
Additional "F2" host anc buffer.
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device...
virtual bool AutoCirculateStop(const NTV2Channel inChannel, const bool inAbort=(0))
Stops AutoCirculate for the given channel, and releases the on-device frame buffers that were allocat...
#define NTV2_IS_VALID_CHANNEL(__x__)
Declares the AJAProcess class.
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.).
ULWord fNumAncBytes
Actual number of captured F1 anc bytes.
virtual AJAStatus Run(void)
Runs me.
virtual uint32_t RecoverDolby(const NTV2Buffer &inAudioBuffer, const uint32_t inAudioSize, NTV2Buffer &outDolbyBuffer)
Recover Dolby data from the given audio data.
This object specifies the information that will be transferred to or from the AJA device in the CNTV2...
NTV2InputSource fInputSource
The device input connector to use.
virtual bool RouteInputSignal(void)
Sets up device routing for capture.
virtual bool AuxExtractSetPacketFilters(const UWord inHDMIInput, const NTV2DIDSet &inDIDs)
Replaces the HDMI packet types to be excluded (filtered) by the given HDMI input's Aux extractor...
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...
virtual AJAStatus Init(void)
Initializes me and prepares me to Run.
void EndProduceNextBuffer(void)
The producer thread calls this function to signal that it has finished populating the frame it obtain...
This identifies the first Audio System.
#define NTV2_IS_VALID_INPUT_SOURCE(_inpSrc_)
static const size_t CIRCULAR_BUFFER_SIZE(10)
Number of NTV2FrameData's in our ring.
static const ULWord kDemoAppSignature((((uint32_t)( 'D'))<< 24)|(((uint32_t)( 'E'))<< 16)|(((uint32_t)( 'M'))<< 8)|(((uint32_t)( 'O'))<< 0))
Declares the NTV2DolbyCapture class.
virtual AJAStatus Attach(AJAThreadFunction *pThreadFunction, void *pUserContext)
FrameDataPtr StartProduceNextBuffer(void)
The thread that's responsible for providing frames – the producer – calls this function to populate...
virtual bool AuxExtractGetBufferOverrun(const UWord inHDMIInput, bool &outIsOverrun, const UWord inField=0)
Answers whether or not the given HDMI input's Aux extractor reached its buffer limits.
virtual ~NTV2DolbyCapture()
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
I capture HDMI Dolby audio from an HDMI input of an AJA device.
Specifies channel or FrameStore 1 (or the first item).
virtual bool UnsubscribeInputVerticalEvent(const NTV2Channel inChannel=NTV2_CHANNEL1)
Unregisters me so I'm no longer notified when an input VBI is signaled on the given input channel...
virtual bool AutoCirculateStart(const NTV2Channel inChannel, const ULWord64 inStartTime=0)
Starts AutoCirculate streaming for the specified channel that was previously initialized by CNTV2Card...
bool CanDoFrameBufferFormat(const NTV2PixelFormat inPF)
NTV2ACFrameRange fFrames
AutoCirculate frame count or range.
NTV2PixelFormat fPixelFormat
Pixel format to use.
static bool GetInputRouting(NTV2XptConnections &outConnections, const CaptureConfig &inConfig, const bool isInputRGB=(0))
Answers with the crosspoint connections needed to implement the given capture configuration.
bool SetAncBuffers(ULWord *pInANCBuffer, const ULWord inANCByteCount, ULWord *pInANCF2Buffer=NULL, const ULWord inANCF2ByteCount=0)
Sets my ancillary data buffers for use in a subsequent call to CNTV2Card::AutoCirculateTransfer.
std::string NTV2FrameBufferFormatToString(const NTV2FrameBufferFormat inValue, const bool inForRetailDisplay=false)
I encapsulate the video, audio and anc host buffers used in the AutoCirculate demos. I'm a more modern version of the AVDataBuffer.
NTV2Buffer fVideoBuffer
Host video buffer.
bool HasAvailableInputFrame(void) const
bool IsRunning(void) const
virtual void GetACStatus(ULWord &outGoodFrames, ULWord &outDroppedFrames, ULWord &outBufferLevel)
Provides status information about my input (capture) process.
AJALabelValuePairs Get(const bool inCompact=(0)) const
std::string fDeviceSpec
The AJA device to use.
std::map< NTV2InputXptID, NTV2OutputXptID > NTV2XptConnections
virtual void ConsumeFrames(void)
Repeatedly consumes frames from the circular buffer (until global quit flag set). ...
ULWord GetCapturedAncByteCount(const bool inField2=false) const
bool CanDoVideoFormat(const NTV2VideoFormat inVF)
UWord lastFrame(void) const
static NTV2DIDSet AuxExtractGetDefaultPacketFilters(void)
virtual bool AutoCirculateInitForInput(const NTV2Channel inChannel, const UWord inFrameCount=7, const NTV2AudioSystem inAudioSystem=NTV2_AUDIOSYSTEM_INVALID, const ULWord inOptionFlags=0, const UByte inNumChannels=1, const UWord inStartFrameNumber=0, const UWord inEndFrameNumber=0)
Prepares for subsequent AutoCirculate ingest streaming, designating a contiguous block of frame buffe...
std::string & lower(std::string &str)
virtual void Quit(void)
Gracefully stops me from running.
virtual bool AuxExtractSetFilterInclusionMode(const UWord inHDMIInput, const bool inEnable)
Enables or disables HDMI AUX packet filtering for the given HDMI input.
void * GetHostAddress(const ULWord inByteOffset, const bool inFromEnd=false) const
This class is used to configure an NTV2Capture instance.
std::string fAudioDataFilePath
Optional path to Audio binary data file.
#define AUTOCIRCULATE_WITH_HDMIAUX
Use this to AutoCirculate with HDMI auxiliary data.
virtual bool GetStreamingApplication(ULWord &outAppType, int32_t &outProcessID)
Answers with the four-CC type and process ID of the application that currently "owns" the AJA device ...
virtual void ToString(std::string &outAllLabelsAndValues) const
Answers with a multi-line string that contains the complete host system info table.
virtual bool WaitForInputVerticalInterrupt(const NTV2Channel inChannel=NTV2_CHANNEL1, UWord inRepeatCount=1)
Efficiently sleeps the calling thread/process until the next one or more field (interlaced video) or ...
static void ProducerThreadStatic(AJAThread *pThread, void *pContext)
This is the capture thread's static callback function that gets called when the capture thread runs...
bool CanDoMultiFormat(void)
std::set< UByte > NTV2DIDSet
A set of distinct NTV2DID values.
bool SetVideoBuffer(ULWord *pInVideoBuffer, const ULWord inVideoByteCount)
Sets my video buffer for use in a subsequent call to CNTV2Card::AutoCirculateTransfer.
AJALabelValuePairs Get(const bool inCompact=(0)) const
#define NTV2_AUDIOSIZE_MAX
NTV2ReferenceSource NTV2InputSourceToReferenceSource(const NTV2InputSource inInputSource)
Converts a given NTV2InputSource to its equivalent NTV2ReferenceSource value.
virtual uint32_t RecoverAudio(const NTV2Buffer &inAncBuffer, const uint32_t inAncSize, NTV2Buffer &outAudioBuffer)
Recover audio from ancillary data.
virtual bool EnableChannel(const NTV2Channel inChannel)
Enables the given FrameStore.