changeset 27138:62916b06a055

Fix division by zero in tvi_v4l2 which occures when capture device driver (such as uvcvideo USB video driver) does not provide VIDIOC_G_STD ioctl.
author voroshil
date Mon, 30 Jun 2008 17:42:35 +0000
parents e09cdb367031
children 0917bf2bed6c
files stream/tvi_v4l2.c
diffstat 1 files changed, 18 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/stream/tvi_v4l2.c	Mon Jun 30 12:51:38 2008 +0000
+++ b/stream/tvi_v4l2.c	Mon Jun 30 17:42:35 2008 +0000
@@ -336,13 +336,23 @@
 }
 
 
+/*
+** Get current FPS.
+*/
+static double getfps(priv_t *priv)
+{
+    if (priv->tv_param->fps > 0)
+        return priv->tv_param->fps;
+    if (priv->standard.frameperiod.denominator && priv->standard.frameperiod.numerator)
+        return (double)priv->standard.frameperiod.denominator / priv->standard.frameperiod.numerator;
+    return 25.0;
+}
+
 // sets and sanitizes audio buffer/block sizes
 static void setup_audio_buffer_sizes(priv_t *priv)
 {
     int bytes_per_sample = priv->audio_in.bytes_per_sample;
-    double fps = (double)priv->standard.frameperiod.denominator /
-        priv->standard.frameperiod.numerator;
-    int seconds = priv->video_buffer_size_max/fps;
+    int seconds = priv->video_buffer_size_max/getfps(priv);
 
     if (seconds < 5) seconds = 5;
     if (seconds > 500) seconds = 500;
@@ -701,6 +711,10 @@
         priv->immediate_mode = 1;
         return TVI_CONTROL_TRUE;
     case TVI_CONTROL_VID_GET_FPS:
+        if (!priv->standard.frameperiod.denominator || !priv->standard.frameperiod.numerator) {
+            mp_msg(MSGT_TV, MSGL_ERR, "%s: Cannot get fps\n", info.short_name);
+            return TVI_CONTROL_FALSE;
+        }
         *(float *)arg = (float)priv->standard.frameperiod.denominator /
             priv->standard.frameperiod.numerator;
         mp_msg(MSGT_TV, MSGL_V, "%s: get fps: %f\n", info.short_name,
@@ -1089,11 +1103,7 @@
         struct v4l2_buffer buf;
 
         /* get performance */
-        frames = 1 + (priv->curr_frame - priv->first_frame +
-                      priv->standard.frameperiod.numerator * 500000 /
-                      priv->standard.frameperiod.denominator) *
-            priv->standard.frameperiod.denominator /
-            priv->standard.frameperiod.numerator / 1000000;
+        frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / (1e6 * getfps(priv)));
         dropped = frames - priv->frames;
 
         /* turn off streaming */