From d92ecf808bda9d85830f300514999e712f302c56 Mon Sep 17 00:00:00 2001 From: epbk Date: Mon, 29 Jul 2024 15:10:56 +0200 Subject: [PATCH 1/2] MP1-5223: Core: RefreshRateChanger: Round down detected FPS prior adapter output selection --- mediaportal/Core/Player/RefreshRateChanger.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mediaportal/Core/Player/RefreshRateChanger.cs b/mediaportal/Core/Player/RefreshRateChanger.cs index 51de2545565..b7b790e3c0a 100644 --- a/mediaportal/Core/Player/RefreshRateChanger.cs +++ b/mediaportal/Core/Player/RefreshRateChanger.cs @@ -651,6 +651,9 @@ private static void FindExtCmdfromSettings(double fps, out double newRR, newExtCmd = ""; newRRDescription = ""; + //Round fps down to 3 decimal places + fps = Math.Round(fps, 3); + foreach (RefreshRateSetting setting in _refreshRateSettings) { foreach (double fpsSetting in setting.Fps) From fb792c18e2ca6eab7b2e093caad448f7178cfc6f Mon Sep 17 00:00:00 2001 From: epbk Date: Mon, 29 Jul 2024 15:16:38 +0200 Subject: [PATCH 2/2] MP1-5223: Core: RefreshRateChanger: Improve FPS detection form VideoDecoder(VIDEOINFOHEADER2)(interlaced videos) --- mediaportal/Core/Player/RefreshRateChanger.cs | 59 +++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/mediaportal/Core/Player/RefreshRateChanger.cs b/mediaportal/Core/Player/RefreshRateChanger.cs index b7b790e3c0a..f705cd97b68 100644 --- a/mediaportal/Core/Player/RefreshRateChanger.cs +++ b/mediaportal/Core/Player/RefreshRateChanger.cs @@ -1092,30 +1092,65 @@ public static void AdaptRefreshRateFromVideoDecoder(string strFile) Log.Debug("[AdaptRefreshRateFromVideoDecoder] Video Decoder found."); DirectShowLib.IPin pin; - int iResult = filter.FindPin("In", out pin); + int iResult = filter.FindPin("Out", out pin); if (iResult == 0) { - Log.Debug("[AdaptRefreshRateFromVideoDecoder] Input Pin of Video Decoder retrieved."); + Log.Debug("[AdaptRefreshRateFromVideoDecoder] Output Pin of Video Decoder retrieved."); DirectShowLib.AMMediaType mediatype = new DirectShowLib.AMMediaType(); iResult = pin.ConnectionMediaType(mediatype); if (iResult == 0) { - Log.Debug("[AdaptRefreshRateFromVideoDecoder] AMMediaType: " + mediatype.formatType.ToString()); + bool bInterlaced = false; + string strGUID = mediatype.formatType.ToString(); + Log.Debug("[AdaptRefreshRateFromVideoDecoder] AMMediaType: " + strGUID); - DirectShowLib.VideoInfoHeader videoHeader = new DirectShowLib.VideoInfoHeader(); - Marshal.PtrToStructure(mediatype.formatPtr, videoHeader); - - if (videoHeader != null) + if (strGUID.Equals("F72A76A0-EB0A-11D0-ACE4-0000C0CC16BA", StringComparison.OrdinalIgnoreCase) //VIDEOINFOHEADER2 + || strGUID.Equals("E06D80E3-DB46-11CF-B4D1-00805F6CBBEA", StringComparison.OrdinalIgnoreCase)) //WMFORMAT_MPEG2Video + { + DirectShowLib.VideoInfoHeader2 videoHeader = new DirectShowLib.VideoInfoHeader2(); + Marshal.PtrToStructure(mediatype.formatPtr, videoHeader); + if (videoHeader != null) + { + bInterlaced = (videoHeader.InterlaceFlags & DirectShowLib.AMInterlace.IsInterlaced) == DirectShowLib.AMInterlace.IsInterlaced; + dFps = Math.Round(10000000F / videoHeader.AvgTimePerFrame, 2); + Log.Debug("[AdaptRefreshRateFromVideoDecoder] AvgTimePerFrame from VideoInfoHeader2: {0}, Interlaced: {1}", + videoHeader.AvgTimePerFrame, bInterlaced); + } + } + else { - Log.Debug("[AdaptRefreshRateFromVideoDecoder] AvgTimePerFrame from VideoInfoHeader: " + videoHeader.AvgTimePerFrame); + DirectShowLib.VideoInfoHeader videoHeader = new DirectShowLib.VideoInfoHeader(); + Marshal.PtrToStructure(mediatype.formatPtr, videoHeader); + + if (videoHeader != null) + { + Log.Debug("[AdaptRefreshRateFromVideoDecoder] AvgTimePerFrame from VideoInfoHeader: " + videoHeader.AvgTimePerFrame); + dFps = Math.Round(10000000F / videoHeader.AvgTimePerFrame, 2); + } + } - dFps = Math.Round(10000000F / videoHeader.AvgTimePerFrame, 2); + if (dFps == 23.98) + dFps = 23.976; - if (dFps == 23.98) - dFps = 23.976; + Log.Info("[AdaptRefreshRateFromVideoDecoder] Detected FPS from Video Decoder: " + dFps); - Log.Info("[AdaptRefreshRateFromVideoDecoder] Detected FPS from Video Decoder: " + dFps); + if (bInterlaced) + { + switch (dFps) + { + case 25: + dFps = 50.0; + break; + + case 29.97: + dFps = 59.97; + break; + + case 30: + dFps = 60.0; + break; + } } } else