From e7bd91814a239a0d4a3bc93b655173257f51e21e Mon Sep 17 00:00:00 2001 From: SuslikV Date: Mon, 24 Feb 2020 09:35:13 +0200 Subject: [PATCH 1/2] Change frame rate detection Make FPS detection of the input file similar to the FFmpeg's own re-encoding algorithm. --- src/FFmpegReader.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index b548fa8f..9b0f7bcb 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -706,9 +706,16 @@ void FFmpegReader::UpdateVideoInfo() { info.vcodec = pCodecCtx->codec->name; info.video_bit_rate = (pFormatCtx->bit_rate / 8); - // set frames per second (fps) - info.fps.num = pStream->avg_frame_rate.num; - info.fps.den = pStream->avg_frame_rate.den; + // Frame rate from the container and codec + AVRational framerate = av_guess_frame_rate(pFormatCtx, pStream, NULL); + info.fps.num = framerate.num; + info.fps.den = framerate.den; + + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdateVideoInfo", "info.fps.num", info.fps.num, "info.fps.den", info.fps.den); + + // TODO: remove excessive debug info in the next releases + // The debug info below is just for comparison and troubleshooting on users side during the transition period + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdateVideoInfo (pStream->avg_frame_rate)", "num", pStream->avg_frame_rate.num, "den", pStream->avg_frame_rate.den); if (pStream->sample_aspect_ratio.num != 0) { info.pixel_ratio.num = pStream->sample_aspect_ratio.num; From 2701cf9079919ae3c3db2ece872c9e2fcaf558a4 Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Thu, 26 Mar 2020 20:12:10 -0400 Subject: [PATCH 2/2] Add frame rate test to FFmpegReader_Tests --- tests/FFmpegReader_Tests.cpp | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/tests/FFmpegReader_Tests.cpp b/tests/FFmpegReader_Tests.cpp index 0a8620c9..6475e5ca 100644 --- a/tests/FFmpegReader_Tests.cpp +++ b/tests/FFmpegReader_Tests.cpp @@ -36,13 +36,16 @@ using namespace std; using namespace openshot; -TEST(FFmpegReader_Invalid_Path) +SUITE(FFmpegReader) +{ + +TEST(Invalid_Path) { // Check invalid path CHECK_THROW(FFmpegReader(""), InvalidFile); } -TEST(FFmpegReader_GetFrame_Before_Opening) +TEST(GetFrame_Before_Opening) { // Create a reader stringstream path; @@ -53,7 +56,7 @@ TEST(FFmpegReader_GetFrame_Before_Opening) CHECK_THROW(r.GetFrame(1), ReaderClosed); } -TEST(FFmpegReader_Check_Audio_File) +TEST(Check_Audio_File) { // Create a reader stringstream path; @@ -83,7 +86,7 @@ TEST(FFmpegReader_Check_Audio_File) r.Close(); } -TEST(FFmpegReader_Check_Video_File) +TEST(Check_Video_File) { // Create a reader stringstream path; @@ -129,7 +132,7 @@ TEST(FFmpegReader_Check_Video_File) r.Close(); } -TEST(FFmpegReader_Seek) +TEST(Seek) { // Create a reader stringstream path; @@ -186,7 +189,23 @@ TEST(FFmpegReader_Seek) } -TEST(FFmpegReader_Multiple_Open_and_Close) +TEST(Frame_Rate) +{ + // Create a reader + stringstream path; + path << TEST_MEDIA_PATH << "sintel_trailer-720p.mp4"; + FFmpegReader r(path.str()); + r.Open(); + + // Verify detected frame rate + openshot::Fraction rate = r.info.fps; + CHECK_EQUAL(24, rate.num); + CHECK_EQUAL(1, rate.den); + + r.Close(); +} + +TEST(Multiple_Open_and_Close) { // Create a reader stringstream path; @@ -221,3 +240,6 @@ TEST(FFmpegReader_Multiple_Open_and_Close) // Close reader r.Close(); } + +} // SUITE(FFmpegReader) +