diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp index c92564146730f82e7a0d931c525e0e1e3b948977..e24b368a2fa5854b5401facf7a48849787a59285 100644 --- a/src/media/media_decoder.cpp +++ b/src/media/media_decoder.cpp @@ -250,7 +250,8 @@ int MediaDecoder::setupFromVideoData() } // Get a pointer to the codec context for the video stream - decoderCtx_ = inputCtx_->streams[streamIndex_]->codec; + avStream_ = inputCtx_->streams[streamIndex_]; + decoderCtx_ = avStream_->codec; if (decoderCtx_ == 0) { RING_ERR("Decoder context is NULL"); return -1; @@ -428,6 +429,14 @@ int MediaDecoder::getWidth() const int MediaDecoder::getHeight() const { return decoderCtx_->height; } +int // TODO : use of float fps is more accurate +MediaDecoder::getFps() const +{ + return (avStream_->avg_frame_rate.den != 0 ? + (int)(avStream_->avg_frame_rate.num / avStream_->avg_frame_rate.den) + : 0); +} + int MediaDecoder::getPixelFormat() const { return libav_utils::ring_pixel_format(decoderCtx_->pix_fmt); } diff --git a/src/media/media_decoder.h b/src/media/media_decoder.h index 91f65194f88bacb3240342358b23455f357017f2..0a20a3aa3c1b1e2b99e6db0f9efd0afeabbffb25 100644 --- a/src/media/media_decoder.h +++ b/src/media/media_decoder.h @@ -99,6 +99,7 @@ class MediaDecoder { int getWidth() const; int getHeight() const; + int getFps() const; int getPixelFormat() const; void setOptions(const std::map<std::string, std::string>& options); @@ -109,6 +110,7 @@ class MediaDecoder { AVCodec *inputDecoder_ = nullptr; AVCodecContext *decoderCtx_ = nullptr; AVFormatContext *inputCtx_ = nullptr; + AVStream *avStream_ = nullptr; std::unique_ptr<Resampler> resampler_; int streamIndex_ = -1; bool emulateRate_ = false; diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp index a3d5a7b4dcb322c0ce015b2fc9327d8254b2880d..c11f19524c8beb496eb1e7aaafaef7308874e5f1 100644 --- a/src/media/video/video_input.cpp +++ b/src/media/video/video_input.cpp @@ -185,6 +185,11 @@ VideoInput::createDecoder() } decOpts_.width = decoder_->getWidth(); decOpts_.height = decoder_->getHeight(); + decOpts_.framerate = decoder_->getFps(); + RING_INFO("create decoder with video params : size=%dX%d, fps=%d", + decOpts_.width, + decOpts_.height, + decOpts_.framerate); foundDecOpts(decOpts_); } @@ -266,9 +271,6 @@ VideoInput::initFile(std::string path) decOpts_.framerate = 1; } else { RING_WARN("Guessing file type for %s", path.c_str()); - // FIXME: proper parsing of FPS etc. should be done in - // MediaDecoder, not here. - decOpts_.framerate = 25; } return true;