예제 #1
0
파일: rtsp.c 프로젝트: 12307/VLC-for-VS2010
rtsp_stream_t *RtspSetup( vlc_object_t *owner, vod_media_t *media,
                          const char *path )
{
    rtsp_stream_t *rtsp = (rtsp_stream_t *)malloc( sizeof( *rtsp ) );			// sunqueen modify

    if( rtsp == NULL )
    {
        free( rtsp );
        return NULL;
    }

    rtsp->owner = owner;
    rtsp->vod_media = media;
    rtsp->sessionc = 0;
    rtsp->sessionv = NULL;
    rtsp->host = NULL;
    rtsp->url = NULL;
    rtsp->psz_path = NULL;
    rtsp->track_id = 0;
    vlc_mutex_init( &rtsp->lock );

    rtsp->timeout = var_InheritInteger(owner, "rtsp-timeout");
    if (rtsp->timeout > 0)
    {
        if (vlc_timer_create(&rtsp->timer, RtspTimeOut, rtsp))
            goto error;
    }

    rtsp->psz_path = strdup( (path != NULL) ? path : "/" );
    if( rtsp->psz_path == NULL )
        goto error;

    msg_Dbg( owner, "RTSP stream at %s", rtsp->psz_path );

    rtsp->host = vlc_rtsp_HostNew( VLC_OBJECT(owner) );
    if( rtsp->host == NULL )
        goto error;

    char *user = var_InheritString(owner, "sout-rtsp-user");
    char *pwd = var_InheritString(owner, "sout-rtsp-pwd");

    rtsp->url = httpd_UrlNew( rtsp->host, rtsp->psz_path, user, pwd );
    free(user);
    free(pwd);
    if( rtsp->url == NULL )
        goto error;

    httpd_UrlCatch( rtsp->url, HTTPD_MSG_DESCRIBE, RtspCallback, (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_SETUP,    RtspCallback, (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_PLAY,     RtspCallback, (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_PAUSE,    RtspCallback, (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_GETPARAMETER, RtspCallback,
                    (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_TEARDOWN, RtspCallback, (httpd_callback_sys_t *)rtsp );			// sunqueen modify
    return rtsp;

error:
    RtspUnsetup( rtsp );
    return NULL;
}
예제 #2
0
파일: rtsp.c 프로젝트: FLYKingdom/vlc
rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url )
{
    rtsp_stream_t *rtsp = malloc( sizeof( *rtsp ) );

    if( rtsp == NULL || ( url->i_port > 99999 ) )
    {
        free( rtsp );
        return NULL;
    }

    rtsp->owner = p_stream;
    rtsp->sessionc = 0;
    rtsp->sessionv = NULL;
    rtsp->host = NULL;
    rtsp->url = NULL;
    rtsp->psz_path = NULL;
    vlc_mutex_init( &rtsp->lock );

    rtsp->port = (url->i_port > 0) ? url->i_port : 554;
    rtsp->psz_path = strdup( ( url->psz_path != NULL ) ? url->psz_path : "/" );
    if( rtsp->psz_path == NULL )
        goto error;

    assert( strlen( rtsp->psz_path ) > 0 );
    if( rtsp->psz_path[strlen( rtsp->psz_path ) - 1] == '/' )
        rtsp->track_fmt = "%strackID=%u";
    else
        rtsp->track_fmt = "%s/trackID=%u";

    msg_Dbg( p_stream, "RTSP stream: host %s port %d at %s",
             url->psz_host, rtsp->port, rtsp->psz_path );

    rtsp->host = httpd_HostNew( VLC_OBJECT(p_stream), url->psz_host,
                                rtsp->port );
    if( rtsp->host == NULL )
        goto error;

    rtsp->url = httpd_UrlNewUnique( rtsp->host, rtsp->psz_path,
                                    NULL, NULL, NULL );
    if( rtsp->url == NULL )
        goto error;

    httpd_UrlCatch( rtsp->url, HTTPD_MSG_DESCRIBE, RtspCallback, (void*)rtsp );
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_SETUP,    RtspCallback, (void*)rtsp );
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_PLAY,     RtspCallback, (void*)rtsp );
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_PAUSE,    RtspCallback, (void*)rtsp );
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_GETPARAMETER, RtspCallback,
                    (void*)rtsp );
    httpd_UrlCatch( rtsp->url, HTTPD_MSG_TEARDOWN, RtspCallback, (void*)rtsp );
    return rtsp;

error:
    RtspUnsetup( rtsp );
    return NULL;
}
예제 #3
0
static void MediaDel( vod_t *p_vod, vod_media_t *p_media )
{
    (void) p_vod;

    if (p_media->rtsp != NULL)
    {
        for (int i = 0; i < p_media->i_es; i++)
        {
            media_es_t *p_es = p_media->es[i];
            if (p_es->rtsp_id != NULL)
                RtspDelId(p_media->rtsp, p_es->rtsp_id);
        }
        RtspUnsetup(p_media->rtsp);
    }

    for( int i = 0; i < p_media->i_es; i++ )
    {
        free( p_media->es[i]->rtp_fmt.fmtp );
        free( p_media->es[i] );
    }
    free( p_media->es );

    free( p_media );
}