00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "rtcp.h"
00024 #include "utils.h"
00025
00038 struct rtcp_event *rtcp_deschedule(struct rtcp_event *head)
00039 {
00040 struct rtcp_event *phead = head;
00041
00042 head = head->next;
00043 free(phead);
00044
00045 return head;
00046 }
00047
00052 void rtcp_clean_events(void *events)
00053 {
00054 struct rtcp_event **events_queue = (struct rtcp_event **) events;
00055 struct rtcp_event *event = *events_queue;
00056 struct rtcp_event *free_event;
00057
00058 while (event) {
00059
00060 free_event = event;
00061 event = event->next;
00062 free(free_event);
00063 }
00064
00065 *events_queue = NULL;
00066 }
00067
00068 double rtcp_interval(int members, int senders,
00069 double bw, int sent,
00070 double avg_rtcp_size, int initial);
00076 struct rtcp_event *rtcp_handle_event(struct rtcp_event *event)
00077 {
00078
00079 double t;
00080 struct timeval tv, now;
00081 rtp_session *rtp_save;
00082 int n;
00083
00084 gettimeofday(&now, NULL);
00085
00086 switch (event->type) {
00087
00088 case RTCP_RR:
00089 case RTCP_SDES:
00090 if (event->rtp_sess->ssrc_queue) {
00091 n = rtcp_send_rr(event->rtp_sess);
00092 event->rtp_sess->sess_stats.avg_rtcp_size =
00093 (1. / 16.) * n + (15. / 16.) *
00094 (event->rtp_sess->sess_stats.avg_rtcp_size);
00095 }
00096 event->rtp_sess->sess_stats.tp = now;
00097
00098 t = rtcp_interval(event->rtp_sess->sess_stats.members,
00099 event->rtp_sess->sess_stats.senders,
00100 event->rtp_sess->sess_stats.rtcp_bw,
00101 event->rtp_sess->sess_stats.we_sent,
00102 event->rtp_sess->sess_stats.avg_rtcp_size,
00103 event->rtp_sess->sess_stats.initial);
00104
00105 tv.tv_sec = (long int) t;
00106 tv.tv_usec = (long int) ((t - tv.tv_sec) * 1000000);
00107 nms_timeval_add(&(event->rtp_sess->sess_stats.tn), &now, &tv);
00108
00109 event->rtp_sess->sess_stats.initial = 0;
00110 event->rtp_sess->sess_stats.pmembers =
00111 event->rtp_sess->sess_stats.members;
00112
00113 rtp_save = event->rtp_sess;
00114 event = rtcp_deschedule(event);
00115 if ((event = rtcp_schedule(event, rtp_save,
00116 rtp_save->sess_stats.tn, RTCP_RR)) == NULL)
00117 return NULL;
00118 break;
00119 case RTCP_BYE:
00120 rtcp_send_bye(event->rtp_sess);
00121 break;
00122 default:
00123 nms_printf(NMSML_ERR, "RTCP Event not handled!\n");
00124 break;
00125 }
00126 return event;
00127 }
00128
00137 struct rtcp_event *rtcp_schedule(struct rtcp_event *head,
00138 rtp_session * rtp_sess, struct timeval tv,
00139 rtcp_type_t type)
00140 {
00141 struct rtcp_event *new_event;
00142 struct rtcp_event *pevent = head;
00143 struct rtcp_event *event = head;
00144
00145 if ((new_event = malloc(sizeof(struct rtcp_event))) == NULL) {
00146 nms_printf(NMSML_FATAL, "Cannot allocate memory!\n");
00147 return NULL;
00148 }
00149
00150 new_event->rtp_sess = rtp_sess;
00151 new_event->tv = tv;
00152 new_event->type = type;
00153 new_event->next = NULL;
00154
00155 if (!head)
00156 return new_event;
00157
00158 while (event && nms_timeval_subtract(NULL, &(event->tv), &tv)) {
00159 pevent = event;
00160 event = event->next;
00161 }
00162
00163 if (pevent == head && event != NULL) {
00164 new_event->next = head;
00165 return new_event;
00166 }
00167
00168 pevent->next = new_event;
00169 new_event->next = event;
00170
00171 return head;
00172 }
00173
00174