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
certified/1.8.6
Michiel van Baak 15 years ago
parent cf51a99b24
commit 007e52f5dc

@ -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;
}

Loading…
Cancel
Save