diff options
-rw-r--r-- | openbsc/include/openbsc/mgcp_internal.h | 1 | ||||
-rw-r--r-- | openbsc/src/libmgcp/mgcp_network.c | 12 | ||||
-rw-r--r-- | openbsc/tests/mgcp/mgcp_test.ok | 16 |
3 files changed, 19 insertions, 10 deletions
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 28ea67885..9b9716539 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -46,6 +46,7 @@ struct mgcp_rtp_stream_state { uint32_t last_timestamp; uint32_t err_ts_counter; int32_t last_tsdelta; + uint32_t last_arrival_time; }; struct mgcp_rtp_state { diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c index 39d58073d..5363fb8de 100644 --- a/openbsc/src/libmgcp/mgcp_network.c +++ b/openbsc/src/libmgcp/mgcp_network.c @@ -415,10 +415,17 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta state->in_stream.ssrc = ssrc; if (rtp_end->force_constant_ssrc) { - const int16_t delta_seq = 1; + int16_t delta_seq; + /* Always increment seqno by 1 */ state->seq_offset = - (state->out_stream.last_seq + delta_seq) - seq; + (state->out_stream.last_seq + 1) - seq; + + /* Estimate number of packets that would have been sent */ + delta_seq = + (arrival_time - state->in_stream.last_arrival_time + + state->packet_duration/2) / + state->packet_duration; adjust_rtp_timestamp_offset(endp, state, rtp_end, addr, delta_seq, timestamp); @@ -452,6 +459,7 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta /* Save before patching */ state->in_stream.last_timestamp = timestamp; state->in_stream.last_seq = seq; + state->in_stream.last_arrival_time = arrival_time; if (rtp_end->force_aligned_timing && state->out_stream.ssrc == ssrc && state->packet_duration) diff --git a/openbsc/tests/mgcp/mgcp_test.ok b/openbsc/tests/mgcp/mgcp_test.ok index 78835745f..e383fb5b2 100644 --- a/openbsc/tests/mgcp/mgcp_test.ok +++ b/openbsc/tests/mgcp/mgcp_test.ok @@ -167,14 +167,14 @@ In TS: 36888, dTS: 160, Seq: 25 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 Stats: Jitter = 27, Transit = 4294967216 In TS: 160000, dTS: 0, Seq: 1000 -Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 765, Transit = 11760 +Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 25, Transit = 4294967216 In TS: 160160, dTS: 160, Seq: 1001 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 718, Transit = 11759 +Stats: Jitter = 24, Transit = 4294967215 In TS: 160320, dTS: 160, Seq: 1002 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 673, Transit = 11759 +Stats: Jitter = 22, Transit = 4294967215 Testing packet error detection. Output SSRC changed to 11223344 In TS: 0, dTS: 0, Seq: 0 @@ -447,12 +447,12 @@ In TS: 36888, dTS: 160, Seq: 25 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 Stats: Jitter = 25, Transit = 4294967136 In TS: 160000, dTS: 0, Seq: 1000 -Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 763, Transit = 11680 +Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 23, Transit = 4294967136 In TS: 160160, dTS: 160, Seq: 1001 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 716, Transit = 11679 +Stats: Jitter = 22, Transit = 4294967135 In TS: 160320, dTS: 160, Seq: 1002 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 -Stats: Jitter = 671, Transit = 11679 +Stats: Jitter = 21, Transit = 4294967135 Done |