| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- #include "aja-props.hpp"
- #include <ajantv2/includes/ntv2devicefeatures.h>
- #include <ajantv2/includes/ntv2utils.h>
- #include <ajantv2/includes/ntv2vpid.h>
- VPIDData::VPIDData()
- : mVpidA{0},
- mVpidB{0},
- mStandardA{VPIDStandard_Unknown},
- mStandardB{VPIDStandard_Unknown},
- mSamplingA{VPIDSampling_XYZ_444},
- mSamplingB{VPIDSampling_XYZ_444}
- {
- }
- VPIDData::VPIDData(ULWord vpidA, ULWord vpidB)
- : mVpidA{vpidA},
- mVpidB{vpidB},
- mStandardA{VPIDStandard_Unknown},
- mStandardB{VPIDStandard_Unknown},
- mSamplingA{VPIDSampling_XYZ_444},
- mSamplingB{VPIDSampling_XYZ_444}
- {
- Parse();
- }
- VPIDData::VPIDData(const VPIDData &other)
- : mVpidA{other.mVpidA},
- mVpidB{other.mVpidB},
- mStandardA{VPIDStandard_Unknown},
- mStandardB{VPIDStandard_Unknown},
- mSamplingA{VPIDSampling_XYZ_444},
- mSamplingB{VPIDSampling_XYZ_444}
- {
- Parse();
- }
- VPIDData::VPIDData(VPIDData &&other)
- : mVpidA{other.mVpidA},
- mVpidB{other.mVpidB},
- mStandardA{VPIDStandard_Unknown},
- mStandardB{VPIDStandard_Unknown},
- mSamplingA{VPIDSampling_XYZ_444},
- mSamplingB{VPIDSampling_XYZ_444}
- {
- Parse();
- }
- VPIDData &VPIDData::operator=(const VPIDData &other)
- {
- mVpidA = other.mVpidA;
- mVpidB = other.mVpidB;
- return *this;
- }
- VPIDData &VPIDData::operator=(VPIDData &&other)
- {
- mVpidA = other.mVpidA;
- mVpidB = other.mVpidB;
- return *this;
- }
- bool VPIDData::operator==(const VPIDData &rhs) const
- {
- return (mVpidA == rhs.mVpidA && mVpidB == rhs.mVpidB);
- }
- bool VPIDData::operator!=(const VPIDData &rhs) const
- {
- return !operator==(rhs);
- }
- void VPIDData::SetA(ULWord vpidA)
- {
- mVpidA = vpidA;
- }
- void VPIDData::SetB(ULWord vpidB)
- {
- mVpidB = vpidB;
- }
- void VPIDData::Parse()
- {
- CNTV2VPID parserA;
- parserA.SetVPID(mVpidA);
- mStandardA = parserA.GetStandard();
- mSamplingA = parserA.GetSampling();
- CNTV2VPID parserB;
- parserB.SetVPID(mVpidB);
- mStandardB = parserB.GetStandard();
- mSamplingB = parserB.GetSampling();
- }
- bool VPIDData::IsRGB() const
- {
- switch (mSamplingA) {
- default:
- break;
- case VPIDSampling_GBR_444:
- case VPIDSampling_GBRA_4444:
- case VPIDSampling_GBRD_4444:
- return true;
- }
- return false;
- }
- VPIDStandard VPIDData::Standard() const
- {
- return mStandardA;
- }
- VPIDSampling VPIDData::Sampling() const
- {
- return mSamplingA;
- }
- // AJASource Properties
- SourceProps::SourceProps()
- : deviceID{DEVICE_ID_NOTFOUND},
- ioSelect{IOSelection::Invalid},
- inputSource{NTV2_INPUTSOURCE_INVALID},
- videoFormat{NTV2_FORMAT_UNKNOWN},
- pixelFormat{NTV2_FBF_INVALID},
- sdi4kTransport{SDI4KTransport::TwoSampleInterleave},
- audioNumChannels{8},
- audioSampleSize{4},
- audioSampleRate{48000},
- vpids{},
- autoDetect{false},
- deactivateWhileNotShowing{false}
- {
- }
- SourceProps::SourceProps(NTV2DeviceID devID)
- : deviceID{devID},
- ioSelect{IOSelection::Invalid},
- inputSource{NTV2_INPUTSOURCE_INVALID},
- videoFormat{NTV2_FORMAT_UNKNOWN},
- pixelFormat{NTV2_FBF_INVALID},
- sdi4kTransport{SDI4KTransport::TwoSampleInterleave},
- audioNumChannels{8},
- audioSampleSize{4},
- audioSampleRate{48000},
- vpids{},
- autoDetect{false},
- deactivateWhileNotShowing{false}
- {
- }
- SourceProps::SourceProps(const SourceProps &props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- inputSource = props.inputSource;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- vpids = props.vpids;
- autoDetect = props.autoDetect;
- deactivateWhileNotShowing = props.deactivateWhileNotShowing;
- }
- SourceProps::SourceProps(SourceProps &&props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- inputSource = props.inputSource;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- vpids = props.vpids;
- autoDetect = props.autoDetect;
- deactivateWhileNotShowing = props.deactivateWhileNotShowing;
- }
- void SourceProps::operator=(const SourceProps &props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- inputSource = props.inputSource;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- vpids = props.vpids;
- autoDetect = props.autoDetect;
- deactivateWhileNotShowing = props.deactivateWhileNotShowing;
- }
- void SourceProps::operator=(SourceProps &&props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- inputSource = props.inputSource;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- vpids = props.vpids;
- autoDetect = props.autoDetect;
- deactivateWhileNotShowing = props.deactivateWhileNotShowing;
- }
- bool SourceProps::operator==(const SourceProps &props)
- {
- return (deviceID == props.deviceID && ioSelect == props.ioSelect &&
- // inputSource == props.inputSource &&
- videoFormat == props.videoFormat &&
- pixelFormat == props.pixelFormat &&
- // vpid == props.vpid &&
- autoDetect == props.autoDetect &&
- sdi4kTransport == props.sdi4kTransport &&
- audioNumChannels == props.audioNumChannels &&
- audioSampleSize == props.audioSampleSize &&
- audioSampleRate == props.audioSampleRate &&
- deactivateWhileNotShowing == props.deactivateWhileNotShowing);
- }
- bool SourceProps::operator!=(const SourceProps &props)
- {
- return !operator==(props);
- }
- NTV2Channel SourceProps::Channel() const
- {
- return NTV2InputSourceToChannel(inputSource);
- }
- NTV2AudioSystem SourceProps::AudioSystem() const
- {
- return NTV2ChannelToAudioSystem(Channel());
- }
- NTV2AudioRate SourceProps::AudioRate() const
- {
- NTV2AudioRate rate = NTV2_AUDIO_48K;
- switch (audioSampleRate) {
- default:
- case 48000:
- rate = NTV2_AUDIO_48K;
- break;
- case 96000:
- rate = NTV2_AUDIO_96K;
- break;
- case 192000:
- rate = NTV2_AUDIO_192K;
- break;
- }
- return rate;
- }
- // Size in bytes of N channels of audio
- size_t SourceProps::AudioSize() const
- {
- return audioNumChannels * audioSampleSize;
- }
- audio_format SourceProps::AudioFormat() const
- {
- // NTV2 is always 32-bit PCM
- return AUDIO_FORMAT_32BIT;
- }
- speaker_layout SourceProps::SpeakerLayout() const
- {
- if (audioNumChannels == 2)
- return SPEAKERS_STEREO;
- // NTV2 is always at least 8ch on modern boards
- return SPEAKERS_7POINT1;
- }
- //
- // AJAOutput Properties
- //
- OutputProps::OutputProps(NTV2DeviceID devID)
- : deviceID{devID},
- ioSelect{IOSelection::Invalid},
- outputDest{NTV2_OUTPUTDESTINATION_ANALOG},
- videoFormat{NTV2_FORMAT_UNKNOWN},
- pixelFormat{NTV2_FBF_INVALID},
- sdi4kTransport{SDI4KTransport::TwoSampleInterleave},
- audioNumChannels{8},
- audioSampleSize{4},
- audioSampleRate{48000}
- {
- }
- OutputProps::OutputProps(OutputProps &&props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- outputDest = props.outputDest;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- }
- OutputProps::OutputProps(const OutputProps &props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- outputDest = props.outputDest;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- }
- void OutputProps::operator=(const OutputProps &props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- outputDest = props.outputDest;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- }
- void OutputProps::operator=(OutputProps &&props)
- {
- deviceID = props.deviceID;
- ioSelect = props.ioSelect;
- outputDest = props.outputDest;
- videoFormat = props.videoFormat;
- pixelFormat = props.pixelFormat;
- sdi4kTransport = props.sdi4kTransport;
- audioNumChannels = props.audioNumChannels;
- audioSampleSize = props.audioSampleSize;
- audioSampleRate = props.audioSampleRate;
- }
- bool OutputProps::operator==(const OutputProps &props)
- {
- return (deviceID == props.deviceID && ioSelect == props.ioSelect &&
- // outputDest == props.outputDest &&
- videoFormat == props.videoFormat &&
- pixelFormat == props.pixelFormat &&
- audioNumChannels == props.audioNumChannels &&
- audioSampleSize == props.audioSampleSize &&
- audioSampleRate == props.audioSampleRate);
- }
- bool OutputProps::operator!=(const OutputProps &props)
- {
- return !operator==(props);
- }
- NTV2FormatDesc OutputProps::FormatDesc()
- {
- return NTV2FormatDesc(videoFormat, pixelFormat, NTV2_VANCMODE_OFF);
- }
- NTV2Channel OutputProps::Channel() const
- {
- // Output Channel Special Cases
- // KONA1 -- Has 2 framestores but only 1 bi-directional SDI widget
- if (deviceID == DEVICE_ID_KONA1) {
- return NTV2_CHANNEL2;
- } else if ((deviceID == DEVICE_ID_IO4K ||
- deviceID == DEVICE_ID_IO4KPLUS) &&
- outputDest == NTV2_OUTPUTDESTINATION_SDI5) {
- // IO4K/IO4K+ SDI Monitor - Use framestore 4 but SDI5
- return NTV2_CHANNEL4;
- }
- if (NTV2_OUTPUT_DEST_IS_HDMI(outputDest))
- return static_cast<NTV2Channel>(
- NTV2DeviceGetNumFrameStores(deviceID) - 1);
- return NTV2OutputDestinationToChannel(outputDest);
- }
- NTV2AudioSystem OutputProps::AudioSystem() const
- {
- return NTV2ChannelToAudioSystem(Channel());
- }
- NTV2AudioRate OutputProps::AudioRate() const
- {
- NTV2AudioRate rate = NTV2_AUDIO_48K;
- switch (audioSampleRate) {
- default:
- case 48000:
- rate = NTV2_AUDIO_48K;
- break;
- case 96000:
- rate = NTV2_AUDIO_96K;
- break;
- case 192000:
- rate = NTV2_AUDIO_192K;
- break;
- }
- return rate;
- }
- // Size in bytes of N channels of audio
- size_t OutputProps::AudioSize() const
- {
- return audioNumChannels * audioSampleSize;
- }
- audio_format OutputProps::AudioFormat() const
- {
- // NTV2 is always 32-bit PCM
- return AUDIO_FORMAT_32BIT;
- }
- speaker_layout OutputProps::SpeakerLayout() const
- {
- if (audioNumChannels == 2)
- return SPEAKERS_STEREO;
- // NTV2 is always at least 8ch on modern boards
- return SPEAKERS_7POINT1;
- }
|