void rtp_session_run_rtcp_send_scheduler(RtpSession *session) { uint64_t tc = ortp_get_cur_time_ms(); OrtpRtcpSendAlgorithm *sa = &session->rtcp.send_algo; if (tc >= sa->tn) { compute_rtcp_interval(session); sa->tn = sa->tp + sa->T_rr; if (tc >= sa->tn) { if (sa->t_rr_last == 0) { rtp_session_schedule_first_rtcp_send(session); } else { if (sa->T_rr_interval != 0) { sa->T_rr_current_interval = (uint32_t)rtcp_rand((float)sa->T_rr_interval); } else { sa->T_rr_current_interval = 0; } if (sa->tn >= (sa->t_rr_last + sa->T_rr_current_interval)) { rtp_session_send_regular_rtcp_packet_and_reschedule(session, tc); } else if (rtp_session_has_fb_packets_to_send(session) == TRUE) { rtp_session_send_fb_rtcp_packet_and_reschedule(session); } else { rtp_session_reschedule(session, tc); } } } } }
static bool_t is_fb_packet_to_be_sent_immediately(RtpSession *session) { uint64_t t0; if (rtp_session_has_fb_packets_to_send(session) == TRUE) return FALSE; t0 = ortp_get_cur_time_ms(); if (t0 > session->rtcp.send_algo.tn) return FALSE; if (session->rtcp.send_algo.allow_early == FALSE) { if ((session->rtcp.send_algo.tn - t0) >= session->rtcp.send_algo.T_max_fb_delay) { /* Discard message as it is considered that it will not be useful to the sender at the time it will receive it. */ freemsg(session->rtcp.send_algo.fb_packets); session->rtcp.send_algo.fb_packets = NULL; } return FALSE; } return TRUE; }