void
-run_ffprobe (boost::filesystem::path content, boost::filesystem::path out)
+run_ffprobe(boost::filesystem::path content, boost::filesystem::path out, bool err, string args)
{
- string ffprobe = "ffprobe \"" + content.string() + "\" 2> \"" + out.string() + "\"";
+ string const redirect = err ? "2>" : ">";
+ auto const ffprobe = String::compose("ffprobe %1 \"%2\" %3 \"%4\"", args.empty() ? " " : args, content.string(), redirect, out.string());
LOG_GENERAL (N_("Probing with %1"), ffprobe);
int const r = system (ffprobe.c_str());
if (r == -1 || (WIFEXITED(r) && WEXITSTATUS(r) != 0)) {
void
-run_ffprobe (boost::filesystem::path content, boost::filesystem::path out)
+run_ffprobe(boost::filesystem::path content, boost::filesystem::path out, bool err, string args)
{
auto path = directory_containing_executable () / "ffprobe";
+ if (!boost::filesystem::exists(path)) {
+ /* This is a hack but we need ffprobe during tests */
+ path = "/Users/ci/workspace/bin/ffprobe";
+ }
+ string const redirect = err ? "2>" : ">";
- string ffprobe = "\"" + path.string() + "\" \"" + content.string() + "\" 2> \"" + out.string() + "\"";
+ auto const ffprobe = String::compose("\"%1\" %2 \"%3\" %4 \"%5\"", path, args.empty() ? " " : args, content.string(), redirect, out.string());
LOG_GENERAL (N_("Probing with %1"), ffprobe);
- system (ffprobe.c_str ());
+ system (ffprobe.c_str());
}
void
-run_ffprobe (boost::filesystem::path content, boost::filesystem::path out)
+run_ffprobe(boost::filesystem::path content, boost::filesystem::path out, bool err, string args)
{
SECURITY_ATTRIBUTES security;
security.nLength = sizeof (security);
security.bInheritHandle = TRUE;
security.lpSecurityDescriptor = 0;
- HANDLE child_stderr_read;
- HANDLE child_stderr_write;
- if (!CreatePipe (&child_stderr_read, &child_stderr_write, &security, 0)) {
+ HANDLE child_out_read;
+ HANDLE child_out_write;
+ if (!CreatePipe(&child_out_read, &child_out_write, &security, 0)) {
LOG_ERROR_NC ("ffprobe call failed (could not CreatePipe)");
return;
}
+ if (!SetHandleInformation(child_out_read, HANDLE_FLAG_INHERIT, 0)) {
+ LOG_ERROR_NC("ffprobe call failed (could not SetHandleInformation)");
+ return;
+ }
+
wchar_t dir[512];
MultiByteToWideChar (CP_UTF8, 0, directory_containing_executable().string().c_str(), -1, dir, sizeof(dir));
STARTUPINFO startup_info;
ZeroMemory (&startup_info, sizeof (startup_info));
startup_info.cb = sizeof (startup_info);
- startup_info.hStdError = child_stderr_write;
+ if (err) {
+ startup_info.hStdError = child_out_write;
+ } else {
+ startup_info.hStdOutput = child_out_write;
+ }
startup_info.dwFlags |= STARTF_USESTDHANDLES;
wchar_t command[512];
- wcscpy (command, L"ffprobe.exe \"");
+ wcscpy(command, L"ffprobe.exe ");
+
+ wchar_t tmp[512];
+ MultiByteToWideChar(CP_UTF8, 0, args.c_str(), -1, tmp, sizeof(tmp));
+ wcscat(command, tmp);
+
+ wcscat(command, L" \"");
- wchar_t file[512];
- MultiByteToWideChar (CP_UTF8, 0, content.string().c_str(), -1, file, sizeof(file));
- wcscat (command, file);
+ MultiByteToWideChar(CP_UTF8, 0, boost::filesystem::canonical(content).make_preferred().string().c_str(), -1, tmp, sizeof(tmp));
+ wcscat(command, tmp);
- wcscat (command, L"\"");
+ wcscat(command, L"\"");
PROCESS_INFORMATION process_info;
ZeroMemory (&process_info, sizeof (process_info));
return;
}
- CloseHandle (child_stderr_write);
+ CloseHandle(child_out_write);
while (true) {
char buffer[512];
DWORD read;
- if (!ReadFile(child_stderr_read, buffer, sizeof(buffer), &read, 0) || read == 0) {
+ if (!ReadFile(child_out_read, buffer, sizeof(buffer), &read, 0) || read == 0) {
break;
}
o.write(buffer, read, 1);
WaitForSingleObject (process_info.hProcess, INFINITE);
CloseHandle (process_info.hProcess);
CloseHandle (process_info.hThread);
- CloseHandle (child_stderr_read);
+ CloseHandle(child_out_read);
}