Author: dzzinstant Date: Tue Jun 3 21:25:59 2014 New Revision: 13 URL: http://svn.gna.org/viewcvs/pidgin-zrtp?rev=13&view=rev Log: Handling of secondary streams fixed: audio+video calls work
Modified: trunk/Changelog trunk/src/zrtp-conf/zrtp-call.c trunk/src/zrtp-conf/zrtp-call.h Modified: trunk/Changelog URL: http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/Changelog?rev=13&r1=12&r2=13&view=diff ============================================================================== --- trunk/Changelog (original) +++ trunk/Changelog Tue Jun 3 21:25:59 2014 @@ -23,3 +23,5 @@ * pidgin-mediawindow.diff makes PidginMedia available for plugin, so ZRTP controlbox can be added to the PidginMedia window. Occasionally freezes Pidgin window! +* Handling of secondary streams fixed => audio+video calls work + Modified: trunk/src/zrtp-conf/zrtp-call.c URL: http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/src/zrtp-conf/zrtp-call.c?rev=13&r1=12&r2=13&view=diff ============================================================================== --- trunk/src/zrtp-conf/zrtp-call.c (original) +++ trunk/src/zrtp-conf/zrtp-call.c Tue Jun 3 21:25:59 2014 @@ -94,6 +94,11 @@ static GstElement* create_zrtpfilter(ZrtpCall *self, guint id); +static void +zrtp_status (GstElement *element, gint severity, gint subCode, gpointer data); +static void +zrtp_slaveStatus (GstElement *element, gint severity, gint subCode, gpointer data); + static GstPad* get_zrtppad(ZrtpCall *self, guint sess_id, gboolean is_recv, gboolean is_rtp, gboolean is_src); @@ -194,8 +199,7 @@ { GstElement *zrtpfilter; - g_object_get(self, - "zrtpmaster", &zrtpfilter, NULL); + g_object_get(self, "zrtpmaster", &zrtpfilter, NULL); return zrtpfilter; } /* ** */ @@ -466,24 +470,42 @@ }; static void -zrtp_connect_slave_cb (GstElement *element, gpointer data) { +connect_slave (ZrtpCall *self, GstElement *element) { + GstElement *zrtpmaster = find_master(self); GByteArray *mspArr = NULL; - ZrtpCall *self = ZRTP_CALL(data); - ZrtpCallPrivate *priv = ZRTP_CALL_GET_PRIVATE(self); - GstElement *zrtpmaster = find_master(self); - - if (!element || !zrtpmaster) - return; + guint32 masterssrc, slavessrc; + gulong signal_id; + g_return_if_fail(GST_IS_ELEMENT(zrtpmaster)); + g_return_if_fail(GST_IS_ELEMENT(element)); + + signal_id = g_signal_handler_find(G_OBJECT(element), + G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, + NULL, G_CALLBACK(zrtp_status), self); + g_signal_handler_disconnect(G_OBJECT(element), signal_id); + g_signal_connect(G_OBJECT(element), + "status", G_CALLBACK(zrtp_slaveStatus), self); g_object_get(G_OBJECT(zrtpmaster), "multi-param", &mspArr, NULL); - DEBUG_ZRTPCALL(self, "connect_slave_cb(zrtpfilter=%p): zrtpmaster=%p Application pointers %p, %d bytes", + DEBUG_ZRTPCALL(self, "connect_slave(zrtpfilter=%p): zrtpmaster=%p Application pointers %p, %d bytes", element, zrtpmaster, mspArr->data, mspArr->len); - g_object_set(G_OBJECT(element), + g_object_set(G_OBJECT(element), "multi-param", mspArr, - "enable", priv->do_enable, - "start", priv->do_enable, + "enable", TRUE, NULL); + + g_object_get(G_OBJECT(zrtpmaster), "local-ssrc", &masterssrc, NULL); + g_object_get(G_OBJECT(element), "local-ssrc", &slavessrc, NULL); + if (slavessrc == masterssrc) + DEBUG_ZRTPCALL(self, "connect_slave(zrtpfilter=%p): Same SSRC=0x%08x!", + element, slavessrc); +} + +static void +zrtp_slaveStatus (GstElement *element, gint severity, gint subCode, gpointer data) +{ + DEBUG_ZRTPCALL(NULL, "_slaveStatus(filter=%p): Called with severity=%d, subCode=%d", + element, severity, subCode); } static void @@ -496,51 +518,48 @@ case ZRTPINFO_HelloReceived: // TODO: move to an unambiguous point between // "stream-info": NEW_STREAM and the first "new-zrtpfilter" - g_signal_emit_by_name(priv->conference, "new-zrtpcall", - self); - break; + if (!find_master(self)) + g_signal_emit_by_name(priv->conference, "new-zrtpcall", + self); + break; + case ZRTPINFO_InitConf1Received: case ZRTPINFO_RespConf2Received: case ZRTPINFO_RSMatchFound: - { - /* First zrtpfilter that establishes an encrypted connection will become master */ if (!find_master(self)) { + /* First zrtpfilter that establishes an encrypted connection */ zrtp_call_set_master(self, element); + /* Exclude zrtpmaster from pendinglist */ + self->zrtp_pending = g_list_remove(self->zrtp_pending, element); - DEBUG_ZRTPCALL(self, - "_statusInfo(): emit 'new-zrtpmaster': participant=%s", - priv->participant); g_signal_emit_by_name(priv->conference, "new-zrtpmaster", self); - - /* Exclude zrtpmaster from pendinglist */ - self->zrtp_pending = g_list_remove(self->zrtp_pending, element); - } break; - } + case ZRTPINFO_SecureStateOn: - { + { GList *link; DEBUG_ZRTPCALL(self, "_handleInfo(filter=%p): security is set to on (subCode=%d)", - element, subCode); + element, subCode); zrtp_call_set_state(self, ZRTPSTATE_ENCRYPTED); - + DEBUG_ZRTPCALL(self, "_statusInfo(): Iterate through all %d slave elements", g_list_length(self->zrtp_pending)); for (link = g_list_first(self->zrtp_pending); link; link = g_list_delete_link(link, link)) { - GstElement *slave = link->data; - zrtp_connect_slave_cb(slave, self); + connect_slave(self, GST_ELEMENT(link->data)); } break; } case ZRTPINFO_SecureStateOff: - zrtp_call_set_state(self, ZRTPSTATE_CLEAR); + zrtp_call_set_state(self, ZRTPSTATE_CONFIGURED); zrtp_call_set_master(self, NULL); + DEBUG_ZRTPCALL(self, "_handleInfo(filter=%p): security is set to off (subCode=%d)", - element, subCode); + element, subCode); + break; default: break; } @@ -579,8 +598,8 @@ void zrtp_signals_connect(ZrtpCall *self, GstElement *zrtp) { - g_signal_connect(zrtp, "status", G_CALLBACK(zrtp_status), self); - g_signal_connect(zrtp, "sas", G_CALLBACK(zrtp_sas), self); + g_signal_connect(zrtp, "status", G_CALLBACK(zrtp_status), self); + g_signal_connect(zrtp, "sas", G_CALLBACK(zrtp_sas), self); g_signal_connect(zrtp, "algorithm", G_CALLBACK(zrtp_algorithm), self); } /* */ @@ -622,12 +641,12 @@ /* Copy mspArr directly if zrtp master has already set up encryption */ if (self->zrtp_state == ZRTPSTATE_ENCRYPTED) { - zrtp_connect_slave_cb(zrtpfilter, self); + connect_slave(self, zrtpfilter); } else { self->zrtp_pending = g_list_append(self->zrtp_pending, zrtpfilter); DEBUG_ZRTPCALL(self, - "create_zrtpfilter(): Added (id=%d, participant=%s) to pending list (now %d elements)", - id, priv->participant, g_list_length(self->zrtp_pending) ); + "create_zrtpfilter(): %p (id=%d, participant=%s) to pending list (now %d elements)", + zrtpfilter, id, priv->participant, g_list_length(self->zrtp_pending) ); } zrtpfilter_configure(self, id); @@ -672,18 +691,18 @@ GstElement *zrtpfilter = find_zrtpfilter(self, id); if (self->zrtp_state == ZRTPSTATE_INIT) { - // First zrtpfilter may start negotiation + /* Only first zrtpfilter may start negotiation */ g_object_set(G_OBJECT(zrtpfilter), "cache-name", priv->cachename, "enable", priv->do_enable, "initialize", priv->do_initialize, NULL); - zrtp_call_set_state(self, ZRTPSTATE_CLEAR); + zrtp_call_set_state(self, ZRTPSTATE_CONFIGURED); } else { g_object_set(G_OBJECT(zrtpfilter), - "cache-name", priv->cachename, + "cache-name", priv->cachename, "enable", priv->do_enable, - "start", priv->do_enable, + "initialize", FALSE, NULL); } } Modified: trunk/src/zrtp-conf/zrtp-call.h URL: http://svn.gna.org/viewcvs/pidgin-zrtp/trunk/src/zrtp-conf/zrtp-call.h?rev=13&r1=12&r2=13&view=diff ============================================================================== --- trunk/src/zrtp-conf/zrtp-call.h (original) +++ trunk/src/zrtp-conf/zrtp-call.h Tue Jun 3 21:25:59 2014 @@ -36,7 +36,7 @@ enum ZrtpState { ZRTPSTATE_NONE = 0, ZRTPSTATE_INIT, - ZRTPSTATE_CLEAR, + ZRTPSTATE_CONFIGURED, ZRTPSTATE_ENCRYPTED, }; _______________________________________________ Pidgin-zrtp-commits mailing list Pidgin-zrtp-commits@gna.org https://mail.gna.org/listinfo/pidgin-zrtp-commits