--- ../qq/vlc-0.8.5/modules/misc/rtsp.c 2006-05-06 17:52:18.000000000 +0200 +++ modules/misc/rtsp.c 2006-06-11 21:12:54.000000000 +0200 @@ -57,6 +57,8 @@ #define THROTLE_LONGTEXT N_( "This limits the maximum number of clients " \ "that can connect to the RTSP VOD. 0 means no limit." ) +#define RAWMUX_TEXT N_( "MUX for RAW RTSP transport" ) + vlc_module_begin(); set_shortname( _("RTSP VoD" ) ); set_description( _("RTSP VoD server") ); @@ -66,6 +68,7 @@ set_callbacks( Open, Close ); add_shortcut( "rtsp" ); add_string ( "rtsp-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, VLC_TRUE ); + add_string( "rtsp-raw-mux", NULL, NULL, RAWMUX_TEXT, RAWMUX_TEXT, VLC_TRUE ); add_integer( "rtsp-throttle-users", 0, NULL, THROTLE_TEXT, THROTLE_LONGTEXT, VLC_TRUE ); vlc_module_end(); @@ -166,6 +169,8 @@ int i_throttle_users; int i_connections; + char *psz_raw_mux; + /* List of media */ int i_media; vod_media_t **media; @@ -225,6 +230,8 @@ msg_Dbg( p_this, "allowing up to %d connections", p_sys->i_throttle_users ); p_sys->i_connections = 0; + p_sys->psz_raw_mux = config_GetPsz( p_vod, "rtsp-raw-mux" ); + p_sys->p_rtsp_host = httpd_HostNew( VLC_OBJECT(p_vod), url.psz_host, url.i_port ); if( !p_sys->p_rtsp_host ) @@ -250,6 +257,7 @@ error: if( p_sys && p_sys->p_rtsp_host ) httpd_HostDelete( p_sys->p_rtsp_host ); + if( p_sys && p_sys->psz_raw_mux ) free( p_sys->psz_raw_mux ); if( p_sys ) free( p_sys ); vlc_UrlClean( &url ); @@ -269,6 +277,7 @@ /* TODO delete medias */ free( p_sys->psz_path ); + free( p_sys->psz_raw_mux ); free( p_sys ); } @@ -324,6 +333,8 @@ RtspCallback, (void*)p_media ); httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_PAUSE, RtspCallback, (void*)p_media ); + httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_GETPARAMETER, + RtspCallback, (void*)p_media ); httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_TEARDOWN, RtspCallback, (void*)p_media ); @@ -686,6 +697,7 @@ if( strstr( psz_transport, "MP2T/H2221/UDP" ) || strstr( psz_transport, "RAW/RAW/UDP" ) ) { + p_media->psz_mux = p_vod->p_sys->psz_raw_mux; p_media->b_raw = VLC_TRUE; } @@ -789,7 +801,9 @@ { char *psz_position = httpd_MsgGet( query, "Range" ); if( psz_position ) psz_position = strstr( psz_position, "npt=" ); - if( psz_position ) + char *psz_scale = httpd_MsgGet( query, "Scale" ); + + if( psz_position && !psz_scale ) { double f_pos; char *end; @@ -807,6 +821,30 @@ } break; } + + if( psz_scale ) + { + double f_pos; + char *end; + + if( psz_scale[0] == '-' ) /* rewind */ + { + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_REWIND, 0 ); + } + else if(psz_scale[0] != '1' ) /* fast-forward */ + { + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_FORWARD, 0 ); + } + if( p_rtsp->b_paused == VLC_TRUE ) + { + p_rtsp->b_paused = VLC_FALSE; + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_PAUSE, psz_output ); + } + break; + } } if( p_rtsp->b_playing && p_rtsp->b_paused ) @@ -887,7 +925,8 @@ p_rtsp = RtspClientGet( p_media, psz_session ); if( !p_rtsp ) break; - vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PAUSE ); + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_PAUSE ); p_rtsp->b_paused = VLC_TRUE; answer->i_status = 200; @@ -913,6 +952,13 @@ RtspClientDel( p_media, p_rtsp ); break; + case HTTPD_MSG_GETPARAMETER: + answer->i_status = 200; + answer->psz_status = strdup( "OK" ); + answer->i_body = 0; + answer->p_body = NULL; + break; + default: return VLC_EGENERIC; } @@ -921,7 +967,7 @@ httpd_MsgAdd( answer, "Content-Length", "%d", answer->i_body ); psz_cseq = httpd_MsgGet( query, "Cseq" ); psz_cseq ? i_cseq = atoi( psz_cseq ) : 0; - httpd_MsgAdd( answer, "Cseq", "%d", i_cseq ); + httpd_MsgAdd( answer, "CSeq", "%d", i_cseq ); httpd_MsgAdd( answer, "Cache-Control", "%s", "no-cache" ); if( psz_session ) --- ../qq/vlc-0.8.5/src/misc/vlm.c 2006-05-06 17:52:13.000000000 +0200 +++ src/misc/vlm.c 2006-06-11 21:11:22.000000000 +0200 @@ -1276,6 +1276,50 @@ } } } + else if( !strcmp( psz_command, "rewind" ) ) + { + double f_pos; + int64_t length; + double skip; + vlc_value_t val; + + if( !demux2_Control( p_instance->p_input->input.p_demux, + DEMUX_GET_POSITION, &f_pos ) && + !demux2_Control( p_instance->p_input->input.p_demux, + DEMUX_GET_LENGTH, &length ) ) + { + skip = 30.0 / ((double)length / 1000.0 / 1000.0); + f_pos -= skip; + if( f_pos > 0.0 ) + { + val.f_float = f_pos; + var_Set( p_instance->p_input, "position", val ); + return VLC_SUCCESS; + } + } + } + else if( !strcmp( psz_command, "forward" ) ) + { + double f_pos; + int64_t length; + double skip; + vlc_value_t val; + + if( !demux2_Control( p_instance->p_input->input.p_demux, + DEMUX_GET_POSITION, &f_pos ) && + !demux2_Control( p_instance->p_input->input.p_demux, + DEMUX_GET_LENGTH, &length ) ) + { + skip = 30.0 / ((double)length / 1000.0 / 1000.0); + f_pos += skip; + if( f_pos < 1.0 ) + { + val.f_float = f_pos; + var_Set( p_instance->p_input, "position", val ); + return VLC_SUCCESS; + } + } + } else if( !strcmp( psz_command, "stop" ) ) { TAB_REMOVE( media->i_instance, media->instance, p_instance ); @@ -2353,6 +2397,14 @@ break; } + case VOD_MEDIA_REWIND: + i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "rewind", 0 ); + break; + + case VOD_MEDIA_FORWARD: + i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "forward", 0 ); + break; + default: break; } --- ../qq/vlc-0.8.5/src/network/httpd.c 2006-05-06 17:52:13.000000000 +0200 +++ src/network/httpd.c 2006-06-10 20:32:01.000000000 +0200 @@ -1506,7 +1506,7 @@ cl->query.i_proto = HTTPD_PROTO_RTSP; cl->query.i_type = HTTPD_MSG_ANSWER; } - else if( !memcmp( cl->p_buffer, "GET", 3 ) || + else if( !memcmp( cl->p_buffer, "GET ", 4 ) || !memcmp( cl->p_buffer, "HEAD", 4 ) || !memcmp( cl->p_buffer, "POST", 4 ) ) { @@ -1583,18 +1583,19 @@ } msg_type[] = { - { "GET", HTTPD_MSG_GET, HTTPD_PROTO_HTTP }, - { "HEAD", HTTPD_MSG_HEAD, HTTPD_PROTO_HTTP }, - { "POST", HTTPD_MSG_POST, HTTPD_PROTO_HTTP }, - - { "OPTIONS", HTTPD_MSG_OPTIONS, HTTPD_PROTO_RTSP }, - { "DESCRIBE", HTTPD_MSG_DESCRIBE, HTTPD_PROTO_RTSP }, - { "SETUP", HTTPD_MSG_SETUP, HTTPD_PROTO_RTSP }, - { "PLAY", HTTPD_MSG_PLAY, HTTPD_PROTO_RTSP }, - { "PAUSE", HTTPD_MSG_PAUSE, HTTPD_PROTO_RTSP }, - { "TEARDOWN", HTTPD_MSG_TEARDOWN, HTTPD_PROTO_RTSP }, + { "OPTIONS", HTTPD_MSG_OPTIONS, HTTPD_PROTO_RTSP }, + { "DESCRIBE", HTTPD_MSG_DESCRIBE, HTTPD_PROTO_RTSP }, + { "SETUP", HTTPD_MSG_SETUP, HTTPD_PROTO_RTSP }, + { "PLAY", HTTPD_MSG_PLAY, HTTPD_PROTO_RTSP }, + { "PAUSE", HTTPD_MSG_PAUSE, HTTPD_PROTO_RTSP }, + { "GET_PARAMETER", HTTPD_MSG_GETPARAMETER, HTTPD_PROTO_RTSP }, + { "TEARDOWN", HTTPD_MSG_TEARDOWN, HTTPD_PROTO_RTSP }, + + { "GET", HTTPD_MSG_GET, HTTPD_PROTO_HTTP }, + { "HEAD", HTTPD_MSG_HEAD, HTTPD_PROTO_HTTP }, + { "POST", HTTPD_MSG_POST, HTTPD_PROTO_HTTP }, - { NULL, HTTPD_MSG_NONE, HTTPD_PROTO_NONE } + { NULL, HTTPD_MSG_NONE, HTTPD_PROTO_NONE } }; int i; --- ../qq/vlc-0.8.5/include/vlc_httpd.h 2006-05-06 17:52:25.000000000 +0200 +++ include/vlc_httpd.h 2006-06-10 20:32:18.000000000 +0200 @@ -55,6 +55,7 @@ HTTPD_MSG_SETUP, HTTPD_MSG_PLAY, HTTPD_MSG_PAUSE, + HTTPD_MSG_GETPARAMETER, HTTPD_MSG_TEARDOWN, /* just to track the count of MSG */ --- ../qq/vlc-0.8.5/include/vlc_vod.h 2006-05-06 17:52:25.000000000 +0200 +++ include/vlc_vod.h 2006-06-11 20:42:04.000000000 +0200 @@ -63,6 +63,8 @@ VOD_MEDIA_PAUSE, /* arg1= double * res= */ VOD_MEDIA_STOP, /* arg1= double res=can fail */ VOD_MEDIA_SEEK, /* arg1= double * res= */ + VOD_MEDIA_REWIND, /* arg1= double * res= */ + VOD_MEDIA_FORWARD, /* arg1= double * res= */ }; #endif