|
@@ -164,36 +164,6 @@ static void OBSStopVirtualCam(void *data, calldata_t *params)
|
|
|
UNUSED_PARAMETER(params);
|
|
|
}
|
|
|
|
|
|
-static void FindBestFilename(string &strPath, bool noSpace)
|
|
|
-{
|
|
|
- int num = 2;
|
|
|
-
|
|
|
- if (!os_file_exists(strPath.c_str()))
|
|
|
- return;
|
|
|
-
|
|
|
- const char *ext = strrchr(strPath.c_str(), '.');
|
|
|
- if (!ext)
|
|
|
- return;
|
|
|
-
|
|
|
- int extStart = int(ext - strPath.c_str());
|
|
|
- for (;;) {
|
|
|
- string testPath = strPath;
|
|
|
- string numStr;
|
|
|
-
|
|
|
- numStr = noSpace ? "_" : " (";
|
|
|
- numStr += to_string(num++);
|
|
|
- if (!noSpace)
|
|
|
- numStr += ")";
|
|
|
-
|
|
|
- testPath.insert(extStart, numStr);
|
|
|
-
|
|
|
- if (!os_file_exists(testPath.c_str())) {
|
|
|
- strPath = testPath;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/* ------------------------------------------------------------------------ */
|
|
|
|
|
|
static bool CreateAACEncoder(OBSEncoder &res, string &id, int bitrate,
|
|
@@ -903,30 +873,6 @@ bool SimpleOutput::StartStreaming(obs_service_t *service)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static void remove_reserved_file_characters(string &s)
|
|
|
-{
|
|
|
- replace(s.begin(), s.end(), '\\', '/');
|
|
|
- replace(s.begin(), s.end(), '*', '_');
|
|
|
- replace(s.begin(), s.end(), '?', '_');
|
|
|
- replace(s.begin(), s.end(), '"', '_');
|
|
|
- replace(s.begin(), s.end(), '|', '_');
|
|
|
- replace(s.begin(), s.end(), ':', '_');
|
|
|
- replace(s.begin(), s.end(), '>', '_');
|
|
|
- replace(s.begin(), s.end(), '<', '_');
|
|
|
-}
|
|
|
-
|
|
|
-static void ensure_directory_exists(string &path)
|
|
|
-{
|
|
|
- replace(path.begin(), path.end(), '\\', '/');
|
|
|
-
|
|
|
- size_t last = path.rfind('/');
|
|
|
- if (last == string::npos)
|
|
|
- return;
|
|
|
-
|
|
|
- string directory = path.substr(0, last);
|
|
|
- os_mkdirs(directory.c_str());
|
|
|
-}
|
|
|
-
|
|
|
void SimpleOutput::UpdateRecording()
|
|
|
{
|
|
|
if (replayBufferActive || recordingActive)
|
|
@@ -977,54 +923,15 @@ bool SimpleOutput::ConfigureRecording(bool updateReplayBuffer)
|
|
|
int rbSize =
|
|
|
config_get_int(main->Config(), "SimpleOutput", "RecRBSize");
|
|
|
|
|
|
- os_dir_t *dir = path && path[0] ? os_opendir(path) : nullptr;
|
|
|
-
|
|
|
- if (!dir) {
|
|
|
- if (main->isVisible())
|
|
|
- OBSMessageBox::warning(main,
|
|
|
- QTStr("Output.BadPath.Title"),
|
|
|
- QTStr("Output.BadPath.Text"));
|
|
|
- else
|
|
|
- main->SysTrayNotify(QTStr("Output.BadPath.Text"),
|
|
|
- QSystemTrayIcon::Warning);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- os_closedir(dir);
|
|
|
-
|
|
|
+ string f;
|
|
|
string strPath;
|
|
|
- strPath += path;
|
|
|
-
|
|
|
- char lastChar = strPath.back();
|
|
|
- if (lastChar != '/' && lastChar != '\\')
|
|
|
- strPath += "/";
|
|
|
-
|
|
|
- strPath += GenerateSpecifiedFilename(ffmpegOutput ? "avi" : format,
|
|
|
- noSpace, filenameFormat);
|
|
|
- ensure_directory_exists(strPath);
|
|
|
- if (!overwriteIfExists)
|
|
|
- FindBestFilename(strPath, noSpace);
|
|
|
|
|
|
obs_data_t *settings = obs_data_create();
|
|
|
if (updateReplayBuffer) {
|
|
|
- string f;
|
|
|
-
|
|
|
- if (rbPrefix && *rbPrefix) {
|
|
|
- f += rbPrefix;
|
|
|
- if (f.back() != ' ')
|
|
|
- f += " ";
|
|
|
- }
|
|
|
-
|
|
|
- f += filenameFormat;
|
|
|
-
|
|
|
- if (rbSuffix && *rbSuffix) {
|
|
|
- if (*rbSuffix != ' ')
|
|
|
- f += " ";
|
|
|
- f += rbSuffix;
|
|
|
- }
|
|
|
-
|
|
|
- remove_reserved_file_characters(f);
|
|
|
-
|
|
|
+ f = GetFormatString(filenameFormat, rbPrefix, rbSuffix);
|
|
|
+ strPath = GetOutputFilename(path, ffmpegOutput ? "avi" : format,
|
|
|
+ noSpace, overwriteIfExists,
|
|
|
+ f.c_str());
|
|
|
obs_data_set_string(settings, "directory", path);
|
|
|
obs_data_set_string(settings, "format", f.c_str());
|
|
|
obs_data_set_string(settings, "extension", format);
|
|
@@ -1033,6 +940,10 @@ bool SimpleOutput::ConfigureRecording(bool updateReplayBuffer)
|
|
|
obs_data_set_int(settings, "max_size_mb",
|
|
|
usingRecordingPreset ? rbSize : 0);
|
|
|
} else {
|
|
|
+ f = GetFormatString(filenameFormat, nullptr, nullptr);
|
|
|
+ strPath = GetOutputFilename(path, ffmpegOutput ? "avi" : format,
|
|
|
+ noSpace, overwriteIfExists,
|
|
|
+ f.c_str());
|
|
|
obs_data_set_string(settings, ffmpegOutput ? "url" : "path",
|
|
|
strPath.c_str());
|
|
|
}
|
|
@@ -1779,34 +1690,9 @@ bool AdvancedOutput::StartRecording()
|
|
|
? "FFFileNameWithoutSpace"
|
|
|
: "RecFileNameWithoutSpace");
|
|
|
|
|
|
- os_dir_t *dir = path && path[0] ? os_opendir(path) : nullptr;
|
|
|
-
|
|
|
- if (!dir) {
|
|
|
- if (main->isVisible())
|
|
|
- OBSMessageBox::warning(
|
|
|
- main, QTStr("Output.BadPath.Title"),
|
|
|
- QTStr("Output.BadPath.Text"));
|
|
|
- else
|
|
|
- main->SysTrayNotify(
|
|
|
- QTStr("Output.BadPath.Text"),
|
|
|
- QSystemTrayIcon::Warning);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- os_closedir(dir);
|
|
|
-
|
|
|
- string strPath;
|
|
|
- strPath += path;
|
|
|
-
|
|
|
- char lastChar = strPath.back();
|
|
|
- if (lastChar != '/' && lastChar != '\\')
|
|
|
- strPath += "/";
|
|
|
-
|
|
|
- strPath += GenerateSpecifiedFilename(recFormat, noSpace,
|
|
|
- filenameFormat);
|
|
|
- ensure_directory_exists(strPath);
|
|
|
- if (!overwriteIfExists)
|
|
|
- FindBestFilename(strPath, noSpace);
|
|
|
+ string strPath = GetOutputFilename(path, recFormat, noSpace,
|
|
|
+ overwriteIfExists,
|
|
|
+ filenameFormat);
|
|
|
|
|
|
obs_data_t *settings = obs_data_create();
|
|
|
obs_data_set_string(settings, ffmpegRecording ? "url" : "path",
|
|
@@ -1879,53 +1765,11 @@ bool AdvancedOutput::StartReplayBuffer()
|
|
|
rbTime = config_get_int(main->Config(), "AdvOut", "RecRBTime");
|
|
|
rbSize = config_get_int(main->Config(), "AdvOut", "RecRBSize");
|
|
|
|
|
|
- os_dir_t *dir = path && path[0] ? os_opendir(path) : nullptr;
|
|
|
-
|
|
|
- if (!dir) {
|
|
|
- if (main->isVisible())
|
|
|
- OBSMessageBox::warning(
|
|
|
- main, QTStr("Output.BadPath.Title"),
|
|
|
- QTStr("Output.BadPath.Text"));
|
|
|
- else
|
|
|
- main->SysTrayNotify(
|
|
|
- QTStr("Output.BadPath.Text"),
|
|
|
- QSystemTrayIcon::Warning);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- os_closedir(dir);
|
|
|
-
|
|
|
- string strPath;
|
|
|
- strPath += path;
|
|
|
-
|
|
|
- char lastChar = strPath.back();
|
|
|
- if (lastChar != '/' && lastChar != '\\')
|
|
|
- strPath += "/";
|
|
|
-
|
|
|
- strPath += GenerateSpecifiedFilename(recFormat, noSpace,
|
|
|
- filenameFormat);
|
|
|
- ensure_directory_exists(strPath);
|
|
|
- if (!overwriteIfExists)
|
|
|
- FindBestFilename(strPath, noSpace);
|
|
|
+ string f = GetFormatString(filenameFormat, rbPrefix, rbSuffix);
|
|
|
+ string strPath = GetOutputFilename(
|
|
|
+ path, recFormat, noSpace, overwriteIfExists, f.c_str());
|
|
|
|
|
|
obs_data_t *settings = obs_data_create();
|
|
|
- string f;
|
|
|
-
|
|
|
- if (rbPrefix && *rbPrefix) {
|
|
|
- f += rbPrefix;
|
|
|
- if (f.back() != ' ')
|
|
|
- f += " ";
|
|
|
- }
|
|
|
-
|
|
|
- f += filenameFormat;
|
|
|
-
|
|
|
- if (rbSuffix && *rbSuffix) {
|
|
|
- if (*rbSuffix != ' ')
|
|
|
- f += " ";
|
|
|
- f += rbSuffix;
|
|
|
- }
|
|
|
-
|
|
|
- remove_reserved_file_characters(f);
|
|
|
|
|
|
obs_data_set_string(settings, "directory", path);
|
|
|
obs_data_set_string(settings, "format", f.c_str());
|