aboutsummaryrefslogtreecommitdiffstats
path: root/tests/jibuf/jibuf_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/jibuf/jibuf_test.c')
-rw-r--r--tests/jibuf/jibuf_test.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/tests/jibuf/jibuf_test.c b/tests/jibuf/jibuf_test.c
index cbfe0af..8771eeb 100644
--- a/tests/jibuf/jibuf_test.c
+++ b/tests/jibuf/jibuf_test.c
@@ -127,13 +127,14 @@ static void clock_override_set(long sec, long usec)
clock_debug("clock_override_set");
}
-static void clock_override_add(long sec, long usec)
+static void clock_override_add_debug(long sec, long usec, bool dbg)
{
osmo_gettimeofday_override_add(sec, usec);
osmo_clock_override_add(CLOCK_MONOTONIC, sec, usec*1000);
- clock_debug("clock_override_add");
+ if (dbg)
+ clock_debug("clock_override_add");
}
-
+#define clock_override_add(sec, usec) clock_override_add_debug(sec, usec, true)
static void dequeue_cb(struct msgb *msg, void *data)
{
@@ -684,6 +685,48 @@ void test_rtp_out_of_sync(unsigned int time_inc_ms, uint16_t seq_nosync_inc, uin
osmo_jibuf_delete(jb);
}
+
+void test_skew(unsigned int skew_inc_us, bool skew_compensation) {
+ int min_delay = 40;
+ unsigned int dropped = 0;
+ struct msgb *msg;
+ int i;
+ char buf[250];
+
+ printf("===test_skew(%u, %d)===\n", skew_inc_us, skew_compensation);
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(32, 400);
+ jb = osmo_jibuf_alloc(NULL);
+ osmo_jibuf_set_dequeue_cb(jb, dequeue_cb, NULL);
+ osmo_jibuf_set_min_delay(jb, min_delay);
+ /*set buffer static, otherwise will grow with drops and enqueue some more packets: */
+ osmo_jibuf_set_max_delay(jb, min_delay);
+ osmo_jibuf_enable_skew_compensation(jb, skew_compensation);
+
+ /* If no skew compensation is used, jitterbuffer should start dropping
+ * packets (all too late) after around min_delay*1000/skew_inc_us packets. */
+ for (i = 0; i<min_delay*1000/skew_inc_us + 50; i++) {
+ snprintf(buf, sizeof(buf), "enqueue packet %d (accum_skew_us = %u)", i, skew_inc_us*i);
+ clock_debug(buf);
+ msg = rtp_next();
+ if (osmo_jibuf_enqueue(jb, msg) < 0) {
+ dropped++;
+ msgb_free(msg);
+ }
+ clock_override_add_debug(0, TIME_RTP_PKT_MS*1000 + skew_inc_us, false);
+ }
+
+ if (skew_compensation) {
+ OSMO_ASSERT(!dropped);
+ OSMO_ASSERT(jb->skew_us);
+ } else {
+ OSMO_ASSERT(dropped);
+ OSMO_ASSERT(!jb->skew_us);
+ }
+}
+
int main(int argc, char **argv)
{
@@ -712,6 +755,8 @@ int main(int argc, char **argv)
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 5, 5*SAMPLES_PER_PKT, true);
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 6, 5*SAMPLES_PER_PKT, false);
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 5, 5*SAMPLES_PER_PKT + 3, false);
+ test_skew(100, false);
+ test_skew(100, true);
fprintf(stdout, "OK: Test passed\n");
return EXIT_SUCCESS;