|
|
|
@ -161,6 +161,9 @@ static void mqtt_monologue_stats(struct call_monologue *ml, JsonBuilder *json) { |
|
|
|
|
|
|
|
|
|
|
|
static void mqtt_ssrc_stats(struct ssrc_ctx *ssrc, JsonBuilder *json, struct call_media *media) { |
|
|
|
if (!ssrc || !media) |
|
|
|
return; |
|
|
|
|
|
|
|
struct ssrc_entry_call *sc = ssrc->parent; |
|
|
|
|
|
|
|
json_builder_set_member_name(json, "SSRC"); |
|
|
|
@ -173,7 +176,6 @@ static void mqtt_ssrc_stats(struct ssrc_ctx *ssrc, JsonBuilder *json, struct cal |
|
|
|
mutex_unlock(&ssrc->tracker.lock); |
|
|
|
|
|
|
|
unsigned int clockrate = 0; |
|
|
|
//struct codec_handler *h = codec_handler_get(ps->media, prim_pt); |
|
|
|
struct rtp_payload_type *pt = g_hash_table_lookup(media->codecs.codecs, GUINT_TO_POINTER(prim_pt)); |
|
|
|
if (pt) { |
|
|
|
json_builder_set_member_name(json, "codec"); |
|
|
|
@ -285,6 +287,16 @@ static void mqtt_ssrc_stats(struct ssrc_ctx *ssrc, JsonBuilder *json, struct cal |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void mqtt_stream_stats_dir(const struct stream_stats *s, JsonBuilder *json) { |
|
|
|
json_builder_set_member_name(json, "bytes"); |
|
|
|
json_builder_add_int_value(json, atomic64_get(&s->bytes)); |
|
|
|
json_builder_set_member_name(json, "packets"); |
|
|
|
json_builder_add_int_value(json, atomic64_get(&s->packets)); |
|
|
|
json_builder_set_member_name(json, "errors"); |
|
|
|
json_builder_add_int_value(json, atomic64_get(&s->errors)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void mqtt_stream_stats(struct packet_stream *ps, JsonBuilder *json) { |
|
|
|
mutex_lock(&ps->in_lock); |
|
|
|
|
|
|
|
@ -297,23 +309,43 @@ static void mqtt_stream_stats(struct packet_stream *ps, JsonBuilder *json) { |
|
|
|
json_builder_add_int_value(json, sfd->socket.local.port); |
|
|
|
} |
|
|
|
|
|
|
|
if (ps->ssrc_in[0]) { |
|
|
|
json_builder_set_member_name(json, "ingress"); |
|
|
|
json_builder_set_member_name(json, "ingress"); |
|
|
|
json_builder_begin_object(json); |
|
|
|
mqtt_stream_stats_dir(&ps->stats_in, json); |
|
|
|
|
|
|
|
json_builder_set_member_name(json, "SSRC"); |
|
|
|
json_builder_begin_array(json); |
|
|
|
for (int i = 0; i < RTPE_NUM_SSRC_TRACKING; i++) { |
|
|
|
if (!ps->ssrc_in[i]) |
|
|
|
break; |
|
|
|
json_builder_begin_object(json); |
|
|
|
mqtt_ssrc_stats(ps->ssrc_in[0], json, ps->media); |
|
|
|
mqtt_ssrc_stats(ps->ssrc_in[i], json, ps->media); |
|
|
|
json_builder_end_object(json); |
|
|
|
} |
|
|
|
json_builder_end_array(json); |
|
|
|
|
|
|
|
json_builder_end_object(json); |
|
|
|
|
|
|
|
mutex_unlock(&ps->in_lock); |
|
|
|
|
|
|
|
mutex_lock(&ps->out_lock); |
|
|
|
|
|
|
|
if (ps->ssrc_out[0]) { |
|
|
|
json_builder_set_member_name(json, "egress"); |
|
|
|
json_builder_set_member_name(json, "egress"); |
|
|
|
json_builder_begin_object(json); |
|
|
|
mqtt_stream_stats_dir(&ps->stats_out, json); |
|
|
|
|
|
|
|
json_builder_set_member_name(json, "SSRC"); |
|
|
|
json_builder_begin_array(json); |
|
|
|
for (int i = 0; i < RTPE_NUM_SSRC_TRACKING; i++) { |
|
|
|
if (!ps->ssrc_out[i]) |
|
|
|
break; |
|
|
|
json_builder_begin_object(json); |
|
|
|
mqtt_ssrc_stats(ps->ssrc_out[0], json, ps->media); |
|
|
|
mqtt_ssrc_stats(ps->ssrc_out[i], json, ps->media); |
|
|
|
json_builder_end_object(json); |
|
|
|
} |
|
|
|
json_builder_end_array(json); |
|
|
|
|
|
|
|
json_builder_end_object(json); |
|
|
|
|
|
|
|
mutex_unlock(&ps->out_lock); |
|
|
|
} |
|
|
|
|