multitrack-video-output.hpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <obs.hpp>
  3. #include <util/config-file.h>
  4. #include <atomic>
  5. #include <optional>
  6. #include <vector>
  7. #include <qobject.h>
  8. #include <QFuture>
  9. #include <QFutureSynchronizer>
  10. #define NOMINMAX
  11. class QString;
  12. void StreamStopHandler(void *arg, calldata_t *data);
  13. void StreamDeactivateHandler(void *arg, calldata_t *data);
  14. void RecordingStartHandler(void *arg, calldata_t *data);
  15. void RecordingStopHandler(void *arg, calldata_t *data);
  16. void RecordingDeactivateHandler(void *arg, calldata_t *data);
  17. bool MultitrackVideoDeveloperModeEnabled();
  18. struct MultitrackVideoOutput {
  19. public:
  20. void PrepareStreaming(QWidget *parent, const char *service_name,
  21. obs_service_t *service,
  22. const std::optional<std::string> &rtmp_url,
  23. const QString &stream_key,
  24. const char *audio_encoder_id,
  25. std::optional<uint32_t> maximum_aggregate_bitrate,
  26. std::optional<uint32_t> maximum_video_tracks,
  27. std::optional<std::string> custom_config,
  28. obs_data_t *dump_stream_to_file_config,
  29. std::optional<size_t> vod_track_mixer);
  30. signal_handler_t *StreamingSignalHandler();
  31. void StartedStreaming();
  32. void StopStreaming();
  33. bool HandleIncompatibleSettings(QWidget *parent, config_t *config,
  34. obs_service_t *service, bool &useDelay,
  35. bool &enableNewSocketLoop,
  36. bool &enableDynBitrate);
  37. OBSOutputAutoRelease StreamingOutput()
  38. {
  39. const std::lock_guard current_lock{current_mutex};
  40. return current ? obs_output_get_ref(current->output_) : nullptr;
  41. }
  42. private:
  43. struct OBSOutputObjects {
  44. OBSOutputAutoRelease output_;
  45. std::vector<OBSEncoderAutoRelease> video_encoders_;
  46. std::vector<OBSEncoderAutoRelease> audio_encoders_;
  47. OBSServiceAutoRelease multitrack_video_service_;
  48. OBSSignal start_signal, stop_signal, deactivate_signal;
  49. };
  50. std::optional<OBSOutputObjects> take_current();
  51. std::optional<OBSOutputObjects> take_current_stream_dump();
  52. static void
  53. ReleaseOnMainThread(std::optional<OBSOutputObjects> objects);
  54. std::mutex current_mutex;
  55. std::optional<OBSOutputObjects> current;
  56. std::mutex current_stream_dump_mutex;
  57. std::optional<OBSOutputObjects> current_stream_dump;
  58. friend void StreamStopHandler(void *arg, calldata_t *data);
  59. friend void StreamDeactivateHandler(void *arg, calldata_t *data);
  60. friend void RecordingStartHandler(void *arg, calldata_t *data);
  61. friend void RecordingStopHandler(void *arg, calldata_t *data);
  62. friend void RecordingDeactivateHandler(void *arg, calldata_t *data);
  63. };