diff options
author | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-07-24 09:49:09 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-07-24 11:19:19 -0300 |
commit | cbc8d0905488d9efe5c9ecb2e97076e27049c6b3 (patch) | |
tree | 51580318fbcd908b972f1fb74f90655afad41e81 /src/camorama-window.c | |
parent | 343b5eb4ae59dbf5583de087326fa3423c923595 (diff) |
Allow selecting the image resolution instead of "small/midium/large"resolution_improvement
The concept of small, midium, large is relative, as it depends on
whatever the camera supports.
Instead of using it, it is a way better to show a list of the
supported resolutions. That works fine for most cameras, with
uses a fixed set.
On cameras with a scale, the Kernel actually exports the resolution
range. On this case, let's present 4 resolutions between the
minimum and maximum one. That should be reasonable for most
usecases.
Nowadays, all drivers should be reporting resolutions via
VIDIOC_ENUM_FRAMESIZES. Yet, as one might run camorama with
very legacy kernels, provide backward support, using
small/midium/large resolutions just like before.
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'src/camorama-window.c')
-rw-r--r-- | src/camorama-window.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/src/camorama-window.c b/src/camorama-window.c index d08e29c..3018e1a 100644 --- a/src/camorama-window.c +++ b/src/camorama-window.c @@ -275,28 +275,57 @@ load_interface(cam* cam) { /* - * Just one resolution is at the XML files. The other ones are - * dynamically-created + * Dynamically generate the resolutions based on what the camera + * actually supports. Provide a fallback method, if the camera driver + * is too old and doesn't support formats enumeration. */ - glade_xml_signal_connect_data (cam->xml, "activate", - G_CALLBACK (on_change_size_activate), cam); - small_res = glade_xml_get_widget (cam->xml, "small"); - new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Medium"); - gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE); - gtk_widget_show (new_res); - g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam); - gtk_widget_set_name(new_res, "medium"); - - new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Large"); - gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE); - gtk_widget_show (new_res); - g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam); - gtk_widget_set_name(new_res, "large"); + /* Get all supported resolutions by cam->pixformat */ + get_supported_resolutions(cam); + + if (cam->n_res > 0) { + int i; + + for (i = 0; i < cam->n_res; i++) { + char name[32]; + + 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_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res); + gtk_widget_show (new_res); + g_signal_connect(new_res, "activate", + G_CALLBACK (on_change_size_activate), cam); + gtk_widget_set_name(new_res, name); + + if (cam->width == cam->res[i].x && cam->height == cam->res[i].y) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), TRUE); + else + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE); + } + + /* We won't actually use the small res */ + gtk_widget_hide (small_res); + } else { + glade_xml_signal_connect_data (cam->xml, "activate", + G_CALLBACK (on_change_size_activate), cam); + + new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Medium"); + gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE); + gtk_widget_show (new_res); + g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam); + gtk_widget_set_name(new_res, "medium"); + + new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Large"); + gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE); + gtk_widget_show (new_res); + g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam); + gtk_widget_set_name(new_res, "large"); + } //glade_xml_signal_connect_data(cam->xml, "capture_func", G_CALLBACK(on_change_size_activate), cam); glade_xml_signal_connect_data (cam->xml, "capture_func", |