Skip to content

Commit 4dd1e9b

Browse files
authored
Send data stats when using event handlers (#3126)
1 parent 40e80b1 commit 4dd1e9b

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

src/dtls-bio.c

+6
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ static int janus_dtls_bio_agent_write(BIO *bio, const char *in, int inl) {
158158
if(bytes > 0) {
159159
pc->dtls_out_stats.info[0].packets++;
160160
pc->dtls_out_stats.info[0].bytes += bytes;
161+
/* If there's a datachannel medium, update the stats there too */
162+
janus_ice_peerconnection_medium *medium = g_hash_table_lookup(pc->media_bytype, GINT_TO_POINTER(JANUS_MEDIA_DATA));
163+
if(medium) {
164+
medium->in_stats.info[0].packets++;
165+
medium->in_stats.info[0].bytes += bytes;
166+
}
161167
}
162168
return bytes;
163169
}

src/ice.c

+50-22
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,22 @@ static gboolean janus_ice_nacked_packet_cleanup(gpointer user_data) {
467467
return G_SOURCE_REMOVE;
468468
}
469469

470+
const char *janus_media_type_str(janus_media_type type) {
471+
switch(type) {
472+
case JANUS_MEDIA_AUDIO:
473+
return "audio";
474+
case JANUS_MEDIA_VIDEO:
475+
return "video";
476+
case JANUS_MEDIA_DATA:
477+
return "data";
478+
case JANUS_MEDIA_UNKNOWN:
479+
return "unknown";
480+
default:
481+
break;
482+
}
483+
return NULL;
484+
}
485+
470486
/* Deallocation helpers for handles and related structs */
471487
static void janus_ice_handle_free(const janus_refcount *handle_ref);
472488
static void janus_ice_webrtc_free(janus_ice_handle *handle);
@@ -2490,6 +2506,12 @@ static void janus_ice_cb_nice_recv(NiceAgent *agent, guint stream_id, guint comp
24902506
/* Update stats (TODO Do the same for the last second window as well) */
24912507
pc->dtls_in_stats.info[0].packets++;
24922508
pc->dtls_in_stats.info[0].bytes += len;
2509+
/* If there's a datachannel medium, update the stats there too */
2510+
janus_ice_peerconnection_medium *medium = g_hash_table_lookup(pc->media_bytype, GINT_TO_POINTER(JANUS_MEDIA_DATA));
2511+
if(medium) {
2512+
medium->out_stats.info[0].packets++;
2513+
medium->out_stats.info[0].bytes += len;
2514+
}
24932515
return;
24942516
}
24952517
/* Not DTLS... RTP or RTCP? (http://tools.ietf.org/html/rfc5761#section-4) */
@@ -4242,8 +4264,8 @@ static gboolean janus_ice_outgoing_stats_handle(gpointer user_data) {
42424264
uint mi=0;
42434265
for(mi=0; mi<g_hash_table_size(pc->media); mi++) {
42444266
medium = g_hash_table_lookup(pc->media, GUINT_TO_POINTER(mi));
4245-
if(!medium || (medium->type != JANUS_MEDIA_AUDIO && medium->type != JANUS_MEDIA_VIDEO))
4246-
continue; /* We don't process data channels here */
4267+
if(!medium)
4268+
continue;
42474269
int vindex = 0;
42484270
for(vindex=0; vindex < 3; vindex++) {
42494271
if(vindex > 0 && (medium->type != JANUS_MEDIA_VIDEO || medium->rtcp_ctx[1] == NULL))
@@ -4258,6 +4280,8 @@ static gboolean janus_ice_outgoing_stats_handle(gpointer user_data) {
42584280
medium->out_stats.info[vindex].bytes_lastsec = 0;
42594281
medium->out_stats.info[vindex].bytes_lastsec_temp = 0;
42604282
}
4283+
if(medium->type != JANUS_MEDIA_AUDIO && medium->type != JANUS_MEDIA_VIDEO)
4284+
continue;
42614285
/* Now let's see if we need to notify the user about no incoming audio or video */
42624286
if(no_media_timer > 0 && pc->dtls && pc->dtls->dtls_connected > 0 && (now - pc->dtls->dtls_connected >= G_USEC_PER_SEC)) {
42634287
gint64 last = medium->in_stats.info[vindex].updated;
@@ -4285,38 +4309,42 @@ static gboolean janus_ice_outgoing_stats_handle(gpointer user_data) {
42854309
combined_event = json_array();
42864310
int vindex=0;
42874311
for(vindex=0; vindex<3; vindex++) {
4288-
if(medium && medium->rtcp_ctx[vindex]) {
4312+
if(medium && ((medium->type == JANUS_MEDIA_DATA && vindex == 0) || medium->rtcp_ctx[vindex])) {
42894313
json_t *info = json_object();
42904314
json_object_set_new(info, "mid", json_string(medium->mid));
42914315
json_object_set_new(info, "mindex", json_integer(medium->mindex));
42924316
if(vindex == 0)
4293-
json_object_set_new(info, "media", json_string(medium->type == JANUS_MEDIA_VIDEO ? "video" : "audio"));
4317+
json_object_set_new(info, "media", json_string(janus_media_type_str(medium->type)));
42944318
else if(vindex == 1)
42954319
json_object_set_new(info, "media", json_string("video-sim1"));
42964320
else
42974321
json_object_set_new(info, "media", json_string("video-sim2"));
4298-
if(medium->codec)
4299-
json_object_set_new(info, "codec", json_string(medium->codec));
4300-
json_object_set_new(info, "base", json_integer(medium->rtcp_ctx[vindex]->tb));
4301-
if(vindex == 0)
4302-
json_object_set_new(info, "rtt", json_integer(janus_rtcp_context_get_rtt(medium->rtcp_ctx[vindex])));
4303-
json_object_set_new(info, "lost", json_integer(janus_rtcp_context_get_lost_all(medium->rtcp_ctx[vindex], FALSE)));
4304-
json_object_set_new(info, "lost-by-remote", json_integer(janus_rtcp_context_get_lost_all(medium->rtcp_ctx[vindex], TRUE)));
4305-
json_object_set_new(info, "jitter-local", json_integer(janus_rtcp_context_get_jitter(medium->rtcp_ctx[vindex], FALSE)));
4306-
json_object_set_new(info, "jitter-remote", json_integer(janus_rtcp_context_get_jitter(medium->rtcp_ctx[vindex], TRUE)));
4307-
json_object_set_new(info, "in-link-quality", json_integer(janus_rtcp_context_get_in_link_quality(medium->rtcp_ctx[vindex])));
4308-
json_object_set_new(info, "in-media-link-quality", json_integer(janus_rtcp_context_get_in_media_link_quality(medium->rtcp_ctx[vindex])));
4309-
json_object_set_new(info, "out-link-quality", json_integer(janus_rtcp_context_get_out_link_quality(medium->rtcp_ctx[vindex])));
4310-
json_object_set_new(info, "out-media-link-quality", json_integer(janus_rtcp_context_get_out_media_link_quality(medium->rtcp_ctx[vindex])));
4322+
if(medium->type == JANUS_MEDIA_AUDIO || medium->type == JANUS_MEDIA_VIDEO) {
4323+
if(medium->codec)
4324+
json_object_set_new(info, "codec", json_string(medium->codec));
4325+
json_object_set_new(info, "base", json_integer(medium->rtcp_ctx[vindex]->tb));
4326+
if(vindex == 0)
4327+
json_object_set_new(info, "rtt", json_integer(janus_rtcp_context_get_rtt(medium->rtcp_ctx[vindex])));
4328+
json_object_set_new(info, "lost", json_integer(janus_rtcp_context_get_lost_all(medium->rtcp_ctx[vindex], FALSE)));
4329+
json_object_set_new(info, "lost-by-remote", json_integer(janus_rtcp_context_get_lost_all(medium->rtcp_ctx[vindex], TRUE)));
4330+
json_object_set_new(info, "jitter-local", json_integer(janus_rtcp_context_get_jitter(medium->rtcp_ctx[vindex], FALSE)));
4331+
json_object_set_new(info, "jitter-remote", json_integer(janus_rtcp_context_get_jitter(medium->rtcp_ctx[vindex], TRUE)));
4332+
json_object_set_new(info, "in-link-quality", json_integer(janus_rtcp_context_get_in_link_quality(medium->rtcp_ctx[vindex])));
4333+
json_object_set_new(info, "in-media-link-quality", json_integer(janus_rtcp_context_get_in_media_link_quality(medium->rtcp_ctx[vindex])));
4334+
json_object_set_new(info, "out-link-quality", json_integer(janus_rtcp_context_get_out_link_quality(medium->rtcp_ctx[vindex])));
4335+
json_object_set_new(info, "out-media-link-quality", json_integer(janus_rtcp_context_get_out_media_link_quality(medium->rtcp_ctx[vindex])));
4336+
}
43114337
json_object_set_new(info, "packets-received", json_integer(medium->in_stats.info[vindex].packets));
43124338
json_object_set_new(info, "packets-sent", json_integer(medium->out_stats.info[vindex].packets));
43134339
json_object_set_new(info, "bytes-received", json_integer(medium->in_stats.info[vindex].bytes));
43144340
json_object_set_new(info, "bytes-sent", json_integer(medium->out_stats.info[vindex].bytes));
4315-
json_object_set_new(info, "bytes-received-lastsec", json_integer(medium->in_stats.info[vindex].bytes_lastsec));
4316-
json_object_set_new(info, "bytes-sent-lastsec", json_integer(medium->out_stats.info[vindex].bytes_lastsec));
4317-
json_object_set_new(info, "nacks-received", json_integer(medium->in_stats.info[vindex].nacks));
4318-
json_object_set_new(info, "nacks-sent", json_integer(medium->out_stats.info[vindex].nacks));
4319-
json_object_set_new(info, "retransmissions-received", json_integer(medium->rtcp_ctx[vindex]->retransmitted));
4341+
if(medium->type == JANUS_MEDIA_AUDIO || medium->type == JANUS_MEDIA_VIDEO) {
4342+
json_object_set_new(info, "bytes-received-lastsec", json_integer(medium->in_stats.info[vindex].bytes_lastsec));
4343+
json_object_set_new(info, "bytes-sent-lastsec", json_integer(medium->out_stats.info[vindex].bytes_lastsec));
4344+
json_object_set_new(info, "nacks-received", json_integer(medium->in_stats.info[vindex].nacks));
4345+
json_object_set_new(info, "nacks-sent", json_integer(medium->out_stats.info[vindex].nacks));
4346+
json_object_set_new(info, "retransmissions-received", json_integer(medium->rtcp_ctx[vindex]->retransmitted));
4347+
}
43204348
if(medium->mindex == 0 && pc->remb_bitrate > 0)
43214349
json_object_set_new(info, "remb-bitrate", json_integer(pc->remb_bitrate));
43224350
if(combined_event != NULL) {

src/ice.h

+4
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,10 @@ typedef enum janus_media_type {
272272
JANUS_MEDIA_VIDEO,
273273
JANUS_MEDIA_DATA
274274
} janus_media_type;
275+
/*! \brief Helper method to get the string associated to a janus_media_mtype value
276+
* @param[in] type The type to stringify
277+
* @returns The type as a string, if valid, or NULL otherwise */
278+
const char *janus_media_type_str(janus_media_type type);
275279

276280
/*! \brief Janus media statistics
277281
* \note To improve with more stuff */

0 commit comments

Comments
 (0)