[asterisk-commits] oej: branch oej/pinefrog-1.4 r252227 - in /team/oej/pinefrog-1.4: ./ channels...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Mar 13 02:51:32 CST 2010
Author: oej
Date: Sat Mar 13 02:51:27 2010
New Revision: 252227
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=252227
Log:
Resetting branch, fixing some typos in new code
Modified:
team/oej/pinefrog-1.4/ (props changed)
team/oej/pinefrog-1.4/channels/chan_h323.c
team/oej/pinefrog-1.4/channels/chan_mgcp.c
team/oej/pinefrog-1.4/channels/chan_sip.c
team/oej/pinefrog-1.4/channels/chan_skinny.c
team/oej/pinefrog-1.4/configs/sip.conf.sample
team/oej/pinefrog-1.4/include/asterisk/frame.h
team/oej/pinefrog-1.4/include/asterisk/rtp.h
team/oej/pinefrog-1.4/main/channel.c
team/oej/pinefrog-1.4/main/rtp.c
Propchange: team/oej/pinefrog-1.4/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sat Mar 13 02:51:27 2010
@@ -1,1 +1,1 @@
-/branches/1.4:1-252036
+/branches/1.4:1-252225
Modified: team/oej/pinefrog-1.4/channels/chan_h323.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/channels/chan_h323.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/channels/chan_h323.c (original)
+++ team/oej/pinefrog-1.4/channels/chan_h323.c Sat Mar 13 02:51:27 2010
@@ -918,7 +918,11 @@
res = 0;
break;
case AST_CONTROL_SRCUPDATE:
- ast_rtp_new_source(pvt->rtp);
+ ast_rtp_update_source(pvt->rtp);
+ res = 0;
+ break;
+ case AST_CONTROL_SRCCHANGE:
+ ast_rtp_change_source(pvt->rtp);
res = 0;
break;
case AST_CONTROL_PROCEEDING:
Modified: team/oej/pinefrog-1.4/channels/chan_mgcp.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/channels/chan_mgcp.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/channels/chan_mgcp.c (original)
+++ team/oej/pinefrog-1.4/channels/chan_mgcp.c Sat Mar 13 02:51:27 2010
@@ -1442,7 +1442,10 @@
ast_moh_stop(ast);
break;
case AST_CONTROL_SRCUPDATE:
- ast_rtp_new_source(sub->rtp);
+ ast_rtp_update_source(sub->rtp);
+ break;
+ case AST_CONTROL_SRCCHANGE:
+ ast_rtp_change_source(sub->rtp);
break;
case -1:
transmit_notify_request(sub, "");
Modified: team/oej/pinefrog-1.4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/channels/chan_sip.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/channels/chan_sip.c (original)
+++ team/oej/pinefrog-1.4/channels/chan_sip.c Sat Mar 13 02:51:27 2010
@@ -813,12 +813,11 @@
#define SIP_PAGE2_UDPTL_DESTINATION (1 << 28) /*!< 28: Use source IP of RTP as destination if NAT is enabled */
#define SIP_PAGE2_DIALOG_ESTABLISHED (1 << 29) /*!< 29: Has a dialog been established? */
#define SIP_PAGE2_RPORT_PRESENT (1 << 30) /*!< 30: Was rport received in the Via header? */
-#define SIP_PAGE2_CONSTANT_SSRC (1 << 31) /*!< 31: Don't change SSRC on reinvite */
#define SIP_PAGE2_FLAGS_TO_COPY \
(SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | \
SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | \
- SIP_PAGE2_UDPTL_DESTINATION | SIP_PAGE2_CONSTANT_SSRC)
+ SIP_PAGE2_UDPTL_DESTINATION)
/* SIP packet flags */
#define SIP_PKT_DEBUG (1 << 0) /*!< Debug this packet */
@@ -1052,7 +1051,8 @@
struct sip_invite_param *options; /*!< Options for INVITE */
int autoframing;
int hangupcause; /*!< Storage of hangupcause copied from our owner before we disconnect from the AST channel (only used at hangup) */
- struct ast_rtp_quality *qual; /*!< The latest quality report, for realtime storage */
+ struct ast_rtp_quality *audioqual; /*!< Audio: The latest quality report, for realtime storage */
+ struct ast_rtp_quality *videoqual; /*!< Video: The latest quality report, for realtime storage */
/*! When receiving an SDP offer, it is important to take note of what media types were offered.
* By doing this, even if we don't want to answer a particular media stream with something meaningful, we can
* still put an m= line in our answer with the port set to 0.
@@ -1376,6 +1376,7 @@
static int send_rtcp_events(const void *data);
static void start_rtcp_events(struct sip_pvt *dialog);
static void stop_media_flows(struct sip_pvt *p);
+static void qos_write_realtime(struct sip_pvt *dialog, struct ast_rtp_quality *qual);
/*--- Authentication stuff */
static int reply_digest(struct sip_pvt *p, struct sip_request *req, char *header, int sipmethod, char *digest, int digest_len);
@@ -2604,12 +2605,6 @@
if (option_debug > 2)
ast_log(LOG_DEBUG, "Destroying SIP peer %s\n", peer->name);
- if (peer->qual) {
- /* We have a quality report to write to realtime before we leave this world. */
- qos_write_realtime(peer->qual);
- free(peer->qual);
- peer->qual = NULL;
- }
/* Delete it, it needs to disappear */
if (peer->call) {
@@ -2967,9 +2962,6 @@
ast_rtp_set_rtptimeout(dialog->rtp, peer->rtptimeout);
ast_rtp_set_rtpholdtimeout(dialog->rtp, peer->rtpholdtimeout);
ast_rtp_set_rtpkeepalive(dialog->rtp, peer->rtpkeepalive);
- if (ast_test_flag(&dialog->flags[1], SIP_PAGE2_CONSTANT_SSRC)) {
- ast_rtp_set_constantssrc(dialog->rtp);
- }
/* Set Frame packetization */
ast_rtp_codec_setpref(dialog->rtp, &dialog->prefs);
dialog->autoframing = peer->autoframing;
@@ -2980,9 +2972,6 @@
ast_rtp_set_rtptimeout(dialog->vrtp, peer->rtptimeout);
ast_rtp_set_rtpholdtimeout(dialog->vrtp, peer->rtpholdtimeout);
ast_rtp_set_rtpkeepalive(dialog->vrtp, peer->rtpkeepalive);
- if (ast_test_flag(&dialog->flags[1], SIP_PAGE2_CONSTANT_SSRC)) {
- ast_rtp_set_constantssrc(dialog->vrtp);
- }
}
ast_string_field_set(dialog, peername, peer->name);
@@ -3305,6 +3294,19 @@
if (dumphistory)
sip_dump_history(p);
+
+ if (p->audioqual) {
+ /* We have a quality report to write to realtime before we leave this world. */
+ qos_write_realtime(p, p->audioqual);
+ free(p->audioqual);
+ p->audioqual = NULL;
+ }
+ if (p->videoqual) {
+ /* We have a quality report to write to realtime before we leave this world. */
+ qos_write_realtime(p, p->videoqual);
+ free(p->videoqual);
+ p->videoqual = NULL;
+ }
if (p->options)
free(p->options);
@@ -3888,6 +3890,7 @@
if (option_debug)
ast_log(LOG_DEBUG, "SIP answering channel: %s\n", ast->name);
+ ast_rtp_update_source(p->rtp);
res = transmit_response_with_sdp(p, "200 OK", &p->initreq, XMIT_CRITICAL);
ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
start_rtcp_events(p);
@@ -3923,7 +3926,7 @@
if ((ast->_state != AST_STATE_UP) &&
!ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
!ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
- ast_rtp_new_source(p->rtp);
+ ast_rtp_update_source(p->rtp);
if (!global_prematuremediafilter) {
p->invitestate = INV_EARLY_MEDIA;
transmit_provisional_response(p, "183 Session Progress", &p->initreq, 1);
@@ -4171,11 +4174,11 @@
res = -1;
break;
case AST_CONTROL_HOLD:
- ast_rtp_new_source(p->rtp);
+ ast_rtp_update_source(p->rtp);
ast_moh_start(ast, data, p->mohinterpret);
break;
case AST_CONTROL_UNHOLD:
- ast_rtp_new_source(p->rtp);
+ ast_rtp_update_source(p->rtp);
ast_moh_stop(ast);
break;
case AST_CONTROL_VIDUPDATE: /* Request a video frame update */
@@ -4186,7 +4189,10 @@
res = -1;
break;
case AST_CONTROL_SRCUPDATE:
- ast_rtp_new_source(p->rtp);
+ ast_rtp_update_source(p->rtp);
+ break;
+ case AST_CONTROL_SRCCHANGE:
+ ast_rtp_change_source(p->rtp);
break;
case -1:
res = -1;
@@ -13453,7 +13459,6 @@
{
struct ast_rtp_quality qual;
char *rtpqstring = NULL;
- char localjitter[10], remotejitter[10];
int qosrealtime = ast_check_realtime("rtpqos");
unsigned int duration; /* Duration in secs */
int readtrans = FALSE, writetrans = FALSE;
@@ -13477,11 +13482,11 @@
be great!
*/
if (option_debug) {
- if (readtrans && p->owner->readtrans->translator) {
- ast_log(LOG_DEBUG, "--- Read translator: %s Cost %d\n", p->owner->readtrans->translator->name, p->owner->readtrans->translator->cost);
+ if (readtrans && p->owner->readtrans->t) {
+ ast_log(LOG_DEBUG, "--- Read translator: %s Cost %d\n", p->owner->readtrans->t->name, p->owner->readtrans->t->cost);
}
- if (writetrans && p->owner->writetrans->translator) {
- ast_log(LOG_DEBUG, "--- Write translator: %s \n", p->owner->writetrans->translator->name, p->owner->writetrans->translator->cost);
+ if (writetrans && p->owner->writetrans->t) {
+ ast_log(LOG_DEBUG, "--- Write translator: %s Cost %d\n", p->owner->writetrans->t->name, p->owner->writetrans->t->cost);
}
}
}
@@ -13561,15 +13566,22 @@
monitor thread instead.
*/
if (reporttype == 1 && qosrealtime) {
- p->qual = ast_calloc(sizeof(struct ast_rtp_quality), 1)
- p->qual = qual;
- p->qual->end = ast_tvnow();
+ if (mediatype[0] == 'a') { /* Audio */
+ p->audioqual = ast_calloc(sizeof(struct ast_rtp_quality), 1);
+ (* p->audioqual) = qual;
+ p->audioqual->end = ast_tvnow();
+ } else if (mediatype[0] == 'v') { /* Video */
+ p->videoqual = ast_calloc(sizeof(struct ast_rtp_quality), 1);
+ (* p->videoqual) = qual;
+ p->videoqual->end = ast_tvnow();
+ }
}
}
/*! \brief Write quality report to realtime storage */
-void qos_write_realtime(struct ast_rtp_quality *qual)
-{
+void qos_write_realtime(struct sip_pvt *dialog, struct ast_rtp_quality *qual)
+{
+#ifdef REALTIME2
unsigned int duration; /* Duration in secs */
char buf_duration[10], buf_lssrc[30], buf_rssrc[30], buf_rtt[30];
char localjitter[10], remotejitter[10];
@@ -13587,13 +13599,13 @@
sprintf(buf_lssrc, "%u", qual->local_ssrc);
sprintf(buf_rssrc, "%u", qual->remote_ssrc);
sprintf(buf_rtt, "%f", qual->rtt);
- sprintf(buf_duration, "%ld", duration);
+ sprintf(buf_duration, "%u", duration);
ast_store_realtime("rtpqos",
- "channel", p->owner ? p->owner->name : "",
- "uniqueid", p->owner ? p->owner->uniqueid : "",
+ "channel", dialog->owner ? dialog->owner->name : "",
+ "uniqueid", dialog->owner ? dialog->owner->uniqueid : "",
"bridgedchan", qual->bridgedchan[0] ? qual->bridgedchan : "" ,
"bridgeduniqueid", qual->bridgeduniqueid[0] ? qual->bridgeduniqueid : "",
- "pvtcallid", p->callid,
+ "pvtcallid", dialog->callid,
"rtpmedia", mediatype,
"localssrc", buf_lssrc, "remotessrc", buf_rssrc,
"rtt", buf_rtt,
@@ -13604,6 +13616,7 @@
"duration", buf_duration,
NULL);
}
+#endif
}
/*! \brief Send RTCP manager events */
@@ -15311,14 +15324,6 @@
res = -1;
goto request_invite_cleanup;
}
- if (ast_test_flag(&p->flags[1], SIP_PAGE2_CONSTANT_SSRC)) {
- if (p->rtp) {
- ast_rtp_set_constantssrc(p->rtp);
- }
- if (p->vrtp) {
- ast_rtp_set_constantssrc(p->vrtp);
- }
- }
} else { /* No SDP in invite, call control session */
p->jointcapability = p->capability;
if (option_debug > 1)
@@ -17801,9 +17806,6 @@
} else if (!strcasecmp(v->name, "t38pt_usertpsource")) {
ast_set_flag(&mask[1], SIP_PAGE2_UDPTL_DESTINATION);
ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_UDPTL_DESTINATION);
- } else if (!strcasecmp(v->name, "constantssrc")) {
- ast_set_flag(&mask[1], SIP_PAGE2_CONSTANT_SSRC);
- ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_CONSTANT_SSRC);
} else
res = 0;
@@ -18886,8 +18888,6 @@
default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
} else if (!strcasecmp(v->name, "matchexterniplocally")) {
global_matchexterniplocally = ast_true(v->value);
- } else if (!strcasecmp(v->name, "constantssrc")) {
- ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_CONSTANT_SSRC);
} else if (!strcasecmp(v->name, "shrinkcallerid")) {
if (ast_true(v->value)) {
global_shrinkcallerid = 1;
Modified: team/oej/pinefrog-1.4/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/channels/chan_skinny.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/channels/chan_skinny.c (original)
+++ team/oej/pinefrog-1.4/channels/chan_skinny.c Sat Mar 13 02:51:27 2010
@@ -2868,7 +2868,10 @@
case AST_CONTROL_PROCEEDING:
break;
case AST_CONTROL_SRCUPDATE:
- ast_rtp_new_source(sub->rtp);
+ ast_rtp_update_source(sub->rtp);
+ break;
+ case AST_CONTROL_SRCCHANGE:
+ ast_rtp_change_source(sub->rtp);
break;
default:
ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", ind);
Modified: team/oej/pinefrog-1.4/configs/sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/configs/sip.conf.sample?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/configs/sip.conf.sample (original)
+++ team/oej/pinefrog-1.4/configs/sip.conf.sample Sat Mar 13 02:51:27 2010
@@ -387,8 +387,6 @@
;canreinvite=update ; Yet a third option... use UPDATE for media path redirection,
; instead of INVITE. This can be combined with 'nonat', as
; 'canreinvite=update,nonat'. It implies 'yes'.
-
-;constantssrc=yes ; Don't change the RTP SSRC when our media stream changes
;----------------------------------------- REALTIME SUPPORT ------------------------
; For additional information on ARA, the Asterisk Realtime Architecture,
@@ -549,7 +547,6 @@
; maxcallbitrate maxcallbitrate
; rfc2833compensate mailbox
; t38pt_usertpsource username
-; constantssrc template
; fromdomain
; regexten
; fromuser
@@ -562,7 +559,6 @@
; sendrpid
; outboundproxy
; rfc2833compensate
-; constantssrc
; t38pt_usertpsource
; contactpermit ; Limit what a host may register as (a neat trick
; contactdeny ; is to register at the same IP as a SIP provider,
Modified: team/oej/pinefrog-1.4/include/asterisk/frame.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/include/asterisk/frame.h?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/include/asterisk/frame.h (original)
+++ team/oej/pinefrog-1.4/include/asterisk/frame.h Sat Mar 13 02:51:27 2010
@@ -85,7 +85,8 @@
\arg \b HOLD Call is placed on hold
\arg \b UNHOLD Call is back from hold
\arg \b VIDUPDATE Video update requested
- \arg \b SRCUPDATE The source of media has changed
+ \arg \b SRCUPDATE The source of media has changed (RTP marker bit must change)
+ \arg \b SRCCHANGE Media source has changed (RTP marker bit and SSRC must change)
*/
@@ -290,6 +291,7 @@
AST_CONTROL_UNHOLD = 17, /*!< Indicate call is left from hold */
AST_CONTROL_VIDUPDATE = 18, /*!< Indicate video frame update */
AST_CONTROL_SRCUPDATE = 20, /*!< Indicate source of media has changed */
+ AST_CONTROL_SRCCHANGE = 21, /*!< Media has changed and requires a new RTP SSRC */
};
#define AST_SMOOTHER_FLAG_G729 (1 << 0)
Modified: team/oej/pinefrog-1.4/include/asterisk/rtp.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/include/asterisk/rtp.h?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/include/asterisk/rtp.h (original)
+++ team/oej/pinefrog-1.4/include/asterisk/rtp.h Sat Mar 13 02:51:27 2010
@@ -213,16 +213,17 @@
adds processing and latency to the bridged call.
*/
void ast_rtcp_set_translation(struct ast_rtp *rtp, const char *writetranslator, const int writecost,
- const char *readtranslator, cost int readcost);
-
-
-
-
+ const char *readtranslator, const int readcost);
/*! \brief When changing sources, don't generate a new SSRC */
void ast_rtp_set_constantssrc(struct ast_rtp *rtp);
-void ast_rtp_new_source(struct ast_rtp *rtp);
+/*! \brief Indicate that we need to set the marker bit */
+void ast_rtp_update_source(struct ast_rtp *rtp);
+
+
+/*! \brief Indicate that we need to set the marker bit and change the ssrc */
+void ast_rtp_change_source(struct ast_rtp *rtp);
/*! \brief Setting RTP payload types from lines in a SDP description: */
void ast_rtp_pt_clear(struct ast_rtp* rtp);
Modified: team/oej/pinefrog-1.4/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/main/channel.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/main/channel.c (original)
+++ team/oej/pinefrog-1.4/main/channel.c Sat Mar 13 02:51:27 2010
@@ -1990,6 +1990,7 @@
case AST_CONTROL_RINGING:
case AST_CONTROL_ANSWER:
case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_SRCCHANGE:
/* Unimportant */
break;
default:
@@ -2589,6 +2590,7 @@
case AST_CONTROL_PROCEEDING:
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_SRCCHANGE:
case AST_CONTROL_RADIO_KEY:
case AST_CONTROL_RADIO_UNKEY:
case AST_CONTROL_OPTION:
@@ -2681,6 +2683,7 @@
case AST_CONTROL_PROCEEDING:
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_SRCCHANGE:
case AST_CONTROL_RADIO_KEY:
case AST_CONTROL_RADIO_UNKEY:
case AST_CONTROL_OPTION:
@@ -3385,6 +3388,7 @@
case AST_CONTROL_UNHOLD:
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_SRCCHANGE:
case -1: /* Ignore -- just stopping indications */
break;
@@ -4334,6 +4338,7 @@
case AST_CONTROL_UNHOLD:
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
+ case AST_CONTROL_SRCCHANGE:
ast_indicate_data(other, f->subclass, f->data, f->datalen);
if (jb_in_use) {
ast_jb_empty_and_reset(c0, c1);
Modified: team/oej/pinefrog-1.4/main/rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/main/rtp.c?view=diff&rev=252227&r1=252226&r2=252227
==============================================================================
--- team/oej/pinefrog-1.4/main/rtp.c (original)
+++ team/oej/pinefrog-1.4/main/rtp.c Sat Mar 13 02:51:27 2010
@@ -196,7 +196,6 @@
struct ast_codec_pref pref;
struct ast_rtp *bridged; /*!< Who we are Packet bridged to */
int set_marker_bit:1; /*!< Whether to set the marker bit or not */
- unsigned int constantssrc:1;
int isactive:2; /*!< Whether the RTP stream is active or not */
};
@@ -1459,6 +1458,7 @@
unsigned int *rtpheader;
struct rtpPayloadType rtpPT;
struct ast_rtp *bridged = NULL;
+ AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
/* If time is up, kill it */
if (rtp->sending_digit)
@@ -1481,7 +1481,7 @@
}
if (res < hdrlen) {
- ast_log(LOG_WARNING, "RTP Read too short\n");
+ ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
return &ast_null_frame;
}
@@ -1527,9 +1527,19 @@
ssrc = ntohl(rtpheader[2]);
if (!mark && rtp->rxssrc && rtp->rxssrc != ssrc) {
- if (option_debug || rtpdebug)
- ast_log(LOG_DEBUG, "Forcing Marker bit, because SSRC has changed\n");
- mark = 1;
+ struct ast_frame *f, srcupdate = {
+ AST_FRAME_CONTROL,
+ .subclass = AST_CONTROL_SRCCHANGE,
+ };
+
+ if (!mark) {
+ if (option_debug || rtpdebug) {
+ ast_log(LOG_DEBUG, "Forcing Marker bit, because SSRC has changed\n");
+ }
+ mark = 1;
+ }
+ f = ast_frisolate(&srcupdate);
+ AST_LIST_INSERT_TAIL(&frames, f, frame_list);
}
rtp->rxssrc = ssrc;
@@ -1542,7 +1552,7 @@
if (res < hdrlen) {
ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
- return &ast_null_frame;
+ return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
}
payloadtype = (seqno & 0x7f0000) >> 16;
padding = seqno & (1 << 29);
@@ -1589,8 +1599,6 @@
hdrlen += 4;
}
-
-
if (rtp_debug_test_addr(&sin))
ast_verbose("Got RTP packet from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
@@ -1631,7 +1639,11 @@
} else {
ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n", payloadtype, ast_inet_ntoa(rtp->them.sin_addr));
}
- return f ? f : &ast_null_frame;
+ if (f) {
+ AST_LIST_INSERT_TAIL(&frames, f, frame_list);
+ return AST_LIST_FIRST(&frames);
+ }
+ return &ast_null_frame;
}
rtp->lastrxformat = rtp->f.subclass = rtpPT.code;
rtp->f.frametype = (rtp->f.subclass < AST_FORMAT_MAX_AUDIO) ? AST_FRAME_VOICE : AST_FRAME_VIDEO;
@@ -1647,7 +1659,8 @@
f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
rtp->resp = 0;
rtp->dtmf_timeout = rtp->dtmf_duration = 0;
- return f;
+ AST_LIST_INSERT_TAIL(&frames, f, frame_list);
+ return AST_LIST_FIRST(&frames);
}
}
@@ -1680,7 +1693,9 @@
rtp->f.subclass |= 0x1;
}
rtp->f.src = "RTP";
- return &rtp->f;
+
+ AST_LIST_INSERT_TAIL(&frames, &rtp->f, frame_list);
+ return AST_LIST_FIRST(&frames);
}
/* The following array defines the MIME Media type (and subtype) for each
@@ -2393,18 +2408,26 @@
return res;
}
-void ast_rtp_set_constantssrc(struct ast_rtp *rtp)
-{
- rtp->constantssrc = 1;
-}
-
-void ast_rtp_new_source(struct ast_rtp *rtp)
+void ast_rtp_update_source(struct ast_rtp *rtp)
{
if (rtp) {
rtp->set_marker_bit = 1;
- if (!rtp->constantssrc) {
- rtp->ssrc = ast_random();
- }
+ if (option_debug > 2) {
+ ast_log(LOG_DEBUG, "Setting the marker bit due to a source update\n");
+ }
+ }
+}
+
+void ast_rtp_change_source(struct ast_rtp *rtp)
+{
+ if (rtp) {
+ unsigned int ssrc = ast_random();
+
+ rtp->set_marker_bit = 1;
+ if (option_debug > 2) {
+ ast_log(LOG_DEBUG, "Changing ssrc from %u to %u due to a source change\n", rtp->ssrc, ssrc);
+ }
+ rtp->ssrc = ssrc;
}
}
More information about the asterisk-commits
mailing list