diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp index b70f921..a031ef7 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -971,12 +971,23 @@ void CDVDDemuxFFmpeg::AddStream(int iId) if (m_bAVI && pStream->codec->codec_id == CODEC_ID_H264) st->bPTSInvalid = true; +#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52, 63, 0) //average fps is more accurate for mkv files if (m_bMatroska && pStream->avg_frame_rate.den && pStream->avg_frame_rate.num) { st->iFpsRate = pStream->avg_frame_rate.num; st->iFpsScale = pStream->avg_frame_rate.den; } +#else + // libavformat older than 2010-05-17 gets the avg wrong, use time_base instead + // for H.264 (r_frame_rate is rounded up 23.976->24fps for H.264 by libavformat) + if (m_bMatroska && pStream->codec->codec_id == CODEC_ID_H264 && + pStream->codec->time_base.den && pStream->codec->time_base.num) + { + st->iFpsRate = pStream->codec->time_base.den; + st->iFpsScale = pStream->codec->time_base.num * pStream->codec->ticks_per_frame; + } +#endif else if(pStream->r_frame_rate.den && pStream->r_frame_rate.num) { st->iFpsRate = pStream->r_frame_rate.num;