C, GTK: affichage du stream d’images RVB à <60 i / s

Je développe une application qui doit recevoir des images d’un appareil photo et les afficher dans une fenêtre GTK.

La caméra fournit des images RVB brutes (3 octets par pixel, sans canal alpha, taille fixe) à une cadence de prise de vue variable (1-50 i / s).

J’ai déjà fait tout ce matériel et j’ai maintenant une fonction de rappel qui est appelée à chaque nouvelle image capturée par la caméra.

Quel est le moyen le plus simple mais suffisamment rapide d’afficher ces images dans ma fenêtre?

Voici ce que j’ai déjà essayé:

  • utiliser gdk_draw_rgb_image() sur une zone de dessin gtk: fonctionnait en principe, mais était si lent que les processus de dessin se chevauchaient et que l’application s’effondrait après les premières images, même à un taux de capture de 1 fps.

  • allouer un GdkPixbuf pour chaque nouvelle image et appeler gtk_image_set_from_pixbuf() sur un widget d’image gtk: affiche uniquement la première image, puis je ne vois aucun changement dans la fenêtre. Peut-être un bug dans mon code, mais je ne sais pas si cela sera assez rapide.

  • utiliser Cairo ( cairo_set_source_surface() , puis cairo_paint() ): semblait assez rapide, mais l’image semblait ssortingée, je ne sais pas si le format de l’image est compatible.

Actuellement, je songe à essayer quelque chose comme Gstreamer et à traiter ces images comme un stream vidéo, mais je ne suis pas sûr que cela ressemble à une surcharge de mon mécanisme simple.

Merci d’avance pour tout conseil!

    L’ensemble de l’API GdkRGB semble être obsolète, ce n’est donc probablement pas la solution recommandée.

    Il en va de même pour l’appel à rendre un pixbuf . La documentation là-bas pointe au Caire, donc la solution semble être de continuer à rechercher pourquoi votre image a semblé incorrecte lorsqu’elle a été rendue par Cairo.

    la détente est juste, le caire est la voie à suivre si vous voulez quelque chose qui fonctionnera dans GTK2 et GTK3. Comme vos échantillons sont RVB sans alpha, vous devez utiliser le format CAIRO_FORMAT_RGB24 . Assurez-vous que la surface que vous peignez est dans ce format. Essayez également de vous assurer que vous n’allouez / détruisez pas constamment le tampon de surface si l’image d’entrée conserve la même taille.