Salut à tous,
Je travaille sur un serveur rtsp en utilisant la bibliotheque "gst-rtsp-server" qui utilise gstreamer qui utilise la glib.
Pour les besoins de mon appli, je souhaite récupérer des events comme "start playing", "stop playing", "media created", etc etc etc.
Ces évènements sont lancé par des "g_signal_emit" et je les récupère au moyen de callback enregistré avec "g_signal_connect".
L'appel des callback fonctionnent bien, mais j'ai des incohérences sur les paramètres.
Dans mon main, j'enregistre un callback pour le signal "media-configure" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part g_signal_connect (G_OBJECT (factory), "media-configure", G_CALLBACK (callback_media_configured), NULL);
Mon callback se présente sous la forme :
Pour vérifier, j'ai ajouté du debug juste avant et juste après les "g_signal_emit" pour afficher les adresses et valeurs des paramètres que je souhaite récupérer. Ceux ci sont bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void callback_media_configured(GstRTSPMediaFactory *factory, GstRTSPMedia *media, gpointer *userdata) { fprintf(stderr, "media ptr:%p (dans le callback)\n", media); // Affiche l'adresse du pointeur de la structure qui mintéresse fprintf(stderr, "media element ptr:%p (dans le callback)\n", media->element); // Affiche NULL alors que ca ne devrait pas. g_signal_connect (G_OBJECT (media), "new-state", G_CALLBACK (callback_media_new_state), NULL); } void callback_media_new_state(GstRTSPMedia *media, gpointer *ptr, int state) { // Retourne une valeur incohérente. fprintf(stderr, "new state = %d (dans le callback)\n", media, state); }
Si on déroule le programme, ça affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 - "media ptr:0x850f42a6 (avant le emit)" // OK - "media element ptr:0x85c245da (avant le emit)" // OK - "media ptr:0x850f42a6 (dans le callback)" // OK - "media element ptr:null(dans le callback)" // NOK - "media ptr:0x850f42a6 (après le emit)" // OK - "media element ptr:0x85c245da (après le emit)" // OK - "new state = 2 (avant emit)" // OK - "new state = 154248524 (dans le callback)" // WTF - "new state = 2 (après le emit)" // OK
Bref, je n'arrive pas à comprendre :
- Comment dans le callback "callback_media_configured" l'adresse du pointeur de la structure que je récupère est bonne mais pas certain de ses champs.
- Comment un INT peut se transformer en n'importe quoi dans le callback "new-state".
Edit: Pour info, voici comment se présentes les signaux et leurs emits :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE] = g_signal_new ("media-configure", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaFactoryClass, media_configure), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_RTSP_MEDIA); g_signal_emit (factory, gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE], 0, media, NULL); gst_rtsp_media_signals[SIGNAL_NEW_STATE] = g_signal_new ("new-state", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaClass, new_state), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 0, G_TYPE_INT); int state = 2; g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_NEW_STATE], 0, state, NULL);
Partager