Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C, GTK: display stream of RGB images at < 60 fps

Tags:

c

stream

rgb

gtk

I'm developing an application that shall receive images from a camera device and display them in a GTK window.

The camera delivers raw RGB images (3 bytes per pixel, no alpha channel, fixed size) at a varying frame rate (1-50 fps).

I've already done all that hardware stuff and now have a callback function that gets called with every new image captured by the camera.

What is the easyest but fast enough way to display those images in my window?

Here's what I already tried:

  • using gdk_draw_rgb_image() on a gtk drawing area: basically worked, but rendered so slow that the drawing processes overlapped and the application crashed after the first few frames, even at 1 fps capture rate.

  • allocating a GdkPixbuf for each new frame and calling gtk_image_set_from_pixbuf() on a gtk image widget: only displays the first frame, then I see no change in the window. May be a bug in my code, but don't know if that will be fast enough.

  • using Cairo (cairo_set_source_surface(), then cairo_paint()): seemed pretty fast, but the image looked striped, don't know if the image format is compatible.

Currently I'm thinking about trying something like gstreamer and treating those images like a video stream, but I'm not sure whether this is like an overkill for my simple mechanism.

Thanks in advance for any advice!

like image 695
lynix Avatar asked Jan 13 '12 10:01

lynix


2 Answers

The entire GdkRGB API seems to be deprecated, so that's probably not the recommended way to solve this.

The same goes for the call to render a pixbuf. The documentation there points at Cairo, so the solution seems to be to continue investigating why your image looked incorrect when rendered by Cairo.

like image 104
unwind Avatar answered Oct 05 '22 03:10

unwind


unwind is right, cairo is the way to go if you want something that will work in GTK2 and GTK3. As your samples are RGB without alpha, you should use the CAIRO_FORMAT_RGB24 format. Make sure the surface you paint is in that format. Also try to make sure that you're not constantly allocating/destroying the surface buffer if the input image keeps the same size.

like image 26
liberforce Avatar answered Oct 05 '22 03:10

liberforce