Merge branch 'misc_dc' into feature
This commit is contained in:
commit
32dda63971
11 changed files with 52 additions and 26 deletions
|
@ -165,17 +165,20 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
|
|||
throw agi::AudioProviderError("unknown or unsupported sample format");
|
||||
}
|
||||
|
||||
if (channels > 1 || bytes_per_sample != 2) {
|
||||
std::unique_ptr<FFMS_ResampleOptions, decltype(&FFMS_DestroyResampleOptions)>
|
||||
opt(FFMS_CreateResampleOptions(AudioSource), FFMS_DestroyResampleOptions);
|
||||
opt->ChannelLayout = FFMS_CH_FRONT_CENTER;
|
||||
opt->SampleFormat = FFMS_FMT_S16;
|
||||
if (OPT_GET("Provider/Audio/FFmpegSource/Downmix")->GetBool()) {
|
||||
if (channels > 2 || bytes_per_sample != 2 || float_samples) {
|
||||
std::unique_ptr<FFMS_ResampleOptions, decltype(&FFMS_DestroyResampleOptions)>
|
||||
opt(FFMS_CreateResampleOptions(AudioSource), FFMS_DestroyResampleOptions);
|
||||
if (channels > 2)
|
||||
opt->ChannelLayout = FFMS_CH_FRONT_LEFT | FFMS_CH_FRONT_RIGHT;
|
||||
opt->SampleFormat = FFMS_FMT_S16;
|
||||
|
||||
// Might fail if FFMS2 wasn't built with libavresample
|
||||
if (!FFMS_SetOutputFormatA(AudioSource, opt.get(), nullptr)) {
|
||||
channels = 1;
|
||||
bytes_per_sample = 2;
|
||||
float_samples = false;
|
||||
// Might fail if FFMS2 wasn't built with libavresample
|
||||
if (!FFMS_SetOutputFormatA(AudioSource, opt.get(), nullptr)) {
|
||||
channels = channels > 2 ? 2 : channels;
|
||||
bytes_per_sample = 2;
|
||||
float_samples = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -236,6 +236,23 @@ struct video_cycle_subtitles_provider final : public cmd::Command {
|
|||
}
|
||||
};
|
||||
|
||||
struct video_reload_subtitles_provider final : public cmd::Command {
|
||||
CMD_NAME("video/subtitles_provider/reload")
|
||||
STR_MENU("Reload active subtitles provider")
|
||||
STR_DISP("Reload active subtitles provider")
|
||||
STR_HELP("Reloads the current subtitles provider")
|
||||
|
||||
void operator()(agi::Context* c) override {
|
||||
auto providers = SubtitlesProviderFactory::GetClasses();
|
||||
if (providers.empty()) return;
|
||||
|
||||
auto it = find(begin(providers), end(providers), OPT_GET("Subtitle/Provider")->GetString());
|
||||
|
||||
OPT_SET("Subtitle/Provider")->SetString(*it);
|
||||
c->frame->StatusTimeout(fmt_tl("Subtitles provider set to %s", *it), 5000);
|
||||
}
|
||||
};
|
||||
|
||||
struct video_detach final : public validator_video_loaded {
|
||||
CMD_NAME("video/detach")
|
||||
CMD_ICON(detach_video_menu)
|
||||
|
@ -757,6 +774,7 @@ namespace cmd {
|
|||
reg(agi::make_unique<video_close>());
|
||||
reg(agi::make_unique<video_copy_coordinates>());
|
||||
reg(agi::make_unique<video_cycle_subtitles_provider>());
|
||||
reg(agi::make_unique<video_reload_subtitles_provider>());
|
||||
reg(agi::make_unique<video_detach>());
|
||||
reg(agi::make_unique<video_details>());
|
||||
reg(agi::make_unique<video_focus_seek>());
|
||||
|
|
|
@ -334,7 +334,8 @@
|
|||
"Sample Rate" : 0
|
||||
},
|
||||
"FFmpegSource" : {
|
||||
"Decode Error Handling" : "ignore"
|
||||
"Decode Error Handling" : "ignore",
|
||||
"Downmix" : false
|
||||
}
|
||||
},
|
||||
"Avisynth" : {
|
||||
|
|
|
@ -410,6 +410,8 @@ void Advanced_Audio(wxTreebook *book, Preferences *parent) {
|
|||
p->OptionChoice(ffms, _("Audio indexing error handling mode"), error_modes_choice, "Provider/Audio/FFmpegSource/Decode Error Handling");
|
||||
|
||||
p->OptionAdd(ffms, _("Always index all audio tracks"), "Provider/FFmpegSource/Index All Tracks");
|
||||
wxControl* stereo = p->OptionAdd(ffms, _("Downmix to stereo"), "Provider/Audio/FFmpegSource/Downmix");
|
||||
stereo->SetToolTip("Reduces memory usage on surround audio, but may cause audio tracks to sound blank in specific circumstances. This will not affect audio with two channels or less.");
|
||||
#endif
|
||||
|
||||
#ifdef WITH_PORTAUDIO
|
||||
|
|
|
@ -53,6 +53,7 @@ Project::Project(agi::Context *c) : context(c) {
|
|||
OPT_SUB("Audio/Cache/Type", &Project::ReloadAudio, this);
|
||||
OPT_SUB("Audio/Provider", &Project::ReloadAudio, this);
|
||||
OPT_SUB("Provider/Audio/FFmpegSource/Decode Error Handling", &Project::ReloadAudio, this);
|
||||
OPT_SUB("Provider/Audio/FFmpegSource/Downmix", &Project::ReloadAudio, this);
|
||||
OPT_SUB("Provider/Avisynth/Memory Max", &Project::ReloadVideo, this);
|
||||
OPT_SUB("Provider/Video/FFmpegSource/Decoding Threads", &Project::ReloadVideo, this);
|
||||
OPT_SUB("Provider/Video/FFmpegSource/Unsafe Seeking", &Project::ReloadVideo, this);
|
||||
|
|
|
@ -71,7 +71,7 @@ std::string Spline::EncodeToAss() const {
|
|||
result += "m ";
|
||||
last = 'm';
|
||||
}
|
||||
result += ToScript(pt.p1).DStr(' ');
|
||||
result += ToScript(pt.p1).Str(' ');
|
||||
break;
|
||||
|
||||
case SplineCurve::LINE:
|
||||
|
@ -79,7 +79,7 @@ std::string Spline::EncodeToAss() const {
|
|||
result += "l ";
|
||||
last = 'l';
|
||||
}
|
||||
result += ToScript(pt.p2).DStr(' ');
|
||||
result += ToScript(pt.p2).Str(' ');
|
||||
break;
|
||||
|
||||
case SplineCurve::BICUBIC:
|
||||
|
@ -87,9 +87,9 @@ std::string Spline::EncodeToAss() const {
|
|||
result += "b ";
|
||||
last = 'b';
|
||||
}
|
||||
result += ToScript(pt.p2).DStr(' ') + " ";
|
||||
result += ToScript(pt.p3).DStr(' ') + " ";
|
||||
result += ToScript(pt.p4).DStr(' ');
|
||||
result += ToScript(pt.p2).Str(' ') + " ";
|
||||
result += ToScript(pt.p3).Str(' ') + " ";
|
||||
result += ToScript(pt.p4).Str(' ');
|
||||
break;
|
||||
|
||||
default: break;
|
||||
|
|
|
@ -250,7 +250,7 @@ void SubsTextEditCtrl::SetStyles() {
|
|||
|
||||
void SubsTextEditCtrl::UpdateStyle() {
|
||||
AssDialogue *diag = context ? context->selectionController->GetActiveLine() : nullptr;
|
||||
bool template_line = diag && diag->Comment && boost::istarts_with(diag->Effect.get(), "template");
|
||||
bool template_line = diag && diag->Comment && (boost::istarts_with(diag->Effect.get(), "template") || boost::istarts_with(diag->Effect.get(), "mixin"));
|
||||
|
||||
tokenized_line = agi::ass::TokenizeDialogueBody(line_text, template_line);
|
||||
agi::ass::SplitWords(line_text, tokenized_line);
|
||||
|
|
|
@ -76,8 +76,9 @@ wxString PrettySize(int bytes) {
|
|||
return agi::wxformat(fmt, size) + " " + suffix[i];
|
||||
}
|
||||
|
||||
std::string float_to_string(double val) {
|
||||
std::string s = agi::format("%.3f", val);
|
||||
std::string float_to_string(double val, int precision) {
|
||||
std::string fmt = "%." + std::to_string(precision) + "f";
|
||||
std::string s = agi::format(fmt, val);
|
||||
size_t pos = s.find_last_not_of("0");
|
||||
if (pos != s.find(".")) ++pos;
|
||||
s.erase(begin(s) + pos, end(s));
|
||||
|
|
|
@ -44,7 +44,7 @@ class wxWindow;
|
|||
|
||||
wxString PrettySize(int bytes);
|
||||
|
||||
std::string float_to_string(double val);
|
||||
std::string float_to_string(double val, int precision = 3);
|
||||
|
||||
/// @brief Get the smallest power of two that is greater or equal to x
|
||||
///
|
||||
|
|
|
@ -88,5 +88,5 @@ std::string Vector2D::DStr(char sep) const {
|
|||
}
|
||||
|
||||
std::string Vector2D::Str(char sep) const {
|
||||
return float_to_string(x) + sep + float_to_string(y);
|
||||
return float_to_string(x,2) + sep + float_to_string(y,2);
|
||||
}
|
||||
|
|
|
@ -508,11 +508,11 @@ std::string VisualToolBase::GetLineVectorClip(AssDialogue *diag, int &scale, boo
|
|||
tag = find_tag(blocks, "\\clip");
|
||||
|
||||
if (tag && tag->size() == 4) {
|
||||
return agi::format("m %d %d l %d %d %d %d %d %d"
|
||||
, (*tag)[0].Get<int>(), (*tag)[1].Get<int>()
|
||||
, (*tag)[2].Get<int>(), (*tag)[1].Get<int>()
|
||||
, (*tag)[2].Get<int>(), (*tag)[3].Get<int>()
|
||||
, (*tag)[0].Get<int>(), (*tag)[3].Get<int>());
|
||||
return agi::format("m %.2f %.2f l %.2f %.2f %.2f %.2f %.2f %.2f"
|
||||
, (*tag)[0].Get<double>(), (*tag)[1].Get<double>()
|
||||
, (*tag)[2].Get<double>(), (*tag)[1].Get<double>()
|
||||
, (*tag)[2].Get<double>(), (*tag)[3].Get<double>()
|
||||
, (*tag)[0].Get<double>(), (*tag)[3].Get<double>());
|
||||
}
|
||||
if (tag) {
|
||||
scale = std::max((*tag)[0].Get(scale), 1);
|
||||
|
|
Loading…
Reference in a new issue