Skip to content
1 change: 1 addition & 0 deletions src/include/switch_core_media.h
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ SWITCH_DECLARE(void) switch_core_media_resume(switch_core_session_t *session);
SWITCH_DECLARE(void) switch_core_media_init(void);
SWITCH_DECLARE(void) switch_core_media_deinit(void);
SWITCH_DECLARE(void) switch_core_media_set_stats(switch_core_session_t *session);
SWITCH_DECLARE(void) switch_core_media_export_jb_stats(switch_core_session_t *session);
SWITCH_DECLARE(void) switch_core_media_sync_stats(switch_core_session_t *session);
SWITCH_DECLARE(void) switch_core_session_wake_video_thread(switch_core_session_t *session);
SWITCH_DECLARE(void) switch_core_session_clear_crypto(switch_core_session_t *session);
Expand Down
1 change: 1 addition & 0 deletions src/include/switch_jitterbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ SWITCH_DECLARE(void) switch_jb_set_flag(switch_jb_t *jb, switch_jb_flag_t flag);
SWITCH_DECLARE(void) switch_jb_clear_flag(switch_jb_t *jb, switch_jb_flag_t flag);
SWITCH_DECLARE(uint32_t) switch_jb_get_nack_success(switch_jb_t *jb);
SWITCH_DECLARE(uint32_t) switch_jb_get_packets_per_frame(switch_jb_t *jb);
SWITCH_DECLARE(void) switch_jb_export_stats(switch_jb_t *jb);

SWITCH_END_EXTERN_C
#endif
Expand Down
1 change: 1 addition & 0 deletions src/include/switch_rtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_debug_jitter_buffer(switch_rtp_t *rtp
SWITCH_DECLARE(switch_status_t) switch_rtp_deactivate_jitter_buffer(switch_rtp_t *rtp_session);
SWITCH_DECLARE(switch_status_t) switch_rtp_pause_jitter_buffer(switch_rtp_t *rtp_session, switch_bool_t pause);
SWITCH_DECLARE(switch_jb_t *) switch_rtp_get_jitter_buffer(switch_rtp_t *rtp_session);
SWITCH_DECLARE(switch_jb_t *) switch_rtp_get_jitter_buffer_for_stats(switch_rtp_t *rtp_session);



Expand Down
53 changes: 53 additions & 0 deletions src/switch_core_media.c
Original file line number Diff line number Diff line change
Expand Up @@ -2553,13 +2553,66 @@ SWITCH_DECLARE(void) switch_core_media_sync_stats(switch_core_session_t *session

}

static void set_jb_stats(switch_core_session_t *session, switch_media_type_t type)
{
switch_media_handle_t *smh;
switch_rtp_engine_t *engine;
switch_jb_t *jb;
const char *type_str = (type == SWITCH_MEDIA_TYPE_AUDIO) ? "audio" :
(type == SWITCH_MEDIA_TYPE_VIDEO) ? "video" : "text";

if (!(smh = session->media_handle)) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
"set_jb_stats(%s): no media handle\n", type_str);
return;
}

engine = &smh->engines[type];
if (!engine->rtp_session) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
"set_jb_stats(%s): no rtp_session\n", type_str);
return;
}

/* Use _for_stats variant which bypasses switch_rtp_ready() check
* since RTP session may not be "ready" during hangup but JB still exists */
jb = switch_rtp_get_jitter_buffer_for_stats(engine->rtp_session);
if (jb) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO,
"set_jb_stats(%s): exporting JB stats\n", type_str);
switch_jb_export_stats(jb);
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO,
"set_jb_stats(%s): no jitter buffer\n", type_str);
}
}

SWITCH_DECLARE(void) switch_core_media_export_jb_stats(switch_core_session_t *session)
{
if (!session->media_handle) {
return;
}

switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO,
"switch_core_media_export_jb_stats() exporting JB stats before hangup handlers\n");

/* Export jitter buffer stats so they're available in hangup hooks */
set_jb_stats(session, SWITCH_MEDIA_TYPE_AUDIO);
set_jb_stats(session, SWITCH_MEDIA_TYPE_VIDEO);
set_jb_stats(session, SWITCH_MEDIA_TYPE_TEXT);
}

SWITCH_DECLARE(void) switch_core_media_set_stats(switch_core_session_t *session)
{
switch_channel_t *channel = switch_core_session_get_channel(session);

if (!session->media_handle) {
return;
}

switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO,
"[%s] switch_core_media_set_stats() called\n", switch_channel_get_name(channel));

switch_core_media_sync_stats(session);

set_stats(session, SWITCH_MEDIA_TYPE_AUDIO, "audio");
Expand Down
3 changes: 3 additions & 0 deletions src/switch_core_state_machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,9 @@ SWITCH_DECLARE(void) switch_core_session_hangup_state(switch_core_session_t *ses
switch_channel_set_timestamps(session->channel);
switch_channel_set_callstate(session->channel, CCS_HANGUP);

/* Export JB stats before hangup handlers run, while JB still exists */
switch_core_media_export_jb_stats(session);

STATE_MACRO(hangup, "HANGUP");

switch_core_media_set_stats(session);
Expand Down
Loading
Loading