improve adaptive jitter buffer ascending check

This commit is contained in:
Anthony Minessale 2014-09-30 22:54:46 +05:00
parent 56edfc7062
commit 92a66fb1e7
2 changed files with 43 additions and 17 deletions

View File

@ -181,7 +181,8 @@ typedef void (*stfu_n_call_me_t)(stfu_instance_t *i, void *);
void stfu_n_report(stfu_instance_t *i, stfu_report_t *r);
void stfu_n_destroy(stfu_instance_t **i);
stfu_instance_t *stfu_n_init(uint32_t qlen, uint32_t max_qlen, uint32_t samples_per_packet, uint32_t samples_per_second, uint32_t max_drift_ms);
stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen);
stfu_status_t _stfu_n_resize(stfu_instance_t *i, int32_t qlen, int line);
#define stfu_n_resize(_i, _ql) _stfu_n_resize(_i, _ql, __LINE__)
stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uint32_t pt, void *data, size_t datalen, uint32_t timer_ts, int last);
stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i);
SWITCH_DECLARE(int32_t) stfu_n_copy_next_frame(stfu_instance_t *jb, uint32_t timestamp, uint16_t seq, uint16_t distance, stfu_frame_t *next_frame);

View File

@ -31,6 +31,9 @@
//#define DB_JB 1
#define DBG_IN 1
#define DBG_OUT 2
#ifndef UINT_MAX
# define UINT_MAX 4294967295U
#endif
@ -230,8 +233,20 @@ void stfu_n_debug(stfu_instance_t *i, const char *name)
if (i->name) free(i->name);
if (name) {
int debug = 0;
if (strstr(name, ":out")) {
debug |= DBG_OUT;
}
if (strstr(name, ":in")) {
debug |= DBG_IN;
}
if (debug) i->debug = debug;
else i->debug = 3;
i->name = strdup(name);
i->debug = 1;
} else {
i->name = strdup("none");
i->debug = 0;
@ -250,14 +265,17 @@ void stfu_n_report(stfu_instance_t *i, stfu_report_t *r)
r->period_missing_percent = i->period_missing_percent;
}
stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
stfu_status_t _stfu_n_resize(stfu_instance_t *i, int32_t qlen, int line)
{
stfu_status_t s;
uint32_t incr = qlen;
if (i->qlen == i->max_qlen) {
return STFU_IT_FAILED;
}
qlen = i->qlen + incr;
if (i->max_qlen && qlen > i->max_qlen) {
if (i->qlen < i->max_qlen) {
qlen = i->max_qlen;
@ -266,6 +284,10 @@ stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
}
}
if (stfu_log != null_logger && i->debug) {
stfu_log(STFU_LOG_EMERG, "%d %s resize %s %u %u\n", line, i->name, incr > 0 ? "up" : "down", i->qlen, i->qlen + incr);
}
if ((s = stfu_n_resize_aqueue(&i->a_queue, qlen)) == STFU_IT_WORKED) {
stfu_n_resize_aqueue(&i->b_queue, qlen);
s = stfu_n_resize_aqueue(&i->c_queue, qlen);
@ -278,6 +300,14 @@ stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
i->last_frame = NULL;
}
if (s == STFU_IT_WORKED) {
if (incr < 0) {
stfu_n_sync(i, i->qlen);
} else {
stfu_n_reset_counters(i);
}
}
return s;
}
@ -481,6 +511,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
if (++i->drift_dropped_packets < i->drift_max_dropped) {
stfu_log(STFU_LOG_EMERG, "%s TOO LATE !!! %u \n\n\n", i->name, ts);
stfu_n_reset(i);
stfu_n_resize(i, 1);
//stfu_n_sync(i, 1);
//return STFU_ITS_TOO_LATE;
}
@ -504,6 +535,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
if (stfu_log != null_logger && i->debug) {
stfu_log(STFU_LOG_EMERG, "%s TOO LATE !!! %u \n\n\n", i->name, ts);
}
stfu_n_resize(i, 1);
stfu_n_sync(i, 1);
return STFU_ITS_TOO_LATE;
}
@ -521,13 +553,8 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
i->period_need_range_avg = i->period_need_range / least1(i->period_missing_count);
if (i->period_missing_count > i->qlen * 2) {
if (stfu_log != null_logger && i->debug) {
stfu_log(STFU_LOG_EMERG, "%s resize up %u %u\n", i->name, i->qlen, i->qlen + 1);
}
stfu_n_resize(i, i->qlen + 1);
stfu_n_reset_counters(i);
stfu_n_resize(i, 1);
}
i->diff = 0;
@ -551,18 +578,16 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
stfu_log(STFU_LOG_EMERG, "PERIOD %f jitter missing:%f q:%d/%d\n", i->period_jitter_percent, i->period_missing_percent, i->qlen, i->orig_qlen);
}
if (i->qlen > i->orig_qlen && i->period_jitter_percent < PERIOD_JITTER_TOLERANCE && i->period_missing_percent < PERIOD_JITTER_TOLERANCE) {
if (stfu_log != null_logger && i->debug) {
stfu_log(STFU_LOG_EMERG, "%s resize down %u %u\n", i->name, i->qlen, i->qlen - 1);
if (i->qlen > i->orig_qlen) {
if (i->period_jitter_percent < PERIOD_JITTER_TOLERANCE && i->period_missing_percent < PERIOD_JITTER_TOLERANCE) {
stfu_n_resize(i, -1);
}
stfu_n_resize(i, i->qlen - 1);
stfu_n_sync(i, i->qlen);
}
stfu_n_reset_counters(i);
}
if (stfu_log != null_logger && i->debug) {
if (stfu_log != null_logger && (i->debug & DBG_IN)) {
double jitter_percent = (double)(((double)i->period_jitter_count / (double)i->period_packet_in_count) * 100.0f);
double missing_percent = (double)(((double)i->period_missing_count / (double)i->period_packet_in_count) * 100.0f);
@ -808,9 +833,9 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
}
}
if (stfu_log != null_logger && i->debug) {
if (stfu_log != null_logger && (i->debug & DBG_OUT)) {
if (found) {
stfu_log(STFU_LOG_EMERG, "%s OUT: %u:%u %u\n", i->name, rframe->ts, rframe->ts / i->samples_per_packet, rframe->plc);
stfu_log(STFU_LOG_EMERG, "O: %s %u:%u %u\n", i->name, rframe->ts, rframe->ts / i->samples_per_packet, rframe->plc);
}
}