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; }
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; }
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 ); }