forked from mia/Aegisub
Move snapshot saving from VideoContext to the commands
Originally committed to SVN as r5968.
This commit is contained in:
parent
8a7f4038c1
commit
2fa16a78c6
3 changed files with 38 additions and 45 deletions
|
@ -56,6 +56,7 @@
|
||||||
#include "../dialog_jumpto.h"
|
#include "../dialog_jumpto.h"
|
||||||
#include "../dialog_video_details.h"
|
#include "../dialog_video_details.h"
|
||||||
#include "../selection_controller.h"
|
#include "../selection_controller.h"
|
||||||
|
#include "../standard_paths.h"
|
||||||
#include "../subs_grid.h"
|
#include "../subs_grid.h"
|
||||||
#include "../utils.h"
|
#include "../utils.h"
|
||||||
#include "../video_box.h"
|
#include "../video_box.h"
|
||||||
|
@ -476,6 +477,41 @@ struct video_frame_prev_large : public validator_video_loaded {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void save_snapshot(agi::Context *c, bool raw) {
|
||||||
|
static const agi::OptionValue* ssPath = OPT_GET("Path/Screenshot");
|
||||||
|
wxString option = lagi_wxString(ssPath->GetString());
|
||||||
|
wxFileName videoFile(c->videoController->videoName);
|
||||||
|
wxString basepath;
|
||||||
|
|
||||||
|
// Is it a path specifier and not an actual fixed path?
|
||||||
|
if (option[0] == '?') {
|
||||||
|
// If dummy video is loaded, we can't save to the video location
|
||||||
|
if (option.StartsWith("?video") && (c->videoController->videoName.Find("?dummy") != wxNOT_FOUND)) {
|
||||||
|
// So try the script location instead
|
||||||
|
option = "?script";
|
||||||
|
}
|
||||||
|
// Find out where the ?specifier points to
|
||||||
|
basepath = StandardPaths::DecodePath(option);
|
||||||
|
// If where ever that is isn't defined, we can't save there
|
||||||
|
if ((basepath == "\\") || (basepath == "/")) {
|
||||||
|
// So save to the current user's home dir instead
|
||||||
|
basepath = wxGetHomeDir();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Actual fixed (possibly relative) path, decode it
|
||||||
|
else basepath = DecodeRelativePath(option,StandardPaths::DecodePath("?user/"));
|
||||||
|
basepath += "/" + videoFile.GetName();
|
||||||
|
|
||||||
|
// Get full path
|
||||||
|
int session_shot_count = 1;
|
||||||
|
wxString path;
|
||||||
|
do {
|
||||||
|
path = wxString::Format("%s_%03d_%d.png", basepath, session_shot_count++, c->videoController->GetFrameN());
|
||||||
|
} while (wxFileName::FileExists(path));
|
||||||
|
|
||||||
|
c->videoController->GetFrame(c->videoController->GetFrameN(), raw)->GetImage().SaveFile(path,wxBITMAP_TYPE_PNG);
|
||||||
|
}
|
||||||
|
|
||||||
/// Save the current video frame, with subtitles (if any)
|
/// Save the current video frame, with subtitles (if any)
|
||||||
struct video_frame_save : public validator_video_loaded {
|
struct video_frame_save : public validator_video_loaded {
|
||||||
CMD_NAME("video/frame/save")
|
CMD_NAME("video/frame/save")
|
||||||
|
@ -484,7 +520,7 @@ struct video_frame_save : public validator_video_loaded {
|
||||||
STR_HELP("Save the currently displayed frame to a PNG file in the video's directory.")
|
STR_HELP("Save the currently displayed frame to a PNG file in the video's directory.")
|
||||||
|
|
||||||
void operator()(agi::Context *c) {
|
void operator()(agi::Context *c) {
|
||||||
c->videoController->SaveSnapshot(false);
|
save_snapshot(c, false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -496,7 +532,7 @@ struct video_frame_save_raw : public validator_video_loaded {
|
||||||
STR_HELP("Save the currently displayed frame without the subtitles to a PNG file in the video's directory.")
|
STR_HELP("Save the currently displayed frame without the subtitles to a PNG file in the video's directory.")
|
||||||
|
|
||||||
void operator()(agi::Context *c) {
|
void operator()(agi::Context *c) {
|
||||||
c->videoController->SaveSnapshot(true);
|
save_snapshot(c, true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,6 @@ void VideoContext::SetContext(agi::Context *context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoContext::SetVideo(const wxString &filename) {
|
void VideoContext::SetVideo(const wxString &filename) {
|
||||||
Stop();
|
|
||||||
Reset();
|
Reset();
|
||||||
if (filename.empty()) {
|
if (filename.empty()) {
|
||||||
VideoOpen();
|
VideoOpen();
|
||||||
|
@ -303,44 +302,6 @@ int VideoContext::GetLength() const {
|
||||||
return videoProvider->GetFrameCount();
|
return videoProvider->GetFrameCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoContext::SaveSnapshot(bool raw) {
|
|
||||||
// Get folder
|
|
||||||
static const agi::OptionValue* ssPath = OPT_GET("Path/Screenshot");
|
|
||||||
wxString option = lagi_wxString(ssPath->GetString());
|
|
||||||
wxFileName videoFile(videoName);
|
|
||||||
wxString basepath;
|
|
||||||
// Is it a path specifier and not an actual fixed path?
|
|
||||||
if (option[0] == '?') {
|
|
||||||
// If dummy video is loaded, we can't save to the video location
|
|
||||||
if (option.StartsWith("?video") && (videoName.Find("?dummy") != wxNOT_FOUND)) {
|
|
||||||
// So try the script location instead
|
|
||||||
option = "?script";
|
|
||||||
}
|
|
||||||
// Find out where the ?specifier points to
|
|
||||||
basepath = StandardPaths::DecodePath(option);
|
|
||||||
// If where ever that is isn't defined, we can't save there
|
|
||||||
if ((basepath == "\\") || (basepath == "/")) {
|
|
||||||
// So save to the current user's home dir instead
|
|
||||||
basepath = wxGetHomeDir();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Actual fixed (possibly relative) path, decode it
|
|
||||||
else basepath = DecodeRelativePath(option,StandardPaths::DecodePath("?user/"));
|
|
||||||
basepath += "/" + videoFile.GetName();
|
|
||||||
|
|
||||||
// Get full path
|
|
||||||
int session_shot_count = 1;
|
|
||||||
wxString path;
|
|
||||||
while (1) {
|
|
||||||
path = basepath + wxString::Format("_%03i_%i.png",session_shot_count,frame_n);
|
|
||||||
++session_shot_count;
|
|
||||||
wxFileName tryPath(path);
|
|
||||||
if (!tryPath.FileExists()) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetFrame(frame_n,raw)->GetImage().SaveFile(path,wxBITMAP_TYPE_PNG);
|
|
||||||
}
|
|
||||||
|
|
||||||
void VideoContext::NextFrame() {
|
void VideoContext::NextFrame() {
|
||||||
if (!videoProvider || IsPlaying() || frame_n == videoProvider->GetFrameCount())
|
if (!videoProvider || IsPlaying() || frame_n == videoProvider->GetFrameCount())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -155,10 +155,6 @@ public:
|
||||||
std::tr1::shared_ptr<AegiVideoFrame> GetFrame(int n, bool raw = false);
|
std::tr1::shared_ptr<AegiVideoFrame> GetFrame(int n, bool raw = false);
|
||||||
void GetFrameAsync(int n);
|
void GetFrameAsync(int n);
|
||||||
|
|
||||||
/// @brief Save the currently displayed frame as an image
|
|
||||||
/// @param raw Should the frame have subtitles?
|
|
||||||
void SaveSnapshot(bool raw);
|
|
||||||
|
|
||||||
/// @brief Is there a video loaded?
|
/// @brief Is there a video loaded?
|
||||||
bool IsLoaded() const { return !!videoProvider; }
|
bool IsLoaded() const { return !!videoProvider; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue