static int do_handle_out(int fd, buffers &b, FILE *fin, unsigned &count, unsigned &last, struct timeval &tv_last) { struct v4l2_plane planes[VIDEO_MAX_PLANES]; struct v4l2_buffer buf; int ret; memset(&buf, 0, sizeof(buf)); memset(planes, 0, sizeof(planes)); buf.type = b.type; buf.memory = b.memory; if (b.is_mplane) { buf.m.planes = planes; buf.length = VIDEO_MAX_PLANES; } ret = test_ioctl(fd, VIDIOC_DQBUF, &buf); if (ret < 0 && errno == EAGAIN) return 0; if (ret < 0) { fprintf(stderr, "%s: failed: %s\n", "VIDIOC_DQBUF", strerror(errno)); return -1; } if (fin && !fill_buffer_from_file(b, buf.index, fin)) return -1; if (b.is_mplane) { for (unsigned j = 0; j < buf.length; j++) buf.m.planes[j].bytesused = buf.m.planes[j].length; } else { buf.bytesused = buf.length; } if (test_ioctl(fd, VIDIOC_QBUF, &buf)) return -1; fprintf(stderr, ">"); fflush(stderr); if (count == 0) { gettimeofday(&tv_last, NULL); } else { struct timeval tv_cur, res; gettimeofday(&tv_cur, NULL); timersub(&tv_cur, &tv_last, &res); if (res.tv_sec) { unsigned fps = (100 * (count - last)) / (res.tv_sec * 100 + res.tv_usec / 10000); last = count; tv_last = tv_cur; fprintf(stderr, " %d fps\n", fps); } } count++; if (stream_count == 0) return 0; if (--stream_count == 0) return -1; return 0; }
static void do_setup_out_buffers(int fd, buffers &b, FILE *fin) { struct v4l2_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = b.type; doioctl(fd, VIDIOC_G_FMT, &fmt); if (!precalculate_bars(fmt.fmt.pix.pixelformat, stream_pat)) { fprintf(stderr, "unsupported pixelformat\n"); return; } for (unsigned i = 0; i < b.bcount; i++) { struct v4l2_plane planes[VIDEO_MAX_PLANES]; struct v4l2_buffer buf; memset(&buf, 0, sizeof(buf)); memset(planes, 0, sizeof(planes)); buf.type = b.type; buf.memory = b.memory; buf.index = i; if (b.is_mplane) { buf.m.planes = planes; buf.length = VIDEO_MAX_PLANES; } if (doioctl(fd, VIDIOC_QUERYBUF, &buf)) return; if (b.is_mplane) { b.num_planes = buf.length; for (unsigned j = 0; j < b.num_planes; j++) { struct v4l2_plane &p = b.planes[i][j]; p.length = planes[j].length; buf.m.planes[j].bytesused = planes[j].length; if (b.memory == V4L2_MEMORY_MMAP) { b.bufs[i][j] = mmap(NULL, p.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, planes[j].m.mem_offset); if (b.bufs[i][j] == MAP_FAILED) { fprintf(stderr, "mmap failed\n"); return; } } else { b.bufs[i][j] = calloc(1, p.length); planes[j].m.userptr = (unsigned long)b.bufs[i][j]; } } // TODO fill_buffer_mp(bufs[i], &fmt.fmt.pix_mp); if (fin) fill_buffer_from_file(b, buf.index, fin); } else { b.num_planes = 1; b.planes[i][0].length = buf.length; buf.bytesused = buf.length; if (b.memory == V4L2_MEMORY_MMAP) { b.bufs[i][0] = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (b.bufs[i][0] == MAP_FAILED) { fprintf(stderr, "mmap failed\n"); return; } } else { b.bufs[i][0] = calloc(1, buf.length); buf.m.userptr = (unsigned long)b.bufs[i][0]; } if (!fin || !fill_buffer_from_file(b, buf.index, fin)) fill_buffer(b.bufs[i][0], &fmt.fmt.pix); } if (doioctl(fd, VIDIOC_QBUF, &buf)) return; } }
GtkWidget * text_create_widget (GtkWidget * dlg) { GtkWidget *w; w = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); text_view = gtk_text_view_new (); gtk_widget_set_name (text_view, "yad-text-widget"); text_buffer = gtk_text_buffer_new (NULL); gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), text_buffer); gtk_text_view_set_justification (GTK_TEXT_VIEW (text_view), options.text_data.justify); gtk_text_view_set_left_margin (GTK_TEXT_VIEW (text_view), options.text_data.margins); gtk_text_view_set_right_margin (GTK_TEXT_VIEW (text_view), options.text_data.margins); gtk_text_view_set_editable (GTK_TEXT_VIEW (text_view), options.common_data.editable); if (!options.common_data.editable) gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE); if (options.text_data.wrap) gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), GTK_WRAP_WORD_CHAR); if (options.text_data.fore) { #if GTK_CHECK_VERSION(3,0,0) GdkRGBA clr; if (gdk_rgba_parse (&clr, options.text_data.fore)) gtk_widget_override_color (text_view, GTK_STATE_FLAG_NORMAL, &clr); #else GdkColor clr; if (gdk_color_parse (options.text_data.fore, &clr)) gtk_widget_modify_text (text_view, GTK_STATE_NORMAL, &clr); #endif } if (options.text_data.back) { #if GTK_CHECK_VERSION(3,0,0) GdkRGBA clr; if (gdk_rgba_parse (&clr, options.text_data.fore)) gtk_widget_override_background_color (text_view, GTK_STATE_FLAG_NORMAL, &clr); #else GdkColor clr; if (gdk_color_parse (options.text_data.back, &clr)) gtk_widget_modify_base (text_view, GTK_STATE_NORMAL, &clr); #endif } if (options.common_data.font) { PangoFontDescription *fd = pango_font_description_from_string (options.common_data.font); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_override_font (text_view, fd); #else gtk_widget_modify_font (text_view, fd); #endif pango_font_description_free (fd); } /* Add submit on ctrl+enter */ g_signal_connect (text_view, "key-press-event", G_CALLBACK (key_press_cb), dlg); /* Initialize linkifying */ if (options.text_data.uri) { GRegex *regex; regex = g_regex_new (YAD_URL_REGEX, G_REGEX_CASELESS | G_REGEX_OPTIMIZE | G_REGEX_EXTENDED, G_REGEX_MATCH_NOTEMPTY, NULL); /* Create text tag for URI */ tag = gtk_text_buffer_create_tag (text_buffer, NULL, "foreground", "blue", "underline", PANGO_UNDERLINE_SINGLE, NULL); g_object_set_data (G_OBJECT (tag), "is_link", GINT_TO_POINTER (1)); g_signal_connect (G_OBJECT (tag), "event", G_CALLBACK (tag_event_cb), NULL); /* Create cursors */ hand = gdk_cursor_new (GDK_HAND2); normal= gdk_cursor_new (GDK_XTERM); g_signal_connect (G_OBJECT (text_view), "motion-notify-event", G_CALLBACK (motion_cb), NULL); g_signal_connect_after (G_OBJECT (text_buffer), "changed", G_CALLBACK (linkify_cb), regex); } gtk_container_add (GTK_CONTAINER (w), text_view); if (options.common_data.uri) fill_buffer_from_file (); else fill_buffer_from_stdin (); return w; }