- psz_group = p_session->psz_group;
- psz_name = p_session->psz_name;
-
- char *plgroup;
- if ((psz_group == NULL)
- || (asprintf (&plgroup, "a=x-plgroup:%s\r\n", psz_group) == -1))
- plgroup = NULL;
-
- const char *comedia = NULL;
- if (!strncasecmp (p_session->sdpformat, "DCCP", 4)
- || !strncasecmp (p_session->sdpformat, "TCP", 3))
- comedia = "a=setup:passive\r\n"
- "a=connection:new\r\n";
-
- int res = asprintf (&psz_sdp, "%s" "%s" "%s"
- "m=video %d %s\r\n",
- head,
- plgroup ?: "",
- comedia ?: "",
- ntohs (net_GetPort ((const struct sockaddr *)&p_session->addr)),
- p_session->sdpformat);
- free (plgroup);
-
- if (res == -1)
- return NULL;
-
- msg_Dbg( p_sap, "Generated SDP (%u bytes):\n%s",
- (unsigned)strlen(psz_sdp), psz_sdp );
- return psz_sdp;
-}
-
-static int ComputeRate( sap_address_t *p_address )
-{
- uint8_t buffer[SAP_MAX_BUFFER];
- ssize_t i_tot = 0;
- mtime_t i_temp;
- int i_rate;
-
- if( p_address->t1 == 0 )
- {
- p_address->t1 = mdate();
- return VLC_SUCCESS;
- }
- for (;;)
- {
- /* Might be too slow if we have huge data */
- ssize_t i_read = recv( p_address->i_rfd, buffer, SAP_MAX_BUFFER, 0 );
- if (i_read == -1)
- break;
- i_tot += i_read;
- }
-
- i_temp = mdate();
-
- /* We calculate the rate every 5 seconds */
- if( i_temp - p_address->t1 < 5000000 )
- {
- p_address->i_buff += i_tot;
- return VLC_SUCCESS;
- }
-
- /* Bits/second */
- i_rate = (int)(8*1000000*((mtime_t)p_address->i_buff + (mtime_t)i_tot ) /
- (i_temp - p_address->t1 ));
-
- p_address->i_limit = 10000;
-
- p_address->i_interval = ((1000*i_rate / p_address->i_limit) *
- (MAX_INTERVAL - MIN_INTERVAL))/1000 + MIN_INTERVAL;
-
- if( p_address->i_interval > MAX_INTERVAL || p_address->i_interval < 0 )
- {
- p_address->i_interval = MAX_INTERVAL;
- }
-#ifdef EXTRA_DEBUG
- msg_Dbg( p_sap,"%s:%i: rate=%i, interval = %i s",
- p_address->psz_address,SAP_PORT, i_rate, p_address->i_interval );
-#endif
-
- p_address->b_ready = VLC_TRUE;
-
- p_address->t1 = i_temp;
- p_address->i_buff = 0;
-
- return VLC_SUCCESS;