Skip to content

Commit 1f96be3

Browse files
committed
Don't use CFR mode if forced framerate is same as the source file
1 parent 30b9747 commit 1f96be3

File tree

3 files changed

+40
-29
lines changed

3 files changed

+40
-29
lines changed

src/avisynth/avssources.cpp

+20-14
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ static AVPixelFormat CSNameToPIXFMT(const char *CSName, AVPixelFormat Default, b
114114
}
115115

116116
AvisynthVideoSource::AvisynthVideoSource(const char *SourceFile, int Track, FFMS_Index *Index,
117-
int FPSNum, int FPSDen, int Threads, int SeekMode, int RFFMode,
117+
int AFPSNum, int AFPSDen, int Threads, int SeekMode, int RFFMode,
118118
int ResizeToWidth, int ResizeToHeight, const char *ResizerName,
119119
const char *ConvertToFormatName, const char *VarPrefix, IScriptEnvironment* Env)
120-
: FPSNum(FPSNum)
121-
, FPSDen(FPSDen)
120+
: FPSNum(AFPSNum)
121+
, FPSDen(AFPSDen)
122122
, RFFMode(RFFMode)
123123
, VarPrefix(VarPrefix) {
124124
VI = {};
@@ -227,19 +227,25 @@ AvisynthVideoSource::AvisynthVideoSource(const char *SourceFile, int Track, FFMS
227227
FieldList.resize(VI.num_frames);
228228
}
229229
} else {
230+
VI.fps_denominator = VP->FPSDenominator;
231+
VI.fps_numerator = VP->FPSNumerator;
232+
VI.num_frames = VP->NumFrames;
230233
if (FPSNum > 0 && FPSDen > 0) {
231-
VI.fps_denominator = FPSDen;
232-
VI.fps_numerator = FPSNum;
233-
if (VP->NumFrames > 1) {
234-
VI.num_frames = static_cast<int>((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5);
235-
if (VI.num_frames < 1) VI.num_frames = 1;
234+
vsh::reduceRational(&FPSNum, &FPSDen);
235+
if (VI.fps_denominator != FPSDen || VI.fps_numerator != FPSNum) {
236+
VI.fps_denominator = FPSDen;
237+
VI.fps_numerator = FPSNum;
238+
if (VP->NumFrames > 1) {
239+
VI.num_frames = static_cast<int>((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5);
240+
if (VI.num_frames < 1)
241+
VI.num_frames = 1;
242+
} else {
243+
VI.num_frames = 1;
244+
}
236245
} else {
237-
VI.num_frames = 1;
246+
FPSNum = 0;
247+
FPSDen = 0;
238248
}
239-
} else {
240-
VI.fps_denominator = VP->FPSDenominator;
241-
VI.fps_numerator = VP->FPSNumerator;
242-
VI.num_frames = VP->NumFrames;
243249
}
244250
}
245251

@@ -584,7 +590,7 @@ PVideoFrame AvisynthVideoSource::GetFrame(int n, IScriptEnvironment *Env) {
584590
num = 1;
585591
int64_t DurNum = TB->Num * num;
586592
int64_t DurDen = TB->Den * 1000;
587-
vsh::muldivRational(&DurNum, &DurDen, 1, 1);
593+
vsh::reduceRational(&DurNum, &DurDen);
588594
Env->propSetInt(props, "_DurationNum", DurNum, 0);
589595
Env->propSetInt(props, "_DurationDen", DurDen, 0);
590596
Env->propSetFloat(props, "_AbsoluteTime", ((static_cast<double>(TB->Num) / 1000) * FFMS_GetFrameInfo(T, n)->PTS) / TB->Den, 0);

src/avisynth/avssources.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ class AvisynthVideoSource : public IClip {
4545
VideoInfo VI;
4646
bool HighBitDepth;
4747
FFMS_VideoSource *V;
48-
int FPSNum;
49-
int FPSDen;
48+
int64_t FPSNum;
49+
int64_t FPSDen;
5050
int RFFMode;
5151
std::vector<FrameFields> FieldList;
5252
const char *VarPrefix;

src/vapoursynth/vapoursource4.cpp

+18-13
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ const VSFrame *VS_CC VSVideoSource4::GetVSFrame(int n, VSCore *core, const VSAPI
141141
num = 1;
142142
int64_t DurNum = TB->Num * num;
143143
int64_t DurDen = TB->Den * 1000;
144-
vsh::muldivRational(&DurNum, &DurDen, 1, 1);
144+
vsh::reduceRational(&DurNum, &DurDen);
145145
vsapi->mapSetInt(Props, "_DurationNum", DurNum, maReplace);
146146
vsapi->mapSetInt(Props, "_DurationDen", DurDen, maReplace);
147147
vsapi->mapSetFloat(Props, "_AbsoluteTime", ((static_cast<double>(TB->Num) / 1000) * FFMS_GetFrameInfo(T, n)->PTS) / TB->Den, maReplace);
@@ -274,22 +274,27 @@ VSVideoSource4::VSVideoSource4(const char *SourceFile, int Track, FFMS_Index *In
274274

275275
const FFMS_VideoProperties *VP = FFMS_GetVideoProperties(V);
276276

277+
VI[0].fpsDen = VP->FPSDenominator;
278+
VI[0].fpsNum = VP->FPSNumerator;
279+
VI[0].numFrames = VP->NumFrames;
280+
vsh::reduceRational(&VI[0].fpsNum, &VI[0].fpsDen);
281+
277282
if (FPSNum > 0 && FPSDen > 0) {
278-
vsh::muldivRational(&FPSNum, &FPSDen, 1, 1);
279-
VI[0].fpsDen = FPSDen;
280-
VI[0].fpsNum = FPSNum;
281-
if (VP->NumFrames > 1) {
282-
VI[0].numFrames = static_cast<int>((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5);
283-
if (VI[0].numFrames < 1)
283+
vsh::reduceRational(&FPSNum, &FPSDen);
284+
if (VI[0].fpsDen != FPSDen || VI[0].fpsNum != FPSNum) {
285+
VI[0].fpsDen = FPSDen;
286+
VI[0].fpsNum = FPSNum;
287+
if (VP->NumFrames > 1) {
288+
VI[0].numFrames = static_cast<int>((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5);
289+
if (VI[0].numFrames < 1)
290+
VI[0].numFrames = 1;
291+
} else {
284292
VI[0].numFrames = 1;
293+
}
285294
} else {
286-
VI[0].numFrames = 1;
295+
FPSNum = 0;
296+
FPSDen = 0;
287297
}
288-
} else {
289-
VI[0].fpsDen = VP->FPSDenominator;
290-
VI[0].fpsNum = VP->FPSNumerator;
291-
VI[0].numFrames = VP->NumFrames;
292-
vsh::muldivRational(&VI[0].fpsNum, &VI[0].fpsDen, 1, 1);
293298
}
294299

295300
if (OutputAlpha) {

0 commit comments

Comments
 (0)