This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
pespin gerrit-no-reply at lists.osmocom.orgpespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-mgw/+/24872 ) Change subject: Take into account Marker bit when patching RTP stream ...................................................................... Take into account Marker bit when patching RTP stream Change-Id: I1fb449eda49e82607649122b9b9d983a9e5983fa --- M include/osmocom/mgcp/mgcp_network.h M src/libosmo-mgcp/mgcp_network.c M tests/mgcp/mgcp_test.c M tests/mgcp/mgcp_test.ok 4 files changed, 90 insertions(+), 20 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/72/24872/1 diff --git a/include/osmocom/mgcp/mgcp_network.h b/include/osmocom/mgcp/mgcp_network.h index 1ed00e4..96f0036 100644 --- a/include/osmocom/mgcp/mgcp_network.h +++ b/include/osmocom/mgcp/mgcp_network.h @@ -174,4 +174,4 @@ /* internal RTP Annex A counting */ void mgcp_rtp_annex_count(const struct mgcp_endpoint *endp, struct mgcp_rtp_state *state, const uint16_t seq, const int32_t transit, - const uint32_t ssrc); + const uint32_t ssrc, const bool marker_bit); diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c index 46cb0fd..51d77d7 100644 --- a/src/libosmo-mgcp/mgcp_network.c +++ b/src/libosmo-mgcp/mgcp_network.c @@ -348,13 +348,21 @@ struct mgcp_rtp_state *state, const struct mgcp_rtp_end *rtp_end, const struct osmo_sockaddr *addr, - int16_t delta_seq, uint32_t in_timestamp) + int16_t delta_seq, uint32_t in_timestamp, + bool marker_bit) { int32_t tsdelta = state->packet_duration; int timestamp_offset; uint32_t out_timestamp; char ipbuf[INET6_ADDRSTRLEN]; + if (marker_bit) { + /* If RTP pkt contains marker bit, the timestamps are not longer + * in sync, so we can erase timestamp offset patching. */ + state->patch.timestamp_offset = 0; + return 0; + } + if (tsdelta == 0) { tsdelta = state->out_stream.last_tsdelta; if (tsdelta != 0) { @@ -398,13 +406,19 @@ struct mgcp_rtp_state *state, const struct mgcp_rtp_end *rtp_end, const struct osmo_sockaddr *addr, - uint32_t timestamp) + uint32_t timestamp, bool marker_bit) { char ipbuf[INET6_ADDRSTRLEN]; int ts_error = 0; int ts_check = 0; int ptime = state->packet_duration; + if (marker_bit) { + /* If RTP pkt contains marker bit, the timestamps are not longer + * in sync, so no alignment is needed. */ + return 0; + } + /* Align according to: T + Toffs - Tlast = k * Tptime */ ts_error = ts_alignment_error(&state->out_stream, ptime, @@ -477,12 +491,13 @@ void mgcp_rtp_annex_count(const struct mgcp_endpoint *endp, struct mgcp_rtp_state *state, const uint16_t seq, - const int32_t transit, const uint32_t ssrc) + const int32_t transit, const uint32_t ssrc, + const bool marker_bit) { int32_t d; /* initialize or re-initialize */ - if (!state->stats.initialized || state->stats.ssrc != ssrc) { + if (!state->stats.initialized || state->stats.ssrc != ssrc || marker_bit) { state->stats.initialized = 1; state->stats.base_seq = seq; state->stats.max_seq = seq - 1; @@ -566,6 +581,7 @@ int32_t transit; uint16_t seq; uint32_t timestamp, ssrc; + bool marker_bit; struct rtp_hdr *rtp_hdr; int payload = rtp_end->codec->payload_type; unsigned int len = msgb_length(msg); @@ -578,9 +594,10 @@ timestamp = ntohl(rtp_hdr->timestamp); arrival_time = get_current_ts(rtp_end->codec->rate); ssrc = ntohl(rtp_hdr->ssrc); + marker_bit = !!rtp_hdr->marker; transit = arrival_time - timestamp; - mgcp_rtp_annex_count(endp, state, seq, transit, ssrc); + mgcp_rtp_annex_count(endp, state, seq, transit, ssrc, marker_bit); if (!state->initialized) { state->initialized = 1; @@ -634,7 +651,7 @@ state->packet_duration; adjust_rtp_timestamp_offset(endp, state, rtp_end, addr, - delta_seq, timestamp); + delta_seq, timestamp, marker_bit); state->patch.patch_ssrc = true; ssrc = state->patch.orig_ssrc; @@ -652,10 +669,14 @@ state->in_stream.last_tsdelta = 0; } else { - /* Compute current per-packet timestamp delta */ - check_rtp_timestamp(endp, state, &state->in_stream, rtp_end, - addr, seq, timestamp, "input", - &state->in_stream.last_tsdelta); + if (!marker_bit) { + /* Compute current per-packet timestamp delta */ + check_rtp_timestamp(endp, state, &state->in_stream, rtp_end, + addr, seq, timestamp, "input", + &state->in_stream.last_tsdelta); + } else { + state->in_stream.last_tsdelta = 0; + } if (state->patch.patch_ssrc) ssrc = state->patch.orig_ssrc; @@ -670,7 +691,7 @@ state->out_stream.ssrc == ssrc && state->packet_duration) /* Align the timestamp offset */ align_rtp_timestamp_offset(endp, state, rtp_end, addr, - timestamp); + timestamp, marker_bit); /* Store the updated SSRC back to the packet */ if (state->patch.patch_ssrc) @@ -685,10 +706,14 @@ rtp_hdr->timestamp = htonl(timestamp); /* Check again, whether the timestamps are still valid */ - if (state->out_stream.ssrc == ssrc) - check_rtp_timestamp(endp, state, &state->out_stream, rtp_end, - addr, seq, timestamp, "output", - &state->out_stream.last_tsdelta); + if (!marker_bit) { + if (state->out_stream.ssrc == ssrc) + check_rtp_timestamp(endp, state, &state->out_stream, rtp_end, + addr, seq, timestamp, "output", + &state->out_stream.last_tsdelta); + } else { + state->out_stream.last_tsdelta = 0; + } /* Save output values */ state->out_stream.last_seq = seq; diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c index e6862e5..7496e88 100644 --- a/tests/mgcp/mgcp_test.c +++ b/tests/mgcp/mgcp_test.c @@ -1259,6 +1259,15 @@ /* RTP: SeqNo=1002, TS=160320 */ {2.040000, 20, "\x80\x62\x03\xEA\x00\x02\x72\x40\x50\x60\x70\x80" "\x01\x23\x45\x67\x89\xAB\xCD\xEF"}, + /* RTP: SeqNo=1003, TS=180320, Marker */ + {2.060000, 20, "\x80\xE2\x03\xEB\x00\x02\xC0\x60\x50\x60\x70\x80" + "\x01\x23\x45\x67\x89\xAB\xCD\xEF"}, + /* RTP: SeqNo=1004, TS=180480 */ + {2.080000, 20, "\x80\x62\x03\xEC\x00\x02\xC1\x00\x50\x60\x70\x80" + "\x01\x23\x45\x67\x89\xAB\xCD\xEF"}, + /* RTP: SeqNo=1005, TS=180480, 10ms too late */ + {2.110000, 20, "\x80\x62\x03\xED\x00\x02\xC1\xA0\x50\x60\x70\x80" + "\x01\x23\x45\x67\x89\xAB\xCD\xEF"}, }; static void test_packet_error_detection(int patch_ssrc, int patch_ts) @@ -1543,24 +1552,24 @@ OSMO_ASSERT(conn->state.stats.initialized == 0); - mgcp_rtp_annex_count(endp, &conn->state, 0, 0, 2342); + mgcp_rtp_annex_count(endp, &conn->state, 0, 0, 2342, false); OSMO_ASSERT(conn->state.stats.initialized == 1); OSMO_ASSERT(conn->state.stats.cycles == 0); OSMO_ASSERT(conn->state.stats.max_seq == 0); - mgcp_rtp_annex_count(endp, &conn->state, 1, 0, 2342); + mgcp_rtp_annex_count(endp, &conn->state, 1, 0, 2342, false); OSMO_ASSERT(conn->state.stats.initialized == 1); OSMO_ASSERT(conn->state.stats.cycles == 0); OSMO_ASSERT(conn->state.stats.max_seq == 1); /* now jump.. */ - mgcp_rtp_annex_count(endp, &conn->state, UINT16_MAX, 0, 2342); + mgcp_rtp_annex_count(endp, &conn->state, UINT16_MAX, 0, 2342, false); OSMO_ASSERT(conn->state.stats.initialized == 1); OSMO_ASSERT(conn->state.stats.cycles == 0); OSMO_ASSERT(conn->state.stats.max_seq == UINT16_MAX); /* and wrap */ - mgcp_rtp_annex_count(endp, &conn->state, 0, 0, 2342); + mgcp_rtp_annex_count(endp, &conn->state, 0, 0, 2342, false); OSMO_ASSERT(conn->state.stats.initialized == 1); OSMO_ASSERT(conn->state.stats.cycles == UINT16_MAX + 1); OSMO_ASSERT(conn->state.stats.max_seq == 0); diff --git a/tests/mgcp/mgcp_test.ok b/tests/mgcp/mgcp_test.ok index 9c48147..04f9e0c 100644 --- a/tests/mgcp/mgcp_test.ok +++ b/tests/mgcp/mgcp_test.ok @@ -770,6 +770,15 @@ 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 = 0, Transit = -144000 +In TS: 180320, dTS: 0, Seq: 1003 +Out TS change: 20000, dTS: 0, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180480, dTS: 160, Seq: 1004 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180640, dTS: 160, Seq: 1005 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 5, Transit = -163760 Testing packet error detection. Output SSRC changed to 11223344 In TS: 0, dTS: 0, Seq: 0 @@ -864,6 +873,15 @@ 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 = 0, Transit = -144000 +In TS: 180320, dTS: 0, Seq: 1003 +Out TS change: 20000, dTS: 0, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180480, dTS: 160, Seq: 1004 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180640, dTS: 160, Seq: 1005 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 5, Transit = -163760 Testing packet error detection, patch timestamps. Output SSRC changed to 11223344 In TS: 0, dTS: 0, Seq: 0 @@ -958,6 +976,15 @@ 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 = 0, Transit = -144000 +In TS: 180320, dTS: 0, Seq: 1003 +Out TS change: 20000, dTS: 0, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180480, dTS: 160, Seq: 1004 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180640, dTS: 160, Seq: 1005 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 5, Transit = -163760 Testing packet error detection, patch SSRC, patch timestamps. Output SSRC changed to 11223344 In TS: 0, dTS: 0, Seq: 0 @@ -1050,6 +1077,15 @@ 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 = 0, Transit = -144000 +In TS: 180320, dTS: 0, Seq: 1003 +Out TS change: 20000, dTS: 0, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180480, dTS: 160, Seq: 1004 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 0, Transit = -163840 +In TS: 180640, dTS: 160, Seq: 1005 +Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0 +Stats: Jitter = 5, Transit = -163760 Testing multiple payload types creating message from statically defined input: ---------8<--------- -- To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/24872 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-mgw Gerrit-Branch: master Gerrit-Change-Id: I1fb449eda49e82607649122b9b9d983a9e5983fa Gerrit-Change-Number: 24872 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210707/6708a39b/attachment.htm>