diff options
author | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-09-18 09:23:41 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-09-18 09:32:15 -0300 |
commit | feabed1c0cbf226df6f71c3e63f5f42e53099890 (patch) | |
tree | 15499b30a29f837c85794f666ed8bd5b00cdec9c | |
parent | 6ec59b5a64b4359c2b8afc36fb48c095fa41315b (diff) |
v4l: get maximum fps for each resolution and display
Most modern cameras allow to get the maximum number of
frames per second for each resolution. Add support for it.
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
-rw-r--r-- | src/camorama-window.c | 11 | ||||
-rw-r--r-- | src/v4l.c | 30 | ||||
-rw-r--r-- | src/v4l.h | 1 |
3 files changed, 36 insertions, 6 deletions
diff --git a/src/camorama-window.c b/src/camorama-window.c index 862f869..33fd847 100644 --- a/src/camorama-window.c +++ b/src/camorama-window.c @@ -279,9 +279,14 @@ void load_interface(cam_t *cam) if (cam->n_res > 0) { for (i = 0; i < cam->n_res; i++) { - char name[32]; - - sprintf(name, "%dx%d", cam->res[i].x, cam->res[i].y); + char name[80]; + + if (cam->res[i].max_fps > 0) + sprintf(name, _("%dx%d (max %.1f fps)"), + cam->res[i].x, cam->res[i].y, + (double)cam->res[i].max_fps); + else + sprintf(name, _("%dx%d"), cam->res[i].x, cam->res[i].y); new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), name); gtk_container_add(GTK_CONTAINER(GTK_WIDGET(gtk_builder_get_object(cam->xml, "menuitem4_menu"))), @@ -36,7 +36,8 @@ void print_cam(cam_t *cam) printf("timestamp = %s\n\n", cam->ts_string); } -static void insert_resolution(cam_t *cam, unsigned int x, unsigned int y) +static void insert_resolution(cam_t *cam, unsigned int x, unsigned int y, + float max_fps) { unsigned int i; @@ -50,6 +51,7 @@ static void insert_resolution(cam_t *cam, unsigned int x, unsigned int y) cam->res[cam->n_res].x = x; cam->res[cam->n_res].y = y; + cam->res[cam->n_res].max_fps = max_fps; cam->n_res++; } @@ -66,6 +68,27 @@ static int sort_func(const void *__b, const void *__a) return r; } +static float get_max_fps_discrete(cam_t *cam, + struct v4l2_frmsizeenum *frmsize) +{ + struct v4l2_frmivalenum frmival; + float fps, max_fps = -1; + + frmival.width = frmsize->discrete.width; + frmival.height = frmsize->discrete.height; + frmival.pixel_format = frmsize->pixel_format; + frmival.index = 0; + + for (frmival.index = 0; + !v4l2_ioctl(cam->dev, VIDIOC_ENUM_FRAMEINTERVALS, &frmival); + frmival.index++) { + fps = ((float)frmival.discrete.denominator)/frmival.discrete.numerator; + if (fps > max_fps) + max_fps = fps; + } + return max_fps; +} + void get_supported_resolutions(cam_t *cam) { struct v4l2_fmtdesc fmt; @@ -87,7 +110,8 @@ void get_supported_resolutions(cam_t *cam) while (!v4l2_ioctl(cam->dev, VIDIOC_ENUM_FRAMESIZES, &frmsize)) { if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { insert_resolution(cam, frmsize.discrete.width, - frmsize.discrete.height); + frmsize.discrete.height, + get_max_fps_discrete(cam, &frmsize)); } else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { for (i = 0; i < 4; i++) { x = frmsize.stepwise.min_width + @@ -96,7 +120,7 @@ void get_supported_resolutions(cam_t *cam) y = frmsize.stepwise.min_height + i * (frmsize.stepwise.max_height - frmsize.stepwise.min_height) / 4; - insert_resolution(cam, x, y); + insert_resolution(cam, x, y, -1); } } frmsize.index++; @@ -45,6 +45,7 @@ struct buffer_start_len { struct resolutions { unsigned int x, y; + float max_fps; }; typedef struct camera { |