diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 4ecf00b362..768c438e03 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1006,7 +1006,8 @@ typedef enum { SWITCH_CAUSE_BLIND_TRANSFER = 600, SWITCH_CAUSE_ATTENDED_TRANSFER = 601, SWITCH_CAUSE_ALLOTTED_TIMEOUT = 602, - SWITCH_CAUSE_USER_CHALLENGE = 603 + SWITCH_CAUSE_USER_CHALLENGE = 603, + SWITCH_CAUSE_MEDIA_TIMEOUT = 604 } switch_call_cause_t; typedef enum { diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 36e6002433..b8401c2b7f 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -387,7 +387,10 @@ static switch_status_t sofia_read_video_frame(switch_core_session_t *session, sw status = switch_rtp_zerocopy_read_frame(tech_pvt->video_rtp_session, &tech_pvt->video_read_frame); if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - return SWITCH_STATUS_FALSE; + if (status == SWITCH_STATUS_TIMEOUT) { + switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_MEDIA_TIMEOUT); + } + return status; } payload = tech_pvt->video_read_frame.payload; @@ -492,11 +495,12 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame); if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - return SWITCH_STATUS_FALSE; + if (status == SWITCH_STATUS_TIMEOUT) { + switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_MEDIA_TIMEOUT); + } + return status; } - - - + payload = tech_pvt->read_frame.payload; if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) { diff --git a/src/switch_channel.c b/src/switch_channel.c index 0a635d550a..abd7502f57 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -97,6 +97,7 @@ static struct switch_cause_table CAUSE_CHART[] = { {"ATTENDED_TRANSFER", SWITCH_CAUSE_ATTENDED_TRANSFER}, {"ALLOTTED_TIMEOUT", SWITCH_CAUSE_ALLOTTED_TIMEOUT}, {"USER_CHALLENGE", SWITCH_CAUSE_USER_CHALLENGE}, + {"MEDIA_TIMEOUT", SWITCH_CAUSE_MEDIA_TIMEOUT}, {NULL, 0} }; diff --git a/src/switch_rtp.c b/src/switch_rtp.c index e0c554999c..d78f036840 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -906,7 +906,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ do_2833(rtp_session); if (!bytes && rtp_session->max_missed_packets) { if (++rtp_session->missed_count >= rtp_session->max_missed_packets) { - return -1; + return -2; } } @@ -1204,7 +1204,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_read(switch_rtp_t *rtp_session, void if (bytes < 0) { *datalen = 0; - return SWITCH_STATUS_GENERR; + return bytes == -2 ? SWITCH_STATUS_TIMEOUT : SWITCH_STATUS_GENERR; } else if (bytes == 0) { *datalen = 0; return SWITCH_STATUS_BREAK; @@ -1244,7 +1244,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp if (bytes < 0) { frame->datalen = 0; - return SWITCH_STATUS_GENERR; + return bytes == -2 ? SWITCH_STATUS_TIMEOUT : SWITCH_STATUS_GENERR; } else if (bytes == 0) { frame->datalen = 0; return SWITCH_STATUS_BREAK;