diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-30 02:12:09 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-30 02:12:09 +0000 |
commit | cd0067f95a3d30b8c59cf745e051810295fc96db (patch) | |
tree | 523cf56292aca0be31b6cbce502ff6608eab29a2 /channels | |
parent | 1369e0caffc94ce9dc3be97252868373c6b6a91b (diff) |
Add SIP video fixes
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6448 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-x | channels/chan_sip.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 0b77fabc4..bdd2c36e8 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -832,6 +832,7 @@ static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int inc, static int transmit_invite(struct sip_pvt *p, int sipmethod, int sendsdp, struct sip_invite_param *options, int init); static int transmit_reinvite_with_sdp(struct sip_pvt *p); static int transmit_info_with_digit(struct sip_pvt *p, char digit); +static int transmit_info_with_vidupdate(struct sip_pvt *p); static int transmit_message_with_text(struct sip_pvt *p, const char *text); static int transmit_refer(struct sip_pvt *p, const char *dest); static int sip_sipredirect(struct sip_pvt *p, const char *dest); @@ -2609,6 +2610,13 @@ static int sip_indicate(struct ast_channel *ast, int condition) ast_log(LOG_DEBUG, "Bridged channel is back from hold, let's talk! : %s\n", p->callid); res = -1; break; + case AST_CONTROL_VIDUPDATE: /* Request a video frame update */ + if (p->vrtp && !ast_test_flag(p, SIP_NOVIDEO)) { + transmit_info_with_vidupdate(p); + res = 0; + } else + res = -1; + break; case -1: res = -1; break; @@ -3949,7 +3957,7 @@ static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request /* If we are cancelling an incoming invite for some reason, add information about the reason why we are doing this in clear text */ if (p->owner && p->owner->hangupcause) { - add_header(&resp, "X-Asterisk-HangupCause:", ast_cause2str(p->owner->hangupcause)); + add_header(&resp, "X-Asterisk-HangupCause", ast_cause2str(p->owner->hangupcause)); } add_blank_header(&resp); return send_response(p, &resp, reliable, seqno); @@ -4056,6 +4064,26 @@ static int add_digit(struct sip_request *req, char digit) return 0; } +/*--- add_vidupdate: add XML encoded media control with update ---*/ +/* XML: The only way to turn 0 bits of information into a few hundred. */ +static int add_vidupdate(struct sip_request *req) +{ + const char *xml_is_a_huge_waste_of_space = + "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n" + " <media_control>\r\n" + " <vc_primitive>\r\n" + " <to_encoder>\r\n" + " <picture_fast_update\r\n" + " </picture_fast_update>\r\n" + " </to_encoder>\r\n" + " </vc_primitive>\r\n" + " </media_control>\r\n"; + add_header(req, "Content-Type", "application/media_control+xml"); + add_header_contentLength(req, strlen(xml_is_a_huge_waste_of_space)); + add_line(req, xml_is_a_huge_waste_of_space); + return 0; +} + /*--- add_sdp: Add Session Description Protocol message ---*/ static int add_sdp(struct sip_request *resp, struct sip_pvt *p) { @@ -5209,6 +5237,15 @@ static int transmit_info_with_digit(struct sip_pvt *p, char digit) return send_request(p, &req, 1, p->ocseq); } +/*--- transmit_info_with_vidupdate: Send SIP INFO with video update request ---*/ +static int transmit_info_with_vidupdate(struct sip_pvt *p) +{ + struct sip_request req; + reqprep(&req, p, SIP_INFO, 0, 1); + add_vidupdate(&req); + return send_request(p, &req, 1, p->ocseq); +} + /*--- transmit_request: transmit generic SIP request ---*/ static int transmit_request(struct sip_pvt *p, int sipmethod, int seqno, int reliable, int newbranch) { @@ -8125,6 +8162,12 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req) ast_set_flag(p, SIP_NEEDDESTROY); } return; + } else if (!strcasecmp(get_header(req, "Content-Type"), "application/media_control+xml")) { + /* Eh, we'll just assume it's a fast picture update for now */ + if (p->owner) + ast_queue_control(p->owner, AST_CONTROL_VIDUPDATE); + transmit_response(p, "200 OK", req); + return; } else if ((c = get_header(req, "X-ClientCode"))) { /* Client code (from SNOM phone) */ if (ast_test_flag(p, SIP_USECLIENTCODE)) { |