aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/src/libmgcp/mgcp_transcode.c4
-rw-r--r--openbsc/tests/mgcp/mgcp_transcoding_test.c52
-rw-r--r--openbsc/tests/mgcp/mgcp_transcoding_test.ok14
3 files changed, 61 insertions, 9 deletions
diff --git a/openbsc/src/libmgcp/mgcp_transcode.c b/openbsc/src/libmgcp/mgcp_transcode.c
index 8ab9a04fd..296020c49 100644
--- a/openbsc/src/libmgcp/mgcp_transcode.c
+++ b/openbsc/src/libmgcp/mgcp_transcode.c
@@ -429,7 +429,7 @@ int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
if (payload_len > 0) {
ts_no = ntohl(*(uint32_t*)(data+4));
if (!state->is_running)
- state->next_seq = ntohs(*(uint32_t*)(data+4));
+ state->next_seq = ntohs(*(uint16_t*)(data+2));
state->is_running = 1;
@@ -494,7 +494,7 @@ int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
nsamples -= state->sample_cnt;
*len = rtp_hdr_size + rc;
- *(uint16_t*)(data+2) = htonl(state->next_seq);
+ *(uint16_t*)(data+2) = htons(state->next_seq);
*(uint32_t*)(data+4) = htonl(ts_no);
state->next_seq += 1;
diff --git a/openbsc/tests/mgcp/mgcp_transcoding_test.c b/openbsc/tests/mgcp/mgcp_transcoding_test.c
index 6b3364516..404268a68 100644
--- a/openbsc/tests/mgcp/mgcp_transcoding_test.c
+++ b/openbsc/tests/mgcp/mgcp_transcoding_test.c
@@ -11,6 +11,7 @@
#include <openbsc/gsm_data.h>
#include <openbsc/mgcp.h>
#include <openbsc/mgcp_internal.h>
+#include <openbsc/rtp.h>
#include "bscconfig.h"
#ifndef BUILD_MGCP_TRANSCODING
@@ -245,6 +246,56 @@ static int transcode_test(const char *srcfmt, const char *dstfmt,
return 0;
}
+static void test_rtp_seq_state(void)
+{
+ char buf[4096];
+ int len;
+ int cont;
+ void *ctx;
+ struct mgcp_endpoint *endp;
+ struct mgcp_process_rtp_state *state;
+ struct rtp_hdr *hdr;
+ uint32_t ts_no;
+ uint16_t seq_no;
+
+ given_configured_endpoint(160, 0, "pcma", "l16", &ctx, &endp);
+ state = endp->bts_end.rtp_process_data;
+ OSMO_ASSERT(!state->is_running);
+ OSMO_ASSERT(state->next_seq == 0);
+ OSMO_ASSERT(state->next_time == 0);
+
+ /* initialize packet */
+ len = audio_packets_pcma[0].len;
+ memcpy(buf, audio_packets_pcma[0].data, len);
+ cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
+ OSMO_ASSERT(cont >= 0);
+ OSMO_ASSERT(state->is_running);
+ OSMO_ASSERT(state->next_seq == 2);
+ OSMO_ASSERT(state->next_time = 240);
+
+ /* verify that the right timestamp was written */
+ OSMO_ASSERT(len == audio_packets_pcma[0].len);
+ hdr = (struct rtp_hdr *) &buf[0];
+
+ memcpy(&ts_no, &hdr->timestamp, sizeof(ts_no));
+ OSMO_ASSERT(htonl(ts_no) == 160);
+ memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
+ OSMO_ASSERT(htons(seq_no) == 1);
+ /* Check the right sequence number is written */
+ state->next_seq = 1234;
+ len = audio_packets_pcma[0].len;
+ memcpy(buf, audio_packets_pcma[0].data, len);
+ cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
+ OSMO_ASSERT(cont >= 0);
+ OSMO_ASSERT(len == audio_packets_pcma[0].len);
+ hdr = (struct rtp_hdr *) &buf[0];
+
+ memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
+ OSMO_ASSERT(htons(seq_no) == 1234);
+
+ talloc_free(ctx);
+}
+
static int test_repacking(int in_samples, int out_samples, int no_transcode)
{
char buf[4096] = {0x80, 0};
@@ -388,6 +439,7 @@ int main(int argc, char **argv)
test_repacking(160, 240, 1);
test_repacking(160, 100, 0);
test_repacking(160, 100, 1);
+ test_rtp_seq_state();
return 0;
}
diff --git a/openbsc/tests/mgcp/mgcp_transcoding_test.ok b/openbsc/tests/mgcp/mgcp_transcoding_test.ok
index 07929a868..e06b0e1bc 100644
--- a/openbsc/tests/mgcp/mgcp_transcoding_test.ok
+++ b/openbsc/tests/mgcp/mgcp_transcoding_test.ok
@@ -27,14 +27,14 @@ counted: 0
== Transcoding test ==
converting l16 -> gsm
encoded:
- 80 0b 00 00 00 00 00 a0 11 22 33 44 d4 7c e3 e9
+ 80 0b 00 01 00 00 00 a0 11 22 33 44 d4 7c e3 e9
62 50 39 f0 f8 b4 68 ea 6c 0e 81 1b 56 2a d5 bc
69 9c d1 f0 66 7a ec 49 7a 33 3d 0a de
counted: 12
== Transcoding test ==
converting l16 -> pcma
encoded:
- 80 0b 00 00 00 00 00 a0 11 22 33 44 d5 a5 a3 a5
+ 80 0b 00 01 00 00 00 a0 11 22 33 44 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5
@@ -49,7 +49,7 @@ counted: 12
== Transcoding test ==
converting gsm -> l16
encoded:
- 80 03 00 00 00 00 00 a0 11 22 33 44 00 00 54 00
+ 80 03 00 01 00 00 00 a0 11 22 33 44 00 00 54 00
59 f0 34 20 c4 c8 b9 f8 e2 18 f1 e8 f2 28 f0 e0
46 08 4f 80 2c a0 a9 c8 80 00 c0 58 3f 80 63 c0
24 b8 fa b8 f6 88 0b a0 c8 70 a8 b0 c8 c0 3b a8
@@ -81,7 +81,7 @@ counted: 0
== Transcoding test ==
converting gsm -> pcma
encoded:
- 80 03 00 00 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
+ 80 03 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60
17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82
04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6
@@ -96,7 +96,7 @@ counted: 12
== Transcoding test ==
converting pcma -> l16
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 00 08 42 00
+ 80 08 00 01 00 00 00 a0 11 22 33 44 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00
@@ -121,7 +121,7 @@ counted: 12
== Transcoding test ==
converting pcma -> gsm
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 d4 b9 f4 5d
+ 80 08 00 01 00 00 00 a0 11 22 33 44 d4 b9 f4 5d
d9 50 5a e1 a0 cd 76 ea 52 0e 87 53 ad d4 ea a2
0a 63 ca e9 60 79 e2 2a 25 d2 c0 f3 39
counted: 12
@@ -161,7 +161,7 @@ Invalid payload type:
== Transcoding test ==
converting gsm -> pcma
encoded:
- 80 08 00 00 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
+ 80 08 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf
38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60
17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82
04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6