MultitrackVideoOutput.hpp 2.4 KB

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