pjsip: reinvite for connected line updates occurs when it should not
[asterisk/asterisk.git] / channels / chan_pjsip.c
index df6e9a3..96500b4 100644 (file)
@@ -1077,6 +1077,7 @@ static int transmit_info_with_vidupdate(void *data)
 static int update_connected_line_information(void *data)
 {
        RAII_VAR(struct ast_sip_session *, session, data, ao2_cleanup);
+       struct ast_party_id connected_id;
 
        if ((ast_channel_state(session->channel) != AST_STATE_UP) && (session->inv_session->role == PJSIP_UAS_ROLE)) {
                int response_code = 0;
@@ -1101,7 +1102,13 @@ static int update_connected_line_information(void *data)
                        method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE;
                }
 
-               ast_sip_session_refresh(session, NULL, NULL, NULL, method, 0);
+               connected_id = ast_channel_connected_effective_id(session->channel);
+               if ((session->endpoint->id.send_pai || session->endpoint->id.send_rpid) &&
+                   (session->endpoint->id.trust_outbound ||
+                    ((connected_id.name.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED &&
+                     (connected_id.number.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED))) {
+                       ast_sip_session_refresh(session, NULL, NULL, NULL, method, 1);
+               }
        }
 
        return 0;
@@ -1168,10 +1175,25 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
        case AST_CONTROL_VIDUPDATE:
                media = pvt->media[SIP_MEDIA_VIDEO];
                if (media && media->rtp) {
-                       ao2_ref(channel->session, +1);
+                       /* FIXME: Only use this for VP8. Additional work would have to be done to
+                        * fully support other video codecs */
+                       struct ast_format_cap *fcap = ast_channel_nativeformats(ast);
+                       struct ast_format vp8;
+                       ast_format_set(&vp8, AST_FORMAT_VP8, 0);
+                       if (ast_format_cap_iscompatible(fcap, &vp8)) {
+                               /* FIXME Fake RTP write, this will be sent as an RTCP packet. Ideally the
+                                * RTP engine would provide a way to externally write/schedule RTCP
+                                * packets */
+                               struct ast_frame fr;
+                               fr.frametype = AST_FRAME_CONTROL;
+                               fr.subclass.integer = AST_CONTROL_VIDUPDATE;
+                               res = ast_rtp_instance_write(media->rtp, &fr);
+                       } else {
+                               ao2_ref(channel->session, +1);
 
-                       if (ast_sip_push_task(channel->session->serializer, transmit_info_with_vidupdate, channel->session)) {
-                               ao2_cleanup(channel->session);
+                               if (ast_sip_push_task(channel->session->serializer, transmit_info_with_vidupdate, channel->session)) {
+                                       ao2_cleanup(channel->session);
+                               }
                        }
                } else {
                        res = -1;