diff --git a/obs-studio-server/source/nodeobs_service.cpp b/obs-studio-server/source/nodeobs_service.cpp index 70213d24c..5b7fd88b1 100644 --- a/obs-studio-server/source/nodeobs_service.cpp +++ b/obs-studio-server/source/nodeobs_service.cpp @@ -1400,8 +1400,8 @@ bool OBS_service::startMultiTrackStreaming(StreamServiceId serviceId, bool dualS std::vector audio_encoders; std::shared_ptr video_encoder_group; - auto output = - osn::SetupOBSOutput("Enhanced Broadcasting", go_live_config.value(), audio_encoders, video_encoder_group, audio_encoder_id, 0, vod_track_mixer); + auto output = osn::SetupOBSOutput("Enhanced Broadcasting", go_live_config.value(), audio_encoders, video_encoder_group, audio_encoder_id, 0, + vod_track_mixer, canvases); if (!output) { throw std::runtime_error("startStreaming - failed to create multitrack output"); } diff --git a/obs-studio-server/source/osn-enhanced-broadcasting.hpp b/obs-studio-server/source/osn-enhanced-broadcasting.hpp index 2cb43493b..5e265376c 100644 --- a/obs-studio-server/source/osn-enhanced-broadcasting.hpp +++ b/obs-studio-server/source/osn-enhanced-broadcasting.hpp @@ -81,7 +81,7 @@ template class EnhancedBroadcasting : public BaseStreami std::vector audio_encoders; std::shared_ptr video_encoder_group; auto output = osn::SetupOBSOutput("Enhanced Broadcasting", go_live_config.value(), audio_encoders, video_encoder_group, audio_encoder_id, 0, - vod_track_mixer); + vod_track_mixer, canvases); if (!output) { throw std::runtime_error("startStreaming - failed to create multitrack output"); } diff --git a/obs-studio-server/source/osn-multitrack-video-output.cpp b/obs-studio-server/source/osn-multitrack-video-output.cpp index 0a4d53a4c..31517886e 100644 --- a/obs-studio-server/source/osn-multitrack-video-output.cpp +++ b/obs-studio-server/source/osn-multitrack-video-output.cpp @@ -172,7 +172,8 @@ static OBSEncoderAutoRelease create_video_encoder(DStr &name_buffer, std::size_t return video_encoder; } -static bool create_video_encoders(const Config &go_live_config, std::shared_ptr &video_encoder_group, obs_output_t *output) +static bool create_video_encoders(const Config &go_live_config, std::shared_ptr &video_encoder_group, obs_output_t *output, + const std::vector &canvases) { DStr video_encoder_name_buffer; if (go_live_config.encoder_configurations.empty()) { @@ -186,18 +187,17 @@ static bool create_video_encoders(const Config &go_live_config, std::shared_ptr< return false; } - const auto max_canvas_idx = obs_get_video_info_count() - 1; - for (size_t i = 0; i < go_live_config.encoder_configurations.size(); i++) { auto &config = go_live_config.encoder_configurations[i]; - if (config.canvas_index > max_canvas_idx) { - blog(LOG_ERROR, "create_video_encoders - got unexpected large canvas index - i: %d", config.canvas_index); + if (config.canvas_index >= canvases.size()) { + blog(LOG_ERROR, "create_video_encoders - canvas_index %d out of range (canvases.size()=%zu) - encoder: %zu", config.canvas_index, + canvases.size(), i); return false; } - obs_video_info *ovi = obs_get_video_info_by_index2(config.canvas_index); + obs_video_info *ovi = canvases[config.canvas_index]; if (!ovi) { - blog(LOG_ERROR, "create_video_encoders - failed to get canvas video info by index - i: %d", config.canvas_index); + blog(LOG_ERROR, "create_video_encoders - null canvas at index %d - encoder: %zu", config.canvas_index, i); return false; } @@ -321,12 +321,12 @@ static OBSOutputAutoRelease create_output() OBSOutputAutoRelease SetupOBSOutput(const std::string &multitrack_video_name, const Config &go_live_config, std::vector &audio_encoders, std::shared_ptr &video_encoder_group, const char *audio_encoder_id, size_t main_audio_mixer, - std::optional vod_track_mixer) + std::optional vod_track_mixer, const std::vector &canvases) { auto output = create_output(); - if (!create_video_encoders(go_live_config, video_encoder_group, output)) + if (!create_video_encoders(go_live_config, video_encoder_group, output, canvases)) return nullptr; std::vector requested_speaker_layouts; diff --git a/obs-studio-server/source/osn-multitrack-video-output.hpp b/obs-studio-server/source/osn-multitrack-video-output.hpp index 11ddd72c1..f4a742592 100644 --- a/obs-studio-server/source/osn-multitrack-video-output.hpp +++ b/obs-studio-server/source/osn-multitrack-video-output.hpp @@ -13,7 +13,7 @@ namespace osn { OBSOutputAutoRelease SetupOBSOutput(const std::string &multitrack_video_name, const Config &go_live_config, std::vector &audio_encoders, std::shared_ptr &video_encoder_group, const char *audio_encoder_id, size_t main_audio_mixer, - std::optional vod_track_mixer); + std::optional vod_track_mixer, const std::vector &canvases); OBSServiceAutoRelease create_service(const Config &go_live_config, const std::optional &rtmp_url, const std::string &in_stream_key);