rtcp_events.c

Go to the documentation of this file.
00001 /* * 
00002  * This file is part of libnemesi
00003  *
00004  * Copyright (C) 2007 by LScube team <team@streaming.polito.it>
00005  * See AUTHORS for more details
00006  * 
00007  * libnemesi is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * libnemesi is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with libnemesi; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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         // fprintf(stderr, "\n\n\nfreeing rtcp event\n\n\n");
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 

Generated on Tue Feb 3 03:10:02 2009 for libnemesi by  doxygen 1.5.4