From 44c2519d7562374f7741f2a9e2d3be3c96db7e57 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 23 Jun 2022 15:09:17 +0200 Subject: [PATCH 1/2] issues-22141 --- modules/videoio/src/cap_ffmpeg_impl.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index 98913ed839..3e8099262d 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -1510,10 +1510,6 @@ bool CvCapture_FFMPEG::grabFrame() ret = got_picture ? 0 : -1; #endif if (ret >= 0) { - //picture_pts = picture->best_effort_timestamp; - if( picture_pts == AV_NOPTS_VALUE_ ) - picture_pts = picture->CV_FFMPEG_PTS_FIELD != AV_NOPTS_VALUE_ && picture->CV_FFMPEG_PTS_FIELD != 0 ? picture->CV_FFMPEG_PTS_FIELD : picture->pkt_dts; - valid = true; } else if (ret == AVERROR(EAGAIN)) { continue; @@ -1526,8 +1522,11 @@ bool CvCapture_FFMPEG::grabFrame() } } - if (valid) + if (valid) { + if( picture_pts == AV_NOPTS_VALUE_ ) + picture_pts = picture->CV_FFMPEG_PTS_FIELD != AV_NOPTS_VALUE_ && picture->CV_FFMPEG_PTS_FIELD != 0 ? picture->CV_FFMPEG_PTS_FIELD : picture->pkt_dts; frame_number++; + } if (!rawMode && valid && first_frame_number < 0) first_frame_number = dts_to_frame_number(picture_pts); From 48e50a76743c85269778406fc328ad930bc0a456 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 15 Sep 2022 14:29:50 +0300 Subject: [PATCH 2/2] Extended video timestamp test to cover fix for the issue #22141. --- modules/videoio/test/test_video_io.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/videoio/test/test_video_io.cpp b/modules/videoio/test/test_video_io.cpp index 6661b13c5a..c73a292d0b 100644 --- a/modules/videoio/test/test_video_io.cpp +++ b/modules/videoio/test/test_video_io.cpp @@ -215,8 +215,28 @@ public: throw SkipTestException(cv::String("Backend ") + cv::videoio_registry::getBackendName(apiPref) + cv::String(" can't open the video: ") + video_file); + int frame_count = (int)cap.get(CAP_PROP_FRAME_COUNT); + + // HACK: Video consists of 125 frames, but cv::VideoCapture with FFmpeg reports only 122 frames for mpg video. + // mpg file reports 5.08 sec * 24 fps => property returns 122 frames,but actual number of frames returned is 125 + // HACK: CAP_PROP_FRAME_COUNT is not supported for vmw + MSMF. Just force check for all 125 frames + if (ext == "mpg") + EXPECT_GT(frame_count, 121); + else if ((ext == "wmv") && (apiPref == CAP_MSMF)) + frame_count = 125; + else + EXPECT_EQ(frame_count, 125); Mat img; - for(int i = 0; i < 10; i++) + +#ifdef _WIN32 // handle old FFmpeg wrapper on Windows till rebuild + frame_count = 10; +#else + // HACK: FFmpeg reports picture_pts = AV_NOPTS_VALUE_ for the last frame for AVI container by some reason + if ((ext == "avi") && (apiPref == CAP_FFMPEG)) + frame_count--; +#endif + + for (int i = 0; i < frame_count; i++) { double timestamp = 0; ASSERT_NO_THROW(cap >> img);