Use an enum for the predefined aspect ratio types

This commit is contained in:
Thomas Goyne 2013-01-20 13:05:24 -08:00
parent 9537e14c3c
commit bc7229782c
5 changed files with 59 additions and 46 deletions

View file

@ -100,12 +100,12 @@ struct video_aspect_cinematic : public validator_video_loaded {
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO) CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) { bool IsActive(const agi::Context *c) {
return c->videoController->GetAspectRatioType() == 3; return c->videoController->GetAspectRatioType() == AspectRatio::Cinematic;
} }
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
c->videoController->Stop(); c->videoController->Stop();
c->videoController->SetAspectRatio(3); c->videoController->SetAspectRatio(AspectRatio::Cinematic);
wxGetApp().frame->SetDisplayMode(1,-1); wxGetApp().frame->SetDisplayMode(1,-1);
} }
}; };
@ -119,7 +119,7 @@ struct video_aspect_custom : public validator_video_loaded {
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO) CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) { bool IsActive(const agi::Context *c) {
return c->videoController->GetAspectRatioType() == 4; return c->videoController->GetAspectRatioType() == AspectRatio::Custom;
} }
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
@ -148,7 +148,7 @@ struct video_aspect_custom : public validator_video_loaded {
if (numval < 0.5 || numval > 5.0) if (numval < 0.5 || numval > 5.0)
wxMessageBox(_("Invalid value! Aspect ratio must be between 0.5 and 5.0."),_("Invalid Aspect Ratio"),wxOK | wxICON_ERROR | wxCENTER); wxMessageBox(_("Invalid value! Aspect ratio must be between 0.5 and 5.0."),_("Invalid Aspect Ratio"),wxOK | wxICON_ERROR | wxCENTER);
else { else {
c->videoController->SetAspectRatio(4, numval); c->videoController->SetAspectRatio(numval);
wxGetApp().frame->SetDisplayMode(1,-1); wxGetApp().frame->SetDisplayMode(1,-1);
} }
} }
@ -163,12 +163,12 @@ struct video_aspect_default : public validator_video_loaded {
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO) CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) { bool IsActive(const agi::Context *c) {
return c->videoController->GetAspectRatioType() == 0; return c->videoController->GetAspectRatioType() == AspectRatio::Default;
} }
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
c->videoController->Stop(); c->videoController->Stop();
c->videoController->SetAspectRatio(0); c->videoController->SetAspectRatio(AspectRatio::Default);
wxGetApp().frame->SetDisplayMode(1,-1); wxGetApp().frame->SetDisplayMode(1,-1);
} }
}; };
@ -182,12 +182,12 @@ struct video_aspect_full : public validator_video_loaded {
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO) CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) { bool IsActive(const agi::Context *c) {
return c->videoController->GetAspectRatioType() == 1; return c->videoController->GetAspectRatioType() == AspectRatio::Fullscreen;
} }
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
c->videoController->Stop(); c->videoController->Stop();
c->videoController->SetAspectRatio(1); c->videoController->SetAspectRatio(AspectRatio::Fullscreen);
wxGetApp().frame->SetDisplayMode(1,-1); wxGetApp().frame->SetDisplayMode(1,-1);
} }
}; };
@ -201,12 +201,12 @@ struct video_aspect_wide : public validator_video_loaded {
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO) CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) { bool IsActive(const agi::Context *c) {
return c->videoController->GetAspectRatioType() == 2; return c->videoController->GetAspectRatioType() == AspectRatio::Widescreen;
} }
void operator()(agi::Context *c) { void operator()(agi::Context *c) {
c->videoController->Stop(); c->videoController->Stop();
c->videoController->SetAspectRatio(2); c->videoController->SetAspectRatio(AspectRatio::Widescreen);
wxGetApp().frame->SetDisplayMode(1,-1); wxGetApp().frame->SetDisplayMode(1,-1);
} }
}; };

View file

@ -722,17 +722,17 @@ void FrameMain::OnSubtitlesOpen() {
if (context->videoController->IsLoaded()) { if (context->videoController->IsLoaded()) {
context->videoController->JumpToFrame(context->ass->GetScriptInfoAsInt("Video Position")); context->videoController->JumpToFrame(context->ass->GetScriptInfoAsInt("Video Position"));
int videoAr = 0;
double videoArValue = 0.;
std::string arString = context->ass->GetScriptInfo("Video Aspect Ratio"); std::string arString = context->ass->GetScriptInfo("Video Aspect Ratio");
if (boost::starts_with(arString, "c")) { if (boost::starts_with(arString, "c")) {
videoAr = 4; double ar = 0.;
agi::util::try_parse(arString.substr(1), &videoArValue); agi::util::try_parse(arString.substr(1), &ar);
context->videoController->SetAspectRatio(ar);
}
else {
int ar = 0;
if (agi::util::try_parse(arString.substr(1), &ar) && ar >= 0 && ar < 4)
context->videoController->SetAspectRatio((AspectRatio)ar);
} }
else
agi::util::try_parse(arString.substr(1), &videoAr);
context->videoController->SetAspectRatio(videoAr, videoArValue);
double videoZoom = 0.; double videoZoom = 0.;
if (agi::util::try_parse(context->ass->GetScriptInfo("Video Zoom Percent"), &videoZoom)) if (agi::util::try_parse(context->ass->GetScriptInfo("Video Zoom Percent"), &videoZoom))

View file

@ -63,7 +63,7 @@ VideoContext::VideoContext()
, end_frame(0) , end_frame(0)
, frame_n(0) , frame_n(0)
, ar_value(1.) , ar_value(1.)
, ar_type(0) , ar_type(AspectRatio::Default)
, has_subtitles(false) , has_subtitles(false)
, playAudioOnStep(OPT_GET("Audio/Plays When Stepping Video")) , playAudioOnStep(OPT_GET("Audio/Plays When Stepping Video"))
, no_amend(false) , no_amend(false)
@ -183,7 +183,7 @@ void VideoContext::SetVideo(const agi::fs::path &filename) {
// Set aspect ratio // Set aspect ratio
double dar = video_provider->GetDAR(); double dar = video_provider->GetDAR();
if (dar > 0) if (dar > 0)
SetAspectRatio(4, dar); SetAspectRatio(dar);
// Set filename // Set filename
config::mru->Add("Video", filename); config::mru->Add("Video", filename);
@ -253,10 +253,10 @@ void VideoContext::OnSubtitlesSave() {
} }
std::string ar; std::string ar;
if (ar_type == 4) if (ar_type == AspectRatio::Custom)
ar = "c" + std::to_string(ar_value); ar = "c" + std::to_string(ar_value);
else else
ar = "c" + std::to_string(ar_type); ar = std::to_string((int)ar_type);
context->ass->SetScriptInfo("Video File", config::path->MakeRelative(video_filename, "?script").generic_string()); context->ass->SetScriptInfo("Video File", config::path->MakeRelative(video_filename, "?script").generic_string());
context->ass->SetScriptInfo("YCbCr Matrix", video_provider->GetColorSpace()); context->ass->SetScriptInfo("YCbCr Matrix", video_provider->GetColorSpace());
@ -371,22 +371,28 @@ void VideoContext::OnPlayTimer(wxTimerEvent &) {
} }
} }
double VideoContext::GetARFromType(int type) const { double VideoContext::GetARFromType(AspectRatio type) const {
if (type == 0) return (double)GetWidth()/(double)GetHeight(); switch (type) {
if (type == 1) return 4.0/3.0; case AspectRatio::Default: return (double)GetWidth()/(double)GetHeight();
if (type == 2) return 16.0/9.0; case AspectRatio::Fullscreen: return 4.0/3.0;
if (type == 3) return 2.35; case AspectRatio::Widescreen: return 16.0/9.0;
return 1.0; //error case AspectRatio::Cinematic: return 2.35;
}
throw agi::InternalError("Bad AR type", nullptr);
} }
void VideoContext::SetAspectRatio(int type, double value) { void VideoContext::SetAspectRatio(double value) {
if (type != 4) value = GetARFromType(type); ar_type = AspectRatio::Custom;
ar_type = type;
ar_value = mid(.5, value, 5.); ar_value = mid(.5, value, 5.);
ARChange(ar_type, ar_value); ARChange(ar_type, ar_value);
} }
void VideoContext::SetAspectRatio(AspectRatio type) {
ar_value = mid(.5, GetARFromType(type), 5.);
ar_type = type;
ARChange(ar_type, ar_value);
}
void VideoContext::LoadKeyframes(agi::fs::path const& filename) { void VideoContext::LoadKeyframes(agi::fs::path const& filename) {
if (filename == keyframes_filename || filename.empty()) return; if (filename == keyframes_filename || filename.empty()) return;
try { try {

View file

@ -57,6 +57,14 @@ namespace agi {
class OptionValue; class OptionValue;
} }
enum class AspectRatio {
Default = 0,
Fullscreen,
Widescreen,
Cinematic,
Custom
};
/// @class VideoContext /// @class VideoContext
/// @brief Manage a bunch of things vaguely related to video playback /// @brief Manage a bunch of things vaguely related to video playback
/// ///
@ -73,7 +81,7 @@ class VideoContext : public wxEvtHandler {
/// New timecodes opened (new timecode data) /// New timecodes opened (new timecode data)
agi::signal::Signal<agi::vfr::Framerate const&> TimecodesOpen; agi::signal::Signal<agi::vfr::Framerate const&> TimecodesOpen;
/// Aspect ratio was changed (type, value) /// Aspect ratio was changed (type, value)
agi::signal::Signal<int, double> ARChange; agi::signal::Signal<AspectRatio, double> ARChange;
agi::Context *context; agi::Context *context;
@ -115,11 +123,8 @@ class VideoContext : public wxEvtHandler {
/// overridden by the user /// overridden by the user
double ar_value; double ar_value;
/// @brief The current AR type /// The current AR type
/// AspectRatio ar_type;
/// 0 is square pixels; 1-3 are predefined ARs; 4 is custom, where the real
/// AR is in arValue
int ar_type;
/// Does the currently loaded video file have subtitles muxed into it? /// Does the currently loaded video file have subtitles muxed into it?
bool has_subtitles; bool has_subtitles;
@ -202,15 +207,17 @@ public:
int GetFrameN() const { return frame_n; } int GetFrameN() const { return frame_n; }
/// Get the actual aspect ratio from a predefined AR type /// Get the actual aspect ratio from a predefined AR type
double GetARFromType(int type) const; double GetARFromType(AspectRatio type) const;
/// Override the aspect ratio of the currently loaded video /// Override the aspect ratio of the currently loaded video
/// @param type Aspect ratio type from 0-4 void SetAspectRatio(double value);
/// @param value If type is 4 (custom), the aspect ratio to use
void SetAspectRatio(int type, double value=1.0); /// Override the aspect ratio of the currently loaded video
/// @param type Predefined type to set the AR to. Must not be Custom.
void SetAspectRatio(AspectRatio type);
/// Get the current AR type /// Get the current AR type
int GetAspectRatioType() const { return ar_type; } AspectRatio GetAspectRatioType() const { return ar_type; }
/// Get the current aspect ratio of the video /// Get the current aspect ratio of the video
double GetAspectRatioValue() const { return ar_value; } double GetAspectRatioValue() const { return ar_value; }

View file

@ -281,9 +281,9 @@ void VideoDisplay::PositionVideo() {
int vidW = con->videoController->GetWidth(); int vidW = con->videoController->GetWidth();
int vidH = con->videoController->GetHeight(); int vidH = con->videoController->GetHeight();
int arType = con->videoController->GetAspectRatioType(); AspectRatio arType = con->videoController->GetAspectRatioType();
double displayAr = double(viewport_width) / viewport_height; double displayAr = double(viewport_width) / viewport_height;
double videoAr = arType == 0 ? double(vidW) / vidH : con->videoController->GetAspectRatioValue(); double videoAr = arType == AspectRatio::Default ? double(vidW) / vidH : con->videoController->GetAspectRatioValue();
// Window is wider than video, blackbox left/right // Window is wider than video, blackbox left/right
if (displayAr - videoAr > 0.01f) { if (displayAr - videoAr > 0.01f) {
@ -310,7 +310,7 @@ void VideoDisplay::UpdateSize() {
videoSize.Set(con->videoController->GetWidth(), con->videoController->GetHeight()); videoSize.Set(con->videoController->GetWidth(), con->videoController->GetHeight());
videoSize *= zoomValue; videoSize *= zoomValue;
if (con->videoController->GetAspectRatioType() != 0) if (con->videoController->GetAspectRatioType() != AspectRatio::Default)
videoSize.SetWidth(videoSize.GetHeight() * con->videoController->GetAspectRatioValue()); videoSize.SetWidth(videoSize.GetHeight() * con->videoController->GetAspectRatioValue());
wxEventBlocker blocker(this); wxEventBlocker blocker(this);