BasicOutputHandler.hpp 4.8 KB

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