]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10770: [freeswitch-core] Make nack buffer bigger by default #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 2 Nov 2017 19:06:13 +0000 (14:06 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 2 Nov 2017 19:06:13 +0000 (14:06 -0500)
src/switch_rtp.c

index 3fb3a9a70f824a73a1926d68c6b9d7b6439e3fee..0509a40128252ec503e328c66ae51617bf9e31cf 100644 (file)
@@ -312,6 +312,8 @@ typedef struct ts_normalize_s {
        int last_external;
 } ts_normalize_t;
 
+#define MAX_NACKS 25
+
 struct switch_rtp {
        /*
         * Two sockets are needed because we might be transcoding protocol families
@@ -477,6 +479,10 @@ struct switch_rtp {
        uint8_t punts;
        uint8_t clean;
        uint32_t last_max_vb_frames;
+
+       uint32_t nack_buf[MAX_NACKS];
+       int nack_idx;
+
 #ifdef ENABLE_ZRTP
        zrtp_session_t *zrtp_session;
        zrtp_profile_t *zrtp_profile;
@@ -6254,6 +6260,21 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
        return status;
 }
 
+char* pBin(long int x,char *so, int width)
+{
+       char s[width+1];
+       int    i=width;
+       s[i--]=0x00;   // terminate string
+ do
+        { // fill in array from right to left
+                s[i--]=(x & 1) ? '1':'0';  // determine bit
+                x>>=1;  // shift right 1 bit
+        } while( x > 0);
+ i++;   // point to last valid character
+ sprintf(so,"%s",s+i); // stick it in the temp string string
+ return so;
+}
+
 static void handle_nack(switch_rtp_t *rtp_session, uint32_t nack)
 {
        switch_size_t bytes = 0;
@@ -6265,7 +6286,8 @@ static void handle_nack(switch_rtp_t *rtp_session, uint32_t nack)
        const char *old_host = NULL;
        const char *my_host = NULL;
        char bufa[50], bufb[50], bufc[50];
-
+       char foo[64] = "";
+       
        if (!(rtp_session->flags[SWITCH_RTP_FLAG_NACK] && rtp_session->vbw)) {
                return;  /* not enabled */
        }
@@ -6276,8 +6298,8 @@ static void handle_nack(switch_rtp_t *rtp_session, uint32_t nack)
                my_host = switch_get_addr(bufc, sizeof(bufc), rtp_session->local_addr);
        }
 
-       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "%s Got NACK [%u][0x%x] for seq %u\n", 
-                                         switch_core_session_get_name(rtp_session->session), nack, nack, ntohs(seq));
+       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "%s Got NACK [%u][0x%x] for seq %u bits [%s]\n", 
+                                         switch_core_session_get_name(rtp_session->session), nack, nack, ntohs(seq), pBin(nack, foo, sizeof(foo)));
 
        if (switch_jb_get_packet_by_seq(rtp_session->vbw, seq, (switch_rtp_packet_t *) send_msg, &bytes) == SWITCH_STATUS_SUCCESS) {
 
@@ -6380,7 +6402,12 @@ static switch_status_t process_rtcp_report(switch_rtp_t *rtp_session, rtcp_msg_t
 
 
                        for (i = 0; i < ntohs(extp->header.length) - 2; i++) {
-                               handle_nack(rtp_session, *nack);
+                               //handle_nack(rtp_session, *nack);
+                               switch_mutex_lock(rtp_session->flag_mutex);
+                               if (rtp_session->nack_idx < MAX_NACKS) {
+                                       rtp_session->nack_buf[rtp_session->nack_idx++] = *nack;
+                               }
+                               switch_mutex_unlock(rtp_session->flag_mutex);
                                nack++;
                        }
 
@@ -8313,7 +8340,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session,
                        switch_channel_t *channel = switch_core_session_get_channel(rtp_session->session);
 
                        if (!rtp_session->vbw) {
-                               int nack_size = 100;
+                               int nack_size = 1000;
                                const char *var;
                                
                                if ((var = switch_channel_get_variable(channel, "rtp_nack_buffer_size"))) {
@@ -8492,6 +8519,17 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra
                return 0;
        }
 
+       switch_mutex_lock(rtp_session->flag_mutex);
+       if (rtp_session->nack_idx) {
+               int i = 0;
+               
+               for(i = 0; i < rtp_session->nack_idx; i++) {
+                       handle_nack(rtp_session, rtp_session->nack_buf[i]); 
+               }
+               rtp_session->nack_idx = 0;
+       }
+       switch_mutex_unlock(rtp_session->flag_mutex);
+       
        //if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO]) {
        //      rtp_session->flags[SWITCH_RTP_FLAG_DEBUG_RTP_READ]++;
        //      rtp_session->flags[SWITCH_RTP_FLAG_DEBUG_RTP_WRITE]++;
@@ -8536,7 +8574,7 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra
                        old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr);
                        my_host = switch_get_addr(bufc, sizeof(bufc), rtp_session->local_addr);
 
-                       printf(
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(rtp_session->session), SWITCH_LOG_CONSOLE,
                                                          "W %s b=%4ld %s:%u %s:%u %s:%u pt=%d ts=%u seq=%u m=%d\n",
                                                          rtp_session->session ? switch_channel_get_name(switch_core_session_get_channel(rtp_session->session)) : "NoName",
                                                          (long) bytes,