Advertisement
folays

rtp

Jun 26th, 2012
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. // octects a envoyer par seconde
  2. #define BITRATE 1000
  3. /* octects a bufferiser (octects a avoir envoye "en trop" par rapport au bitrate en permancence)
  4.  * ne pas envoyer trop sinon le client risque de penser qu'on envoie trop vite et il risque de
  5.  *  sauter en avant ou accelererer temporairement
  6.  */
  7. #define BUFFER_MIN 64 * 1024
  8. #define BUFFER_MAX 128 * 1024
  9.  
  10. static struct tv last_tv;
  11. int total_nbytes = 0;
  12.  
  13. int main()
  14. {
  15.   {
  16.     int flag;
  17.     fcntl(s, F_GETFL);
  18.     fcntl(s, F_SETFL, flag | O_NONBLOCK);
  19.   }
  20.   gettimeofday(&last_tv);
  21.   schedule_timeout(0); // 0 for immediate timeout
  22. }
  23.  
  24. on_timer()
  25. {
  26.   struct tv tv;
  27.   int nbytes;
  28.  
  29.   gettimeofday(&tv);
  30.   // on calcule la difference de temps
  31.   int time_diff_in_ms = (tv.tv_sec - last_tv.tv_sec) * 1000 - (tv.tv_usec - last_tv.tv_usec);
  32.   // on calcule le nombre d'octects a send() pour atteindre un buffer de BUFFER_MAX
  33.   nbytes = BUFFER_MAX - (total_nbytes - time_diff_in_ms * BITRATE * 1000);
  34.   if (nbytes > 0)
  35.     {
  36.       nbytes = send(nbytes);
  37.       if (nbytes < 0 && errno != EAGAIN)
  38.     err(1, "bloh ? :(");
  39.       else if (nbytes == 0)
  40.     errx(1, "c'est fini!");
  41.       if (nbytes > 0)
  42.     total_nbytes += nbytes;
  43.     }
  44.   while (total_nbytes >= BITRATE && last_tv.tv_sec >= 1)
  45.     { /* ca c'est pour eviter d'overflow */
  46.       total_nbytes -= BITRATE;
  47.       last_tv.tv_sec += 1;
  48.     }
  49.   /*
  50.    * quelques maths:
  51.    *  buffer(seconds) = buffer en fonction du temps
  52.    *  on veut que : buffer(seconds) >= BUFFER_MIN
  53.    *  d'autre part, on sait que buffer(seconds) = total_nbytes - BITRATE * seconds
  54.    * quelques maths:
  55.    *  buffer(seconds) >= BUFFER_MIN
  56.    *  total_nbytes - BITRATE * seconds >= BUFFER_MIN
  57.    *  -seconds >= (BUFFER_MIN - total_nbytes) / BITRATE
  58.    *  seconds <= -(BUFFER_MIN - total_nbytes) / BITRATE ## inversion de signes
  59.    *  seconds <= (total_nbytes - BUFFER_MIN) / BITRATE
  60.    * --> donc il faut que le timeout en secondes soit <= (total_nbytes - BUFFER_MIN) / BITRATE
  61.    */
  62.   int timeout_in_ms = (total_nbytes - BUFFER_MIN) * 1000 / BITRATE;
  63.   if (timeout_in_ms < 0) /* si le timeout est negatif parce qu'on a monis de BUFFER_MIN d'avance */
  64.     timeout_in_ms = 0; /* reschedule immediatelly */
  65.   schedule_timeout(timeout_in_ms); // in ms
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement