mirror of https://github.com/odrling/Aegisub
Merge r3211 (and add the same one-line mod to the dshow provider that doesn't exist in trunk anymore) into the 2.1.8 branch.
Originally committed to SVN as r3213.
This commit is contained in:
parent
264043e1a7
commit
0bb38c472b
|
@ -74,8 +74,9 @@ public:
|
|||
// How many frames does this provider wants that Aegisub caches? Set to 0 if it doesn't require caching.
|
||||
virtual int GetDesiredCacheSize() { return 0; }
|
||||
|
||||
// For providers that are natively time-based (e.g. DirectShow)
|
||||
virtual bool IsNativelyByFrames() { return true; }
|
||||
// For "special" providers that don't deal well with VFR (i.e. Avisynth)
|
||||
virtual bool NeedsVFRHack() { return false; }; // Returns true if provider needs special VFR treatment
|
||||
virtual bool IsNativelyByFrames() { return true; };
|
||||
virtual void OverrideFrameTimeList(Aegisub::IntArray list) {} // Override the list with the provided one, for VFR handling
|
||||
};
|
||||
|
||||
|
|
|
@ -286,20 +286,22 @@ void VideoContext::SetVideo(const wxString &filename) {
|
|||
keyFramesLoaded = false;
|
||||
}
|
||||
|
||||
bool isVfr = provider->IsVFR();
|
||||
|
||||
// Set frame rate
|
||||
fps = provider->GetFPS();
|
||||
// if the source is vfr and the provider isn't frame-based (i.e. is dshow),
|
||||
// we need to jump through some hoops to make VFR work properly.
|
||||
if (!provider->IsNativelyByFrames() && isVfr) {
|
||||
// does this provider need special vfr treatment?
|
||||
if (provider->NeedsVFRHack()) {
|
||||
// FIXME:
|
||||
// Unfortunately, this hack does not actually work for the one
|
||||
// provider that needs it (Avisynth). Go figure.
|
||||
bool isVfr = provider->IsVFR();
|
||||
if (!isVfr || provider->IsNativelyByFrames()) {
|
||||
VFR_Input.SetCFR(fps);
|
||||
if (VFR_Output.GetFrameRateType() != VFR) VFR_Output.SetCFR(fps);
|
||||
}
|
||||
else {
|
||||
FrameRate temp = provider->GetTrueFrameRate();
|
||||
provider->OverrideFrameTimeList(temp.GetFrameTimeList());
|
||||
}
|
||||
// source not VFR? set as CFR
|
||||
else if (!isVfr) {
|
||||
VFR_Input.SetCFR(fps);
|
||||
if (VFR_Output.GetFrameRateType() != VFR) VFR_Output.SetCFR(fps);
|
||||
}
|
||||
|
||||
// Gather video parameters
|
||||
|
|
|
@ -89,6 +89,7 @@ public:
|
|||
|
||||
void OverrideFrameTimeList(wxArrayInt list);
|
||||
bool IsNativelyByFrames() { return byFrame; }
|
||||
bool NeedsVFRHack() { return true; }
|
||||
Aegisub::String GetWarning();
|
||||
Aegisub::String GetDecoderName() { return Aegisub::String(L"Avisynth/") + decoderName; }
|
||||
};
|
||||
|
|
|
@ -179,6 +179,9 @@ void VideoProviderCache::OverrideFrameTimeList(Aegisub::IntArray list) {
|
|||
bool VideoProviderCache::IsNativelyByFrames() {
|
||||
return master->IsNativelyByFrames();
|
||||
}
|
||||
bool VideoProviderCache::NeedsVFRHack() {
|
||||
return master->NeedsVFRHack();
|
||||
}
|
||||
Aegisub::String VideoProviderCache::GetWarning() {
|
||||
return master->GetWarning();
|
||||
}
|
||||
|
|
|
@ -90,6 +90,7 @@ public:
|
|||
virtual FrameRate GetTrueFrameRate();
|
||||
virtual void OverrideFrameTimeList(Aegisub::IntArray list); // Override the list with the provided one, for VFR handling
|
||||
virtual bool IsNativelyByFrames();
|
||||
virtual bool NeedsVFRHack();
|
||||
virtual Aegisub::String GetWarning();
|
||||
virtual Aegisub::String GetDecoderName();
|
||||
};
|
||||
|
|
|
@ -125,6 +125,7 @@ public:
|
|||
|
||||
Aegisub::String GetDecoderName() { return L"DirectShow"; }
|
||||
bool IsNativelyByFrames() { return false; }
|
||||
bool NeedsVFRHack() { return true; }
|
||||
|
||||
void OverrideFrameTimeList(Aegisub::IntArray list);
|
||||
int GetDesiredCacheSize() { return 8; }
|
||||
|
|
|
@ -87,7 +87,6 @@ public:
|
|||
bool IsVFR() { return true; };
|
||||
FrameRate GetTrueFrameRate() { return Timecodes; };
|
||||
Aegisub::String GetDecoderName() { return L"FFmpegSource"; }
|
||||
bool IsNativelyByFrames() { return true; }
|
||||
int GetDesiredCacheSize() { return 8; }
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue