Fix spurious jitter in ROMs with continously changing frame height (ghost!).

This commit is contained in:
Christian Speckner 2017-10-17 00:25:24 +02:00
parent 4a73aab1e4
commit 1338b8d0d0
3 changed files with 16 additions and 6 deletions

View File

@ -28,7 +28,7 @@
#include "StateManager.hxx" #include "StateManager.hxx"
#define STATE_HEADER "05000303state" #define STATE_HEADER "05000304state"
// #define MOVIE_HEADER "03030000movie" // #define MOVIE_HEADER "03030000movie"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -18,9 +18,10 @@
#include "JitterEmulation.hxx" #include "JitterEmulation.hxx"
enum Metrics: uInt32 { enum Metrics: uInt32 {
framesForStableHeight = 2, framesForStableHeight = 2,
minDeltaForJitter = 3, framesUntilDestabilization = 10,
maxJitter = 50 minDeltaForJitter = 3,
maxJitter = 50
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -32,9 +33,10 @@ JitterEmulation::JitterEmulation() :
void JitterEmulation::reset() void JitterEmulation::reset()
{ {
myLastFrameScanlines = 0; myLastFrameScanlines = 0;
myStableFrameFinalLines = 0; myStableFrameFinalLines = -1;
myStableFrames = 0; myStableFrames = 0;
myStabilizationCounter = 0; myStabilizationCounter = 0;
myDestabilizationCounter = 0;
myJitter = 0; myJitter = 0;
} }
@ -42,17 +44,21 @@ void JitterEmulation::reset()
void JitterEmulation::frameComplete(uInt32 scanlineCount) void JitterEmulation::frameComplete(uInt32 scanlineCount)
{ {
if (scanlineCount != myStableFrameFinalLines) { if (scanlineCount != myStableFrameFinalLines) {
if (myDestabilizationCounter++ > Metrics::framesUntilDestabilization) myStableFrameFinalLines = -1;
if (scanlineCount == myLastFrameScanlines) { if (scanlineCount == myLastFrameScanlines) {
if (++myStabilizationCounter >= Metrics::framesForStableHeight) { if (++myStabilizationCounter >= Metrics::framesForStableHeight) {
if (myStableFrameFinalLines > 0) updateJitter(scanlineCount - myStableFrameFinalLines); if (myStableFrameFinalLines > 0) updateJitter(scanlineCount - myStableFrameFinalLines);
myStableFrameFinalLines = scanlineCount; myStableFrameFinalLines = scanlineCount;
myDestabilizationCounter = 0;
} }
} }
else myStabilizationCounter = 0; else myStabilizationCounter = 0;
} }
else myDestabilizationCounter = 0;
myLastFrameScanlines = scanlineCount; myLastFrameScanlines = scanlineCount;
@ -84,6 +90,7 @@ bool JitterEmulation::save(Serializer& out) const
out.putInt(myStableFrameFinalLines); out.putInt(myStableFrameFinalLines);
out.putInt(myStableFrames); out.putInt(myStableFrames);
out.putInt(myStabilizationCounter); out.putInt(myStabilizationCounter);
out.putInt(myDestabilizationCounter);
out.putInt(myJitter); out.putInt(myJitter);
out.putInt(myJitterFactor); out.putInt(myJitterFactor);
out.putInt(myYStart); out.putInt(myYStart);
@ -108,6 +115,7 @@ bool JitterEmulation::load(Serializer& in)
myStableFrameFinalLines = in.getInt(); myStableFrameFinalLines = in.getInt();
myStableFrames = in.getInt(); myStableFrames = in.getInt();
myStabilizationCounter = in.getInt(); myStabilizationCounter = in.getInt();
myDestabilizationCounter = in.getInt();
myJitter = in.getInt(); myJitter = in.getInt();
myJitterFactor = in.getInt(); myJitterFactor = in.getInt();
myYStart = in.getInt(); myYStart = in.getInt();

View File

@ -58,12 +58,14 @@ class JitterEmulation: public Serializable {
uInt32 myLastFrameScanlines; uInt32 myLastFrameScanlines;
uInt32 myStableFrameFinalLines; Int32 myStableFrameFinalLines;
uInt32 myStableFrames; uInt32 myStableFrames;
uInt32 myStabilizationCounter; uInt32 myStabilizationCounter;
uInt32 myDestabilizationCounter;
Int32 myJitter; Int32 myJitter;
Int32 myJitterFactor; Int32 myJitterFactor;