diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp index f47bd17592ca7dbaa11ca9f1fdbb03f7797d12d4..e34fa381fe9a8114b5c4ebc19d66ac6f6d7e808d 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 df051508ca89bd94bd47c16332dbdfc8fc80b0b4..a0f5deada511dc5ab07f8263fecaefbb6971e6b3 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_;