window-basic-main-outputs.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. #include <future>
  3. #include <memory>
  4. #include <string>
  5. #include "multitrack-video-output.hpp"
  6. class OBSBasic;
  7. using SetupStreamingContinuation_t = std::function<void(bool)>;
  8. struct BasicOutputHandler {
  9. OBSOutputAutoRelease fileOutput;
  10. OBSOutputAutoRelease streamOutput;
  11. OBSOutputAutoRelease replayBuffer;
  12. OBSOutputAutoRelease virtualCam;
  13. bool streamingActive = false;
  14. bool recordingActive = false;
  15. bool delayActive = false;
  16. bool replayBufferActive = false;
  17. bool virtualCamActive = false;
  18. OBSBasic *main;
  19. std::unique_ptr<MultitrackVideoOutput> multitrackVideo;
  20. bool multitrackVideoActive = false;
  21. OBSOutputAutoRelease StreamingOutput() const
  22. {
  23. return (multitrackVideo && multitrackVideoActive)
  24. ? multitrackVideo->StreamingOutput()
  25. : OBSOutputAutoRelease{
  26. obs_output_get_ref(streamOutput)};
  27. }
  28. obs_view_t *virtualCamView = nullptr;
  29. video_t *virtualCamVideo = nullptr;
  30. obs_scene_t *vCamSourceScene = nullptr;
  31. obs_sceneitem_t *vCamSourceSceneItem = nullptr;
  32. std::string outputType;
  33. std::string lastError;
  34. std::string lastRecordingPath;
  35. OBSSignal startRecording;
  36. OBSSignal stopRecording;
  37. OBSSignal startReplayBuffer;
  38. OBSSignal stopReplayBuffer;
  39. OBSSignal startStreaming;
  40. OBSSignal stopStreaming;
  41. OBSSignal startVirtualCam;
  42. OBSSignal stopVirtualCam;
  43. OBSSignal deactivateVirtualCam;
  44. OBSSignal streamDelayStarting;
  45. OBSSignal streamStopping;
  46. OBSSignal recordStopping;
  47. OBSSignal recordFileChanged;
  48. OBSSignal replayBufferStopping;
  49. OBSSignal replayBufferSaved;
  50. inline BasicOutputHandler(OBSBasic *main_);
  51. virtual ~BasicOutputHandler(){};
  52. virtual std::shared_future<void>
  53. SetupStreaming(obs_service_t *service,
  54. SetupStreamingContinuation_t continuation) = 0;
  55. virtual bool StartStreaming(obs_service_t *service) = 0;
  56. virtual bool StartRecording() = 0;
  57. virtual bool StartReplayBuffer() { return false; }
  58. virtual bool StartVirtualCam();
  59. virtual void StopStreaming(bool force = false) = 0;
  60. virtual void StopRecording(bool force = false) = 0;
  61. virtual void StopReplayBuffer(bool force = false) { (void)force; }
  62. virtual void StopVirtualCam();
  63. virtual bool StreamingActive() const = 0;
  64. virtual bool RecordingActive() const = 0;
  65. virtual bool ReplayBufferActive() const { return false; }
  66. virtual bool VirtualCamActive() const;
  67. virtual void Update() = 0;
  68. virtual void SetupOutputs() = 0;
  69. virtual void UpdateVirtualCamOutputSource();
  70. virtual void DestroyVirtualCamView();
  71. virtual void DestroyVirtualCameraScene();
  72. inline bool Active() const
  73. {
  74. return streamingActive || recordingActive || delayActive ||
  75. replayBufferActive || virtualCamActive ||
  76. multitrackVideoActive;
  77. }
  78. protected:
  79. void SetupAutoRemux(const char *&container);
  80. std::string GetRecordingFilename(const char *path,
  81. const char *container, bool noSpace,
  82. bool overwrite, const char *format,
  83. bool ffmpeg);
  84. std::shared_future<void> SetupMultitrackVideo(
  85. obs_service_t *service, std::string audio_encoder_id,
  86. size_t main_audio_mixer, std::optional<size_t> vod_track_mixer,
  87. std::function<void(std::optional<bool>)> continuation);
  88. OBSDataAutoRelease GenerateMultitrackVideoStreamDumpConfig();
  89. };
  90. BasicOutputHandler *CreateSimpleOutputHandler(OBSBasic *main);
  91. BasicOutputHandler *CreateAdvancedOutputHandler(OBSBasic *main);