BasicOutputHandler.hpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #pragma once
  2. #include <utility/MultitrackVideoOutput.hpp>
  3. #include <obs.hpp>
  4. #include <util/dstr.hpp>
  5. #include <future>
  6. #define RTMP_PROTOCOL "rtmp"
  7. #define SRT_PROTOCOL "srt"
  8. #define RIST_PROTOCOL "rist"
  9. class OBSBasic;
  10. using SetupStreamingContinuation_t = std::function<void(bool)>;
  11. struct BasicOutputHandler {
  12. OBSOutputAutoRelease fileOutput;
  13. OBSOutputAutoRelease streamOutput;
  14. OBSOutputAutoRelease replayBuffer;
  15. OBSOutputAutoRelease virtualCam;
  16. bool streamingActive = false;
  17. bool recordingActive = false;
  18. bool delayActive = false;
  19. bool replayBufferActive = false;
  20. bool virtualCamActive = false;
  21. OBSBasic *main;
  22. std::unique_ptr<MultitrackVideoOutput> multitrackVideo;
  23. bool multitrackVideoActive = false;
  24. OBSOutputAutoRelease StreamingOutput() const
  25. {
  26. return (multitrackVideo && multitrackVideoActive)
  27. ? multitrackVideo->StreamingOutput()
  28. : OBSOutputAutoRelease{obs_output_get_ref(streamOutput)};
  29. }
  30. obs_view_t *virtualCamView = nullptr;
  31. video_t *virtualCamVideo = nullptr;
  32. obs_scene_t *vCamSourceScene = nullptr;
  33. obs_sceneitem_t *vCamSourceSceneItem = nullptr;
  34. std::string outputType;
  35. std::string lastError;
  36. std::string lastRecordingPath;
  37. OBSSignal startRecording;
  38. OBSSignal stopRecording;
  39. OBSSignal startReplayBuffer;
  40. OBSSignal stopReplayBuffer;
  41. OBSSignal startStreaming;
  42. OBSSignal stopStreaming;
  43. OBSSignal startVirtualCam;
  44. OBSSignal stopVirtualCam;
  45. OBSSignal deactivateVirtualCam;
  46. OBSSignal streamDelayStarting;
  47. OBSSignal streamStopping;
  48. OBSSignal recordStopping;
  49. OBSSignal recordFileChanged;
  50. OBSSignal replayBufferStopping;
  51. OBSSignal replayBufferSaved;
  52. BasicOutputHandler(OBSBasic *main_);
  53. virtual ~BasicOutputHandler() {};
  54. virtual std::shared_future<void> SetupStreaming(obs_service_t *service,
  55. SetupStreamingContinuation_t continuation) = 0;
  56. virtual bool StartStreaming(obs_service_t *service) = 0;
  57. virtual bool StartRecording() = 0;
  58. virtual bool StartReplayBuffer() { return false; }
  59. virtual bool StartVirtualCam();
  60. virtual void StopStreaming(bool force = false) = 0;
  61. virtual void StopRecording(bool force = false) = 0;
  62. virtual void StopReplayBuffer(bool force = false) { (void)force; }
  63. virtual void StopVirtualCam();
  64. virtual bool StreamingActive() const = 0;
  65. virtual bool RecordingActive() const = 0;
  66. virtual bool ReplayBufferActive() const { return false; }
  67. virtual bool VirtualCamActive() const;
  68. virtual void Update() = 0;
  69. virtual void SetupOutputs() = 0;
  70. virtual void UpdateVirtualCamOutputSource();
  71. virtual void DestroyVirtualCamView();
  72. virtual void DestroyVirtualCameraScene();
  73. inline bool Active() const
  74. {
  75. return streamingActive || recordingActive || delayActive || replayBufferActive || virtualCamActive ||
  76. multitrackVideoActive;
  77. }
  78. protected:
  79. void SetupAutoRemux(const char *&container);
  80. std::string GetRecordingFilename(const char *path, const char *container, bool noSpace, bool overwrite,
  81. const char *format, bool ffmpeg);
  82. std::shared_future<void> SetupMultitrackVideo(obs_service_t *service, std::string audio_encoder_id,
  83. size_t main_audio_mixer, std::optional<size_t> vod_track_mixer,
  84. std::function<void(std::optional<bool>)> continuation);
  85. OBSDataAutoRelease GenerateMultitrackVideoStreamDumpConfig();
  86. };
  87. BasicOutputHandler *CreateSimpleOutputHandler(OBSBasic *main);
  88. BasicOutputHandler *CreateAdvancedOutputHandler(OBSBasic *main);
  89. void OBSStreamStarting(void *data, calldata_t *params);
  90. void OBSStreamStopping(void *data, calldata_t *params);
  91. void OBSStartStreaming(void *data, calldata_t *params);
  92. void OBSStopStreaming(void *data, calldata_t *params);
  93. void OBSStartRecording(void *data, calldata_t *params);
  94. void OBSStopRecording(void *data, calldata_t *params);
  95. void OBSRecordStopping(void *data, calldata_t *params);
  96. void OBSRecordFileChanged(void *data, calldata_t *params);
  97. void OBSStartReplayBuffer(void *data, calldata_t *params);
  98. void OBSStopReplayBuffer(void *data, calldata_t *params);
  99. void OBSReplayBufferStopping(void *data, calldata_t *params);
  100. void OBSReplayBufferSaved(void *data, calldata_t *params);
  101. inline bool can_use_output(const char *prot, const char *output, const char *prot_test1,
  102. const char *prot_test2 = nullptr)
  103. {
  104. return (strcmp(prot, prot_test1) == 0 || (prot_test2 && strcmp(prot, prot_test2) == 0)) &&
  105. (obs_get_output_flags(output) & OBS_OUTPUT_SERVICE) != 0;
  106. }
  107. const char *GetStreamOutputType(const obs_service_t *service);
  108. inline bool ServiceSupportsVodTrack(const char *service)
  109. {
  110. static const char *vodTrackServices[] = {"Twitch"};
  111. for (const char *vodTrackService : vodTrackServices) {
  112. if (astrcmpi(vodTrackService, service) == 0)
  113. return true;
  114. }
  115. return false;
  116. }
  117. void clear_archive_encoder(obs_output_t *output, const char *expected_name);