From 4776c563a6566c60b5466dd9b72563c95ed71965 Mon Sep 17 00:00:00 2001
From: philippegorley <philippe.gorley@savoirfairelinux.com>
Date: Mon, 6 Aug 2018 13:19:34 -0400
Subject: [PATCH] decoder: set framerate if not found

If FFmpeg was unable to find a framerate in avformat_find_stream_info,
fall back to the DeviceParams' framerate.

This was the case for certain Macs.

Change-Id: I0ee7ebeef37676ff5907482421425051e880c6f5
---
 src/media/media_decoder.cpp | 4 ++++
 src/media/media_decoder.h   | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index f47bd17592..e34fa381fe 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -73,6 +73,7 @@ MediaDecoder::~MediaDecoder()
 
 int MediaDecoder::openInput(const DeviceParams& params)
 {
+    inputParams_ = params;
     AVInputFormat *iformat = av_find_input_format(params.format.c_str());
 
     if (!iformat)
@@ -192,6 +193,9 @@ MediaDecoder::setupStream(AVMediaType mediaType)
     }
     avcodec_parameters_to_context(decoderCtx_, avStream_->codecpar);
     decoderCtx_->framerate = avStream_->avg_frame_rate;
+    // in case FFmpeg could not find a framerate, fall back to the ones found in openInput
+    if (mediaType == AVMEDIA_TYPE_VIDEO && (decoderCtx_->framerate.num == 0 || decoderCtx_->framerate.den == 0))
+        decoderCtx_->framerate = inputParams_.framerate;
 
     decoderCtx_->thread_count = std::max(1u, std::min(8u, std::thread::hardware_concurrency()/2));
 
diff --git a/src/media/media_decoder.h b/src/media/media_decoder.h
index df051508ca..a0f5deada5 100644
--- a/src/media/media_decoder.h
+++ b/src/media/media_decoder.h
@@ -34,6 +34,7 @@
 
 #include "audio/audiobuffer.h"
 
+#include "media_device.h"
 #include "media_stream.h"
 #include "rational.h"
 #include "noncopyable.h"
@@ -57,7 +58,6 @@ struct AudioFormat;
 class RingBuffer;
 class Resampler;
 class MediaIOHandle;
-struct DeviceParams;
 
 class MediaDecoder {
     public:
@@ -117,6 +117,8 @@ class MediaDecoder {
         int64_t startTime_;
         int64_t lastTimestamp_;
 
+        DeviceParams inputParams_;
+
         AudioBuffer decBuff_;
         AudioBuffer resamplingBuff_;
 
-- 
GitLab