AJA NTV2 SDK  17.6.0.1664
NTV2 SDK 17.6.0.1664
main.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 // Includes
10 #include "ntv2streamplayer.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 * pAncFilePath (AJA_NULL); // Anc data filepath to play
34  char * pVideoFormat (AJA_NULL); // Video format to use
35  int channelNumber (1); // Channel/FrameStore to use
36  int doMultiFormat (0); // MultiFormat mode?
37  int showVersion (0); // Show version?
39 
40  // Command line option descriptions:
41  const CNTV2DemoCommon::PoptOpts optionsTable [] =
42  {
43  {"version", 0, POPT_ARG_NONE, &showVersion, 0, "show version & exit", AJA_NULL },
44  {"device", 'd', POPT_ARG_STRING, &pDeviceSpec, 0, "device to use", "index#, serial#, or model" },
45  {"channel", 'c', POPT_ARG_INT, &channelNumber, 0, "channel to use", "1-8" },
46  {"multiFormat", 'm', POPT_ARG_NONE, &doMultiFormat, 0, "use multi-format/channel", AJA_NULL },
47  {"pixelFormat", 'p', POPT_ARG_STRING, &pPixelFormat, 0, "pixel format to use", "'?' or 'list' to list" },
48  {"frames", 0, POPT_ARG_STRING, &pFramesSpec, 0, "frames to Stream", "num[@min] or min-max" },
49  {"videoFormat", 'v', POPT_ARG_STRING, &pVideoFormat, 0, "video format to produce", "'?' or 'list' to list" },
52  };
53  CNTV2DemoCommon::Popt popt(argc, argv, optionsTable);
54  if (!popt)
55  {cerr << "## ERROR: " << popt.errorStr() << endl; return 2;}
56  if (showVersion)
57  {cout << argv[0] << ", NTV2 SDK " << ::NTV2Version() << endl; return 0;}
58 
59  // Device
60  const string deviceSpec (pDeviceSpec ? pDeviceSpec : "0");
61  if (!CNTV2DemoCommon::IsValidDevice(deviceSpec))
62  return 1;
63 
64  PlayerConfig config(deviceSpec);
65 
66  // Channel
67  if ((channelNumber < 1) || (channelNumber > 8))
68  {cerr << "## ERROR: Invalid channel number " << channelNumber << " -- expected 1 thru 8" << endl; return 1;}
69  config.fOutputChannel = NTV2Channel(channelNumber - 1);
70 
71  // VideoFormat
72  const string videoFormatStr (pVideoFormat ? pVideoFormat : "");
73  config.fVideoFormat = videoFormatStr.empty() ? NTV2_FORMAT_1080i_5994
75  if (videoFormatStr == "?" || videoFormatStr == "list")
76  {cout << CNTV2DemoCommon::GetVideoFormatStrings(VIDEO_FORMATS_ALL, pDeviceSpec ? deviceSpec : "") << endl; return 0;}
77  else if (!videoFormatStr.empty() && config.fVideoFormat == NTV2_FORMAT_UNKNOWN)
78  { cerr << "## ERROR: Invalid '--videoFormat' value '" << videoFormatStr << "' -- expected values:" << endl
80  return 2;
81  }
82 
83  // Pixel Format
84  const string pixelFormatStr (pPixelFormat ? pPixelFormat : "");
85  config.fPixelFormat = pixelFormatStr.empty() ? NTV2_FBF_8BIT_YCBCR : CNTV2DemoCommon::GetPixelFormatFromString(pixelFormatStr);
86  if (pixelFormatStr == "?" || pixelFormatStr == "list")
87  {cout << CNTV2DemoCommon::GetPixelFormatStrings(PIXEL_FORMATS_ALL, pDeviceSpec ? deviceSpec : "") << endl; return 0;}
88  else if (!pixelFormatStr.empty() && !NTV2_IS_VALID_FRAME_BUFFER_FORMAT(config.fPixelFormat))
89  {
90  cerr << "## ERROR: Invalid '--pixelFormat' value '" << pixelFormatStr << "' -- expected values:" << endl
92  return 2;
93  }
94 
95  // AutoCirculate Frames
96  static const string legalFramesSpec ("{frameCount}[@{firstFrameNum}] or {firstFrameNum}-{lastFrameNum}");
97  const string framesSpec (pFramesSpec ? pFramesSpec : "");
98  if (!framesSpec.empty())
99  {
100  const string parseResult(config.fFrames.setFromString(framesSpec));
101  if (!parseResult.empty())
102  {cerr << "## ERROR: Bad 'frames' spec '" << framesSpec << "'\n## " << parseResult << endl; return 1;}
103  }
104  if (!config.fFrames.valid())
105  {cerr << "## ERROR: Bad 'frames' spec '" << framesSpec << "'\n## Expected " << legalFramesSpec << endl; return 1;}
106 
107  // Anc Playback
108  string ancFilePath (pAncFilePath ? pAncFilePath : "");
109  ancFilePath = aja::strip(ancFilePath);
110 
111  config.fAncDataFilePath = ancFilePath;
113  config.fSuppressAudio = true;
114  config.fSuppressVideo = false;
115  config.fDoMultiFormat = doMultiFormat ? true : false; // Multiformat mode?
116  config.fTransmitLTC = false;
117 
118  // Instantiate and initialize the NTV2StreamPlayer object...
119  NTV2StreamPlayer player(config);
120  AJAStatus status = player.Init();
121  if (AJA_FAILURE(status))
122  {cout << "## ERROR: Initialization failed: " << ::AJAStatusToString(status) << endl; return 1;}
123 
124  ::signal (SIGINT, SignalHandler);
125  #if defined(AJAMac)
126  ::signal (SIGHUP, SignalHandler);
127  ::signal (SIGQUIT, SignalHandler);
128  #endif
129 
130  // Run it...
131  player.Run();
132 
133  cout << " Active Repeat Queue" << endl
134  << " Count Count Depth" << endl;
135  do
136  { // Poll its status until stopped...
137  NTV2StreamChannel strStatus;
138  player.GetStreamStatus(strStatus);
139  cout << setw(9) << strStatus.mActiveCount
140  << setw(9) << strStatus.mRepeatCount
141  << setw(9) << strStatus.GetQueueDepth() << "\r" << flush;
142  AJATime::Sleep(2000);
143  } while (player.IsRunning() && !gGlobalQuit); // loop til done
144 
145  cout << endl;
146  return 0;
147 
148 } // main
CNTV2DemoCommon::GetVideoFormatFromString
static NTV2VideoFormat GetVideoFormatFromString(const std::string &inStr, const NTV2VideoFormatKinds inKinds=VIDEO_FORMATS_SDHD, const std::string &inDevSpec=std::string())
Returns the NTV2VideoFormat that matches the given string.
Definition: ntv2democommon.cpp:515
NTV2StreamChannel
Definition: ntv2publicinterface.h:8908
poptOption
Definition: options_popt.h:148
CNTV2DemoCommon::GetPixelFormatFromString
static NTV2PixelFormat GetPixelFormatFromString(const std::string &inStr, const NTV2PixelFormatKinds inKinds=PIXEL_FORMATS_ALL, const std::string inDevSpec=std::string())
Returns the NTV2PixelFormat that matches the given string.
Definition: ntv2democommon.cpp:599
aja::strip
std::string & strip(std::string &str, const std::string &ws)
Definition: common.cpp:461
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1343
gGlobalQuit
static bool gGlobalQuit((0))
VIDEO_FORMATS_ALL
@ VIDEO_FORMATS_ALL
Definition: ntv2democommon.h:229
SignalHandler
void SignalHandler(int inSignal)
Definition: main.cpp:26
NTV2StreamChannel::GetQueueDepth
ULWord GetQueueDepth(void)
Gets the queue depth.
Definition: ntv2publicinterface.h:8940
NTV2_FORMAT_1080i_5994
@ NTV2_FORMAT_1080i_5994
Definition: ntv2enums.h:539
NTV2StreamPlayer::Init
virtual AJAStatus Init(void)
Initializes me and prepares me to Run.
Definition: ntv2streamplayer.cpp:72
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:331
NTV2StreamPlayer
I play out SD or HD test pattern (with timecode) to an output of an AJA device with or without audio ...
Definition: ntv2streamplayer.h:24
NTV2ACFrameRange::setFromString
std::string setFromString(const std::string &inStr)
Definition: ntv2utils.cpp:4160
NTV2ChannelToOutputDestination
NTV2OutputDestination NTV2ChannelToOutputDestination(const NTV2Channel inChannel, const NTV2IOKinds inKinds=NTV2_IOKINDS_SDI)
Converts the given NTV2Channel value into its ordinary equivalent NTV2OutputDestination.
Definition: ntv2utils.cpp:5232
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
POPT_AUTOHELP
#define POPT_AUTOHELP
Definition: options_popt.h:220
CNTV2DemoCommon::IsValidDevice
static bool IsValidDevice(const std::string &inDeviceSpec)
Definition: ntv2democommon.cpp:455
AJAStatus
AJAStatus
Definition: types.h:378
PlayerConfig::fFrames
NTV2ACFrameRange fFrames
AutoCirculate frame count or range.
Definition: ntv2democommon.h:326
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
PlayerConfig::fSuppressAudio
bool fSuppressAudio
If true, suppress audio; otherwise generate & xfer audio tone.
Definition: ntv2democommon.h:332
PlayerConfig::fSuppressVideo
bool fSuppressVideo
If true, suppress video; otherwise generate & xfer test patterns.
Definition: ntv2democommon.h:333
CNTV2DemoCommon::GetPixelFormatStrings
static std::string GetPixelFormatStrings(const NTV2PixelFormatKinds inKinds=PIXEL_FORMATS_ALL, const std::string inDevSpec=std::string())
Definition: ntv2democommon.cpp:567
PlayerConfig::fVideoFormat
NTV2VideoFormat fVideoFormat
The video format to use.
Definition: ntv2democommon.h:328
NTV2_FBF_8BIT_YCBCR
@ NTV2_FBF_8BIT_YCBCR
See 8-Bit YCbCr Format.
Definition: ntv2enums.h:214
CNTV2DemoCommon::Popt
Definition: ntv2democommon.h:849
PlayerConfig::fOutputChannel
NTV2Channel fOutputChannel
The device channel to use.
Definition: ntv2democommon.h:324
CNTV2DemoCommon::Popt::errorStr
virtual const std::string & errorStr(void) const
Definition: ntv2democommon.h:857
NTV2Version
std::string NTV2Version(const bool inDetailed=false)
Definition: ntv2version.cpp:41
PlayerConfig::fAncDataFilePath
std::string fAncDataFilePath
Optional path to Anc binary data file to playout.
Definition: ntv2democommon.h:323
CNTV2DemoCommon::GetVideoFormatStrings
static std::string GetVideoFormatStrings(const NTV2VideoFormatKinds inKinds=VIDEO_FORMATS_SDHD, const std::string inDevSpec=std::string())
Definition: ntv2democommon.cpp:485
AJADebug::Open
static AJAStatus Open(bool incrementRefCount=false)
Definition: debug.cpp:44
AJA_NULL
#define AJA_NULL
Definition: ajatypes.h:199
NTV2StreamPlayer::Run
virtual AJAStatus Run(void)
Runs me.
Definition: ntv2streamplayer.cpp:343
NTV2_FORMAT_UNKNOWN
@ NTV2_FORMAT_UNKNOWN
Definition: ntv2enums.h:525
PlayerConfig::fTransmitLTC
bool fTransmitLTC
If true, embed LTC; otherwise embed VITC.
Definition: ntv2democommon.h:334
PlayerConfig::fOutputDest
NTV2OutputDest fOutputDest
The desired output connector to use.
Definition: ntv2democommon.h:325
ntv2streamplayer.h
std
Definition: json.hpp:5362
AJAStatusToString
std::string AJAStatusToString(const AJAStatus inStatus, const bool inDetailed)
Definition: debug.cpp:981
POPT_TABLEEND
#define POPT_TABLEEND
Definition: options_popt.h:215
true
#define true
Definition: ntv2devicefeatures.h:26
NTV2StreamChannel::mActiveCount
ULWord64 mActiveCount
Number of active transfers.
Definition: ntv2publicinterface.h:8919
NTV2ACFrameRange::valid
bool valid(void) const
Definition: ntv2utils.h:985
PlayerConfig
Configures an NTV2Player instance.
Definition: ntv2democommon.h:319
PlayerConfig::fPixelFormat
NTV2PixelFormat fPixelFormat
The pixel format to use.
Definition: ntv2democommon.h:327
NTV2_IS_VALID_FRAME_BUFFER_FORMAT
#define NTV2_IS_VALID_FRAME_BUFFER_FORMAT(__s__)
Definition: ntv2enums.h:254
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
NTV2StreamChannel::mRepeatCount
ULWord64 mRepeatCount
Number of repeated transfers.
Definition: ntv2publicinterface.h:8920
NTV2StreamPlayer::GetStreamStatus
virtual void GetStreamStatus(NTV2StreamChannel &outStatus)
Provides status information about my output (playout) process.
Definition: ntv2streamplayer.cpp:597
PIXEL_FORMATS_ALL
@ PIXEL_FORMATS_ALL
Definition: ntv2democommon.h:252