diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index a643ff6ba15e731963f2d8084a45347176945d5a..df42ae2577c6f352706f3760620d62485597a87e 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -5553,6 +5553,25 @@ static int add_sdp_streams(struct ast_sip_session_media *session_media, handler_list = ao2_find(sdp_handlers, ast_codec_media_type2str(session_media->type), OBJ_KEY); if (!handler_list) { + /* If there is no handler for this media, set port as 0 in m line and copy all media specific + * attributes from the remote (offer) */ + if ((ast_stream_get_state(stream) == AST_STREAM_STATE_REMOVED || !ast_stream_get_formats(stream) || + !ast_format_cap_count(ast_stream_get_formats(stream))) && remote && remote->media[ast_stream_get_position(stream)]) { + pj_pool_t *pool = session->inv_session->pool_prov; + struct pjmedia_sdp_media *media = pjmedia_sdp_media_clone(pool, remote->media[ast_stream_get_position(stream)]); + if (media) { + /* Update port */ + media->desc.port = 0; + media->desc.port_count = 1; + + /* Add this media to the local SDP */ + answer->media[answer->media_count++] = media; + ast_stream_set_state(stream, AST_STREAM_STATE_REMOVED); + + SCOPE_EXIT_RTN_VALUE(0, "Add a rejected media stream and its attributes\n"); + } + } + SCOPE_EXIT_RTN_VALUE(0, "No handlers\n"); }