aja-props.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #include "aja-props.hpp"
  2. #include "aja-common.hpp"
  3. #include <ajantv2/includes/ntv2devicefeatures.h>
  4. #include <ajantv2/includes/ntv2utils.h>
  5. // AJASource Properties
  6. SourceProps::SourceProps()
  7. : deviceID{DEVICE_ID_NOTFOUND},
  8. ioSelect{IOSelection::Invalid},
  9. // inputSource{NTV2_INPUTSOURCE_INVALID},
  10. videoFormat{NTV2_FORMAT_UNKNOWN},
  11. pixelFormat{NTV2_FBF_INVALID},
  12. sdiTransport{SDITransport::SingleLink},
  13. sdi4kTransport{SDITransport4K::TwoSampleInterleave},
  14. audioNumChannels{8},
  15. audioSampleSize{4},
  16. audioSampleRate{48000},
  17. vpids{},
  18. autoDetect{false},
  19. deactivateWhileNotShowing{false}
  20. {
  21. }
  22. SourceProps::SourceProps(NTV2DeviceID devID)
  23. : deviceID{devID},
  24. ioSelect{IOSelection::Invalid},
  25. // inputSource{NTV2_INPUTSOURCE_INVALID},
  26. videoFormat{NTV2_FORMAT_UNKNOWN},
  27. pixelFormat{NTV2_FBF_INVALID},
  28. sdiTransport{SDITransport::SingleLink},
  29. sdi4kTransport{SDITransport4K::TwoSampleInterleave},
  30. audioNumChannels{8},
  31. audioSampleSize{4},
  32. audioSampleRate{48000},
  33. vpids{},
  34. autoDetect{false},
  35. deactivateWhileNotShowing{false}
  36. {
  37. }
  38. SourceProps::SourceProps(const SourceProps &props)
  39. {
  40. deviceID = props.deviceID;
  41. ioSelect = props.ioSelect;
  42. // inputSource = props.inputSource;
  43. videoFormat = props.videoFormat;
  44. pixelFormat = props.pixelFormat;
  45. sdiTransport = props.sdiTransport;
  46. sdi4kTransport = props.sdi4kTransport;
  47. audioNumChannels = props.audioNumChannels;
  48. audioSampleSize = props.audioSampleSize;
  49. audioSampleRate = props.audioSampleRate;
  50. vpids = props.vpids;
  51. autoDetect = props.autoDetect;
  52. deactivateWhileNotShowing = props.deactivateWhileNotShowing;
  53. }
  54. SourceProps::SourceProps(SourceProps &&props)
  55. {
  56. deviceID = props.deviceID;
  57. ioSelect = props.ioSelect;
  58. // inputSource = props.inputSource;
  59. videoFormat = props.videoFormat;
  60. pixelFormat = props.pixelFormat;
  61. sdiTransport = props.sdiTransport;
  62. sdi4kTransport = props.sdi4kTransport;
  63. audioNumChannels = props.audioNumChannels;
  64. audioSampleSize = props.audioSampleSize;
  65. audioSampleRate = props.audioSampleRate;
  66. vpids = props.vpids;
  67. autoDetect = props.autoDetect;
  68. deactivateWhileNotShowing = props.deactivateWhileNotShowing;
  69. }
  70. void SourceProps::operator=(const SourceProps &props)
  71. {
  72. deviceID = props.deviceID;
  73. ioSelect = props.ioSelect;
  74. // inputSource = props.inputSource;
  75. videoFormat = props.videoFormat;
  76. pixelFormat = props.pixelFormat;
  77. sdiTransport = props.sdiTransport;
  78. sdi4kTransport = props.sdi4kTransport;
  79. audioNumChannels = props.audioNumChannels;
  80. audioSampleSize = props.audioSampleSize;
  81. audioSampleRate = props.audioSampleRate;
  82. vpids = props.vpids;
  83. autoDetect = props.autoDetect;
  84. deactivateWhileNotShowing = props.deactivateWhileNotShowing;
  85. }
  86. void SourceProps::operator=(SourceProps &&props)
  87. {
  88. deviceID = props.deviceID;
  89. ioSelect = props.ioSelect;
  90. // inputSource = props.inputSource;
  91. videoFormat = props.videoFormat;
  92. pixelFormat = props.pixelFormat;
  93. sdiTransport = props.sdiTransport;
  94. sdi4kTransport = props.sdi4kTransport;
  95. audioNumChannels = props.audioNumChannels;
  96. audioSampleSize = props.audioSampleSize;
  97. audioSampleRate = props.audioSampleRate;
  98. vpids = props.vpids;
  99. autoDetect = props.autoDetect;
  100. deactivateWhileNotShowing = props.deactivateWhileNotShowing;
  101. }
  102. bool SourceProps::operator==(const SourceProps &props)
  103. {
  104. return (deviceID == props.deviceID && ioSelect == props.ioSelect &&
  105. // inputSource == props.inputSource &&
  106. videoFormat == props.videoFormat &&
  107. pixelFormat == props.pixelFormat &&
  108. // vpid == props.vpid &&
  109. autoDetect == props.autoDetect &&
  110. sdiTransport == props.sdiTransport &&
  111. sdi4kTransport == props.sdi4kTransport &&
  112. audioNumChannels == props.audioNumChannels &&
  113. audioSampleSize == props.audioSampleSize &&
  114. audioSampleRate == props.audioSampleRate &&
  115. deactivateWhileNotShowing == props.deactivateWhileNotShowing);
  116. }
  117. bool SourceProps::operator!=(const SourceProps &props)
  118. {
  119. return !operator==(props);
  120. }
  121. NTV2InputSource SourceProps::InitialInputSource() const
  122. {
  123. auto inputSources = InputSources();
  124. if (!inputSources.empty()) {
  125. return *inputSources.begin();
  126. }
  127. return NTV2_INPUTSOURCE_INVALID;
  128. }
  129. NTV2InputSourceSet SourceProps::InputSources() const
  130. {
  131. NTV2InputSourceSet inputSources;
  132. aja::IOSelectionToInputSources(ioSelect, inputSources);
  133. return inputSources;
  134. }
  135. NTV2Channel SourceProps::Channel() const
  136. {
  137. return NTV2InputSourceToChannel(InitialInputSource());
  138. }
  139. NTV2AudioSystem SourceProps::AudioSystem() const
  140. {
  141. return NTV2ChannelToAudioSystem(Channel());
  142. }
  143. NTV2AudioRate SourceProps::AudioRate() const
  144. {
  145. NTV2AudioRate rate = NTV2_AUDIO_48K;
  146. switch (audioSampleRate) {
  147. default:
  148. case 48000:
  149. rate = NTV2_AUDIO_48K;
  150. break;
  151. case 96000:
  152. rate = NTV2_AUDIO_96K;
  153. break;
  154. case 192000:
  155. rate = NTV2_AUDIO_192K;
  156. break;
  157. }
  158. return rate;
  159. }
  160. // Size in bytes of N channels of audio
  161. size_t SourceProps::AudioSize() const
  162. {
  163. return audioNumChannels * audioSampleSize;
  164. }
  165. audio_format SourceProps::AudioFormat() const
  166. {
  167. // NTV2 is always 32-bit PCM
  168. return AUDIO_FORMAT_32BIT;
  169. }
  170. speaker_layout SourceProps::SpeakerLayout() const
  171. {
  172. if (audioNumChannels == 2)
  173. return SPEAKERS_STEREO;
  174. // NTV2 is always at least 8ch on modern boards
  175. return SPEAKERS_7POINT1;
  176. }
  177. //
  178. // AJAOutput Properties
  179. //
  180. OutputProps::OutputProps(NTV2DeviceID devID)
  181. : deviceID{devID},
  182. ioSelect{IOSelection::Invalid},
  183. outputDest{NTV2_OUTPUTDESTINATION_ANALOG},
  184. videoFormat{NTV2_FORMAT_UNKNOWN},
  185. pixelFormat{NTV2_FBF_INVALID},
  186. sdi4kTransport{SDITransport4K::TwoSampleInterleave},
  187. audioNumChannels{8},
  188. audioSampleSize{4},
  189. audioSampleRate{48000}
  190. {
  191. }
  192. OutputProps::OutputProps(OutputProps &&props)
  193. {
  194. deviceID = props.deviceID;
  195. ioSelect = props.ioSelect;
  196. outputDest = props.outputDest;
  197. videoFormat = props.videoFormat;
  198. pixelFormat = props.pixelFormat;
  199. sdiTransport = props.sdiTransport;
  200. sdi4kTransport = props.sdi4kTransport;
  201. audioNumChannels = props.audioNumChannels;
  202. audioSampleSize = props.audioSampleSize;
  203. audioSampleRate = props.audioSampleRate;
  204. }
  205. OutputProps::OutputProps(const OutputProps &props)
  206. {
  207. deviceID = props.deviceID;
  208. ioSelect = props.ioSelect;
  209. outputDest = props.outputDest;
  210. videoFormat = props.videoFormat;
  211. pixelFormat = props.pixelFormat;
  212. sdiTransport = props.sdiTransport;
  213. sdi4kTransport = props.sdi4kTransport;
  214. audioNumChannels = props.audioNumChannels;
  215. audioSampleSize = props.audioSampleSize;
  216. audioSampleRate = props.audioSampleRate;
  217. }
  218. void OutputProps::operator=(const OutputProps &props)
  219. {
  220. deviceID = props.deviceID;
  221. ioSelect = props.ioSelect;
  222. outputDest = props.outputDest;
  223. videoFormat = props.videoFormat;
  224. pixelFormat = props.pixelFormat;
  225. sdiTransport = props.sdiTransport;
  226. sdi4kTransport = props.sdi4kTransport;
  227. audioNumChannels = props.audioNumChannels;
  228. audioSampleSize = props.audioSampleSize;
  229. audioSampleRate = props.audioSampleRate;
  230. }
  231. void OutputProps::operator=(OutputProps &&props)
  232. {
  233. deviceID = props.deviceID;
  234. ioSelect = props.ioSelect;
  235. outputDest = props.outputDest;
  236. videoFormat = props.videoFormat;
  237. pixelFormat = props.pixelFormat;
  238. sdiTransport = props.sdiTransport;
  239. sdi4kTransport = props.sdi4kTransport;
  240. audioNumChannels = props.audioNumChannels;
  241. audioSampleSize = props.audioSampleSize;
  242. audioSampleRate = props.audioSampleRate;
  243. }
  244. bool OutputProps::operator==(const OutputProps &props)
  245. {
  246. return (deviceID == props.deviceID && ioSelect == props.ioSelect &&
  247. // outputDest == props.outputDest &&
  248. videoFormat == props.videoFormat &&
  249. pixelFormat == props.pixelFormat &&
  250. sdiTransport == props.sdiTransport &&
  251. sdi4kTransport == props.sdi4kTransport &&
  252. audioNumChannels == props.audioNumChannels &&
  253. audioSampleSize == props.audioSampleSize &&
  254. audioSampleRate == props.audioSampleRate);
  255. }
  256. bool OutputProps::operator!=(const OutputProps &props)
  257. {
  258. return !operator==(props);
  259. }
  260. NTV2FormatDesc OutputProps::FormatDesc()
  261. {
  262. return NTV2FormatDesc(videoFormat, pixelFormat, NTV2_VANCMODE_OFF);
  263. }
  264. NTV2Channel OutputProps::Channel() const
  265. {
  266. // Output Channel Special Cases
  267. // KONA1 -- Has 2 framestores but only 1 bi-directional SDI widget
  268. if (deviceID == DEVICE_ID_KONA1) {
  269. return NTV2_CHANNEL2;
  270. } else if ((deviceID == DEVICE_ID_IO4K ||
  271. deviceID == DEVICE_ID_IO4KPLUS) &&
  272. outputDest == NTV2_OUTPUTDESTINATION_SDI5) {
  273. // IO4K/IO4K+ SDI Monitor - Use framestore 4 but SDI5
  274. return NTV2_CHANNEL4;
  275. }
  276. if (NTV2_OUTPUT_DEST_IS_HDMI(outputDest))
  277. return static_cast<NTV2Channel>(
  278. NTV2DeviceGetNumFrameStores(deviceID) - 1);
  279. return NTV2OutputDestinationToChannel(outputDest);
  280. }
  281. NTV2AudioSystem OutputProps::AudioSystem() const
  282. {
  283. return NTV2ChannelToAudioSystem(Channel());
  284. }
  285. NTV2AudioRate OutputProps::AudioRate() const
  286. {
  287. NTV2AudioRate rate = NTV2_AUDIO_48K;
  288. switch (audioSampleRate) {
  289. default:
  290. case 48000:
  291. rate = NTV2_AUDIO_48K;
  292. break;
  293. case 96000:
  294. rate = NTV2_AUDIO_96K;
  295. break;
  296. case 192000:
  297. rate = NTV2_AUDIO_192K;
  298. break;
  299. }
  300. return rate;
  301. }
  302. // Size in bytes of N channels of audio
  303. size_t OutputProps::AudioSize() const
  304. {
  305. return audioNumChannels * audioSampleSize;
  306. }
  307. audio_format OutputProps::AudioFormat() const
  308. {
  309. // NTV2 is always 32-bit PCM
  310. return AUDIO_FORMAT_32BIT;
  311. }
  312. speaker_layout OutputProps::SpeakerLayout() const
  313. {
  314. if (audioNumChannels == 2)
  315. return SPEAKERS_STEREO;
  316. // NTV2 is always at least 8ch on modern boards
  317. return SPEAKERS_7POINT1;
  318. }