AJA NTV2 SDK  17.1.1.1245
NTV2 SDK 17.1.1.1245
main.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 // Includes
10 #include "ntv2player4k.h"
11 #include <signal.h>
12 
13 
14 using namespace std;
15 
16 
17 // Globals
18 static bool gGlobalQuit (false); // Set this "true" to exit gracefully
19 
20 
21 static void SignalHandler (int inSignal)
22 {
23  (void) inSignal;
24  gGlobalQuit = true;
25 }
26 
27 
28 int main (int argc, const char ** argv)
29 {
30  char * pDeviceSpec (AJA_NULL); // Device specifier string, if any
31  char * pPixelFormat (AJA_NULL); // Pixel format argument
32  char * pFramesSpec (AJA_NULL); // AutoCirculate frames spec
33  char * pVideoFormat (AJA_NULL); // Video format to use
34  int channelNumber (1); // Channel/FrameStore to use
35  int doMultiFormat (0); // MultiFormat mode?
36  int showVersion (0); // Show version?
37  int numAudioLinks (1); // Number of audio systems for multi-link audio
38  int useHDMIOut (0); // Enable HDMI output?
39  int doRGBOnWire (0); // Route the output to put RGB on the wire
40  int doSquares (0); // Don't route output thru Tsi Muxes
41  int doLinkGrping (0); // Use 6/12G output mode - IoXT+ and Kona5 Retail
43 
44  // Command line option descriptions:
45  const CNTV2DemoCommon::PoptOpts optionsTable [] =
46  {
47  {"version", 0, POPT_ARG_NONE, &showVersion, 0, "show version & exit", AJA_NULL },
48  {"device", 'd', POPT_ARG_STRING, &pDeviceSpec, 0, "device to use", "index#, serial#, or model" },
49  {"channel", 'c', POPT_ARG_INT, &channelNumber, 0, "channel to use", "1-8" },
50  {"multiFormat", 'm', POPT_ARG_NONE, &doMultiFormat, 0, "use multi-format/channel", AJA_NULL },
51  {"pixelFormat", 'p', POPT_ARG_STRING, &pPixelFormat, 0, "pixel format to use", "'?' or 'list' to list" },
52  {"frames", 0, POPT_ARG_STRING, &pFramesSpec, 0, "frames to AutoCirculate", "num[@min] or min-max" },
53  {"videoFormat", 'v', POPT_ARG_STRING, &pVideoFormat, 0, "video format to produce", "'?' or 'list' to list" },
54  {"audioLinks", 'a', POPT_ARG_INT, &numAudioLinks, 0, "# audio systems to link", "1-4 0=silence" },
55  {"hdmi", 'h', POPT_ARG_NONE, &useHDMIOut, 0, "enable HDMI output?", AJA_NULL },
56  {"rgb", 'r', POPT_ARG_NONE, &doRGBOnWire, 0, "RGB on SDI?", AJA_NULL },
57  {"squares", 's', POPT_ARG_NONE, &doSquares, 0, "use square routing?", AJA_NULL },
58  {"6g/12g", 'g', POPT_ARG_NONE, &doLinkGrping, 0, "use 6G/12G output mode", AJA_NULL },
61  };
62  CNTV2DemoCommon::Popt popt(argc, argv, optionsTable);
63  if (!popt)
64  {cerr << "## ERROR: " << popt.errorStr() << endl; return 2;}
65  if (showVersion)
66  {cout << argv[0] << ", NTV2 SDK " << ::NTV2Version() << endl; return 0;}
67 
68  // Device
69  const string deviceSpec (pDeviceSpec ? pDeviceSpec : "0");
70  if (!CNTV2DemoCommon::IsValidDevice(deviceSpec))
71  return 1;
72 
73  PlayerConfig config(deviceSpec);
74 
75  // Channel
76  if ((channelNumber < 1) || (channelNumber > 8))
77  {cerr << "## ERROR: Invalid channel number " << channelNumber << " -- expected 1 thru 8" << endl; return 1;}
78  config.fOutputChannel = NTV2Channel(channelNumber - 1);
79 
80  // VideoFormat
81  const string videoFormatStr (pVideoFormat ? pVideoFormat : "");
82  config.fVideoFormat = videoFormatStr.empty() ? NTV2_FORMAT_4x1920x1080p_2398
84  if (videoFormatStr == "?" || videoFormatStr == "list")
85  {cout << CNTV2DemoCommon::GetVideoFormatStrings(VIDEO_FORMATS_4KUHD, deviceSpec) << endl; return 0;}
86  else if (!videoFormatStr.empty() && !NTV2_IS_4K_VIDEO_FORMAT(config.fVideoFormat))
87  { cerr << "## ERROR: Invalid '--videoFormat' value '" << videoFormatStr << "' -- expected values:" << endl
89  return 2;
90  }
91 
92  // Pixel Format
93  const string pixelFormatStr (pPixelFormat ? pPixelFormat : "");
94  config.fPixelFormat = pixelFormatStr.empty() ? NTV2_FBF_8BIT_YCBCR : CNTV2DemoCommon::GetPixelFormatFromString(pixelFormatStr);
95  if (pixelFormatStr == "?" || pixelFormatStr == "list")
96  {cout << CNTV2DemoCommon::GetPixelFormatStrings(PIXEL_FORMATS_ALL, deviceSpec) << endl; return 0;}
97  else if (!pixelFormatStr.empty() && !NTV2_IS_VALID_FRAME_BUFFER_FORMAT(config.fPixelFormat))
98  {
99  cerr << "## ERROR: Invalid '--pixelFormat' value '" << pixelFormatStr << "' -- expected values:" << endl
101  return 2;
102  }
103 
104  // AutoCirculate Frames
105  static const string legalFramesSpec ("{frameCount}[@{firstFrameNum}] or {firstFrameNum}-{lastFrameNum}");
106  const string framesSpec (pFramesSpec ? pFramesSpec : "");
107  if (!framesSpec.empty())
108  {
109  const string parseResult(config.fFrames.setFromString(framesSpec));
110  if (!parseResult.empty())
111  {cerr << "## ERROR: Bad 'frames' spec '" << framesSpec << "'\n## " << parseResult << endl; return 1;}
112  }
113  if (!config.fFrames.valid())
114  {cerr << "## ERROR: Bad 'frames' spec '" << framesSpec << "'\n## Expected " << legalFramesSpec << endl; return 1;}
115 
116  // Anc Playback
117  config.fDoMultiFormat = doMultiFormat ? true : false; // Multiformat mode?
118  config.fDoHDMIOutput = useHDMIOut ? true : false;
119  config.fDoTsiRouting = doSquares ? false : true;
120  config.fDoRGBOnWire = doRGBOnWire ? true : false;
121  config.fDoLinkGrouping = doLinkGrping ? true : false;
122  config.fNumAudioLinks = UWord(numAudioLinks);
123 
124  // Instantiate and initialize the NTV2Player4K object...
125  NTV2Player4K player(config);
126  AJAStatus status = player.Init();
127  if (AJA_FAILURE(status))
128  {cout << "## ERROR: Initialization failed: " << ::AJAStatusToString(status) << endl; return 1;}
129 
130  ::signal (SIGINT, SignalHandler);
131  #if defined(AJAMac)
132  ::signal (SIGHUP, SignalHandler);
133  ::signal (SIGQUIT, SignalHandler);
134  #endif
135 
136  // Run it...
137  player.Run();
138 
139  cout << " Frames Frames Buffer" << endl
140  << " Played Dropped Level" << endl;
141  do
142  { // Poll its status until stopped...
143  AUTOCIRCULATE_STATUS outputStatus;
144  player.GetACStatus(outputStatus);
145  cout << setw(9) << outputStatus.GetProcessedFrameCount()
146  << setw(9) << outputStatus.GetDroppedFrameCount()
147  << setw(9) << outputStatus.GetBufferLevel() << "\r" << flush;
148  AJATime::Sleep(2000);
149  } while (player.IsRunning() && !gGlobalQuit); // loop til done
150 
151  cout << endl;
152  return 0;
153 
154 } // main
CNTV2DemoCommon::GetVideoFormatStrings
static std::string GetVideoFormatStrings(const NTV2VideoFormatKinds inKinds=VIDEO_FORMATS_NON_4KUHD, const std::string inDeviceSpecifier=std::string())
Definition: ntv2democommon.cpp:550
PlayerConfig::fDoHDMIOutput
bool fDoHDMIOutput
If true, enable HDMI output; otherwise, disable HDMI output.
Definition: ntv2democommon.h:328
poptOption
Definition: options_popt.h:148
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1305
SignalHandler
void SignalHandler(int inSignal)
Definition: main.cpp:26
NTV2Player4K::Init
virtual AJAStatus Init(void)
Initializes me and prepares me to Run.
Definition: ntv2player4k.cpp:107
AUTOCIRCULATE_STATUS::GetProcessedFrameCount
ULWord GetProcessedFrameCount(void) const
Definition: ntv2publicinterface.h:7216
AUTOCIRCULATE_STATUS::GetBufferLevel
ULWord GetBufferLevel(void) const
Definition: ntv2publicinterface.h:7221
main
int main(int argc, const char **argv)
Definition: main.cpp:30
PlayerConfig::fDoMultiFormat
bool fDoMultiFormat
If true, enable device-sharing; otherwise take exclusive control of device.
Definition: ntv2democommon.h:323
NTV2ACFrameRange::setFromString
std::string setFromString(const std::string &inStr)
Definition: ntv2utils.cpp:4155
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
POPT_ARG_INT
#define POPT_ARG_INT
Definition: options_popt.h:58
PlayerConfig::fDoLinkGrouping
bool fDoLinkGrouping
If true, enables 6/12G output mode on IoX3/Kona5 (4K/8K)
Definition: ntv2democommon.h:331
CNTV2DemoCommon::GetVideoFormatFromString
static NTV2VideoFormat GetVideoFormatFromString(const std::string &inStr, const NTV2VideoFormatKinds inKinds=VIDEO_FORMATS_NON_4KUHD)
Returns the NTV2VideoFormat that matches the given string.
Definition: ntv2democommon.cpp:635
NTV2_IS_4K_VIDEO_FORMAT
#define NTV2_IS_4K_VIDEO_FORMAT(__f__)
Definition: ntv2enums.h:746
PlayerConfig::fDoTsiRouting
bool fDoTsiRouting
If true, enable TSI routing; otherwise route for square division (4K/8K)
Definition: ntv2democommon.h:329
POPT_AUTOHELP
#define POPT_AUTOHELP
Definition: options_popt.h:220
NTV2Player4K
I am an object that can play out a 4K or UHD test pattern (with timecode) to an output of an AJA devi...
Definition: ntv2player4k.h:24
CNTV2DemoCommon::IsValidDevice
static bool IsValidDevice(const std::string &inDeviceSpec)
Definition: ntv2democommon.cpp:430
AJAStatus
AJAStatus
Definition: types.h:378
PlayerConfig::fFrames
NTV2ACFrameRange fFrames
AutoCirculate frame count or range.
Definition: ntv2democommon.h:317
AJATime::Sleep
static void Sleep(const int32_t inMilliseconds)
Suspends execution of the current thread for a given number of milliseconds.
Definition: systemtime.cpp:284
AUTOCIRCULATE_STATUS
This is returned from the CNTV2Card::AutoCirculateGetStatus function.
Definition: ntv2publicinterface.h:7160
CNTV2DemoCommon::GetPixelFormatFromString
static NTV2FrameBufferFormat GetPixelFormatFromString(const std::string &inStr)
Returns the NTV2FrameBufferFormat that matches the given string.
Definition: ntv2democommon.cpp:653
PlayerConfig::fNumAudioLinks
UWord fNumAudioLinks
The number of audio systems to control for multi-link audio (4K/8K)
Definition: ntv2democommon.h:322
PIXEL_FORMATS_ALL
@ PIXEL_FORMATS_ALL
Definition: ntv2democommon.h:240
UWord
uint16_t UWord
Definition: ajatypes.h:251
PlayerConfig::fVideoFormat
NTV2VideoFormat fVideoFormat
The video format to use.
Definition: ntv2democommon.h:319
NTV2_FBF_8BIT_YCBCR
@ NTV2_FBF_8BIT_YCBCR
See 8-Bit YCbCr Format.
Definition: ntv2enums.h:211
CNTV2DemoCommon::Popt
Definition: ntv2democommon.h:801
PlayerConfig::fOutputChannel
NTV2Channel fOutputChannel
The device channel to use.
Definition: ntv2democommon.h:315
gGlobalQuit
static bool gGlobalQuit((0))
CNTV2DemoCommon::Popt::errorStr
virtual const std::string & errorStr(void) const
Definition: ntv2democommon.h:809
NTV2Version
std::string NTV2Version(const bool inDetailed=false)
Definition: ntv2version.cpp:41
NTV2Player4K::Run
virtual AJAStatus Run(void)
Runs me.
Definition: ntv2player4k.cpp:1189
AJADebug::Open
static AJAStatus Open(bool incrementRefCount=false)
Definition: debug.cpp:44
AJA_NULL
#define AJA_NULL
Definition: ajatypes.h:197
PlayerConfig::fDoRGBOnWire
bool fDoRGBOnWire
If true, produce RGB on the wire; otherwise output YUV.
Definition: ntv2democommon.h:330
false
#define false
Definition: ntv2devicefeatures.h:25
std
Definition: json.hpp:5362
AJAStatusToString
std::string AJAStatusToString(const AJAStatus inStatus, const bool inDetailed)
Definition: debug.cpp:981
AUTOCIRCULATE_STATUS::GetDroppedFrameCount
ULWord GetDroppedFrameCount(void) const
Definition: ntv2publicinterface.h:7211
POPT_TABLEEND
#define POPT_TABLEEND
Definition: options_popt.h:215
ntv2player4k.h
Header file for NTV2Player4K demonstration class.
NTV2_FORMAT_4x1920x1080p_2398
@ NTV2_FORMAT_4x1920x1080p_2398
Definition: ntv2enums.h:561
true
#define true
Definition: ntv2devicefeatures.h:26
CNTV2DemoCommon::GetPixelFormatStrings
static std::string GetPixelFormatStrings(const NTV2PixelFormatKinds inKinds=PIXEL_FORMATS_ALL, const std::string inDeviceSpecifier=std::string())
Definition: ntv2democommon.cpp:600
VIDEO_FORMATS_4KUHD
@ VIDEO_FORMATS_4KUHD
Definition: ntv2democommon.h:226
NTV2ACFrameRange::valid
bool valid(void) const
Definition: ntv2utils.h:977
PlayerConfig
Configures an NTV2Player instance.
Definition: ntv2democommon.h:310
PlayerConfig::fPixelFormat
NTV2PixelFormat fPixelFormat
The pixel format to use.
Definition: ntv2democommon.h:318
NTV2_IS_VALID_FRAME_BUFFER_FORMAT
#define NTV2_IS_VALID_FRAME_BUFFER_FORMAT(__s__)
Definition: ntv2enums.h:251
AJA_FAILURE
#define AJA_FAILURE(_status_)
Definition: types.h:371
POPT_ARG_STRING
#define POPT_ARG_STRING
Definition: options_popt.h:57
POPT_ARG_NONE
#define POPT_ARG_NONE
Definition: options_popt.h:56
NTV2Player4K::GetACStatus
virtual void GetACStatus(AUTOCIRCULATE_STATUS &outStatus)
Provides status information about my output (playout) process.
Definition: ntv2player4k.cpp:1480