From b847ef40e2f9a13f54315518be45d5ff11276632 Mon Sep 17 00:00:00 2001
From: Karl Dietz <dekarl@mythtv.org>
Date: Sun, 27 Apr 2014 02:19:55 +0200
Subject: [PATCH 1/5] use av_guess_frame_rate from ffmpeg 2.2+ to replace own
 guesswork

Fixes #12047
---
 mythtv/libs/libmythtv/avformatdecoder.cpp |   27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
index 412806c..55c9b27 100644
--- a/mythtv/libs/libmythtv/avformatdecoder.cpp
+++ b/mythtv/libs/libmythtv/avformatdecoder.cpp
@@ -1357,9 +1357,19 @@ int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo,
 
 float AvFormatDecoder::normalized_fps(AVStream *stream, AVCodecContext *enc)
 {
-    float fps, avg_fps, codec_fps, container_fps, estimated_fps;
-    avg_fps = codec_fps = container_fps = estimated_fps = 0.0f;
-
+    float fps, avg_fps, codec_fps, container_fps, estimated_fps, guess_fps;
+    avg_fps = codec_fps = container_fps = estimated_fps = guess_fps = 0.0f;
+
+    /*
+     * Let ffmpeg do the guessing instead of duplicating their work.
+     * Only use our guess when ffmpeg doesn't come up with anything
+     * >3fps
+     */
+    guess_fps = av_q2d(av_guess_frame_rate(ic, stream, NULL));
+
+    /* this is not a good source for FPS according to
+     * https://trac.bunkus.org/wiki/FAQ:WrongFrameRateDisplayed
+     */
     if (stream->avg_frame_rate.den && stream->avg_frame_rate.num)
         avg_fps = av_q2d(stream->avg_frame_rate); // MKV default_duration
 
@@ -1378,9 +1388,13 @@ float AvFormatDecoder::normalized_fps(AVStream *stream, AVCodecContext *enc)
     if (stream->r_frame_rate.den && stream->r_frame_rate.num) // tbr
         estimated_fps = av_q2d(stream->r_frame_rate);
 
+    if (guess_fps > 3.0f)
+    {
+       fps = guess_fps;
+    }
     // matroska demuxer sets the default_duration to avg_frame_rate
     // mov,mp4,m4a,3gp,3g2,mj2 demuxer sets avg_frame_rate
-    if ((QString(ic->iformat->name).contains("matroska") ||
+    else if ((QString(ic->iformat->name).contains("matroska") ||
         QString(ic->iformat->name).contains("mov")) &&
         avg_fps < 121.0f && avg_fps > 3.0f)
         fps = avg_fps;
@@ -1401,9 +1415,10 @@ float AvFormatDecoder::normalized_fps(AVStream *stream, AVCodecContext *enc)
     if (fps != m_fps)
     {
         LOG(VB_PLAYBACK, LOG_INFO, LOC +
-            QString("Selected FPS is %1 (avg %2 codec %3 "
+            QString("Selected FPS is %1 (guess %6 avg %2 codec %3 "
                     "container %4 estimated %5)").arg(fps).arg(avg_fps)
-                .arg(codec_fps).arg(container_fps).arg(estimated_fps));
+                .arg(codec_fps).arg(container_fps).arg(estimated_fps)
+                .arg(guess_fps));
         m_fps = fps;
     }
 
-- 
1.7.9.5

