/****************************************************************************** Copyright (C) 2023 by Lain Bailey Zachary Lund Philippe Groarke This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ******************************************************************************/ #include "OBSBasic.hpp" #include #include void OBSBasic::ResetOutputs() { ProfileScope("OBSBasic::ResetOutputs"); const char *mode = config_get_string(activeConfiguration, "Output", "Mode"); bool advOut = astrcmpi(mode, "Advanced") == 0; if ((!outputHandler || !outputHandler->Active()) && (!setupStreamingGuard.valid() || setupStreamingGuard.wait_for(std::chrono::seconds{0}) == std::future_status::ready)) { outputHandler.reset(); outputHandler.reset(advOut ? CreateAdvancedOutputHandler(this) : CreateSimpleOutputHandler(this)); emit ReplayBufEnabled(outputHandler->replayBuffer); if (sysTrayReplayBuffer) sysTrayReplayBuffer->setEnabled(!!outputHandler->replayBuffer); UpdateIsRecordingPausable(); } else { outputHandler->Update(); } } bool OBSBasic::Active() const { if (!outputHandler) return false; return outputHandler->Active(); } void OBSBasic::ResizeOutputSizeOfSource() { if (obs_video_active()) return; QMessageBox resize_output(this); resize_output.setText(QTStr("ResizeOutputSizeOfSource.Text") + "\n\n" + QTStr("ResizeOutputSizeOfSource.Continue")); QAbstractButton *Yes = resize_output.addButton(QTStr("Yes"), QMessageBox::YesRole); resize_output.addButton(QTStr("No"), QMessageBox::NoRole); resize_output.setIcon(QMessageBox::Warning); resize_output.setWindowTitle(QTStr("ResizeOutputSizeOfSource")); resize_output.exec(); if (resize_output.clickedButton() != Yes) return; OBSSource source = obs_sceneitem_get_source(GetCurrentSceneItem()); int width = obs_source_get_width(source); int height = obs_source_get_height(source); width = ((width + 3) / 4) * 4; // Round width up to the nearest multiple of 4 height = ((height + 1) / 2) * 2; // Round height up to the nearest multiple of 2 config_set_uint(activeConfiguration, "Video", "BaseCX", width); config_set_uint(activeConfiguration, "Video", "BaseCY", height); config_set_uint(activeConfiguration, "Video", "OutputCX", width); config_set_uint(activeConfiguration, "Video", "OutputCY", height); ResetVideo(); ResetOutputs(); activeConfiguration.SaveSafe("tmp"); on_actionFitToScreen_triggered(); } const char *OBSBasic::GetCurrentOutputPath() { const char *path = nullptr; const char *mode = config_get_string(Config(), "Output", "Mode"); if (strcmp(mode, "Advanced") == 0) { const char *advanced_mode = config_get_string(Config(), "AdvOut", "RecType"); if (strcmp(advanced_mode, "FFmpeg") == 0) { path = config_get_string(Config(), "AdvOut", "FFFilePath"); } else { path = config_get_string(Config(), "AdvOut", "RecFilePath"); } } else { path = config_get_string(Config(), "SimpleOutput", "FilePath"); } return path; } void OBSBasic::OutputPathInvalidMessage() { blog(LOG_ERROR, "Recording stopped because of bad output path"); OBSMessageBox::critical(this, QTStr("Output.BadPath.Title"), QTStr("Output.BadPath.Text")); } bool OBSBasic::IsFFmpegOutputToURL() const { const char *mode = config_get_string(Config(), "Output", "Mode"); if (strcmp(mode, "Advanced") == 0) { const char *advanced_mode = config_get_string(Config(), "AdvOut", "RecType"); if (strcmp(advanced_mode, "FFmpeg") == 0) { bool is_local = config_get_bool(Config(), "AdvOut", "FFOutputToFile"); if (!is_local) return true; } } return false; } bool OBSBasic::OutputPathValid() { if (IsFFmpegOutputToURL()) return true; const char *path = GetCurrentOutputPath(); return path && *path && QDir(path).exists(); }