]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix jb endless loop of missing packets
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 3 Jul 2014 04:34:25 +0000 (09:34 +0500)
committerKen Rice <krice@freeswitch.org>
Thu, 3 Jul 2014 12:56:44 +0000 (07:56 -0500)
libs/stfu/stfu.c

index b82864c7a517a68c184e0207eb8f0ef5095da7ae..b596dd775bd48bc4eeca4a08b867e1b7f8b5bf88 100644 (file)
@@ -505,9 +505,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 (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) {
-            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;
         }
     }
     
@@ -567,19 +567,30 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint16_t seq, uin
        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;
     int best_diff = 1000000, cur_diff = 0;
     stfu_frame_t *frame = NULL, *best_frame = NULL;
-
+    int newer = 0;
     stfu_assert(r_frame);
     
     *r_frame = NULL;
 
+ top:
+
+    if (force) {
+        in->cur_ts = 0;
+    }
+
     for(i = 0; i < queue->real_array_size; 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) {
             best_diff = cur_diff;
@@ -588,6 +599,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) {
         *r_frame = best_frame;
         queue->last_index = best_index;
@@ -683,7 +699,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
 
     if (i->sync_out) {
         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_seq = rframe->seq;
             }
@@ -759,7 +775,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
         i->period_bad_count++;
         i->consecutive_good_count = 0;
     }
-
+    
     if (found) {
         i->last_frame = rframe;
         i->out_queue->wr_len++;
@@ -773,7 +789,13 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
         i->plc_pt = rframe->pt;
 
     } 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_seq = rframe->seq;
             i->last_wr_ts = i->cur_ts;
@@ -785,17 +807,22 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
             }
 
         } else {
-            i->last_wr_ts = i->cur_ts;
-            rframe = &i->out_queue->int_frame;
-            rframe->dlen = i->plc_len;
-            rframe->pt = i->plc_pt;
-            rframe->ts = i->cur_ts;
-            rframe->seq = i->cur_seq;
-            i->miss_count++;
+            if (force) {
+                stfu_log(STFU_LOG_EMERG, "%s NO PACKETS HARD RESETTING\n", i->name);
+                stfu_n_reset(i);
+            } else {
+                i->last_wr_ts = i->cur_ts;
+                rframe = &i->out_queue->int_frame;
+                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) {
-                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);
+                if (stfu_log != null_logger && i->debug) {
+                    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);
+                }
             }
         }