]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix some rtp regressions
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 11 Apr 2013 23:11:06 +0000 (18:11 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 11 Apr 2013 23:11:06 +0000 (18:11 -0500)
src/switch_rtp.c

index b3c903cbfad23685287daf506413a0abb1af3524..e7bd163ab47251f827b94be063058dc4ca552163 100644 (file)
@@ -962,13 +962,17 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d
 
        if (ok || !ice->rready) {
                if ((packet->header.type == SWITCH_STUN_BINDING_RESPONSE)) {
-                       if (rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) {
-                               rtp_session->ice.rready = 1;
-                               rtp_session->rtcp_ice.rready = 1;
-                       } else {
-                               ice->rready = 1;
+
+                       if (!ice->rready) {
+                               if (rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) {
+                                       rtp_session->ice.rready = 1;
+                                       rtp_session->rtcp_ice.rready = 1;
+                               } else {
+                                       ice->rready = 1;
+                               }
+
+                               switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH);
                        }
-                       switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH);
                } else if ((packet->header.type == SWITCH_STUN_BINDING_REQUEST)) {
                        uint8_t stunbuf[512];
                        switch_stun_packet_t *rpacket;
@@ -983,8 +987,10 @@ static void handle_ice(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice, void *d
                                sock_output = rtp_session->rtcp_sock_output;
                        }
 
-                       ice->ready = 1;
-                       switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH);
+                       if (!ice->ready) {
+                               ice->ready = 1;
+                               switch_rtp_set_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH);
+                       }
 
                        memset(stunbuf, 0, sizeof(stunbuf));
                        rpacket = switch_stun_packet_build_header(SWITCH_STUN_BINDING_RESPONSE, packet->header.id, stunbuf);
@@ -3727,10 +3733,12 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
        stfu_frame_t *jb_frame;
        uint32_t ts = 0;
        char *b = NULL;
+       int sync = 0;
 
        switch_assert(bytes);
  more:
        *bytes = sizeof(rtp_msg_t);
+       sync = 0;
 
        status = switch_socket_recvfrom(rtp_session->from_addr, rtp_session->sock_input, 0, (void *) &rtp_session->recv_msg, bytes);
 
@@ -3748,6 +3756,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
                                handle_stun_ping_reply(rtp_session, (void *) &rtp_session->recv_msg, *bytes);
                        }
                        *bytes = 0;
+                       sync = 1;
                }
        }
 
@@ -3778,11 +3787,6 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, 
                                                                          "Drop %s packet %ld bytes (dtls not ready!) b=%u\n", rtp_type(rtp_session), (long)*bytes, *b);
                                        *bytes = 0;
-
-                                       if (!rtp_session->flags[SWITCH_RTP_FLAG_USE_TIMER] && rtp_session->timer.interval) {
-                                               switch_core_timer_sync(&rtp_session->timer);
-                                       }
-
                                }
                                
                        }
@@ -3792,6 +3796,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
 
                if (rtp_session->dtls->bytes) {
                        *bytes = 0;
+                       sync = 1;
                }
        }
 
@@ -3810,6 +3815,16 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
                }
        }
 
+
+       if (sync) {
+               if (!rtp_session->flags[SWITCH_RTP_FLAG_USE_TIMER] && rtp_session->timer.interval) {
+                       switch_core_timer_sync(&rtp_session->timer);
+               }
+               rtp_session->hot_hits = 0;
+               goto more;
+       }
+
+
  udptl:
 
        ts = ntohl(rtp_session->recv_msg.header.ts);
@@ -4241,12 +4256,15 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                                !rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && 
                                !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] && 
                                !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] &&
+                               //!rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX] && 
+                               //!rtp_session->dtls && 
                                rtp_session->read_pollfd) {
                                if (switch_poll(rtp_session->read_pollfd, 1, &fdr, 0) == SWITCH_STATUS_SUCCESS) {
                                        status = read_rtp_packet(rtp_session, &bytes, flags, SWITCH_FALSE);
                                        if ((*flags & SFF_RTCP)) {
                                                *flags &= ~SFF_RTCP;
                                                has_rtcp = 1;
+                                               read_pretriggered = 0;
                                                goto rtcp;
                                        }
 
@@ -4514,7 +4532,13 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                                        if (rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) {
                                                process_rtcp_packet(rtp_session, &bytes);
                                                ret = 1;
-                                               goto end;
+                                       
+                                               if (!rtp_session->flags[SWITCH_RTP_FLAG_USE_TIMER] && rtp_session->timer.interval) {
+                                                       switch_core_timer_sync(&rtp_session->timer);
+                                               }
+
+
+                                               goto recvfrom;
                                        }
                                }
                        }