]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[core] Fix jitter buffer- it is not truncating frames properly. It is also overflowi... 1442/head
authorChris Rienzo <chris@signalwire.com>
Tue, 11 Aug 2020 23:32:21 +0000 (23:32 +0000)
committerDragos Oancea <dragos@signalwire.com>
Tue, 16 Nov 2021 14:21:11 +0000 (16:21 +0200)
src/include/switch_rtp.h
src/switch_jitterbuffer.c

index 96ea2135f37ecd5748558c84db46e67dccab5a0a..3da7254e91d410daac17cdb261fc4bc74b166fc1 100644 (file)
 
 SWITCH_BEGIN_EXTERN_C
 
+#define SWITCH_RTP_HEADER_LEN sizeof(switch_rtp_hdr_t)
 #define SWITCH_RTP_MAX_BUF_LEN 16384
 #define SWITCH_RTCP_MAX_BUF_LEN 16384
 #define SWITCH_RTP_MAX_BUF_LEN_WORDS 4094 /* (max / 4) - 2 */
+#define SWITCH_RTP_MAX_PACKET_LEN (SWITCH_RTP_MAX_BUF_LEN + SWITCH_RTP_HEADER_LEN)
 //#define SWITCH_RTP_KEY_LEN 30
 //#define SWITCH_RTP_CRYPTO_KEY_32 "AES_CM_128_HMAC_SHA1_32"
 #define SWITCH_RTP_CRYPTO_KEY_80 "AES_CM_128_HMAC_SHA1_80"
index 54e9fc1c5e1bf1eec25313313aeb153ff263bde9..d68b269024e6d96864b0e6c33ce24eb9a5c556e0 100644 (file)
@@ -640,7 +640,6 @@ static inline void add_node(switch_jb_t *jb, switch_rtp_packet_t *packet, switch
 
        node->packet = *packet;
        node->len = len;
-       memcpy(node->packet.body, packet->body, len);
 
        switch_core_inthash_insert(jb->node_hash, node->packet.header.seq, node);
 
@@ -1006,10 +1005,10 @@ SWITCH_DECLARE(switch_status_t) switch_jb_peek_frame(switch_jb_t *jb, uint32_t t
                frame->seq = ntohs(node->packet.header.seq);
                frame->timestamp = ntohl(node->packet.header.ts);
                frame->m = node->packet.header.m;
-               frame->datalen = node->len - 12;
+               frame->datalen = node->len - SWITCH_RTP_HEADER_LEN;
 
-               if (frame->data && frame->buflen > node->len - 12) {
-                       memcpy(frame->data, node->packet.body, node->len - 12);
+               if (frame->data && frame->buflen > node->len - SWITCH_RTP_HEADER_LEN) {
+                       memcpy(frame->data, node->packet.body, node->len - SWITCH_RTP_HEADER_LEN);
                }
                return SWITCH_STATUS_SUCCESS;
        }
@@ -1221,9 +1220,9 @@ SWITCH_DECLARE(switch_status_t) switch_jb_put_packet(switch_jb_t *jb, switch_rtp
        uint32_t i;
        uint16_t want = ntohs(jb->next_seq), got = ntohs(packet->header.seq);
 
-       if (len >= sizeof(switch_rtp_packet_t)) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "trying to put %" SWITCH_SIZE_T_FMT " bytes exceeding buffer, truncate to %" SWITCH_SIZE_T_FMT "\n", len, sizeof(switch_rtp_packet_t));
-               len = sizeof(switch_rtp_packet_t);
+       if (len >= SWITCH_RTP_MAX_PACKET_LEN) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "trying to put %" SWITCH_SIZE_T_FMT " bytes exceeding buffer, truncate to %" SWITCH_SIZE_T_FMT "\n", len, SWITCH_RTP_MAX_PACKET_LEN);
+               len = SWITCH_RTP_MAX_PACKET_LEN;
        }
 
        switch_mutex_lock(jb->mutex);
@@ -1279,7 +1278,6 @@ SWITCH_DECLARE(switch_status_t) switch_jb_put_packet(switch_jb_t *jb, switch_rtp
                }
        }
 
-
        add_node(jb, packet, len);
 
        if (switch_test_flag(jb, SJB_QUEUE_ONLY) && jb->max_packet_len && jb->max_frame_len * 2 > jb->max_packet_len &&
@@ -1307,7 +1305,6 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet_by_seq(switch_jb_t *jb, uin
                jb_debug(jb, 2, "Found buffered seq: %u\n", ntohs(seq));
                *packet = node->packet;
                *len = node->len;
-               memcpy(packet->body, node->packet.body, node->len);
                packet->header.version = 2;
                status = SWITCH_STATUS_SUCCESS;
        } else {
@@ -1461,7 +1458,6 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
                *packet = node->packet;
                *len = node->len;
                jb->last_len = *len;
-               memcpy(packet->body, node->packet.body, node->len);
                packet->header.version = 2;
                hide_node(node, SWITCH_TRUE);
 
@@ -1505,7 +1501,6 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
        return status;
 }
 
-
 /* For Emacs:
  * Local Variables:
  * mode:c