@@ -243,8 +243,14 @@ def check_output(self):
243
243
pass
244
244
245
245
def check_bitrate (self ):
246
+ # ffmpeg default framerate is 25 fps
247
+ fps = vars (self ).get ("fps" , 25 )
248
+
249
+ # calculate frame offset to compensate for seek
250
+ offset = vars (self ).get ("seek" , 0 ) * fps
251
+
246
252
encsize = os .path .getsize (self .encoder .encoded )
247
- bitrate_actual = encsize * 8 * vars ( self ). get ( " fps" , 25 ) / 1024.0 / self .frames
253
+ bitrate_actual = encsize * 8 * fps / 1024.0 / ( self .frames - offset )
248
254
get_media ()._set_test_details (
249
255
size_encoded = encsize ,
250
256
bitrate_actual = "{:-.2f}" .format (bitrate_actual ))
@@ -271,20 +277,38 @@ def check_bitrate(self):
271
277
def check_metrics (self ):
272
278
vars (self ).setdefault ("metric" , dict (type = "psnr" ))
273
279
280
+ # The decoder reference file (i.e. the encoder source file) includes all of
281
+ # the frames without the seek. The encoder output file includes only the
282
+ # frames after the seek. Therefore, the decoder should seek/advance the
283
+ # reference frames before applying any frame comparison metrics
284
+ # (e.g. PSNR, SSIM) on the decoder source file (i.e. encoder output file).
274
285
self .decoder .update (
275
286
reference = self .encoder .source ,
276
287
source = self .encoder .encoded ,
277
- metric = self .metric
288
+ metric = self .metric ,
289
+ refseek = vars (self ).get ("seek" , 0 ),
278
290
)
279
291
self .decoder .decode ()
280
292
293
+ # ffmpeg default framerate is 25 fps
294
+ fps = vars (self ).get ("fps" , 25 )
295
+
296
+ # calculate frame offset to compensate for seek
297
+ offset = vars (self ).get ("seek" , 0 ) * fps
298
+
299
+ # NOTE: Ref/filetrue seek compensation is not currently captured in this
300
+ # metric. The metric would need this information for its internal
301
+ # comparision functions. However, since we are exploiting the "inline"
302
+ # metric feature (i.e. setting metric.actual directly), the internal
303
+ # comparison functions will be bypassed.
281
304
metric = metrics2 .factory .create (** vars (self ))
282
305
metric .update (
283
306
filetrue = self .encoder .source ,
284
307
filecoded = self .encoder .encoded ,
285
308
filetest = self .decoder .decoded ,
309
+ frames = self .frames - offset ,
286
310
)
287
- metric .actual = parse_psnr_stats (self .decoder .statsfile , self .frames )
311
+ metric .actual = parse_psnr_stats (self .decoder .statsfile , self .frames - offset )
288
312
289
313
metric .check ()
290
314
@@ -311,6 +335,7 @@ def check_forced_idr(self):
311
335
f" -v verbose -i { self .encoder .osencoded } -c:v copy -bsf:v trace_headers"
312
336
f" -f null - 2>&1 | grep 'nal_unit_type.*{ judge } ' | wc -l"
313
337
)
338
+ assert vars (self ).get ("seek" , 0 ) == 0 , "Seek is not currently supported with forced_idr"
314
339
assert str (self .frames ) == output .strip (), "It appears that the forced_idr did not work"
315
340
316
341
def check_max_frame_size (self ):
0 commit comments