mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-21 12:30:41 +00:00
Clean transmit_* for start/stop media transmission
Small patch changing skinny_set_rtp_peer to use transmit_stopmediatransmission and to use new transmit_startmediatransmission. Basic testing on 30VIP's by wedhorn Basic testing on 7960 by me (closes issue #16956) Reported by: wedhorn Patches: skinny-clean05b.diff uploaded by wedhorn (license 30) Tested by: wedhorn,mvanbaak git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@251222 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -2412,6 +2412,26 @@ static void transmit_stopmediatransmission(struct skinny_device *d, struct skinn
|
||||
transmit_response(d, req);
|
||||
}
|
||||
|
||||
static void transmit_startmediatransmission(struct skinny_device *d, struct skinny_subchannel *sub, struct sockaddr_in dest, struct ast_format_list fmt)
|
||||
{
|
||||
struct skinny_req *req;
|
||||
|
||||
if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
|
||||
return;
|
||||
|
||||
req->data.startmedia.conferenceId = htolel(sub->callid);
|
||||
req->data.startmedia.passThruPartyId = htolel(sub->callid);
|
||||
req->data.startmedia.remoteIp = dest.sin_addr.s_addr;
|
||||
req->data.startmedia.remotePort = htolel(ntohs(dest.sin_port));
|
||||
req->data.startmedia.packetSize = htolel(fmt.cur_ms);
|
||||
req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
|
||||
req->data.startmedia.qualifier.precedence = htolel(127);
|
||||
req->data.startmedia.qualifier.vad = htolel(0);
|
||||
req->data.startmedia.qualifier.packets = htolel(0);
|
||||
req->data.startmedia.qualifier.bitRate = htolel(0);
|
||||
transmit_response(d, req);
|
||||
}
|
||||
|
||||
static void transmit_activatecallplane(struct skinny_device *d, struct skinny_line *l)
|
||||
{
|
||||
struct skinny_req *req;
|
||||
@@ -2480,6 +2500,8 @@ static void transmit_cfwdstate(struct skinny_device *d, struct skinny_line *l)
|
||||
transmit_response(d, req);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int skinny_extensionstate_cb(char *context, char *exten, int state, void *data)
|
||||
{
|
||||
struct skinny_speeddial *sd = data;
|
||||
@@ -2661,11 +2683,9 @@ static int skinny_set_rtp_peer(struct ast_channel *c, struct ast_rtp_instance *r
|
||||
struct skinny_subchannel *sub;
|
||||
struct skinny_line *l;
|
||||
struct skinny_device *d;
|
||||
struct skinnysession *s;
|
||||
struct ast_format_list fmt;
|
||||
struct sockaddr_in us = { 0, };
|
||||
struct sockaddr_in them = { 0, };
|
||||
struct skinny_req *req;
|
||||
|
||||
sub = c->tech_pvt;
|
||||
|
||||
@@ -2678,47 +2698,28 @@ static int skinny_set_rtp_peer(struct ast_channel *c, struct ast_rtp_instance *r
|
||||
|
||||
l = sub->parent;
|
||||
d = l->device;
|
||||
s = d->session;
|
||||
|
||||
if (rtp){
|
||||
ast_rtp_instance_get_remote_address(rtp, &them);
|
||||
|
||||
/* Shutdown any early-media or previous media on re-invite */
|
||||
if (!(req = req_alloc(sizeof(struct stop_media_transmission_message), STOP_MEDIA_TRANSMISSION_MESSAGE)))
|
||||
return -1;
|
||||
|
||||
req->data.stopmedia.conferenceId = htolel(sub->callid);
|
||||
req->data.stopmedia.passThruPartyId = htolel(sub->callid);
|
||||
transmit_response(d, req);
|
||||
|
||||
transmit_stopmediatransmission(d, sub);
|
||||
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "Peerip = %s:%d\n", ast_inet_ntoa(them.sin_addr), ntohs(them.sin_port));
|
||||
|
||||
if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
|
||||
return -1;
|
||||
|
||||
fmt = ast_codec_pref_getsize(&l->prefs, ast_best_codec(l->capability));
|
||||
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "Setting payloadType to '%s' (%d ms)\n", ast_getformatname(fmt.bits), fmt.cur_ms);
|
||||
|
||||
req->data.startmedia.conferenceId = htolel(sub->callid);
|
||||
req->data.startmedia.passThruPartyId = htolel(sub->callid);
|
||||
if (!(l->directmedia) || (l->nat)){
|
||||
ast_rtp_instance_get_local_address(rtp, &us);
|
||||
req->data.startmedia.remoteIp = d->ourip.s_addr;
|
||||
req->data.startmedia.remotePort = htolel(ntohs(us.sin_port));
|
||||
us.sin_addr.s_addr = us.sin_addr.s_addr ? us.sin_addr.s_addr : d->ourip.s_addr;
|
||||
transmit_startmediatransmission(d, sub, us, fmt);
|
||||
} else {
|
||||
req->data.startmedia.remoteIp = them.sin_addr.s_addr;
|
||||
req->data.startmedia.remotePort = htolel(ntohs(them.sin_port));
|
||||
transmit_startmediatransmission(d, sub, them, fmt);
|
||||
}
|
||||
req->data.startmedia.packetSize = htolel(fmt.cur_ms);
|
||||
req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
|
||||
req->data.startmedia.qualifier.precedence = htolel(127);
|
||||
req->data.startmedia.qualifier.vad = htolel(0);
|
||||
req->data.startmedia.qualifier.packets = htolel(0);
|
||||
req->data.startmedia.qualifier.bitRate = htolel(0);
|
||||
transmit_response(d, req);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5628,33 +5629,23 @@ static int handle_open_receive_channel_ack_message(struct skinny_req *req, struc
|
||||
if (sub->rtp) {
|
||||
ast_rtp_instance_set_remote_address(sub->rtp, &sin);
|
||||
ast_rtp_instance_get_local_address(sub->rtp, &us);
|
||||
us.sin_addr.s_addr = us.sin_addr.s_addr ? us.sin_addr.s_addr : d->ourip.s_addr;
|
||||
} else {
|
||||
ast_log(LOG_ERROR, "No RTP structure, this is very bad\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "ipaddr = %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
|
||||
|
||||
if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
|
||||
return -1;
|
||||
if (skinnydebug) {
|
||||
ast_verb(1, "device ipaddr = %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
|
||||
ast_verb(1, "asterisk ipaddr = %s:%d\n", ast_inet_ntoa(us.sin_addr), ntohs(us.sin_port));
|
||||
}
|
||||
|
||||
fmt = ast_codec_pref_getsize(&l->prefs, ast_best_codec(l->capability));
|
||||
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "Setting payloadType to '%s' (%d ms)\n", ast_getformatname(fmt.bits), fmt.cur_ms);
|
||||
|
||||
req->data.startmedia.conferenceId = htolel(sub->callid);
|
||||
req->data.startmedia.passThruPartyId = htolel(sub->callid);
|
||||
req->data.startmedia.remoteIp = d->ourip.s_addr;
|
||||
req->data.startmedia.remotePort = htolel(ntohs(us.sin_port));
|
||||
req->data.startmedia.packetSize = htolel(fmt.cur_ms);
|
||||
req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
|
||||
req->data.startmedia.qualifier.precedence = htolel(127);
|
||||
req->data.startmedia.qualifier.vad = htolel(0);
|
||||
req->data.startmedia.qualifier.packets = htolel(0);
|
||||
req->data.startmedia.qualifier.bitRate = htolel(0);
|
||||
transmit_response(d, req);
|
||||
transmit_startmediatransmission(d, sub, us, fmt);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user