diff --git a/src/mod/codecs/mod_vpx/mod_vpx.c b/src/mod/codecs/mod_vpx/mod_vpx.c index c1f64190e9..01fe627b4e 100644 --- a/src/mod/codecs/mod_vpx/mod_vpx.c +++ b/src/mod/codecs/mod_vpx/mod_vpx.c @@ -501,7 +501,8 @@ static switch_status_t switch_vpx_decode(switch_codec_t *codec, switch_frame_t * switch_size_t len; vpx_codec_ctx_t *decoder = NULL; switch_status_t status = SWITCH_STATUS_SUCCESS; - + int is_keyframe = ((*(unsigned char *)frame->data) & 0x01) ? 0 : 1; + if (!context->decoder_init) { init_codec(codec); } @@ -515,10 +516,11 @@ static switch_status_t switch_vpx_decode(switch_codec_t *codec, switch_frame_t * // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "len: %d ts: %" SWITCH_SIZE_T_FMT " mark:%d\n", frame->datalen, frame->timestamp, frame->m); - if (context->last_received_timestamp && context->last_received_timestamp != frame->timestamp && + if (!is_keyframe && context->last_received_timestamp && context->last_received_timestamp != frame->timestamp && (!frame->m) && (!context->last_received_complete_picture)) { // possible packet loss switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Reset\n"); + context->need_key_frame = 1; switch_goto_status(SWITCH_STATUS_RESTART, end); } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 031b663b1d..9e6e9a8bcc 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -9010,18 +9010,12 @@ SWITCH_DECLARE(void) switch_core_session_stop_media(switch_core_session_t *sessi v_engine = &smh->engines[SWITCH_MEDIA_TYPE_VIDEO]; if (a_engine->rtp_session) { - switch_rtp_del_dtls(a_engine->rtp_session, DTLS_TYPE_RTP|DTLS_TYPE_RTCP); - switch_rtp_set_flag(a_engine->rtp_session, SWITCH_RTP_FLAG_PAUSE); - switch_rtp_set_flag(a_engine->rtp_session, SWITCH_RTP_FLAG_MUTE); + switch_rtp_reset(a_engine->rtp_session); } if (v_engine->rtp_session) { - switch_rtp_del_dtls(v_engine->rtp_session, DTLS_TYPE_RTP|DTLS_TYPE_RTCP); - switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_PAUSE); - switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_MUTE); + switch_rtp_reset(v_engine->rtp_session); } - - } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index de540ae07f..471d84b6c0 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2542,6 +2542,22 @@ SWITCH_DECLARE(void) switch_rtp_reset(switch_rtp_t *rtp_session) rtp_session->ts = 0; memset(&rtp_session->ts_norm, 0, sizeof(rtp_session->ts_norm)); + + switch_rtp_del_dtls(rtp_session, DTLS_TYPE_RTP|DTLS_TYPE_RTCP); + switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_PAUSE); + switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_MUTE); + + + if (rtp_session->ice.ready) { + if (rtp_session->vb) { + switch_vb_reset(rtp_session->vb); + } + if (rtp_session->vbw) { + switch_vb_reset(rtp_session->vbw); + } + rtp_session->ice.ready = rtp_session->ice.rready = 0; + } + } SWITCH_DECLARE(void) switch_rtp_reset_media_timer(switch_rtp_t *rtp_session) @@ -3948,22 +3964,10 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_activate_ice(switch_rtp_t *rtp_sessio switch_mutex_lock(rtp_session->ice_mutex); if (proto == IPR_RTP) { - ice = &rtp_session->ice; - + ice = &rtp_session->ice; rtp_session->flags[SWITCH_RTP_FLAG_PAUSE] = 0; rtp_session->flags[SWITCH_RTP_FLAG_MUTE] = 0; - switch_core_session_video_reinit(rtp_session->session); - - if (ice->ready) { - if (rtp_session->vb) { - switch_vb_reset(rtp_session->vb); - } - if (rtp_session->vbw) { - switch_vb_reset(rtp_session->vbw); - } - } - } else { ice = &rtp_session->rtcp_ice; }