From f6ec0e9fc4261d2173286e9b23fd19060040d1d1 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Wed, 4 Dec 2013 10:30:11 +0100 Subject: mgcp/rtp: Refactored packet_duration computation Since the packet duration is given in ms with the 'ptime' RTP media attribute and also with the 'p' MGCP local connection option, the computation is changed to use this value (if present). The computation assumes, that there are N complete frames in a packet and takes into account, that the ptime value possibly had been rounded towards the next ms value (which is never the case with a frame length of exact 20ms). Sponsored-by: On-Waves ehf --- openbsc/src/libmgcp/mgcp_network.c | 5 +---- openbsc/src/libmgcp/mgcp_protocol.c | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'openbsc/src/libmgcp') diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c index 6463ae0bb..bf205d1c7 100644 --- a/openbsc/src/libmgcp/mgcp_network.c +++ b/openbsc/src/libmgcp/mgcp_network.c @@ -237,10 +237,7 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta state->initialized = 1; state->jitter = 0; state->transit = arrival_time - timestamp; - state->packet_duration = - rtp_end->rate * rtp_end->frames_per_packet * - rtp_end->frame_duration_num / - rtp_end->frame_duration_den; + state->packet_duration = mgcp_rtp_packet_duration(endp, rtp_end); state->out_stream = state->in_stream; state->out_stream.last_timestamp = timestamp; state->out_stream.ssrc = ssrc - 1; /* force output SSRC change */ diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c index b8e1ecde4..ab941645e 100644 --- a/openbsc/src/libmgcp/mgcp_protocol.c +++ b/openbsc/src/libmgcp/mgcp_protocol.c @@ -75,7 +75,7 @@ char *strline_r(char *str, char **saveptr) /* Assume audio frame length of 20ms */ #define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20 #define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000 -#define DEFAULT_RTP_AUDIO_FRAMES_PER_PACKET 1 +#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20 #define DEFAULT_RTP_AUDIO_DEFAULT_RATE 8000 static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end); @@ -631,6 +631,23 @@ void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change, rtp->force_constant_ssrc ? ", force constant ssrc" : ""); } +uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp, + struct mgcp_rtp_end *rtp) +{ + int f = 0; + + /* Get the number of frames per channel and packet */ + if (rtp->frames_per_packet) + f = rtp->frames_per_packet; + else if (rtp->packet_duration_ms && rtp->frame_duration_num) { + int den = 1000 * rtp->frame_duration_num; + f = (rtp->packet_duration_ms * rtp->frame_duration_den + den/2) + / den; + } + + return rtp->rate * f * rtp->frame_duration_num / rtp->frame_duration_den; +} + static struct msgb *handle_create_con(struct mgcp_parse_data *p) { struct mgcp_trunk_config *tcfg; @@ -1086,8 +1103,9 @@ static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end) /* Set default values */ end->frame_duration_num = DEFAULT_RTP_AUDIO_FRAME_DUR_NUM; end->frame_duration_den = DEFAULT_RTP_AUDIO_FRAME_DUR_DEN; - end->frames_per_packet = DEFAULT_RTP_AUDIO_FRAMES_PER_PACKET; - end->rate = DEFAULT_RTP_AUDIO_DEFAULT_RATE; + end->frames_per_packet = 0; /* unknown */ + end->packet_duration_ms = DEFAULT_RTP_AUDIO_PACKET_DURATION_MS; + end->rate = DEFAULT_RTP_AUDIO_DEFAULT_RATE; } static void mgcp_rtp_end_init(struct mgcp_rtp_end *end) -- cgit v1.2.3