From 6a656785929e50c352855391ef17177206896067 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 3 Nov 2023 13:59:31 +0300 Subject: [PATCH] Use video stream fps first in FFmpeg backend for VideoCapture. --- modules/videoio/src/cap_ffmpeg_impl.hpp | 13 +++++++------ modules/videoio/test/test_ffmpeg.cpp | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index bf259b4daf..17d02df95a 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -1877,15 +1877,16 @@ int64_t CvCapture_FFMPEG::get_bitrate() const double CvCapture_FFMPEG::get_fps() const { -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 1, 100) && LIBAVFORMAT_VERSION_MICRO >= 100 - double fps = r2d(av_guess_frame_rate(ic, ic->streams[video_stream], NULL)); -#else +#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0) || LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) double fps = r2d(ic->streams[video_stream]->avg_frame_rate); +#else + double fps = r2d(ic->streams[video_stream]->r_frame_rate); +#endif -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) +#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 1, 100) && LIBAVFORMAT_VERSION_MICRO >= 100 if (fps < eps_zero) { - fps = r2d(ic->streams[video_stream]->avg_frame_rate); + fps = r2d(av_guess_frame_rate(ic, ic->streams[video_stream], NULL)); } #endif @@ -1893,7 +1894,7 @@ double CvCapture_FFMPEG::get_fps() const { fps = 1.0 / r2d(ic->streams[video_stream]->time_base); } -#endif + return fps; } diff --git a/modules/videoio/test/test_ffmpeg.cpp b/modules/videoio/test/test_ffmpeg.cpp index 9f59480c9c..338138518b 100644 --- a/modules/videoio/test/test_ffmpeg.cpp +++ b/modules/videoio/test/test_ffmpeg.cpp @@ -296,7 +296,7 @@ TEST_P(videoio_encapsulate, write) ASSERT_TRUE(capActualRaw.isOpened()); const double fpsReference = capReference.get(CAP_PROP_FPS); const double fpsActual = capActual.get(CAP_PROP_FPS); - ASSERT_EQ(fpsReference, fpsActual); + ASSERT_NEAR(fpsReference, fpsActual, 1e-2); const int nFramesActual = static_cast(capActual.get(CAP_PROP_FRAME_COUNT)); ASSERT_EQ(nFrames, nFramesActual);