Un des objectifs de Jakopter est de faciliter l’intégration de traitements utilisateur pour le flux vidéo du drone. Jakopter n’a pas actuellement de système de plugins.
Un traitement peut être intégré via un callback, qui est appelé à chaque fois qu’une image provenant du drone est décodée.
Actuellement, pour utiliser votre propre traitement, vous devez remplacer le pointeur de fonction frame_processing_callback dans le fichier source video.c, en y affectant votre propre fonction. Le callback est par défaut affecté à l’affichage direct du flux vidéo ainsi que des informations de vol en overlay ; une solution simple pour conserver l’affichage tout en effectuant votre traitement est d’utiliser une fonction intermédiaire, qui appelle dans l’ordre souhaité votre fonction et la fonction video_display_frame.
Le callback met 4 paramètres à votre disposition :
- Le buffer contenant l’image brute, non compressée, au format YUV420p (planaire), avec chaque composante codée sur 8 bits.
- La largeur de l’image.
- La hauteur de l’image.
- La taille totale, en octets, de l’image.
Comme dit précédemment, ce callback est appelé par Jakopter à chaque fois qu’une image du flux vidéo est décodée, en renseignant ces paramètres. À noter :
- La largeur et la hauteur de l’image (et donc sa taille totale) peuvent varier, si l’utilisateur en fait la demande au drone via l’envoi d’une commande de configuration.
- Le buffer contenant l’image devrait être considéré comme invalide après le retour du callback. Si vous en avez besoin au-delà, vous devrez le copier.
- Jakopter ne peut actuellement décoder que les flux vidéo h264 du drone. Nous n’avons pas jugé prioritaire de prendre en charge les autres formats possibles.
Deux autres pointeurs de fonction, frame_processing_init et frame_processing_clean, peuvent être utilisés si vous avez besoin d’initialisation/destruction pour votre callback de traitement. Notez cependant que frame_processing_init est appelé depuis un thread différent de celui qui appelle frame_processing_callback et frame_processing_clean. Nous devrions changer cela prochainement, pour que les trois fonctions soient appelées depuis le même thread.