Skip to content
Snippets Groups Projects
Commit 4776c563 authored by Philippe Gorley's avatar Philippe Gorley
Browse files

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
parent 170355f6
No related branches found
No related tags found
No related merge requests found
...@@ -73,6 +73,7 @@ MediaDecoder::~MediaDecoder() ...@@ -73,6 +73,7 @@ MediaDecoder::~MediaDecoder()
int MediaDecoder::openInput(const DeviceParams& params) int MediaDecoder::openInput(const DeviceParams& params)
{ {
inputParams_ = params;
AVInputFormat *iformat = av_find_input_format(params.format.c_str()); AVInputFormat *iformat = av_find_input_format(params.format.c_str());
if (!iformat) if (!iformat)
...@@ -192,6 +193,9 @@ MediaDecoder::setupStream(AVMediaType mediaType) ...@@ -192,6 +193,9 @@ MediaDecoder::setupStream(AVMediaType mediaType)
} }
avcodec_parameters_to_context(decoderCtx_, avStream_->codecpar); avcodec_parameters_to_context(decoderCtx_, avStream_->codecpar);
decoderCtx_->framerate = avStream_->avg_frame_rate; 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)); decoderCtx_->thread_count = std::max(1u, std::min(8u, std::thread::hardware_concurrency()/2));
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "audio/audiobuffer.h" #include "audio/audiobuffer.h"
#include "media_device.h"
#include "media_stream.h" #include "media_stream.h"
#include "rational.h" #include "rational.h"
#include "noncopyable.h" #include "noncopyable.h"
...@@ -57,7 +58,6 @@ struct AudioFormat; ...@@ -57,7 +58,6 @@ struct AudioFormat;
class RingBuffer; class RingBuffer;
class Resampler; class Resampler;
class MediaIOHandle; class MediaIOHandle;
struct DeviceParams;
class MediaDecoder { class MediaDecoder {
public: public:
...@@ -117,6 +117,8 @@ class MediaDecoder { ...@@ -117,6 +117,8 @@ class MediaDecoder {
int64_t startTime_; int64_t startTime_;
int64_t lastTimestamp_; int64_t lastTimestamp_;
DeviceParams inputParams_;
AudioBuffer decBuff_; AudioBuffer decBuff_;
AudioBuffer resamplingBuff_; AudioBuffer resamplingBuff_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment