diff --git a/main.c b/main.c index e10f51e..20f0895 100644 --- a/main.c +++ b/main.c @@ -109,7 +109,7 @@ GtkWidget *main_stack; GtkWidget *thumb_last; GtkWidget *control_box; GtkWidget *control_name; -GtkWidget *control_slider; +GtkAdjustment *control_slider; GtkWidget *control_auto; static int @@ -344,6 +344,9 @@ draw_controls() cairo_surface_destroy(status_surface); // Make a service to show status of controls, 32px high + if (gtk_widget_get_window(preview) == NULL) { + return; + } status_surface = gdk_window_create_similar_surface(gtk_widget_get_window(preview), CAIRO_CONTENT_COLOR_ALPHA, preview_width, 32); @@ -404,7 +407,7 @@ init_sensor(char *fn, int width, int height, int mbus, int rate) struct v4l2_subdev_format fmt = {}; fd = open(fn, O_RDWR); - g_printerr("Setting sensor rate to %d\n", rate); + g_print("Setting sensor rate to %d\n", rate); interval.pad = 0; interval.interval.numerator = 1; interval.interval.denominator = rate; @@ -413,10 +416,11 @@ init_sensor(char *fn, int width, int height, int mbus, int rate) errno_exit("VIDIOC_SUBDEV_S_FRAME_INTERVAL"); } - g_printerr("Driver returned %d/%d frameinterval\n", - interval.interval.numerator, interval.interval.denominator); + if (interval.interval.numerator != 1 || interval.interval.denominator != rate) + g_printerr("Driver chose %d/%d instead\n", + interval.interval.numerator, interval.interval.denominator); - g_printerr("Setting sensor to %dx%d fmt %d\n", + g_print("Setting sensor to %dx%d fmt %d\n", width, height, mbus); fmt.pad = 0; fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; @@ -428,10 +432,10 @@ init_sensor(char *fn, int width, int height, int mbus, int rate) if (xioctl(fd, VIDIOC_SUBDEV_S_FMT, &fmt) == -1) { errno_exit("VIDIOC_SUBDEV_S_FMT"); } - - g_printerr("Driver returned %dx%d fmt %d\n", - fmt.format.width, fmt.format.height, - fmt.format.code); + if (fmt.format.width != width || fmt.format.height != height || fmt.format.code != mbus) + g_printerr("Driver chose %dx%d fmt %d instead\n", + fmt.format.width, fmt.format.height, + fmt.format.code); // Trigger continuous auto focus if the sensor supports it if (v4l2_has_control(fd, V4L2_CID_FOCUS_AUTO)) { @@ -515,7 +519,7 @@ init_device(int fd) .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, }; if (current.width > 0) { - g_printerr("Setting camera to %dx%d fmt %d\n", + g_print("Setting camera to %dx%d fmt %d\n", current.width, current.height, current.fmt); fmt.fmt.pix.width = current.width; fmt.fmt.pix.height = current.height; @@ -527,20 +531,20 @@ init_device(int fd) show_error("Could not set camera mode"); return -1; } - - g_printerr("Driver returned %dx%d fmt %d\n", - fmt.fmt.pix.width, fmt.fmt.pix.height, - fmt.fmt.pix.pixelformat); + if (fmt.fmt.pix.width != current.width || + fmt.fmt.pix.height != current.height || + fmt.fmt.pix.pixelformat != current.fmt) + g_printerr("Driver returned %dx%d fmt %d\n", + fmt.fmt.pix.width, fmt.fmt.pix.height, + fmt.fmt.pix.pixelformat); /* Note VIDIOC_S_FMT may change width and height. */ } else { - g_printerr("Querying camera format\n"); - /* Preserve original settings as set by v4l2-ctl for example */ if (xioctl(fd, VIDIOC_G_FMT, &fmt) == -1) { errno_exit("VIDIOC_G_FMT"); } - g_printerr("Driver returned %dx%d fmt %d\n", + g_print("Got %dx%d fmt %d from the driver\n", fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.pixelformat); current.width = fmt.fmt.pix.width; @@ -784,7 +788,7 @@ process_image(const int *p, int size) g_object_unref(pixbuf); // Start post-processing the captured burst - g_printerr("Post process %s to %s.ext\n", burst_dir, fname_target); + g_print("Post process %s to %s.ext\n", burst_dir, fname_target); sprintf(command, "%s %s %s &", processing_script, burst_dir, fname_target); system(command); @@ -1109,7 +1113,6 @@ find_cameras() if (ret < 0) { break; } - printf("At node %s, (0x%x)\n", entity.name, entity.type); if (strncmp(entity.name, front_cam.dev_name, strlen(front_cam.dev_name)) == 0) { front_cam.entity_id = entity.id; find_dev_node(entity.dev.major, entity.dev.minor, front_cam.dev); @@ -1147,17 +1150,17 @@ find_media_fd() while ((dir = readdir(d)) != NULL) { if (strncmp(dir->d_name, "media", 5) == 0) { sprintf(fnbuf, "/dev/%s", dir->d_name); - printf("Checking %s\n", fnbuf); fd = open(fnbuf, O_RDWR); xioctl(fd, MEDIA_IOC_DEVICE_INFO, &mdi); - printf("Found media device: %s\n", mdi.driver); if (strcmp(mdi.driver, media_drv_name) == 0) { + printf("Found media device: %s (%s)\n", fnbuf, mdi.driver); media_fd = fd; return 0; } close(fd); } } + g_printerr("Could not find /dev/media* node matching '%s'\n", media_drv_name); return 1; } @@ -1228,18 +1231,18 @@ on_preview_tap(GtkWidget *widget, GdkEventButton *event, gpointer user_data) current_control = USER_CONTROL_ISO; gtk_label_set_text(GTK_LABEL(control_name), "ISO"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(control_auto), auto_gain); - gtk_adjustment_set_lower(GTK_ADJUSTMENT(control_slider), 0.0); - gtk_adjustment_set_upper(GTK_ADJUSTMENT(control_slider), (float)current.gain_max); - gtk_adjustment_set_value(GTK_ADJUSTMENT(control_slider), (double)gain); + gtk_adjustment_set_lower(control_slider, 0.0); + gtk_adjustment_set_upper(control_slider, (float)current.gain_max); + gtk_adjustment_set_value(control_slider, (double)gain); } else if (event->x > 60 && event->x < 120) { // Shutter angle current_control = USER_CONTROL_SHUTTER; gtk_label_set_text(GTK_LABEL(control_name), "Shutter"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(control_auto), auto_exposure); - gtk_adjustment_set_lower(GTK_ADJUSTMENT(control_slider), 1.0); - gtk_adjustment_set_upper(GTK_ADJUSTMENT(control_slider), 360.0); - gtk_adjustment_set_value(GTK_ADJUSTMENT(control_slider), (double)exposure); + gtk_adjustment_set_lower(control_slider, 1.0); + gtk_adjustment_set_upper(control_slider, 360.0); + gtk_adjustment_set_value(control_slider, (double)exposure); } return; @@ -1304,7 +1307,7 @@ on_control_auto_toggled(GtkToggleButton *widget, gpointer user_data) } else { v4l2_ctrl_set(fd, V4L2_CID_AUTOGAIN, 0); gain = v4l2_ctrl_get(fd, V4L2_CID_GAIN); - gtk_adjustment_set_value(GTK_ADJUSTMENT(control_slider), (double)gain); + gtk_adjustment_set_value(control_slider, (double)gain); } break; case USER_CONTROL_SHUTTER: @@ -1314,7 +1317,7 @@ on_control_auto_toggled(GtkToggleButton *widget, gpointer user_data) } else { v4l2_ctrl_set(fd, V4L2_CID_EXPOSURE_AUTO, V4L2_EXPOSURE_MANUAL); exposure = v4l2_ctrl_get(fd, V4L2_CID_EXPOSURE); - gtk_adjustment_set_value(GTK_ADJUSTMENT(control_slider), (double)exposure); + gtk_adjustment_set_value(control_slider, (double)exposure); } break; } @@ -1476,7 +1479,6 @@ main(int argc, char *argv[]) GtkBuilder *builder = gtk_builder_new_from_resource("/org/postmarketos/Megapixels/camera.glade"); GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); - GtkWidget *preview_box = GTK_WIDGET(gtk_builder_get_object(builder, "preview_box")); GtkWidget *shutter = GTK_WIDGET(gtk_builder_get_object(builder, "shutter")); GtkWidget *switch_btn = GTK_WIDGET(gtk_builder_get_object(builder, "switch_camera")); GtkWidget *settings_btn = GTK_WIDGET(gtk_builder_get_object(builder, "settings")); @@ -1491,7 +1493,7 @@ main(int argc, char *argv[]) thumb_last = GTK_WIDGET(gtk_builder_get_object(builder, "thumb_last")); control_box = GTK_WIDGET(gtk_builder_get_object(builder, "control_box")); control_name = GTK_WIDGET(gtk_builder_get_object(builder, "control_name")); - control_slider = GTK_WIDGET(gtk_builder_get_object(builder, "control_adj")); + control_slider = GTK_ADJUSTMENT(gtk_builder_get_object(builder, "control_adj")); control_auto = GTK_WIDGET(gtk_builder_get_object(builder, "control_auto")); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(shutter, "clicked", G_CALLBACK(on_shutter_clicked), NULL); @@ -1515,11 +1517,7 @@ main(int argc, char *argv[]) } else { gtk_css_provider_load_from_resource(provider, "/org/postmarketos/Megapixels/camera.css"); } - GtkStyleContext *context = gtk_widget_get_style_context(preview_box); - gtk_style_context_add_provider(context, - GTK_STYLE_PROVIDER(provider), - GTK_STYLE_PROVIDER_PRIORITY_USER); - context = gtk_widget_get_style_context(error_box); + GtkStyleContext *context = gtk_widget_get_style_context(error_box); gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);