From 1f96be35492edaf79d1f5680aa94adc50ca8231a Mon Sep 17 00:00:00 2001 From: Fredrik Mellbin Date: Tue, 27 Feb 2024 19:14:45 +0100 Subject: [PATCH] Don't use CFR mode if forced framerate is same as the source file --- src/avisynth/avssources.cpp | 34 ++++++++++++++++++------------- src/avisynth/avssources.h | 4 ++-- src/vapoursynth/vapoursource4.cpp | 31 ++++++++++++++++------------ 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/avisynth/avssources.cpp b/src/avisynth/avssources.cpp index c02b756517..7bc703f266 100644 --- a/src/avisynth/avssources.cpp +++ b/src/avisynth/avssources.cpp @@ -114,11 +114,11 @@ static AVPixelFormat CSNameToPIXFMT(const char *CSName, AVPixelFormat Default, b } AvisynthVideoSource::AvisynthVideoSource(const char *SourceFile, int Track, FFMS_Index *Index, - int FPSNum, int FPSDen, int Threads, int SeekMode, int RFFMode, + int AFPSNum, int AFPSDen, int Threads, int SeekMode, int RFFMode, int ResizeToWidth, int ResizeToHeight, const char *ResizerName, const char *ConvertToFormatName, const char *VarPrefix, IScriptEnvironment* Env) - : FPSNum(FPSNum) - , FPSDen(FPSDen) + : FPSNum(AFPSNum) + , FPSDen(AFPSDen) , RFFMode(RFFMode) , VarPrefix(VarPrefix) { VI = {}; @@ -227,19 +227,25 @@ AvisynthVideoSource::AvisynthVideoSource(const char *SourceFile, int Track, FFMS FieldList.resize(VI.num_frames); } } else { + VI.fps_denominator = VP->FPSDenominator; + VI.fps_numerator = VP->FPSNumerator; + VI.num_frames = VP->NumFrames; if (FPSNum > 0 && FPSDen > 0) { - VI.fps_denominator = FPSDen; - VI.fps_numerator = FPSNum; - if (VP->NumFrames > 1) { - VI.num_frames = static_cast((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5); - if (VI.num_frames < 1) VI.num_frames = 1; + vsh::reduceRational(&FPSNum, &FPSDen); + if (VI.fps_denominator != FPSDen || VI.fps_numerator != FPSNum) { + VI.fps_denominator = FPSDen; + VI.fps_numerator = FPSNum; + if (VP->NumFrames > 1) { + VI.num_frames = static_cast((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5); + if (VI.num_frames < 1) + VI.num_frames = 1; + } else { + VI.num_frames = 1; + } } else { - VI.num_frames = 1; + FPSNum = 0; + FPSDen = 0; } - } else { - VI.fps_denominator = VP->FPSDenominator; - VI.fps_numerator = VP->FPSNumerator; - VI.num_frames = VP->NumFrames; } } @@ -584,7 +590,7 @@ PVideoFrame AvisynthVideoSource::GetFrame(int n, IScriptEnvironment *Env) { num = 1; int64_t DurNum = TB->Num * num; int64_t DurDen = TB->Den * 1000; - vsh::muldivRational(&DurNum, &DurDen, 1, 1); + vsh::reduceRational(&DurNum, &DurDen); Env->propSetInt(props, "_DurationNum", DurNum, 0); Env->propSetInt(props, "_DurationDen", DurDen, 0); Env->propSetFloat(props, "_AbsoluteTime", ((static_cast(TB->Num) / 1000) * FFMS_GetFrameInfo(T, n)->PTS) / TB->Den, 0); diff --git a/src/avisynth/avssources.h b/src/avisynth/avssources.h index d777cc7199..e27e37466a 100644 --- a/src/avisynth/avssources.h +++ b/src/avisynth/avssources.h @@ -45,8 +45,8 @@ class AvisynthVideoSource : public IClip { VideoInfo VI; bool HighBitDepth; FFMS_VideoSource *V; - int FPSNum; - int FPSDen; + int64_t FPSNum; + int64_t FPSDen; int RFFMode; std::vector FieldList; const char *VarPrefix; diff --git a/src/vapoursynth/vapoursource4.cpp b/src/vapoursynth/vapoursource4.cpp index 043e417402..3fd98aaa5d 100644 --- a/src/vapoursynth/vapoursource4.cpp +++ b/src/vapoursynth/vapoursource4.cpp @@ -141,7 +141,7 @@ const VSFrame *VS_CC VSVideoSource4::GetVSFrame(int n, VSCore *core, const VSAPI num = 1; int64_t DurNum = TB->Num * num; int64_t DurDen = TB->Den * 1000; - vsh::muldivRational(&DurNum, &DurDen, 1, 1); + vsh::reduceRational(&DurNum, &DurDen); vsapi->mapSetInt(Props, "_DurationNum", DurNum, maReplace); vsapi->mapSetInt(Props, "_DurationDen", DurDen, maReplace); vsapi->mapSetFloat(Props, "_AbsoluteTime", ((static_cast(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 const FFMS_VideoProperties *VP = FFMS_GetVideoProperties(V); + VI[0].fpsDen = VP->FPSDenominator; + VI[0].fpsNum = VP->FPSNumerator; + VI[0].numFrames = VP->NumFrames; + vsh::reduceRational(&VI[0].fpsNum, &VI[0].fpsDen); + if (FPSNum > 0 && FPSDen > 0) { - vsh::muldivRational(&FPSNum, &FPSDen, 1, 1); - VI[0].fpsDen = FPSDen; - VI[0].fpsNum = FPSNum; - if (VP->NumFrames > 1) { - VI[0].numFrames = static_cast((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5); - if (VI[0].numFrames < 1) + vsh::reduceRational(&FPSNum, &FPSDen); + if (VI[0].fpsDen != FPSDen || VI[0].fpsNum != FPSNum) { + VI[0].fpsDen = FPSDen; + VI[0].fpsNum = FPSNum; + if (VP->NumFrames > 1) { + VI[0].numFrames = static_cast((VP->LastTime - VP->FirstTime) * (1 + 1. / (VP->NumFrames - 1)) * FPSNum / FPSDen + 0.5); + if (VI[0].numFrames < 1) + VI[0].numFrames = 1; + } else { VI[0].numFrames = 1; + } } else { - VI[0].numFrames = 1; + FPSNum = 0; + FPSDen = 0; } - } else { - VI[0].fpsDen = VP->FPSDenominator; - VI[0].fpsNum = VP->FPSNumerator; - VI[0].numFrames = VP->NumFrames; - vsh::muldivRational(&VI[0].fpsNum, &VI[0].fpsDen, 1, 1); } if (OutputAlpha) {