@@ -114,11 +114,11 @@ static AVPixelFormat CSNameToPIXFMT(const char *CSName, AVPixelFormat Default, b
114
114
}
115
115
116
116
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,
118
118
int ResizeToWidth, int ResizeToHeight, const char *ResizerName,
119
119
const char *ConvertToFormatName, const char *VarPrefix, IScriptEnvironment* Env)
120
- : FPSNum(FPSNum )
121
- , FPSDen(FPSDen )
120
+ : FPSNum(AFPSNum )
121
+ , FPSDen(AFPSDen )
122
122
, RFFMode(RFFMode)
123
123
, VarPrefix(VarPrefix) {
124
124
VI = {};
@@ -227,19 +227,25 @@ AvisynthVideoSource::AvisynthVideoSource(const char *SourceFile, int Track, FFMS
227
227
FieldList.resize (VI.num_frames );
228
228
}
229
229
} else {
230
+ VI.fps_denominator = VP->FPSDenominator ;
231
+ VI.fps_numerator = VP->FPSNumerator ;
232
+ VI.num_frames = VP->NumFrames ;
230
233
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
+ }
236
245
} else {
237
- VI.num_frames = 1 ;
246
+ FPSNum = 0 ;
247
+ FPSDen = 0 ;
238
248
}
239
- } else {
240
- VI.fps_denominator = VP->FPSDenominator ;
241
- VI.fps_numerator = VP->FPSNumerator ;
242
- VI.num_frames = VP->NumFrames ;
243
249
}
244
250
}
245
251
@@ -584,7 +590,7 @@ PVideoFrame AvisynthVideoSource::GetFrame(int n, IScriptEnvironment *Env) {
584
590
num = 1 ;
585
591
int64_t DurNum = TB->Num * num;
586
592
int64_t DurDen = TB->Den * 1000 ;
587
- vsh::muldivRational (&DurNum, &DurDen, 1 , 1 );
593
+ vsh::reduceRational (&DurNum, &DurDen);
588
594
Env->propSetInt (props, " _DurationNum" , DurNum, 0 );
589
595
Env->propSetInt (props, " _DurationDen" , DurDen, 0 );
590
596
Env->propSetFloat (props, " _AbsoluteTime" , ((static_cast <double >(TB->Num ) / 1000 ) * FFMS_GetFrameInfo (T, n)->PTS ) / TB->Den , 0 );
0 commit comments