]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 5 May 2007 01:31:54 +0000 (01:31 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 5 May 2007 01:31:54 +0000 (01:31 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5093 d0543943-73ff-0310-b7d9-9358b9ac24b2

conf/default_context.xml
libs/stfu/stfu.c
libs/stfu/stfu.h
src/mod/timers/mod_softtimer/mod_softtimer.c
src/switch_rtp.c

index 7b8b2688a5985bf51efa40bd729c9ee3e7749a0b..de88059a470e9248ba8d2024025a5745df6ada96 100644 (file)
@@ -53,7 +53,7 @@
       <!-- Request a certain tone/file to be played while you wait for the call to be answered-->
       <action application="set" data="ringback=${us-ring}"/>
       <!--<action application="set" data="ringback=/home/ring.wav"/>-->
-      <!--<action application="set" data="jitterbuffer_msec=400"/>-->
+      <!--<action application="set" data="jitterbuffer_msec=180"/>-->
       <action application="bridge" data="sofia/$${sip_profile}/1234@conference.freeswitch.org"/>
     </condition>
   </extension>
index 371b47b9cabae6111c032be0f1360e2f92961a16..64bf9c06086a746ac34ffb1a37dd04aab944d212 100644 (file)
@@ -90,6 +90,21 @@ stfu_instance_t *stfu_n_init(uint32_t qlen)
        return i;
 }
 
+void stfu_n_reset(stfu_instance_t *i)
+{
+       i->in_queue = &i->a_queue;
+       i->out_queue = &i->b_queue;
+       i->in_queue->array_len = 0;
+       i->out_queue->array_len = 0;
+       i->out_queue->wr_len = 0;
+       i->out_queue->last_index = 0;
+       i->miss_count = 0;      
+       i->last_ts = 0;
+       i->running = 0;
+       i->miss_count = 0;
+       i->interval = 0;
+}
+
 static int32_t stfu_n_measure_interval(stfu_queue_t *queue)
 {
        uint32_t index;
@@ -148,7 +163,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, void *data, size_
                i->out_queue->wr_len = 0;
                i->out_queue->last_index = 0;
                i->miss_count = 0;
-
+       
                if (stfu_n_process(i, i->out_queue) < 0) {
                        return STFU_IT_FAILED;
                }
@@ -183,7 +198,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
        stfu_frame_t *frame = NULL, *rframe = NULL;
        
 
-       if ((i->out_queue->wr_len == i->out_queue->array_len) || !i->out_queue->array_len) {
+       if (((i->out_queue->wr_len == i->out_queue->array_len) || !i->out_queue->array_len)) {
                return NULL;
        }
 
@@ -199,7 +214,7 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
                }
 
                frame = &i->out_queue->array[index];
-                               
+               
                if (frame->ts != should_have) {
                        int tried = 0;
                        for (index2 = 0; index2 < i->out_queue->array_len; index2++) {
@@ -226,12 +241,13 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
 
                        i->miss_count++;
 
-                       if (i->miss_count > 10 || i->in_queue->array_len == i->in_queue->array_size ) {
-                               i->out_queue->wr_len = i->out_queue->array_len;
-                               i->last_ts = should_have = frame->ts;
+                       if (i->miss_count > 10 || (i->in_queue->array_len == i->in_queue->array_size) || tried >= i->in_queue->array_size) {
+                               i->running = 0;
+                               i->interval = 0;
+                               i->out_queue->wr_len = i->out_queue->array_size;
                                return NULL;
                        }
-
+                       
                        i->last_ts = should_have;
                        rframe = &i->out_queue->int_frame;
                        rframe->dlen = i->out_queue->array[i->out_queue->last_index].dlen;
index 792a4959c78fc4391913afe5b856a1b544e92812..18c74dbd14c5c4b4101cbd49ca981d23caef6a2f 100644 (file)
@@ -88,7 +88,9 @@ void stfu_n_destroy(stfu_instance_t **i);
 stfu_instance_t *stfu_n_init(uint32_t qlen);
 stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, void *data, size_t datalen, int last);
 stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i);
-#define stfu_im_done() stfu_n_add_data(i, 0, NULL, 0, 1)
+void stfu_n_reset(stfu_instance_t *i);
+
+#define stfu_im_done(i) stfu_n_add_data(i, 0, NULL, 0, 1)
 #define stfu_n_eat(i,t,d,l) stfu_n_add_data(i, t, d, l, 0)
 
 #ifdef __cplusplus
index b3a3f642617a624ec66e133b2b9691cb2fda13e0..cc305d8c98bed76d71009a3fa7601e6dbe227cdd 100644 (file)
@@ -73,7 +73,7 @@ static inline switch_status_t timer_init(switch_timer_t *timer)
 {
        timer_private_t *private_info;
 
-       if (globals.RUNNING != 1) {
+       if (globals.RUNNING != 1 || !globals.mutex) {
                return SWITCH_STATUS_FALSE;
        }
 
index 12ac302411190a08b63c1fae84f3ecf776d91e09..ecfa437c0e35949351a64c7e6b736467c554cb6f 100644 (file)
@@ -816,6 +816,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
        switch_size_t bytes = 0;
        switch_status_t status;
        uint8_t check = 1;
+       stfu_frame_t *jb_frame;
 
        if (!rtp_session->timer.interval) {
                rtp_session->last_time = switch_time_now();
@@ -833,22 +834,23 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                        return -1;
                }
 
-               if (rtp_session->jb && bytes) {
-                       stfu_frame_t *frame;
+               if (rtp_session->jb && bytes && rtp_session->recv_msg.header.pt == rtp_session->payload) {
+                       if (rtp_session->recv_msg.header.m) {
+                               stfu_n_reset(rtp_session->jb);
+                       } 
                        
                        stfu_n_eat(rtp_session->jb, ntohl(rtp_session->recv_msg.header.ts), rtp_session->recv_msg.body, bytes - rtp_header_len);
-                       if ((frame = stfu_n_read_a_frame(rtp_session->jb))) {
-                               memcpy(rtp_session->recv_msg.body, frame->data, frame->dlen);
-                               if (frame->plc) {
+                       if ((jb_frame = stfu_n_read_a_frame(rtp_session->jb))) {
+                               memcpy(rtp_session->recv_msg.body, jb_frame->data, jb_frame->dlen);
+                               if (jb_frame->plc) {
                                        *flags |= SFF_PLC;
-                               }
-                               bytes = frame->dlen + rtp_header_len;
-                               rtp_session->recv_msg.header.ts = htonl(frame->ts);
+                                       }
+                               bytes = jb_frame->dlen + rtp_header_len;
+                               rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
                        } else {
                                bytes = 0;
                                continue;
-                       }
-                       
+                       }                       
                }
 
                if (!bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) {
@@ -882,15 +884,22 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
 
                if (check) {
                        do_2833(rtp_session);
-
-                       if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) {
+                       
+                       if (rtp_session->jb && (jb_frame = stfu_n_read_a_frame(rtp_session->jb))) {
+                               memcpy(rtp_session->recv_msg.body, jb_frame->data, jb_frame->dlen);
+                               if (jb_frame->plc) {
+                                       *flags |= SFF_PLC;
+                               }
+                               bytes = jb_frame->dlen + rtp_header_len;
+                               rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
+                       } else if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) {
                                uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
                                /* We're late! We're Late! */
                                if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) {
                                        switch_yield(1000);
                                        continue;
                                }
-                                       
+                               
                                memset(data, 0, 2);
                                data[0] = 65;