From df6624bf1c77e1c369545ef763f22bfd7a019e35 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 2 Mar 2022 06:17:22 +0900 Subject: [PATCH] directshow: Fix for division by zero The AvgTimePerFrame value may be unknown. Use arbitrary value (30 fps) instead of crashing. Part-of: --- .../gst-plugins-bad/sys/directshow/gstdshow.cpp | 12 ++++++++++-- .../sys/directshow/gstdshowvideodec.cpp | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/directshow/gstdshow.cpp b/subprojects/gst-plugins-bad/sys/directshow/gstdshow.cpp index 1e6da8cf12..8d0ddf7faf 100644 --- a/subprojects/gst-plugins-bad/sys/directshow/gstdshow.cpp +++ b/subprojects/gst-plugins-bad/sys/directshow/gstdshow.cpp @@ -101,7 +101,11 @@ gst_dshow_new_pin_mediatype_from_enum_mediatypes (IPin * pin, IEnumMediaTypes *e pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; - pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + if (video_info->AvgTimePerFrame > 0) { + pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + } else { + pin_mediatype->defaultFPS = 30; + } pin_mediatype->granularityWidth = 1; pin_mediatype->granularityHeight = 1; @@ -125,7 +129,11 @@ gst_dshow_new_pin_mediatype_from_streamcaps (IPin * pin, gint id, IAMStreamConfi pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; - pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + if (video_info->AvgTimePerFrame > 0) { + pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + } else { + pin_mediatype->defaultFPS = 30; + } pin_mediatype->granularityWidth = pin_mediatype->vscc.OutputGranularityX; pin_mediatype->granularityHeight = pin_mediatype->vscc.OutputGranularityY; diff --git a/subprojects/gst-plugins-bad/sys/directshow/gstdshowvideodec.cpp b/subprojects/gst-plugins-bad/sys/directshow/gstdshowvideodec.cpp index 16d5b7a4d0..1af9a636f7 100644 --- a/subprojects/gst-plugins-bad/sys/directshow/gstdshowvideodec.cpp +++ b/subprojects/gst-plugins-bad/sys/directshow/gstdshowvideodec.cpp @@ -999,16 +999,23 @@ gst_dshowvideodec_src_getcaps (GstPad * pad) if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_RGB24) && IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo)) { + gint fps_n; + video_info = (VIDEOINFOHEADER *) mediatype->pbFormat; + if (video_info->AvgTimePerFrame > 0) { + fps_n = 10000000 / video_info->AvgTimePerFrame; + } else { + fps_n = 30; + } + /* ffmpegcolorspace handles RGB24 in BIG_ENDIAN */ mediacaps = gst_caps_new_simple ("video/x-raw-rgb", "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24, "width", G_TYPE_INT, video_info->bmiHeader.biWidth, "height", G_TYPE_INT, video_info->bmiHeader.biHeight, - "framerate", GST_TYPE_FRACTION, - (int) (10000000 / video_info->AvgTimePerFrame), 1, "endianness", + "framerate", GST_TYPE_FRACTION, fps_n, 1, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 255, "green_mask", G_TYPE_INT, 65280, "blue_mask", G_TYPE_INT, 16711680, NULL);