diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 1300850ed6..3bb1ef4e99 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -930,10 +930,18 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_ session_media = AST_VECTOR_GET(&session->pending_media_state->sessions, i); stream = ast_stream_topology_get_stream(session->pending_media_state->topology, i); - /* The stream state will have already been set to removed when either we - * negotiate the incoming SDP stream or when we produce our own local SDP. - * This can occur if an internal thing has requested it to be removed, or if - * we remove it as a result of the stream limit being reached. + /* Make sure that this stream is in the correct state. If we need to change + * the state to REMOVED, then our work here is done, so go ahead and move on + * to the next stream. + */ + if (!remote->media[i]->desc.port) { + ast_stream_set_state(stream, AST_STREAM_STATE_REMOVED); + continue; + } + + /* If the stream state is REMOVED, nothing needs to be done, so move on to the + * next stream. This can occur if an internal thing has requested it to be + * removed, or if we remove it as a result of the stream limit being reached. */ if (ast_stream_get_state(stream) == AST_STREAM_STATE_REMOVED) { /* diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 1327d710a6..1d1d66e8b6 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -5802,7 +5802,17 @@ static struct ast_frame *ast_rtcp_interpret(struct ast_rtp_instance *instance, s } if (ssrc_valid && rtp->themssrc_valid) { - if (ssrc != rtp->themssrc && use_packet_source) { + /* + * If the SSRC is 1, we still need to handle RTCP since this could be a + * special case. For example, if we have a unidirectional video stream, the + * SSRC may be set to 1 by the browser (in the case of chromium), and requests + * will still need to be processed so that video can flow as expected. This + * should only be done for PLI and FUR, since there is not a way to get the + * appropriate rtp instance when the SSRC is 1. + */ + int exception = (ssrc == 1 && !((pt == RTCP_PT_PSFB && rc == AST_RTP_RTCP_FMT_PLI) || pt == RTCP_PT_FUR)); + if ((ssrc != rtp->themssrc && use_packet_source && ssrc != 1) + || exception) { /* * Skip over this RTCP record as it does not contain the * correct SSRC. We should not act upon RTCP records