obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2config2110.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

491 lines
17 KiB
C++

/* SPDX-License-Identifier: MIT */
/**
@file ntv2config2110.h
@brief Declares the CNTV2Config2110 class.
@copyright (C) 2014-2021 AJA Video Systems, Inc.
**/
#ifndef NTV2_2110CONFIG_H
#define NTV2_2110CONFIG_H
#include "ntv2card.h"
#include "ntv2enums.h"
#include "ntv2registers2110.h"
#include "ntv2mbcontroller.h"
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
/**
@brief Structs and enums that hold the virtual config data used by services the ControlPanel application and JSON parsers
**/
#define RX_USE_SFP_IP BIT(31)
#define IP_STRSIZE 32
typedef enum
{
kNetworkData2110 = NTV2_FOURCC('n','t','1','3'), // 4CC of network config data
kTransmitVideoData2110 = NTV2_FOURCC('t','v','1','3'), // 4CC of video transmit config data
kTransmitAudioData2110 = NTV2_FOURCC('t','a','1','3'), // 4CC of audio transmit config data
kTransmitAncData2110 = NTV2_FOURCC('t','n','1','3'), // 4CC of anc transmit config data
kReceiveVideoData2110 = NTV2_FOURCC('r','v','1','3'), // 4CC of video receive config data
kReceiveAudioData2110 = NTV2_FOURCC('r','a','1','3'), // 4CC of audio receive config data
kReceiveAncData2110 = NTV2_FOURCC('r','n','1','3'), // 4CC of anc receive config data
kChStatusData2110 = NTV2_FOURCC('s','t','1','3') // 4CC of channel status config data
} VirtualDataTag2110;
typedef enum
{
kIpStatusFail = 0,
kIpStatusStopped = 1,
kIpStatusRunning = 2
} IpChStatusState;
// force 1 byte alignment so can work across 32/64 bit apps
#pragma pack(push,1)
typedef struct
{
NTV2Stream stream;
char remoteIP[2][IP_STRSIZE];
uint32_t remotePort[2];
uint32_t localPort[2];
uint32_t sfpEnable[2];
uint32_t ttl;
uint32_t ssrc;
uint32_t payloadType;
NTV2VideoFormat videoFormat;
VPIDSampling sampling;
uint32_t enable;
uint8_t unused[12];
} TxVideoChData2110;
typedef struct
{
NTV2Stream stream;
NTV2Channel channel;
char remoteIP[2][IP_STRSIZE];
uint32_t localPort[2];
uint32_t remotePort[2];
uint32_t sfpEnable[2];
uint32_t ttl;
uint32_t ssrc;
uint32_t payloadType;
uint32_t numAudioChannels;
uint32_t firstAudioChannel;
eNTV2PacketInterval audioPktInterval;
uint32_t enable;
uint8_t unused[16];
} TxAudioChData2110;
typedef struct
{
NTV2Stream stream;
char remoteIP[2][IP_STRSIZE];
uint32_t localPort[2];
uint32_t remotePort[2];
uint32_t sfpEnable[2];
uint32_t ttl;
uint32_t ssrc;
uint32_t payloadType;
uint32_t enable;
uint8_t unused[16];
} TxAncChData2110;
typedef struct
{
NTV2Stream stream;
char sourceIP[2][IP_STRSIZE];
char destIP[2][IP_STRSIZE];
uint32_t sourcePort[2];
uint32_t destPort[2];
uint32_t sfpEnable[2];
uint32_t vlan;
uint32_t ssrc;
uint32_t payloadType;
NTV2VideoFormat videoFormat;
uint32_t enable;
uint8_t unused[16];
} RxVideoChData2110;
typedef struct
{
NTV2Stream stream;
NTV2Channel channel;
char sourceIP[2][IP_STRSIZE];
char destIP[2][IP_STRSIZE];
uint32_t sourcePort[2];
uint32_t destPort[2];
uint32_t sfpEnable[2];
uint32_t vlan;
uint32_t ssrc;
uint32_t payloadType;
uint32_t numAudioChannels;
eNTV2PacketInterval audioPktInterval;
uint32_t enable;
uint8_t unused[16];
} RxAudioChData2110;
typedef struct
{
NTV2Stream stream;
char sourceIP[2][IP_STRSIZE];
char destIP[2][IP_STRSIZE];
uint32_t sourcePort[2];
uint32_t destPort[2];
uint32_t sfpEnable[2];
uint32_t vlan;
uint32_t ssrc;
uint32_t payloadType;
uint32_t enable;
uint8_t unused[16];
} RxAncChData2110;
typedef struct
{
eSFP sfp;
char ipAddress[IP_STRSIZE];
char subnetMask[IP_STRSIZE];
char gateWay[IP_STRSIZE];
uint32_t enable;
uint8_t unused[16];
} SFPData2110;
typedef struct
{
uint32_t txChStatus[4];
uint32_t rxChStatus[4];
uint8_t unused[16];
} IpStatus2110;
typedef struct
{
bool setup4k;
uint32_t ptpDomain;
uint8_t ptpPreferredGMID[8];
uint32_t numSFPs;
SFPData2110 sfp[2];
bool multiSDP;
bool audioCombine;
uint32_t rxMatchOverride;
uint8_t unused[10];
} NetworkData2110;
typedef struct
{
uint32_t numTxVideoChannels;
TxVideoChData2110 txVideoCh[4];
} TransmitVideoData2110;
typedef struct
{
uint32_t numTxAudioChannels;
TxAudioChData2110 txAudioCh[4];
} TransmitAudioData2110;
typedef struct
{
uint32_t numTxAncChannels;
TxAncChData2110 txAncCh[4];
} TransmitAncData2110;
typedef struct
{
uint32_t numRxVideoChannels;
RxVideoChData2110 rxVideoCh[4];
} ReceiveVideoData2110;
typedef struct
{
uint32_t numRxAudioChannels;
RxAudioChData2110 rxAudioCh[4];
} ReceiveAudioData2110;
typedef struct
{
uint32_t numRxAncChannels;
RxAncChData2110 rxAncCh[4];
} ReceiveAncData2110;
#pragma pack(pop)
inline NTV2Stream ChToVideoStream(int ch)
{ return (NTV2Stream)(NTV2_VIDEO1_STREAM+ch); }
inline int VideoStreamToCh(NTV2Stream s)
{ return (int)(s); }
inline NTV2Stream ChToAudioStream(int ch)
{ return (NTV2Stream)(NTV2_AUDIO1_STREAM+ch); }
inline int AudioStreamToCh(NTV2Stream s)
{ return (int)(s >= NTV2_AUDIO1_STREAM ? s-NTV2_AUDIO1_STREAM : 0); }
inline NTV2Stream ChToAncStream(int ch)
{ return (NTV2Stream)(NTV2_ANC1_STREAM+ch); }
inline int AncStreamToCh(NTV2Stream s)
{ return (int)(s >= NTV2_ANC1_STREAM ? s-NTV2_ANC1_STREAM : 0); }
/**
@brief Configures a SMPTE 2110 Transmit Channel.
**/
class AJAExport tx_2110Config
{
public:
tx_2110Config() { init(); }
void init();
bool operator != ( const tx_2110Config &other );
bool operator == ( const tx_2110Config &other );
public:
std::string remoteIP[2]; ///< @brief Specifies remote (destination) IP address.
uint32_t localPort[2]; ///< @brief Specifies the local (source) port number.
uint32_t remotePort[2]; ///< @brief Specifies the remote (destination) port number.
uint16_t payloadType;
uint8_t tos; // type of service
uint8_t ttl; // time to live
uint32_t ssrc;
NTV2Channel channel;
NTV2VideoFormat videoFormat;
VPIDSampling videoSamples;
uint8_t numAudioChannels;
uint8_t firstAudioChannel;
eNTV2PacketInterval audioPktInterval;
};
/**
@brief Configures a SMPTE 2110 Receive Channel.
**/
class AJAExport rx_2110Config
{
public:
rx_2110Config() { init(); }
void init();
bool operator != ( const rx_2110Config &other );
bool operator == ( const rx_2110Config &other );
public:
uint32_t rxMatch; ///< @brief Bitmap of rxMatch criteria used
std::string sourceIP; ///< @brief Specifies the source (sender) IP address (if RX_MATCH_2110_SOURCE_IP set). If it's in the multiclass range, then
/// by default, the IGMP multicast group will be joined (see CNTV2Config2110::SetIGMPDisable).
std::string destIP; ///< @brief Specifies the destination (target) IP address (if RX_MATCH_2110_DEST_IP set)
uint32_t sourcePort; ///< @brief Specifies the source (sender) port number (if RX_MATCH_2110_SOURCE_PORT set)
uint32_t destPort; ///< @brief Specifies the destination (target) port number (if RX_MATCH_2110_DEST_PORT set)
uint32_t ssrc; ///< @brief Specifies the SSRC identifier (if RX_MATCH_2110_SSRC set)
uint16_t vlan; ///< @brief Specifies the VLAN TCI (if RX_MATCH_2110_VLAN set)
uint16_t payloadType;
NTV2VideoFormat videoFormat;
VPIDSampling videoSamples;
uint32_t numAudioChannels;
eNTV2PacketInterval audioPktInterval;
};
typedef struct
{
rx_2110Config rx2110Config[4];
} multiRx_2110Config;
/**
@brief The CNTV2Config2110 class inquires and configures SMPTE 2110 network I/O for \ref konaip and \ref ioip.
**/
class AJAExport CNTV2Config2110 : public CNTV2MBController
{
friend class CKonaIpJsonSetup;
public:
CNTV2Config2110 (CNTV2Card & device);
~CNTV2Config2110();
bool SetNetworkConfiguration (const eSFP sfp, const IPVNetConfig & netConfig);
bool GetNetworkConfiguration (const eSFP sfp, IPVNetConfig & netConfig);
bool SetNetworkConfiguration (const eSFP sfp, const std::string localIPAddress, const std::string subnetMask, const std::string gateway);
bool GetNetworkConfiguration (const eSFP sfp, std::string & localIPAddress, std::string & subnetMask, std::string & gateway);
bool DisableNetworkInterface (const eSFP sfp);
bool SetRxStreamConfiguration (const eSFP sfp, const NTV2Stream stream, const rx_2110Config & rxConfig);
bool GetRxStreamConfiguration (const eSFP sfp, const NTV2Stream stream, rx_2110Config & rxConfig);
bool SetRxStreamEnable (const eSFP sfp, const NTV2Stream stream, bool enable);
bool GetRxStreamEnable (const eSFP sfp, const NTV2Stream stream, bool & enabled);
bool GetRxPacketCount (const NTV2Stream stream, uint32_t &packets);
bool GetRxByteCount (const NTV2Stream stream, uint32_t &bytes);
bool GetRxByteCount (const eSFP sfp, uint64_t &bytes);
bool SetTxStreamConfiguration (const NTV2Stream stream, const tx_2110Config & txConfig);
bool GetTxStreamConfiguration (const NTV2Stream stream, tx_2110Config & txConfig);
bool SetTxStreamEnable (const NTV2Stream stream, bool enableSfp1, bool enableSfp2 = false);
bool GetTxStreamEnable (const NTV2Stream stream, bool & sfp1Enabled, bool & sfp2Enabled);
bool GetTxPacketCount (NTV2Stream stream, uint32_t &packets);
bool GetTxByteCount (const eSFP sfp, uint64_t &bytes);
bool SetPTPDomain (const uint8_t domain);
bool GetPTPDomain (uint8_t &domain);
bool SetPTPPreferredGrandMasterId (const uint8_t id[8]);
bool GetPTPPreferredGrandMasterId (uint8_t (&id)[8]);
bool GetPTPStatus (PTPStatus & ptpStatus);
bool Set4KModeEnable (const bool enable);
bool Get4KModeEnable (bool & enable);
/**
@brief Enables or disables the audio combiner.
@param[in] enable Specify true to enable the audio combiner; specify false to disable it.
@return True if successful; otherwise false.
@note This only affects 4K RX mode.
@note This parameter can be set in the \ref ntv2konaipjsonsetup. Both JSON examples specify it in the "network2110" area.
@detail Normally the audio combiner is disabled when transmitting 16 audio channels over a single flow.
However, it is possible to divide the audio into multiple flows of 4 channels each, so in this case, on the RX side,
you would enable the audio combiner, so that it combines all the separate flows into a single 16-channel audio buffer.
@see CNTV2Config2110::GetAudioCombineEnable
**/
bool SetAudioCombineEnable (const bool enable);
/**
@brief Answers with the enable/disable state of the audio combiner.
@param[in] enable Receives true if the audio combiner is enabled; otherwise false if it's disabled.
@return True if successful; otherwise false.
@note This only affects 4K RX mode.
@detail Normally the audio combiner is off when transmitting 16 audio channels over a single flow.
However, it is possible to divide the audio into multiple flows of 4 channels each, so in this case, on the RX side,
you would enable the audio combiner so, that it combines all the separate flows into a single 16-channel audio buffer.
@see CNTV2Config2110::SetAudioCombineEnable
**/
bool GetAudioCombineEnable (bool & enable);
bool SetIPServicesControl (const bool enable, const bool forceReconfig);
bool GetIPServicesControl (bool & enable, bool & forceReconfig);
std::string GetSDPUrl (const eSFP sfp, const NTV2Stream stream);
std::string GetGeneratedSDP (bool enabledSfp1, bool enabledSfp2, const NTV2Stream stream);
bool GetActualSDP (std::string url, std::string & sdp);
bool ExtractRxVideoConfigFromSDP (std::string sdp, rx_2110Config & rxConfig);
bool ExtractRxVideoConfigFromSDP (std::string sdp, multiRx_2110Config & rxConfig);
bool ExtractRxAudioConfigFromSDP (std::string sdp, rx_2110Config & rxConfig);
bool ExtractRxAncConfigFromSDP (std::string sdp, rx_2110Config & rxConfig);
/**
@brief Disables the automatic (default) joining of multicast groups using IGMP, based on remote IP address for Rx Channels
@param[in] sfp Specifies SFP connector used.
@param[in] disable If true, IGMP messages will not be sent to join multicast groups
@note When Rx channels are enabled for multicast IP addresses, by default the multicast group is joined. When Rx Channels
are disabled, if the channel is the last user of the group, then the subscription to the multicast group will be ended.
When IGMP is disabled, the above actions are not performed,
**/
bool SetIGMPDisable (const eSFP sfp, const bool disable);
bool GetIGMPDisable (const eSFP sfp, bool & disabled);
bool SetIGMPVersion (const eIGMPVersion_t version);
bool GetIGMPVersion (eIGMPVersion_t & version);
void SetBiDirectionalChannels (const bool bidirectional) { _biDirectionalChannels = bidirectional;}
bool GetBiDirectionalChannels (void) {return _biDirectionalChannels;}
bool GetMACAddress (const eSFP port, const NTV2Stream stream, std::string remoteIP, uint32_t & hi, uint32_t & lo);
bool GetSFPMSAData (eSFP port, SFPMSAData & data);
bool GetLinkStatus (eSFP port, SFPStatus & sfpStatus);
bool GenSDP (bool enableSfp1, bool enableSfp2, const NTV2Stream stream, bool pushit=true);
static uint32_t Get2110TxStreamIndex (NTV2Stream stream );
static uint32_t GetDecapsulatorAddress (eSFP sfp, NTV2Stream stream);
bool SetLLDPInfo (std::string sysname);
bool GetLLDPInfo (std::string &chassisId0, std::string &portId0,
std::string &chassisId1, std::string &portId1);
uint64_t GetNTPTimestamp (void);
// If method returns false call this to get details
std::string getLastError (void);
NTV2IpError getLastErrorCode (void);
static uint32_t videoPacketizers[4];
static uint32_t videoRGB12Packetizers[4];
static uint32_t audioPacketizers[4];
static uint32_t videoDepacketizers[4];
static uint32_t audioDepacketizers[4];
protected:
uint32_t GetDepacketizerAddress (const NTV2Stream stream);
uint32_t GetPacketizerAddress (const NTV2Stream stream, const VPIDSampling sampling);
uint32_t GetFramerAddress (const eSFP sfp, const NTV2Stream stream);
void SelectTxFramerChannel (const NTV2Stream stream, const uint32_t baseAddr);
void AcquireFramerControlAccess (const uint32_t baseAddr);
void ReleaseFramerControlAccess (const uint32_t baseAddr);
void EnableFramerStream (const eSFP sfp, const NTV2Stream stream, bool enable);
bool SetFramerStream (const eSFP sfp, const NTV2Stream stream, const tx_2110Config & txConfig);
void GetFramerStream (const eSFP sfp, const NTV2Stream stream, tx_2110Config & txConfig);
void SetArbiter (const eSFP sfp, const NTV2Stream stream, bool enable);
void GetArbiter (const eSFP sfp, const NTV2Stream stream, bool & enable);
void SetSampling(const eSFP sfp, const NTV2Stream stream, const VPIDSampling sampling);
VPIDSampling GetSampling(const eSFP sfp, const NTV2Stream stream);
void DisableDepacketizerStream (const NTV2Stream stream);
void EnableDepacketizerStream (const NTV2Stream stream);
void DisableDecapsulatorStream (const eSFP sfp, const NTV2Stream stream);
void EnableDecapsulatorStream (const eSFP sfp, const NTV2Stream stream);
void SetupDecapsulatorStream (const eSFP sfp, const NTV2Stream stream, const rx_2110Config &rxConfig);
void ResetPacketizerStream (const NTV2Stream stream);
void SetupDepacketizerStream (const NTV2Stream stream, const rx_2110Config & rxConfig);
void ResetDepacketizerStream (const NTV2Stream stream);
void SetVideoFormatForRxTx (const NTV2Stream stream, const NTV2VideoFormat format, const bool rx);
void GetVideoFormatForRxTx (const NTV2Stream stream, NTV2VideoFormat & format, uint32_t & hwFormat, const bool rx);
bool ConfigurePTP (const eSFP sfp, const std::string localIPAddress);
bool GenVideoStreamSDP (std::stringstream &sdp, const bool enableSfp1,
const bool enableSfp2, const NTV2Stream stream, char *gmInfo);
bool GenVideoStreamSDPInfo (std::stringstream & sdp, const eSFP sfp, const NTV2Stream stream, char* gmInfo);
bool GenVideoStreamMultiSDPInfo (std::stringstream & sdp, char* gmInfo);
bool GenAudioStreamSDP (std::stringstream &sdp, const bool enableSfp1,
const bool enableSfp2, const NTV2Stream stream, char *gmInfo);
bool GenAudioStreamSDPInfo (std::stringstream & sdp, const eSFP sfp, const NTV2Stream stream, char* gmInfo);
bool GenAncStreamSDP (std::stringstream &sdp, const bool enableSfp1,
const bool enableSfp2, const NTV2Stream stream, char *gmInfo);
bool GenAncStreamSDPInfo (std::stringstream & sdp, const eSFP sfp, const NTV2Stream stream, char* gmInfo);
NTV2StreamType StreamType (const NTV2Stream stream);
NTV2Channel VideoStreamToChannel (const NTV2Stream stream);
private:
std::string To_String (int val);
std::vector<std::string> split (const char *str, char delim);
std::string rateToString (NTV2FrameRate rate);
NTV2FrameRate stringToRate (std::string str);
int LeastCommonMultiple (int a,int b);
int getDescriptionValue (int startLine, std::string type, std::string & value);
std::string getVideoDescriptionValue (std::string type);
std::stringstream txsdp;
uint32_t _numRx0Chans;
uint32_t _numRx1Chans;
uint32_t _numTx0Chans;
uint32_t _numTx1Chans;
uint32_t _numRxChans;
uint32_t _numTxChans;
bool _biDirectionalChannels; // logically bi-directional channels
std::vector<std::string> sdpLines;
std::vector<std::string> tokens;
}; // CNTV2Config2110
#endif // NTV2_2110CONFIG_H