directshow: Fix for division by zero
authorSeungha Yang <seungha@centricular.com>
Tue, 1 Mar 2022 21:17:22 +0000 (06:17 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 2 Mar 2022 19:35:49 +0000 (19:35 +0000)
The AvgTimePerFrame value may be unknown. Use arbitrary
value (30 fps) instead of crashing.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1828>

subprojects/gst-plugins-bad/sys/directshow/gstdshow.cpp
subprojects/gst-plugins-bad/sys/directshow/gstdshowvideodec.cpp

index 1e6da8c..8d0ddf7 100644 (file)
@@ -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;
 
index 16d5b7a..1af9a63 100644 (file)
@@ -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);