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:
Karl Blomster 2009-07-23 05:01:36 +00:00
parent 264043e1a7
commit 0bb38c472b
7 changed files with 23 additions and 15 deletions

View File

@ -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
};

View File

@ -285,21 +285,23 @@ void VideoContext::SetVideo(const wxString &filename) {
else {
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) {
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);
// 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());
}
}
// Gather video parameters

View File

@ -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; }
};

View File

@ -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();
}

View File

@ -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();
};

View File

@ -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; }

View File

@ -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; }
};