aja-output.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #pragma once
  2. #include "aja-props.hpp"
  3. #include <ajantv2/includes/ntv2testpatterngen.h>
  4. #include <ajabase/common/types.h>
  5. #include <ajabase/system/thread.h>
  6. // #define AJA_WRITE_DEBUG_WAV
  7. #ifdef AJA_WRITE_DEBUG_WAV
  8. #include <ajabase/common/wavewriter.h>
  9. #endif
  10. #include <deque>
  11. #include <memory>
  12. #include <mutex>
  13. struct VideoFrame {
  14. struct video_data frame;
  15. int64_t frameNum;
  16. size_t size;
  17. };
  18. struct AudioFrames {
  19. struct audio_data frames;
  20. size_t offset;
  21. size_t size;
  22. };
  23. using VideoQueue = std::deque<VideoFrame>;
  24. using AudioQueue = std::deque<AudioFrames>;
  25. class CNTV2Card; // forward decl
  26. class AJAOutput {
  27. public:
  28. enum {
  29. // min queue sizes computed in AJAOutput
  30. kVideoQueueMaxSize = 15,
  31. kAudioQueueMaxSize = 96, // ~(48000 / 1024 samples per audio_frame) * 2sec
  32. };
  33. AJAOutput(CNTV2Card *card, const std::string &cardID, const std::string &outputID, UWord deviceIndex,
  34. const NTV2DeviceID deviceID);
  35. ~AJAOutput();
  36. CNTV2Card *GetCard();
  37. void Initialize(const OutputProps &props);
  38. void SetOBSOutput(obs_output_t *output);
  39. obs_output_t *GetOBSOutput();
  40. void SetOutputProps(const OutputProps &props);
  41. OutputProps GetOutputProps() const;
  42. void CacheConnections(const NTV2XptConnections &cnx);
  43. void ClearConnections();
  44. void GenerateTestPattern(NTV2VideoFormat vf, NTV2PixelFormat pf, NTV2TestPatternSelect pattern,
  45. uint32_t frameNum);
  46. void QueueVideoFrame(struct video_data *frame, size_t size);
  47. void QueueAudioFrames(struct audio_data *frames, size_t size);
  48. void ClearVideoQueue();
  49. void ClearAudioQueue();
  50. size_t VideoQueueSize();
  51. size_t AudioQueueSize();
  52. void DMAAudioFromQueue(NTV2AudioSystem audioSys, uint32_t channels, uint32_t sampleRate, uint32_t sampleSize);
  53. void DMAVideoFromQueue();
  54. void CreateThread(bool enable = false);
  55. void StopThread();
  56. bool ThreadRunning();
  57. static void OutputThread(AJAThread *thread, void *ctx);
  58. std::string mCardID;
  59. std::string mOutputID;
  60. UWord mDeviceIndex;
  61. NTV2DeviceID mDeviceID;
  62. uint32_t mAudioPlayCursor;
  63. uint32_t mAudioWriteCursor;
  64. uint32_t mAudioWrapAddress;
  65. uint64_t mAudioQueueBytes;
  66. uint64_t mAudioWriteBytes;
  67. uint64_t mAudioPlayBytes;
  68. uint32_t mNumCardFrames;
  69. uint32_t mFirstCardFrame;
  70. uint32_t mLastCardFrame;
  71. uint32_t mWriteCardFrame;
  72. uint32_t mPlayCardFrame;
  73. uint32_t mPlayCardNext;
  74. uint32_t mFrameRateNum;
  75. uint32_t mFrameRateDen;
  76. uint64_t mVideoQueueFrames;
  77. uint64_t mVideoWriteFrames;
  78. uint64_t mVideoPlayFrames;
  79. uint64_t mFirstVideoTS;
  80. uint64_t mFirstAudioTS;
  81. uint64_t mLastVideoTS;
  82. uint64_t mLastAudioTS;
  83. int64_t mOutputDelay;
  84. int64_t mVideoMax;
  85. int64_t mVideoDelay;
  86. int64_t mVideoSync;
  87. int64_t mVideoAdjust;
  88. int64_t mAudioMax;
  89. int64_t mAudioDelay;
  90. int64_t mAudioSync;
  91. int64_t mAudioAdjust;
  92. int64_t mLastStatTime;
  93. #ifdef AJA_WRITE_DEBUG_WAV
  94. AJAWavWriter *mWaveWriter;
  95. #endif
  96. private:
  97. void reset_frame_counts();
  98. void calculate_card_frame_indices(uint32_t numFrames, NTV2DeviceID id, NTV2Channel channel, NTV2VideoFormat vf,
  99. NTV2PixelFormat pf);
  100. uint32_t get_card_play_count();
  101. void dma_audio_samples(NTV2AudioSystem audioSys, uint32_t *data, size_t size);
  102. CNTV2Card *mCard;
  103. OutputProps mOutputProps;
  104. NTV2TestPatternBuffer mTestPattern;
  105. bool mIsRunning;
  106. bool mAudioStarted;
  107. AJAThread mRunThread;
  108. mutable std::mutex mVideoLock;
  109. mutable std::mutex mAudioLock;
  110. mutable std::mutex mRunThreadLock;
  111. std::unique_ptr<VideoQueue> mVideoQueue;
  112. std::unique_ptr<AudioQueue> mAudioQueue;
  113. obs_output_t *mOBSOutput;
  114. NTV2XptConnections mCrosspoints;
  115. };