[Pkg-voip-commits] [janus] 04/282: Removed info string, cleaned up a bit, and refactored code to limit reduncancy

Jonas Smedegaard dr at jones.dk
Wed Dec 20 21:53:21 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to annotated tag debian/0.2.6-1
in repository janus.

commit d072629cb45bb5f3675ddeff4aec5d9868c174fc
Author: Lorenzo Miniero <lminiero at gmail.com>
Date:   Thu Mar 2 13:12:51 2017 +0100

    Removed info string, cleaned up a bit, and refactored code to limit reduncancy
---
 html/nosiptest.js     |   8 +-
 plugins/janus_nosip.c | 462 +++++++++++++++++++-------------------------------
 2 files changed, 180 insertions(+), 290 deletions(-)

diff --git a/html/nosiptest.js b/html/nosiptest.js
index dcedd16..c9c9825 100644
--- a/html/nosiptest.js
+++ b/html/nosiptest.js
@@ -106,8 +106,7 @@ $(document).ready(function() {
 													// the SIP plugin uses (mandatory vs. optional). We'll
 													// get the result in an event called "generated" here.
 													var body = {
-														request: "generate",
-														info: "something-meaningful-about-the-caller"
+														request: "generate"
 													};
 													caller.send({message: body, jsep: jsep});
 												},
@@ -173,11 +172,10 @@ $(document).ready(function() {
 											// the callee handle it as if it arrived via signalling
 											var sdp = result["sdp"];
 											$('#localsdp').text(
-												"[" + result["type"] + "][" + result["info"] + "]\n" + sdp);
+												"[" + result["type"] + "]\n" + sdp);
 											// This will result in a "processed" event on the callee handle
 											var processOffer = {
 												request: "process",
-												info: "something-meaningful-about-the-callee",
 												type: result["type"],
 												sdp: result["sdp"]
 											}
@@ -362,7 +360,7 @@ $(document).ready(function() {
 											// the caller handle it as if it arrived via signalling
 											var sdp = result["sdp"];
 											$('#remotesdp').text(
-												"[" + result["type"] + "][" + result["info"] + "]\n" + sdp);
+												"[" + result["type"] + "]\n" + sdp);
 											// This will result in a "processed" event on the caller handle
 											var processAnswer = {
 												request: "process",
diff --git a/plugins/janus_nosip.c b/plugins/janus_nosip.c
index 634aaea..756bf0f 100644
--- a/plugins/janus_nosip.c
+++ b/plugins/janus_nosip.c
@@ -261,7 +261,6 @@ typedef struct janus_nosip_media {
 
 typedef struct janus_nosip_session {
 	janus_plugin_session *handle;
-	char *info;					/* Opaque identifier that the application can set */
 	janus_nosip_media media;	/* Media gatewaying stuff (same stuff as the SIP plugin) */
 	janus_sdp *sdp;				/* The SDP this user sent */
 	janus_recorder *arc;		/* The Janus recorder instance for this user's audio, if enabled */
@@ -427,21 +426,6 @@ static int janus_nosip_allocate_local_ports(janus_nosip_session *session);
 static void *janus_nosip_relay_thread(void *data);
 
 
-/* Random string helper (in case user doesn't provide opaque info) */
-static char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-static void janus_nosip_random_string(int length, char *buffer) {
-	if(length > 0 && buffer) {
-		int l = (int)(sizeof(charset)-1);
-		int i=0;
-		for(i=0; i<length; i++) {
-			int key = rand() % l;
-			buffer[i] = charset[key];
-		}
-		buffer[length-1] = '\0';
-	}
-}
-
-
 /* Error codes */
 #define JANUS_NOSIP_ERROR_UNKNOWN_ERROR			499
 #define JANUS_NOSIP_ERROR_NO_MESSAGE			440
@@ -474,14 +458,12 @@ static void *janus_nosip_watchdog(void *data) {
 					sl = sl->next;
 					continue;
 				}
-				if (now-session->destroyed >= 5*G_USEC_PER_SEC) {
+				if(now-session->destroyed >= 5*G_USEC_PER_SEC) {
 					/* We're lazy and actually get rid of the stuff only after a few seconds */
 					JANUS_LOG(LOG_VERB, "Freeing old NoSIP session\n");
 					GList *rm = sl->next;
 					old_sessions = g_list_delete_link(old_sessions, sl);
 					sl = rm;
-					g_free(session->info);
-					session->info = NULL;
 					janus_sdp_free(session->sdp);
 					session->sdp = NULL;
 					g_free(session->media.remote_ip);
@@ -509,17 +491,17 @@ static void janus_nosip_detect_local_ip(char *buf, size_t buflen) {
 	struct sockaddr_in addr;
 	socklen_t len;
 	int fd = socket(AF_INET, SOCK_DGRAM, 0);
-	if (fd == -1)
+	if(fd == -1)
 		goto error;
 	addr.sin_family = AF_INET;
 	addr.sin_port = htons(1);
 	inet_pton(AF_INET, "1.2.3.4", &addr.sin_addr.s_addr);
-	if (connect(fd, (const struct sockaddr*) &addr, sizeof(addr)) < 0)
+	if(connect(fd, (const struct sockaddr*) &addr, sizeof(addr)) < 0)
 		goto error;
 	len = sizeof(addr);
-	if (getsockname(fd, (struct sockaddr*) &addr, &len) < 0)
+	if(getsockname(fd, (struct sockaddr*) &addr, &len) < 0)
 		goto error;
-	if (getnameinfo((const struct sockaddr*) &addr, sizeof(addr),
+	if(getnameinfo((const struct sockaddr*) &addr, sizeof(addr),
 			buf, buflen,
 			NULL, 0, NI_NUMERICHOST) != 0)
 		goto error;
@@ -527,7 +509,7 @@ static void janus_nosip_detect_local_ip(char *buf, size_t buflen) {
 	return;
 
 error:
-	if (fd != -1)
+	if(fd != -1)
 		close(fd);
 	JANUS_LOG(LOG_VERB, "Couldn't find any address! using 127.0.0.1 as the local IP... (which is NOT going to work out of your machine)\n");
 	g_strlcpy(buf, "127.0.0.1", buflen);
@@ -557,19 +539,19 @@ int janus_nosip_init(janus_callbacks *callback, const char *config_path) {
 		janus_config_item *item = janus_config_get_item_drilldown(config, "general", "local_ip");
 		if(item && item->value) {
 			int family;
-			if (!janus_is_ip_valid(item->value, &family)) {
+			if(!janus_is_ip_valid(item->value, &family)) {
 				JANUS_LOG(LOG_WARN, "Invalid local IP specified: %s, guessing the default...\n", item->value);
 			} else {
 				/* Verify that we can actually bind to that address */
 				int fd = socket(family, SOCK_DGRAM, 0);
-				if (fd == -1) {
+				if(fd == -1) {
 					JANUS_LOG(LOG_WARN, "Error creating test socket, falling back to detecting IP address...\n");
 				} else {
 					int r;
 					struct sockaddr_storage ss;
 					socklen_t addrlen;
 					memset(&ss, 0, sizeof(ss));
-					if (family == AF_INET) {
+					if(family == AF_INET) {
 						struct sockaddr_in *addr4 = (struct sockaddr_in*)&ss;
 						addr4->sin_family = AF_INET;
 						addr4->sin_port = 0;
@@ -584,7 +566,7 @@ int janus_nosip_init(janus_callbacks *callback, const char *config_path) {
 					}
 					r = bind(fd, (const struct sockaddr*)&ss, addrlen);
 					close(fd);
-					if (r < 0) {
+					if(r < 0) {
 						JANUS_LOG(LOG_WARN, "Error setting local IP address to %s, falling back to detecting IP address...\n", item->value);
 					} else {
 						g_strlcpy(local_ip, item->value, sizeof(local_ip));
@@ -593,7 +575,7 @@ int janus_nosip_init(janus_callbacks *callback, const char *config_path) {
 				}
 			}
 		}
-		if (!local_ip_set)
+		if(!local_ip_set)
 			janus_nosip_detect_local_ip(local_ip, sizeof(local_ip));
 		JANUS_LOG(LOG_WARN, "Local IP set to %s\n", local_ip);
 
@@ -703,7 +685,6 @@ void janus_nosip_create_session(janus_plugin_session *handle, int *error) {
 	}
 	janus_nosip_session *session = g_malloc0(sizeof(janus_nosip_session));
 	session->handle = handle;
-	session->info = NULL;
 	session->sdp = NULL;
 	session->media.remote_ip = NULL;
 	session->media.ready = 0;
@@ -787,7 +768,7 @@ void janus_nosip_destroy_session(janus_plugin_session *handle, int *error) {
 		g_hash_table_remove(sessions, handle);
 		janus_nosip_hangup_media(handle);
 		session->destroyed = janus_get_monotonic_time();
-		JANUS_LOG(LOG_VERB, "Destroying NoSIP session (%s)...\n", session->info);
+		JANUS_LOG(LOG_VERB, "Destroying NoSIP session (%p)...\n", session);
 		/* Cleaning up and removing the session is done in a lazy way */
 		old_sessions = g_list_append(old_sessions, session);
 	}
@@ -806,7 +787,6 @@ json_t *janus_nosip_query_session(janus_plugin_session *handle) {
 	}
 	/* Provide some generic info, e.g., if we're in a call and with whom */
 	json_t *info = json_object();
-	json_object_set_new(info, "info", session->info ? json_string(session->info) : NULL);
 	if(session->sdp) {
 		json_object_set_new(info, "srtp-required", json_string(session->media.require_srtp ? "yes" : "no"));
 		json_object_set_new(info, "sdes-local", json_string(session->media.has_srtp_local ? "yes" : "no"));
@@ -867,73 +847,46 @@ void janus_nosip_incoming_rtp(janus_plugin_session *handle, int video, char *buf
 			return;
 		}
 		/* Forward to our NoSIP peer */
-		if(video) {
-			if(!session->media.video_send) {
-				/* Dropping video packet, peer doesn't want to receive it */
-				return;
-			}
-			if(session->media.video_ssrc == 0) {
-				rtp_header *header = (rtp_header *)buf;
+		if((video && !session->media.video_send) || (!video && !session->media.audio_send)) {
+			/* Dropping packet, peer doesn't want to receive it */
+			return;
+		}
+		if((video && session->media.video_ssrc == 0) || (!video && session->media.audio_ssrc == 0)) {
+			rtp_header *header = (rtp_header *)buf;
+			if(video) {
 				session->media.video_ssrc = ntohl(header->ssrc);
-				JANUS_LOG(LOG_VERB, "Got NoSIP video SSRC: %"SCNu32"\n", session->media.video_ssrc);
-			}
-			if(session->media.has_video && session->media.video_rtp_fd) {
-				/* Save the frame if we're recording */
-				janus_recorder_save_frame(session->vrc, buf, len);
-				/* Is SRTP involved? */
-				if(session->media.has_srtp_local) {
-					char sbuf[2048];
-					memcpy(&sbuf, buf, len);
-					int protected = len;
-					int res = srtp_protect(session->media.video_srtp_out, &sbuf, &protected);
-					if(res != srtp_err_status_ok) {
-						rtp_header *header = (rtp_header *)&sbuf;
-						guint32 timestamp = ntohl(header->timestamp);
-						guint16 seq = ntohs(header->seq_number);
-						JANUS_LOG(LOG_ERR, "[NoSIP-%s] Video SRTP protect error... %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")...\n",
-							session->info, janus_nosip_get_srtp_error(res), len, protected, timestamp, seq);
-					} else {
-						/* Forward the frame to the peer */
-						send(session->media.video_rtp_fd, sbuf, protected, 0);
-					}
-				} else {
-					/* Forward the frame to the peer */
-					send(session->media.video_rtp_fd, buf, len, 0);
-				}
-			}
-		} else {
-			if(!session->media.audio_send) {
-				/* Dropping audio packet, peer doesn't want to receive it */
-				return;
-			}
-			if(session->media.audio_ssrc == 0) {
-				rtp_header *header = (rtp_header *)buf;
+			} else {
 				session->media.audio_ssrc = ntohl(header->ssrc);
-				JANUS_LOG(LOG_VERB, "Got NoSIP audio SSRC: %"SCNu32"\n", session->media.audio_ssrc);
 			}
-			if(session->media.has_audio && session->media.audio_rtp_fd) {
-				/* Save the frame if we're recording */
-				janus_recorder_save_frame(session->arc, buf, len);
-				/* Is SRTP involved? */
-				if(session->media.has_srtp_local) {
-					char sbuf[2048];
-					memcpy(&sbuf, buf, len);
-					int protected = len;
-					int res = srtp_protect(session->media.audio_srtp_out, &sbuf, &protected);
-					if(res != srtp_err_status_ok) {
-						rtp_header *header = (rtp_header *)&sbuf;
-						guint32 timestamp = ntohl(header->timestamp);
-						guint16 seq = ntohs(header->seq_number);
-						JANUS_LOG(LOG_ERR, "[NoSIP-%s] Audio SRTP protect error... %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")...\n",
-							session->info, janus_nosip_get_srtp_error(res), len, protected, timestamp, seq);
-					} else {
-						/* Forward the frame to the peer */
-						send(session->media.audio_rtp_fd, sbuf, protected, 0);
-					}
+			JANUS_LOG(LOG_VERB, "Got NoSIP %s SSRC: %"SCNu32"\n",
+				video ? "video" : "audio",
+				video ? session->media.video_ssrc : session->media.audio_ssrc);
+		}
+		if((video && session->media.has_video && session->media.video_rtp_fd) ||
+				(!video && session->media.has_audio && session->media.audio_rtp_fd)) {
+			/* Save the frame if we're recording */
+			janus_recorder_save_frame(video ? session->vrc : session->arc, buf, len);
+			/* Is SRTP involved? */
+			if(session->media.has_srtp_local) {
+				char sbuf[2048];
+				memcpy(&sbuf, buf, len);
+				int protected = len;
+				int res = srtp_protect(
+					(video ? session->media.video_srtp_out : session->media.audio_srtp_out),
+					&sbuf, &protected);
+				if(res != srtp_err_status_ok) {
+					rtp_header *header = (rtp_header *)&sbuf;
+					guint32 timestamp = ntohl(header->timestamp);
+					guint16 seq = ntohs(header->seq_number);
+					JANUS_LOG(LOG_ERR, "[NoSIP-%p] %s SRTP protect error... %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")...\n",
+						session, video ? "Video" : "Audio", janus_nosip_get_srtp_error(res), len, protected, timestamp, seq);
 				} else {
 					/* Forward the frame to the peer */
-					send(session->media.audio_rtp_fd, buf, len, 0);
+					send((video ? session->media.video_rtp_fd : session->media.audio_rtp_fd), sbuf, protected, 0);
 				}
+			} else {
+				/* Forward the frame to the peer */
+				send((video ? session->media.video_rtp_fd : session->media.audio_rtp_fd), buf, len, 0);
 			}
 		}
 	}
@@ -962,8 +915,8 @@ void janus_nosip_incoming_rtcp(janus_plugin_session *handle, int video, char *bu
 					int protected = len;
 					int res = srtp_protect_rtcp(session->media.video_srtp_out, &sbuf, &protected);
 					if(res != srtp_err_status_ok) {
-						JANUS_LOG(LOG_ERR, "[NoSIP-%s] Video SRTCP protect error... %s (len=%d-->%d)...\n",
-							session->info, janus_nosip_get_srtp_error(res), len, protected);
+						JANUS_LOG(LOG_ERR, "[NoSIP-%p] Video SRTCP protect error... %s (len=%d-->%d)...\n",
+							session, janus_nosip_get_srtp_error(res), len, protected);
 					} else {
 						/* Forward the message to the peer */
 						send(session->media.video_rtcp_fd, sbuf, protected, 0);
@@ -986,8 +939,8 @@ void janus_nosip_incoming_rtcp(janus_plugin_session *handle, int video, char *bu
 					int protected = len;
 					int res = srtp_protect_rtcp(session->media.audio_srtp_out, &sbuf, &protected);
 					if(res != srtp_err_status_ok) {
-						JANUS_LOG(LOG_ERR, "[NoSIP-%s] Audio SRTCP protect error... %s (len=%d-->%d)...\n",
-							session->info, janus_nosip_get_srtp_error(res), len, protected);
+						JANUS_LOG(LOG_ERR, "[NoSIP-%p] Audio SRTCP protect error... %s (len=%d-->%d)...\n",
+							session, janus_nosip_get_srtp_error(res), len, protected);
 					} else {
 						/* Forward the message to the peer */
 						send(session->media.audio_rtcp_fd, sbuf, protected, 0);
@@ -1014,6 +967,14 @@ void janus_nosip_hangup_media(janus_plugin_session *handle) {
 		return;
 	if(g_atomic_int_add(&session->hangingup, 1))
 		return;
+	/* Notify the thread that it's time to go */
+	if(session->media.pipefd[1] > 0) {
+		int code = 1;
+		ssize_t res = 0;
+		do {
+			res = write(session->media.pipefd[1], &code, sizeof(int));
+		} while(res == -1 && errno == EINTR);
+	}
 	/* Get rid of the recorders, if available */
 	janus_mutex_lock(&session->rec_mutex);
 	if(session->arc) {
@@ -1041,13 +1002,6 @@ void janus_nosip_hangup_media(janus_plugin_session *handle) {
 	}
 	session->vrc_peer = NULL;
 	janus_mutex_unlock(&session->rec_mutex);
-	/* FIXME Simulate a "hangup" coming from the browser */
-	janus_nosip_message *msg = g_malloc0(sizeof(janus_nosip_message));
-	msg->handle = handle;
-	msg->message = json_pack("{ss}", "request", "hangup");
-	msg->transaction = NULL;
-	msg->jsep = NULL;
-	g_async_queue_push(messages, msg);
 }
 
 /* Thread to handle incoming messages */
@@ -1222,18 +1176,12 @@ static void *janus_nosip_handler(void *data) {
 				/* Take note of the SDP (may be useful for UPDATEs or re-INVITEs) */
 				janus_sdp_free(session->sdp);
 				session->sdp = parsed_sdp;
-				if(session->info == NULL) {
-					char tempinfo[16];
-					janus_nosip_random_string(sizeof(tempinfo), tempinfo);
-					session->info = g_strdup(info ? info : tempinfo);
-				}
-				JANUS_LOG(LOG_VERB, "Prepared SDP %s for (%s)\n%s", msg_sdp_type, info, sdp);
+				JANUS_LOG(LOG_VERB, "Prepared SDP %s for (%p)\n%s", msg_sdp_type, info, sdp);
 				g_atomic_int_set(&session->hangingup, 0);
 				/* Also notify event handlers */
 				if(notify_events && gateway->events_is_enabled()) {
 					json_t *info = json_object();
 					json_object_set_new(info, "event", json_string("generated"));
-					json_object_set_new(info, "info", json_string(session->info));
 					json_object_set_new(info, "type", json_string(offer ? "offer" : "answer"));
 					json_object_set_new(info, "sdp", json_string(sdp));
 					gateway->notify_event(&janus_nosip_plugin, session->handle, info);
@@ -1241,7 +1189,6 @@ static void *janus_nosip_handler(void *data) {
 				/* Send the barebone SDP back */
 				result = json_object();
 				json_object_set_new(result, "event", json_string("generated"));
-				json_object_set_new(result, "info", json_string(session->info));
 				json_object_set_new(result, "type", json_string(offer ? "offer" : "answer"));
 				json_object_set_new(result, "sdp", json_string(sdp));
 				g_free(sdp);
@@ -1254,7 +1201,7 @@ static void *janus_nosip_handler(void *data) {
 				}
 				janus_nosip_sdp_process(session, parsed_sdp, !offer, FALSE, &changed);
 				/* Check if offer has neither audio nor video, fail */
-				if (!session->media.has_audio && !session->media.has_video) {
+				if(!session->media.has_audio && !session->media.has_video) {
 					JANUS_LOG(LOG_ERR, "No audio and no video being negotiated\n");
 					janus_sdp_free(parsed_sdp);
 					error_code = JANUS_NOSIP_ERROR_INVALID_SDP;
@@ -1262,7 +1209,7 @@ static void *janus_nosip_handler(void *data) {
 					goto error;
 				}
 				/* Also fail if there's no remote IP address that can be used for RTP */
-				if (!session->media.remote_ip) {
+				if(!session->media.remote_ip) {
 					JANUS_LOG(LOG_ERR, "No remote IP address\n");
 					janus_sdp_free(parsed_sdp);
 					error_code = JANUS_NOSIP_ERROR_INVALID_SDP;
@@ -1272,16 +1219,10 @@ static void *janus_nosip_handler(void *data) {
 				/* Take note of the SDP (may be useful for UPDATEs or re-INVITEs) */
 				janus_sdp_free(session->sdp);
 				session->sdp = parsed_sdp;
-				if(session->info == NULL) {
-					char tempinfo[16];
-					janus_nosip_random_string(sizeof(tempinfo), tempinfo);
-					session->info = g_strdup(info ? info : tempinfo);
-				}
 				/* Also notify event handlers */
 				if(notify_events && gateway->events_is_enabled()) {
 					json_t *info = json_object();
 					json_object_set_new(info, "event", json_string("processed"));
-					json_object_set_new(info, "info", json_string(session->info));
 					json_object_set_new(info, "type", json_string(offer ? "offer" : "answer"));
 					json_object_set_new(info, "sdp", json_string(msg_sdp));
 					gateway->notify_event(&janus_nosip_plugin, session->handle, info);
@@ -1289,7 +1230,6 @@ static void *janus_nosip_handler(void *data) {
 				/* Send SDP to the browser */
 				result = json_object();
 				json_object_set_new(result, "event", json_string("processed"));
-				json_object_set_new(result, "info", json_string(session->info));
 				if(session->media.has_srtp_remote) {
 					json_object_set_new(result, "srtp",
 						json_string(session->media.require_srtp ? "sdes_mandatory" : "sdes_optional"));
@@ -1302,7 +1242,7 @@ static void *janus_nosip_handler(void *data) {
 				session->media.ready = 1;	/* FIXME Maybe we need a better way to signal this */
 				GError *error = NULL;
 				char tname[16];
-				g_snprintf(tname, sizeof(tname), "nosiprtp %s", session->info);
+				g_snprintf(tname, sizeof(tname), "nosiprtp %p", session);
 				g_thread_try_new(tname, janus_nosip_relay_thread, session, &error);
 				if(error != NULL) {
 					JANUS_LOG(LOG_ERR, "Got error %d (%s) trying to launch the RTP/RTCP thread...\n", error->code, error->message ? error->message : "??");
@@ -1310,15 +1250,7 @@ static void *janus_nosip_handler(void *data) {
 			}
 		} else if(!strcasecmp(request_text, "hangup")) {
 			/* Get rid of an ongoing session */
-			if(session->info == NULL) {
-				JANUS_LOG(LOG_ERR, "Wrong state (no info?)\n");
-				error_code = JANUS_NOSIP_ERROR_WRONG_STATE;
-				g_snprintf(error_cause, 512, "Wrong state (no info?)");
-				goto error;
-			}
-			g_free(session->info);
-			session->info = NULL;
-			/* Notify the operation */
+			gateway->close_pc(session->handle);
 			result = json_object();
 			json_object_set_new(result, "event", json_string("hangingup"));
 		} else if(!strcasecmp(request_text, "recording")) {
@@ -1328,12 +1260,6 @@ static void *janus_nosip_handler(void *data) {
 				JANUS_NOSIP_ERROR_MISSING_ELEMENT, JANUS_NOSIP_ERROR_INVALID_ELEMENT);
 			if(error_code != 0)
 				goto error;
-			if(session->info == NULL) {
-				JANUS_LOG(LOG_ERR, "Wrong state (no info?)\n");
-				error_code = JANUS_NOSIP_ERROR_WRONG_STATE;
-				g_snprintf(error_cause, 512, "Wrong state (no info?)");
-				goto error;
-			}
 			json_t *action = json_object_get(root, "action");
 			const char *action_text = json_string_value(action);
 			if(strcasecmp(action_text, "start") && strcasecmp(action_text, "stop")) {
@@ -1417,8 +1343,8 @@ static void *janus_nosip_handler(void *data) {
 				}
 				if(record_audio || record_video) {
 					/* Start recording the user's audio and/or video */
-					JANUS_LOG(LOG_INFO, "Starting recording of user's %s (%s)\n",
-						(record_audio && record_video ? "audio and video" : (record_audio ? "audio" : "video")), session->info);
+					JANUS_LOG(LOG_INFO, "Starting recording of user's %s (%p)\n",
+						(record_audio && record_video ? "audio and video" : (record_audio ? "audio" : "video")), session);
 					if(record_audio) {
 						memset(filename, 0, 255);
 						if(recording_base) {
@@ -1524,6 +1450,8 @@ static void *janus_nosip_handler(void *data) {
 		int ret = gateway->push_event(msg->handle, &janus_nosip_plugin, msg->transaction, event, localjsep);
 		JANUS_LOG(LOG_VERB, "  >> Pushing event: %d (%s)\n", ret, janus_get_api_error(ret));
 		json_decref(event);
+		if(localjsep)
+			json_decref(localjsep);
 		janus_nosip_message_free(msg);
 		continue;
 
@@ -1664,7 +1592,7 @@ void janus_nosip_sdp_process(janus_nosip_session *session, janus_sdp *sdp, gbool
 		}
 		temp = temp->next;
 	}
-	if(changed && *changed) {
+	if(update && changed && *changed) {
 		/* Something changed: mark this on the session, so that the thread can update the sockets */
 		session->media.updated = TRUE;
 		if(session->media.pipefd[1] > 0) {
@@ -1870,29 +1798,29 @@ static void janus_nosip_connect_sockets(janus_nosip_session *session, struct soc
 	if(session->media.remote_audio_rtp_port) {
 		server_addr->sin_port = htons(session->media.remote_audio_rtp_port);
 		if(connect(session->media.audio_rtp_fd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) == -1) {
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't connect audio RTP? (%s:%d)\n", session->info, session->media.remote_ip, session->media.remote_audio_rtp_port);
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't connect audio RTP? (%s:%d)\n", session, session->media.remote_ip, session->media.remote_audio_rtp_port);
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p]   -- %d (%s)\n", session, errno, strerror(errno));
 		}
 	}
 	if(session->media.remote_audio_rtcp_port) {
 		server_addr->sin_port = htons(session->media.remote_audio_rtcp_port);
 		if(connect(session->media.audio_rtcp_fd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) == -1) {
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't connect audio RTCP? (%s:%d)\n", session->info, session->media.remote_ip, session->media.remote_audio_rtcp_port);
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't connect audio RTCP? (%s:%d)\n", session, session->media.remote_ip, session->media.remote_audio_rtcp_port);
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p]   -- %d (%s)\n", session, errno, strerror(errno));
 		}
 	}
 	if(session->media.remote_video_rtp_port) {
 		server_addr->sin_port = htons(session->media.remote_video_rtp_port);
 		if(connect(session->media.video_rtp_fd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) == -1) {
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't connect video RTP? (%s:%d)\n", session->info, session->media.remote_ip, session->media.remote_video_rtp_port);
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't connect video RTP? (%s:%d)\n", session, session->media.remote_ip, session->media.remote_video_rtp_port);
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p]   -- %d (%s)\n", session, errno, strerror(errno));
 		}
 	}
 	if(session->media.remote_video_rtcp_port) {
 		server_addr->sin_port = htons(session->media.remote_video_rtcp_port);
 		if(connect(session->media.video_rtcp_fd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) == -1) {
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't connect video RTCP? (%s:%d)\n", session->info, session->media.remote_ip, session->media.remote_video_rtcp_port);
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't connect video RTCP? (%s:%d)\n", session, session->media.remote_ip, session->media.remote_video_rtcp_port);
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p]   -- %d (%s)\n", session, errno, strerror(errno));
 		}
 	}
 
@@ -1901,31 +1829,32 @@ static void janus_nosip_connect_sockets(janus_nosip_session *session, struct soc
 /* Thread to relay RTP/RTCP frames coming from the peer */
 static void *janus_nosip_relay_thread(void *data) {
 	janus_nosip_session *session = (janus_nosip_session *)data;
-	if(!session || !session->info) {
+	if(!session) {
 		g_thread_unref(g_thread_self());
 		return NULL;
 	}
-	JANUS_LOG(LOG_INFO, "[NoSIP-%s] Starting relay thread\n", session->info);
+	JANUS_LOG(LOG_INFO, "[NoSIP-%p] Starting relay thread\n", session);
 
 	gboolean have_server_ip = TRUE;
 	struct sockaddr_in server_addr;
 	memset(&server_addr, 0, sizeof(server_addr));
 	server_addr.sin_family = AF_INET;
 	if(session->media.remote_ip == NULL) {
-		JANUS_LOG(LOG_WARN, "[NoSIP-%s] No remote IP?\n", session->info);
+		JANUS_LOG(LOG_WARN, "[NoSIP-%p] No remote IP?\n", session);
 	} else {
 		if((inet_aton(session->media.remote_ip, &server_addr.sin_addr)) <= 0) {	/* Not a numeric IP... */
 			struct hostent *host = gethostbyname(session->media.remote_ip);	/* ...resolve name */
 			if(!host) {
-				JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't get host (%s)\n", session->info, session->media.remote_ip);
+				JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't get host (%s)\n", session, session->media.remote_ip);
 				have_server_ip = FALSE;
 			} else {
 				server_addr.sin_addr = *(struct in_addr *)host->h_addr_list;
 			}
 		}
 	}
-	if(have_server_ip)
+	if(have_server_ip) {
 		janus_nosip_connect_sockets(session, &server_addr);
+	}
 
 	/* File descriptors */
 	socklen_t addrlen;
@@ -1940,13 +1869,15 @@ static void *janus_nosip_relay_thread(void *data) {
 	gboolean goon = TRUE;
 	int astep = 0, vstep = 0;
 	guint32 ats = 0, vts = 0;
-	while(goon && session != NULL && !session->destroyed) {	/* FIXME We need a per-call watchdog as well */
+	while(goon && session != NULL &&
+			!session->destroyed && !g_atomic_int_get(&session->hangingup)) {
 		if(session->media.updated) {
 			/* Apparently there was a session update */
-			if(have_server_ip && (inet_aton(session->media.remote_ip, &server_addr.sin_addr)) <= 0) {
+			if(have_server_ip && (inet_aton(session->media.remote_ip, &server_addr.sin_addr) == 0)) {
 				janus_nosip_connect_sockets(session, &server_addr);
 			} else {
-				JANUS_LOG(LOG_ERR, "[NoSIP-%s] Couldn't update session details (missing or invalid remote IP address)\n", session->info);
+				JANUS_LOG(LOG_ERR, "[NoSIP-%p] Couldn't update session details: missing or invalid remote IP address? (%s)\n",
+					session, session->media.remote_ip);
 			}
 			session->media.updated = FALSE;
 		}
@@ -1986,8 +1917,8 @@ static void *janus_nosip_relay_thread(void *data) {
 		/* Wait for some data */
 		resfd = poll(fds, num, 1000);
 		if(resfd < 0) {
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s] Error polling...\n", session->info);
-			JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p] Error polling...\n", session);
+			JANUS_LOG(LOG_ERR, "[NoSIP-%p]   -- %d (%s)\n", session, errno, strerror(errno));
 			break;
 		} else if(resfd == 0) {
 			/* No data, keep going */
@@ -1998,20 +1929,19 @@ static void *janus_nosip_relay_thread(void *data) {
 		int i = 0;
 		for(i=0; i<num; i++) {
 			if(fds[i].revents & (POLLERR | POLLHUP)) {
-				/* Socket error? */
-				JANUS_LOG(LOG_ERR, "[NoSIP-%s] Error polling: %s...\n", session->info,
-					fds[i].revents & POLLERR ? "POLLERR" : "POLLHUP");
-				JANUS_LOG(LOG_ERR, "[NoSIP-%s]   -- %d (%s)\n", session->info, errno, strerror(errno));
 				if(session->media.updated)
 					break;
-				goon = FALSE;	/* Can we assume it's pretty much over, after a POLLERR? */
-				/* FIXME Simulate a "hangup" coming from the browser */
-				janus_nosip_message *msg = g_malloc0(sizeof(janus_nosip_message));
-				msg->handle = session->handle;
-				msg->message = json_pack("{ss}", "request", "hangup");
-				msg->transaction = NULL;
-				msg->jsep = NULL;
-				g_async_queue_push(messages, msg);
+				/* Socket error? */
+				JANUS_LOG((errno == 0 ? LOG_WARN : LOG_ERR), "[NoSIP-%p] Error polling: %s... errno=%d (%s)\n",
+					session, fds[i].revents & POLLERR ? "POLLERR" : "POLLHUP", errno, strerror(errno));
+				if(errno == 0) {
+					/* Maybe not a breaking error? */
+					continue;
+				}
+				/* Can we assume it's pretty much over, after a POLLERR? */
+				goon = FALSE;
+				/* FIXME Close the PeerConnection */
+				gateway->close_pc(session->handle);
 				break;
 			} else if(fds[i].revents & POLLIN) {
 				if(pipe_fd != -1 && fds[i].fd == pipe_fd) {
@@ -2021,24 +1951,35 @@ static void *janus_nosip_relay_thread(void *data) {
 					break;
 				}
 				/* Got an RTP/RTCP packet */
-				if(session->media.audio_rtp_fd != -1 && fds[i].fd == session->media.audio_rtp_fd) {
-					/* Got something audio (RTP) */
-					addrlen = sizeof(remote);
-					bytes = recvfrom(session->media.audio_rtp_fd, buffer, 1500, 0, (struct sockaddr*)&remote, &addrlen);
+				addrlen = sizeof(remote);
+				bytes = recvfrom(fds[i].fd, buffer, 1500, 0, (struct sockaddr*)&remote, &addrlen);
+				/* Let's check what this is */
+				gboolean video = fds[i].fd == session->media.video_rtp_fd || fds[i].fd == session->media.video_rtcp_fd;
+				gboolean rtcp = fds[i].fd == session->media.audio_rtcp_fd || fds[i].fd == session->media.video_rtcp_fd;
+				if(!rtcp) {
+					/* Audio or Video RTP */
 					rtp_header *header = (rtp_header *)buffer;
-					if(session->media.audio_ssrc_peer != ntohl(header->ssrc)) {
-						session->media.audio_ssrc_peer = ntohl(header->ssrc);
-						JANUS_LOG(LOG_VERB, "Got SIP peer audio SSRC: %"SCNu32"\n", session->media.audio_ssrc_peer);
+					if((video && session->media.video_ssrc_peer != ntohl(header->ssrc)) ||
+							(!video && session->media.audio_ssrc_peer != ntohl(header->ssrc))) {
+						if(video) {
+							session->media.video_ssrc_peer = ntohl(header->ssrc);
+						} else {
+							session->media.audio_ssrc_peer = ntohl(header->ssrc);
+						}
+						JANUS_LOG(LOG_VERB, "[NoSIP-%p] Got SIP peer %s SSRC: %"SCNu32"\n",
+							session, video ? "video" : "audio", session->media.audio_ssrc_peer);
 					}
 					/* Is this SRTP? */
 					if(session->media.has_srtp_remote) {
 						int buflen = bytes;
-						srtp_err_status_t res = srtp_unprotect(session->media.audio_srtp_in, buffer, &buflen);
+						srtp_err_status_t res = srtp_unprotect(
+							(video ? session->media.video_srtp_in : session->media.audio_srtp_in),
+							buffer, &buflen);
 						if(res != srtp_err_status_ok && res != srtp_err_status_replay_fail && res != srtp_err_status_replay_old) {
 							guint32 timestamp = ntohl(header->timestamp);
 							guint16 seq = ntohs(header->seq_number);
-							JANUS_LOG(LOG_ERR, "[NoSIP-%s] Audio SRTP unprotect error: %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")\n",
-								session->info, janus_nosip_get_srtp_error(res), bytes, buflen, timestamp, seq);
+							JANUS_LOG(LOG_ERR, "[NoSIP-%p] %s SRTP unprotect error: %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")\n",
+								session, video ? "Video" : "Audio", janus_nosip_get_srtp_error(res), bytes, buflen, timestamp, seq);
 							continue;
 						}
 						bytes = buflen;
@@ -2047,128 +1988,79 @@ static void *janus_nosip_relay_thread(void *data) {
 					guint32 ssrc = ntohl(header->ssrc);
 					guint32 timestamp = ntohl(header->timestamp);
 					guint16 seq = ntohs(header->seq_number);
-					if(ssrc != session->media.context.a_last_ssrc) {
-						JANUS_LOG(LOG_VERB, "Audio SSRC changed (re-INVITE?), %"SCNu32" --> %"SCNu32"\n",
-							session->media.context.a_last_ssrc, ssrc);
-						session->media.context.a_last_ssrc = ssrc;
-						session->media.context.a_base_ts_prev = session->media.context.a_last_ts;
-						session->media.context.a_base_ts = timestamp;
-						session->media.context.a_base_seq_prev = session->media.context.a_last_seq;
-						session->media.context.a_base_seq = seq;
+					if((video && ssrc != session->media.context.v_last_ssrc) ||
+							(!video && ssrc != session->media.context.a_last_ssrc)) {
+						JANUS_LOG(LOG_VERB, "[NoSIP-%p] %s SSRC changed (re-INVITE?), %"SCNu32" --> %"SCNu32"\n",
+							session, video ? "Video" : "Audio",
+							video ? session->media.context.v_last_ssrc : session->media.context.a_last_ssrc,
+							ssrc);
+						if(video) {
+							session->media.context.v_last_ssrc = ssrc;
+							session->media.context.v_base_ts_prev = session->media.context.v_last_ts;
+							session->media.context.v_base_ts = timestamp;
+							session->media.context.v_base_seq_prev = session->media.context.v_last_seq;
+							session->media.context.v_base_seq = seq;
+						} else {
+							session->media.context.a_last_ssrc = ssrc;
+							session->media.context.a_base_ts_prev = session->media.context.a_last_ts;
+							session->media.context.a_base_ts = timestamp;
+							session->media.context.a_base_seq_prev = session->media.context.a_last_seq;
+							session->media.context.a_base_seq = seq;
+						}
 					}
 					/* Compute a coherent timestamp and sequence number */
-					session->media.context.a_last_ts = (timestamp-session->media.context.a_base_ts)
-						+ session->media.context.a_base_ts_prev+(astep ? astep : 960);	/* FIXME */
-					session->media.context.a_last_seq = (seq-session->media.context.a_base_seq)+session->media.context.a_base_seq_prev+1;
-					/* Update the timestamp and sequence number in the RTP packet, and send it */
-					header->timestamp = htonl(session->media.context.a_last_ts);
-					header->seq_number = htons(session->media.context.a_last_seq);
-					if(ats == 0) {
-						ats = timestamp;
-					} else if(astep == 0) {
-						astep = timestamp-ats;
-						if(astep < 0)
-							astep = 0;
+					if(video) {
+						session->media.context.v_last_ts = (timestamp-session->media.context.v_base_ts)
+							+ session->media.context.v_base_ts_prev+(vstep ? vstep : 4500);	/* FIXME */
+						session->media.context.v_last_seq = (seq-session->media.context.v_base_seq)+session->media.context.v_base_seq_prev+1;
+					} else {
+						session->media.context.a_last_ts = (timestamp-session->media.context.a_base_ts)
+							+ session->media.context.a_base_ts_prev+(astep ? astep : 960);	/* FIXME */
+						session->media.context.a_last_seq = (seq-session->media.context.a_base_seq)+session->media.context.a_base_seq_prev+1;
 					}
-					/* Save the frame if we're recording */
-					janus_recorder_save_frame(session->arc_peer, buffer, bytes);
-					/* Relay to browser */
-					gateway->relay_rtp(session->handle, 0, buffer, bytes);
-					continue;
-				} else if(session->media.audio_rtcp_fd != -1 && fds[i].fd == session->media.audio_rtcp_fd) {
-					/* Got something audio (RTCP) */
-					addrlen = sizeof(remote);
-					bytes = recvfrom(session->media.audio_rtcp_fd, buffer, 1500, 0, (struct sockaddr*)&remote, &addrlen);
-					//~ JANUS_LOG(LOG_VERB, "************************\nGot %d bytes on the audio RTCP channel...\n", bytes);
-					/* Is this SRTCP? */
-					if(session->media.has_srtp_remote) {
-						int buflen = bytes;
-						srtp_err_status_t res = srtp_unprotect_rtcp(session->media.audio_srtp_in, buffer, &buflen);
-						if(res != srtp_err_status_ok && res != srtp_err_status_replay_fail && res != srtp_err_status_replay_old) {
-							JANUS_LOG(LOG_ERR, "[NoSIP-%s] Audio SRTCP unprotect error: %s (len=%d-->%d)\n",
-								session->info, janus_nosip_get_srtp_error(res), bytes, buflen);
-							continue;
+					/* Update the timestamp and sequence number in the RTP packet, and send it */
+					header->timestamp = htonl(video ? session->media.context.v_last_ts: session->media.context.a_last_ts);
+					header->seq_number = htons(video ? session->media.context.v_last_seq : session->media.context.a_last_seq);
+					if(video) {
+						if(vts == 0) {
+							vts = timestamp;
+						} else if(vstep == 0) {
+							vstep = timestamp-vts;
+							if(vstep < 0) {
+								vstep = 0;
+							}
 						}
-						bytes = buflen;
-					}
-					/* Relay to browser */
-					gateway->relay_rtcp(session->handle, 0, buffer, bytes);
-					continue;
-				} else if(session->media.video_rtp_fd != -1 && fds[i].fd == session->media.video_rtp_fd) {
-					/* Got something video (RTP) */
-					addrlen = sizeof(remote);
-					bytes = recvfrom(session->media.video_rtp_fd, buffer, 1500, 0, (struct sockaddr*)&remote, &addrlen);
-					//~ JANUS_LOG(LOG_VERB, "************************\nGot %d bytes on the video RTP channel...\n", bytes);
-					//~ rtp_header_t *rtp = (rtp_header_t *)buffer;
-					//~ JANUS_LOG(LOG_VERB, " ... parsed RTP packet (ssrc=%u, pt=%u, seq=%u, ts=%u)...\n",
-						//~ ntohl(rtp->ssrc), rtp->type, ntohs(rtp->seq_number), ntohl(rtp->timestamp));
-					rtp_header *header = (rtp_header *)buffer;
-					if(session->media.video_ssrc_peer != ntohl(header->ssrc)) {
-						session->media.video_ssrc_peer = ntohl(header->ssrc);
-						JANUS_LOG(LOG_VERB, "Got SIP peer video SSRC: %"SCNu32"\n", session->media.video_ssrc_peer);
-					}
-					/* Is this SRTP? */
-					if(session->media.has_srtp_remote) {
-						int buflen = bytes;
-						srtp_err_status_t res = srtp_unprotect(session->media.video_srtp_in, buffer, &buflen);
-						if(res != srtp_err_status_ok && res != srtp_err_status_replay_fail && res != srtp_err_status_replay_old) {
-							guint32 timestamp = ntohl(header->timestamp);
-							guint16 seq = ntohs(header->seq_number);
-							JANUS_LOG(LOG_ERR, "[NoSIP-%s] Video SRTP unprotect error: %s (len=%d-->%d, ts=%"SCNu32", seq=%"SCNu16")\n",
-								session->info, janus_nosip_get_srtp_error(res), bytes, buflen, timestamp, seq);
-							continue;
+					} else {
+						if(ats == 0) {
+							ats = timestamp;
+						} else if(astep == 0) {
+							astep = timestamp-ats;
+							if(astep < 0) {
+								astep = 0;
+							}
 						}
-						bytes = buflen;
-					}
-					/* Check if the SSRC changed (e.g., after a re-INVITE or UPDATE) */
-					guint32 ssrc = ntohl(header->ssrc);
-					guint32 timestamp = ntohl(header->timestamp);
-					guint16 seq = ntohs(header->seq_number);
-					if(ssrc != session->media.context.v_last_ssrc) {
-						JANUS_LOG(LOG_VERB, "Video SSRC changed (re-INVITE?)\n");
-						session->media.context.v_last_ssrc = ssrc;
-						session->media.context.v_base_ts_prev = session->media.context.v_last_ts;
-						session->media.context.v_base_ts = timestamp;
-						session->media.context.v_base_seq_prev = session->media.context.v_last_seq;
-						session->media.context.v_base_seq = seq;
-					}
-					/* Compute a coherent timestamp and sequence number */
-					session->media.context.v_last_ts = (timestamp-session->media.context.v_base_ts)
-						+ session->media.context.v_base_ts_prev+(vstep ? vstep : 4500);	/* FIXME */
-					session->media.context.v_last_seq = (seq-session->media.context.v_base_seq)+session->media.context.v_base_seq_prev+1;
-					/* Update the timestamp and sequence number in the RTP packet, and send it */
-					header->timestamp = htonl(session->media.context.v_last_ts);
-					header->seq_number = htons(session->media.context.v_last_seq);
-					if(vts == 0) {
-						vts = timestamp;
-					} else if(vstep == 0) {
-						vstep = timestamp-vts;
-						if(vstep < 0)
-							vstep = 0;
 					}
 					/* Save the frame if we're recording */
-					janus_recorder_save_frame(session->vrc_peer, buffer, bytes);
+					janus_recorder_save_frame(video ? session->vrc_peer : session->arc_peer, buffer, bytes);
 					/* Relay to browser */
-					gateway->relay_rtp(session->handle, 1, buffer, bytes);
+					gateway->relay_rtp(session->handle, video, buffer, bytes);
 					continue;
-				} else if(session->media.video_rtcp_fd != -1 && fds[i].fd == session->media.video_rtcp_fd) {
-					/* Got something video (RTCP) */
-					addrlen = sizeof(remote);
-					bytes = recvfrom(session->media.video_rtcp_fd, buffer, 1500, 0, (struct sockaddr*)&remote, &addrlen);
-					//~ JANUS_LOG(LOG_VERB, "************************\nGot %d bytes on the video RTCP channel...\n", bytes);
-					/* Is this SRTCP? */
+				} else {
+					/* Audio or Video RTCP */
 					if(session->media.has_srtp_remote) {
 						int buflen = bytes;
-						srtp_err_status_t res = srtp_unprotect_rtcp(session->media.video_srtp_in, buffer, &buflen);
+						srtp_err_status_t res = srtp_unprotect_rtcp(
+							(video ? session->media.video_srtp_in : session->media.audio_srtp_in),
+							buffer, &buflen);
 						if(res != srtp_err_status_ok && res != srtp_err_status_replay_fail && res != srtp_err_status_replay_old) {
-							JANUS_LOG(LOG_ERR, "[NoSIP-%s] Video SRTP unprotect error: %s (len=%d-->%d)\n",
-								session->info, janus_nosip_get_srtp_error(res), bytes, buflen);
+							JANUS_LOG(LOG_ERR, "[NoSIP-%p] %s SRTCP unprotect error: %s (len=%d-->%d)\n",
+								session, video ? "Video" : "Audio", janus_nosip_get_srtp_error(res), bytes, buflen);
 							continue;
 						}
 						bytes = buflen;
 					}
 					/* Relay to browser */
-					gateway->relay_rtcp(session->handle, 1, buffer, bytes);
+					gateway->relay_rtcp(session->handle, video, buffer, bytes);
 					continue;
 				}
 			}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/janus.git



More information about the Pkg-voip-commits mailing list