mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-12 20:27:19 +00:00
fix jb endless loop of missing packets
This commit is contained in:
parent
0efcc9b973
commit
99f15662e2
@ -506,9 +506,9 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
|
|||||||
|
|
||||||
if (i->last_wr_ts) {
|
if (i->last_wr_ts) {
|
||||||
if (ts < 1000 && i->last_wr_ts > (UINT_MAX - 1000)) {
|
if (ts < 1000 && i->last_wr_ts > (UINT_MAX - 1000)) {
|
||||||
i->diff = abs(((UINT_MAX - i->last_wr_ts) + ts) / i->samples_per_packet);
|
i->diff = abs((int)(((UINT_MAX - i->last_wr_ts) + ts) / i->samples_per_packet));
|
||||||
} else if (ts) {
|
} else if (ts) {
|
||||||
i->diff = abs(i->last_wr_ts - ts) / i->samples_per_packet;
|
i->diff = abs((int)(i->last_wr_ts - ts)) / i->samples_per_packet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,19 +568,30 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
|
|||||||
return STFU_IT_WORKED;
|
return STFU_IT_WORKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stfu_n_find_any_frame(stfu_instance_t *in, stfu_queue_t *queue, stfu_frame_t **r_frame)
|
static int stfu_n_find_any_frame(stfu_instance_t *in, stfu_queue_t *queue, stfu_frame_t **r_frame, int force)
|
||||||
{
|
{
|
||||||
uint32_t i = 0, best_index = 0;
|
uint32_t i = 0, best_index = 0;
|
||||||
int best_diff = 1000000, cur_diff = 0;
|
int best_diff = 1000000, cur_diff = 0;
|
||||||
stfu_frame_t *frame = NULL, *best_frame = NULL;
|
stfu_frame_t *frame = NULL, *best_frame = NULL;
|
||||||
|
int newer = 0;
|
||||||
stfu_assert(r_frame);
|
stfu_assert(r_frame);
|
||||||
|
|
||||||
*r_frame = NULL;
|
*r_frame = NULL;
|
||||||
|
|
||||||
|
top:
|
||||||
|
|
||||||
|
if (force) {
|
||||||
|
in->cur_ts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for(i = 0; i < queue->real_array_size; i++) {
|
for(i = 0; i < queue->real_array_size; i++) {
|
||||||
frame = &queue->array[i];
|
frame = &queue->array[i];
|
||||||
cur_diff = abs(frame->ts - in->cur_ts);
|
|
||||||
|
if (!frame->was_read && in->cur_ts && frame->ts > in->cur_ts) {
|
||||||
|
newer++;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_diff = abs((int)(frame->ts - in->cur_ts));
|
||||||
|
|
||||||
if (!frame->was_read && cur_diff < best_diff) {
|
if (!frame->was_read && cur_diff < best_diff) {
|
||||||
best_diff = cur_diff;
|
best_diff = cur_diff;
|
||||||
@ -589,6 +600,11 @@ static int stfu_n_find_any_frame(stfu_instance_t *in, stfu_queue_t *queue, stfu_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!force && !best_frame && newer) {
|
||||||
|
force = 1;
|
||||||
|
goto top;
|
||||||
|
}
|
||||||
|
|
||||||
if (best_frame) {
|
if (best_frame) {
|
||||||
*r_frame = best_frame;
|
*r_frame = best_frame;
|
||||||
queue->last_index = best_index;
|
queue->last_index = best_index;
|
||||||
@ -684,7 +700,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
|
|||||||
|
|
||||||
if (i->sync_out) {
|
if (i->sync_out) {
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if ((found = stfu_n_find_any_frame(i, i->out_queue, &rframe))) {
|
if ((found = stfu_n_find_any_frame(i, i->out_queue, &rframe, 1))) {
|
||||||
i->cur_ts = rframe->ts;
|
i->cur_ts = rframe->ts;
|
||||||
i->cur_seq = rframe->seq;
|
i->cur_seq = rframe->seq;
|
||||||
}
|
}
|
||||||
@ -760,7 +776,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
|
|||||||
i->period_bad_count++;
|
i->period_bad_count++;
|
||||||
i->consecutive_good_count = 0;
|
i->consecutive_good_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
i->last_frame = rframe;
|
i->last_frame = rframe;
|
||||||
i->out_queue->wr_len++;
|
i->out_queue->wr_len++;
|
||||||
@ -774,7 +790,13 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
|
|||||||
i->plc_pt = rframe->pt;
|
i->plc_pt = rframe->pt;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (stfu_n_find_any_frame(i, i->out_queue, &rframe)) {
|
int force = 0;
|
||||||
|
|
||||||
|
if (i->consecutive_bad_count > (i->max_qlen / 2)) {
|
||||||
|
force = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stfu_n_find_any_frame(i, i->out_queue, &rframe, force)) {
|
||||||
i->cur_ts = rframe->ts;
|
i->cur_ts = rframe->ts;
|
||||||
i->cur_seq = rframe->seq;
|
i->cur_seq = rframe->seq;
|
||||||
i->last_wr_ts = i->cur_ts;
|
i->last_wr_ts = i->cur_ts;
|
||||||
@ -786,17 +808,22 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
i->last_wr_ts = i->cur_ts;
|
if (force) {
|
||||||
rframe = &i->out_queue->int_frame;
|
stfu_log(STFU_LOG_EMERG, "%s NO PACKETS HARD RESETTING\n", i->name);
|
||||||
rframe->dlen = i->plc_len;
|
stfu_n_reset(i);
|
||||||
rframe->pt = i->plc_pt;
|
} else {
|
||||||
rframe->ts = i->cur_ts;
|
i->last_wr_ts = i->cur_ts;
|
||||||
rframe->seq = i->cur_seq;
|
rframe = &i->out_queue->int_frame;
|
||||||
i->miss_count++;
|
rframe->dlen = i->plc_len;
|
||||||
|
rframe->pt = i->plc_pt;
|
||||||
|
rframe->ts = i->cur_ts;
|
||||||
|
rframe->seq = i->cur_seq;
|
||||||
|
i->miss_count++;
|
||||||
|
|
||||||
if (stfu_log != null_logger && i->debug) {
|
if (stfu_log != null_logger && i->debug) {
|
||||||
stfu_log(STFU_LOG_EMERG, "%s PLC %d/%d %d %ld %u:%u\n", i->name,
|
stfu_log(STFU_LOG_EMERG, "%s PLC %d/%d %d %ld %u:%u\n", i->name,
|
||||||
i->miss_count, i->max_qlen, rframe->plc, rframe->dlen, rframe->ts, rframe->ts / i->samples_per_packet);
|
i->miss_count, i->max_qlen, rframe->plc, rframe->dlen, rframe->ts, rframe->ts / i->samples_per_packet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user