diff options
Diffstat (limited to 'stream/tvi_v4l2.c')
-rw-r--r-- | stream/tvi_v4l2.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c index a13d4c203a..97bce47754 100644 --- a/stream/tvi_v4l2.c +++ b/stream/tvi_v4l2.c @@ -336,13 +336,23 @@ static int amode2v4l(int amode) } +/* +** 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; @@ -438,6 +448,18 @@ static int getstd(priv_t *priv) int i=0; if (ioctl(priv->video_fd, VIDIOC_G_STD, &id) < 0) { + struct v4l2_streamparm parm; + + parm.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; + if(ioctl(priv->video_fd, VIDIOC_G_PARM, &parm) >= 0) { + mp_msg(MSGT_TV, MSGL_WARN, "%s: your device driver does not support VIDIOC_G_STD ioctl," + " VIDIOC_G_PARM was used instead.\n", info.short_name); + priv->standard.index=0; + priv->standard.id=0; + priv->standard.frameperiod=parm.parm.capture.timeperframe; + return 0; + } + mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl get standard failed: %s\n", info.short_name, strerror(errno)); return -1; @@ -701,6 +723,10 @@ static int control(priv_t *priv, int cmd, void *arg) 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 +1115,7 @@ static int uninit(priv_t *priv) 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 */ |