Ejemplo n.º 1
0
char *get_SDP_version(char *buffer)
{
	buffer[0]='\0';	
	sprintf(buffer,"%.0f",NTP_time(time(NULL)));
	return buffer;
}
/**
 * @brief Create description for an SDP session
 *
 * @param uri URI of the resource to describe
 *
 * @return A new GString containing the complete description of the
 *         session or NULL if the resource was not found or no demuxer
 *         was found to handle it.
 */
static GString *sdp_session_descr(RTSP_Client *rtsp, RFC822_Request *req)
{
    URI *uri = req->uri;
    GString *descr = NULL;
    double duration;

    float currtime_float, restime_float;

    Resource *resource;

    char *path;

    const char *inet_family;

    if ( rtsp->peer_sa == NULL ) {
        xlog(LOG_ERR, "unable to identify address family for connection");
        return NULL;
    }

    inet_family = rtsp->peer_sa->sa_family == AF_INET6 ? "IP6" : "IP4";
    path = g_uri_unescape_string(uri->path, "/");

    xlog(LOG_DBG, "[SDP] opening %s", path);
    if ( !(resource = r_open(path)) ) {
        xlog(LOG_ERR, "[SDP] %s not found", path);
        g_free(path);
        return NULL;
    }
    g_free(path);

    descr = g_string_new("v=0"SDP_EL);

    /* Near enough approximation to run it now */
    currtime_float = NTP_time(time(NULL));
    restime_float = resource->mtime ? NTP_time(resource->mtime) : currtime_float;

    /* Network type: Internet; Address type: IP4. */
    g_string_append_printf(descr, "o=- %.0f %.0f IN %s %s"SDP_EL,
                           currtime_float, restime_float,
                           inet_family,
                           uri->host);

    /* We might want to provide a better name */
    g_string_append(descr, "s=RTSP Session\r\n");

    g_string_append_printf(descr,
                           "c=IN %s %s"SDP_EL,
                           inet_family,
                           rtsp->local_host);

    g_string_append(descr, "t=0 0"SDP_EL);

    // type attribute. We offer only broadcast
    g_string_append(descr, "a=type:broadcast"SDP_EL);

    /* Server signature; the same as the Server: header */
    g_string_append_printf(descr, "a=tool:%s"SDP_EL,
                           feng_signature);

    // control attribute. We should look if aggregate metod is supported?
    g_string_append(descr, "a=control:*"SDP_EL);

    if ((duration = resource->duration) > 0 &&
        duration != HUGE_VAL)
        g_string_append_printf(descr, "a=range:npt=0-%f"SDP_EL, duration);

    g_list_foreach(resource->tracks,
                   sdp_track_descr,
                   descr);

    r_close(resource);

    xlog(LOG_INF, "[SDP] description:\n%s", descr->str);

    return descr;
}