1
0
Fork 0

src/: fail --load-tape-create-video if video encoding fails.

Also fail video encoding if output file already exists.
This commit is contained in:
Julian Smith 2021-12-07 09:29:45 +00:00
parent dd7cbf56cc
commit dd9f4ac890
3 changed files with 45 additions and 18 deletions

View file

@ -1783,13 +1783,15 @@ bool loadTapeContinuous(
{
continuous->m_replay_fixed_dt_prev = -1;
}
if (continuous->m_replay_create_video)
bool ok = true;
if (ok && continuous->m_replay_create_video)
{
SG_LOG(SG_GENERAL, SG_ALERT, "Replaying with create-video");
auto view_mgr = globals->get_subsystem<FGViewMgr>();
if (view_mgr)
{
view_mgr->video_start(
ok = view_mgr->video_start(
"" /*name*/,
"" /*codec*/,
-1 /*quality*/,
@ -1797,9 +1799,14 @@ bool loadTapeContinuous(
0 /*bitrate*/
);
}
else
{
SG_LOG(SG_GENERAL, SG_ALERT, "Cannot handle create_video=true because FGViewMgr not available");
ok = false;
}
}
replay_internal.start(true /*new_tape*/);
return true;
if (ok) ok = replay_internal.start(true /*new_tape*/);
return ok;
}
/** Read a flight recorder tape with given filename from disk.

View file

@ -366,7 +366,7 @@ FGViewMgr::add_view( flightgear::View * v )
v->init();
}
void FGViewMgr::video_start(
bool FGViewMgr::video_start(
const std::string& name_in,
const std::string& codec_in,
double quality,
@ -413,6 +413,11 @@ void FGViewMgr::video_start(
SGPath path = SGPath(fgGetString("/sim/video/directory"));
SGPath path_link = path;
path.append(name);
if (path.exists())
{
videoEncodingError("Video encoding failure, output file already exists: " + path.str());
return false;
}
path_link.append(name_link);
path_link.remove();
bool ok = path_link.makeLink(path.file());
@ -464,7 +469,9 @@ void FGViewMgr::video_start(
catch (std::exception& e)
{
videoEncodingError(e.what());
return false;
}
return true;
}
void FGViewMgr::video_stop()

View file

@ -94,25 +94,38 @@ public:
void add_view( flightgear::View * v );
// Start video encoding to <path>.
// Start video encoding of main window.
//
// If <name> is "" we generate a name containing current date and time.
//
// If <codec> is "" we use /sim/video/codec.
//
// If quality is -1 we use /sim/video/quality; similarly for speed. If
// bitrate is 0 we use /sim/video/bitrate.
// name
// Name of output file or "" to generate a name containing current
// date and time and /sim/video/container. List of supported
// containers can be found with 'ffmpeg -formats'.
// codec_name
// Name of codec or "" to use /sim/video/codec. Passed to
// avcodec_find_encoder_by_name(). List of supported codecs can be
// found with 'ffmpeg -codecs'.
// quality
// Encoding quality in range 0..1 or -1 to use /sim/video/quality.
// speed:
// Encoding speed in range 0..1 or -1 to use /sim/video/speed.
// bitrate
// Target bitratae in bits/sec or -1 to use /sim/video/bitrate.
//
// We show popup warning if values are out of range - quality and speed
// must be -1 or 0-1, bitrate must be >= 0.
//
void video_start(
const std::string& name,
const std::string& codec,
double quality,
double speed,
int bitrate
// Returns false if we fail to start video encoding.
//
bool video_start(
const std::string& name="",
const std::string& codec="",
double quality=-1,
double speed=-1,
int bitrate=0
);
// Stop video encoding of main window.
//
void video_stop();
private: