Skip to content
Snippets Groups Projects
Commit dcd395f7 authored by fryshorts's avatar fryshorts
Browse files

Use helper function to set framerate in v4l2 input.

parent 6c8216c6
No related branches found
No related tags found
No related merge requests found
......@@ -169,3 +169,33 @@ int_fast32_t v4l2_set_format(int_fast32_t dev, int *resolution,
*bytesperline = fmt.fmt.pix.bytesperline;
return 0;
}
int_fast32_t v4l2_set_framerate(int_fast32_t dev, int *framerate)
{
bool set = false;
int num, denom;
struct v4l2_streamparm par;
if (!dev || !framerate)
return -1;
/* We need to set the type in order to query the stream settings */
par.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (v4l2_ioctl(dev, VIDIOC_G_PARM, &par) < 0)
return -1;
if (*framerate != -1) {
v4l2_unpack_tuple(&num, &denom, *framerate);
par.parm.capture.timeperframe.numerator = num;
par.parm.capture.timeperframe.denominator = denom;
set = true;
}
if (set && (v4l2_ioctl(dev, VIDIOC_S_PARM, &par) < 0))
return -1;
*framerate = v4l2_pack_tuple(par.parm.capture.timeperframe.numerator,
par.parm.capture.timeperframe.denominator);
return 0;
}
......@@ -235,6 +235,18 @@ int_fast32_t v4l2_set_input(int_fast32_t dev, int *input);
int_fast32_t v4l2_set_format(int_fast32_t dev, int *resolution,
int *pixelformat, int *bytesperline);
/**
* Set the framerate on the device.
*
* If the action succeeds framerate is set to the used value.
*
* @param dev handle to the v4l2 device
* @param framerate packed value of the framerate or -1 to leave as is
*
* @return negative on failure
*/
int_fast32_t v4l2_set_framerate(int_fast32_t dev, int *framerate);
#ifdef __cplusplus
}
#endif
......@@ -64,7 +64,7 @@ struct v4l2_data {
int set_input;
int set_pixfmt;
int set_res;
int_fast32_t set_fps;
int set_fps;
/* data used within the capture thread */
int_fast32_t dev;
......@@ -582,7 +582,6 @@ static void v4l2_destroy(void *vptr)
*/
static void v4l2_init(struct v4l2_data *data)
{
struct v4l2_streamparm par;
struct dstr fps;
int fps_num, fps_denom;
......@@ -614,18 +613,13 @@ static void v4l2_init(struct v4l2_data *data)
blog(LOG_INFO, "Linesize: %d Bytes", data->linesize);
/* set framerate */
v4l2_unpack_tuple(&fps_num, &fps_denom, data->set_fps);
par.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
par.parm.capture.timeperframe.numerator = fps_num;
par.parm.capture.timeperframe.denominator = fps_denom;
if (v4l2_ioctl(data->dev, VIDIOC_S_PARM, &par) < 0) {
if (v4l2_set_framerate(data->dev, &data->set_fps) < 0) {
blog(LOG_ERROR, "Unable to set framerate");
goto fail;
}
v4l2_unpack_tuple(&fps_num, &fps_denom, data->set_fps);
dstr_init(&fps);
dstr_printf(&fps, "%.2f",
(float) par.parm.capture.timeperframe.denominator
/ par.parm.capture.timeperframe.numerator);
dstr_printf(&fps, "%.2f", (float) fps_denom / fps_num);
blog(LOG_INFO, "Framerate: %s fps", fps.array);
dstr_free(&fps);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment