From 6f3e4d56cb72a5f845bd28edea7104bdc6474b8a Mon Sep 17 00:00:00 2001 From: Jean-Paul Saman Date: Wed, 12 Jul 2006 18:48:21 +0000 Subject: [PATCH] RTSP rewind and fastforward support (Scale option). Almost entirely rewritten a patch from K. Staring . --- THANKS | 1 + include/vlc_vod.h | 2 ++ modules/misc/rtsp.c | 37 +++++++++++++++++++++++++++--- src/misc/vlm.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 3 deletions(-) diff --git a/THANKS b/THANKS index ada93c3ea8..e609509962 100644 --- a/THANKS +++ b/THANKS @@ -85,6 +85,7 @@ Jonas Larsen - Danish translation Julien Blache - disc ejection code kty0ne - WinAmp 5 skin for VLC Kevin H. Patterson - Theora framesize calculation patch by Kevin H. Patterson (kevpatt at khptech dot com +K. Staring - RTSP rewind and fast-forward support Laurent Jonqueres - Occitan localization Laurent Mutricy - HTTP interface fixes Lorena Gomes - Catalan translation diff --git a/include/vlc_vod.h b/include/vlc_vod.h index e91c28231b..ca82e76a24 100644 --- a/include/vlc_vod.h +++ b/include/vlc_vod.h @@ -63,6 +63,8 @@ enum vod_query_e 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 diff --git a/modules/misc/rtsp.c b/modules/misc/rtsp.c index c86c576acc..f2ec3417e2 100644 --- a/modules/misc/rtsp.c +++ b/modules/misc/rtsp.c @@ -785,7 +785,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, case HTTPD_MSG_PLAY: { - char *psz_output, *psz_position, ip[NI_MAXNUMERICHOST]; + char *psz_output, ip[NI_MAXNUMERICHOST]; int i, i_port_audio = 0, i_port_video = 0; /* for now only multicast so easy */ @@ -807,14 +807,14 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, if( p_rtsp->b_playing ) { char *psz_position = httpd_MsgGet( query, "Range" ); + char *psz_scale = httpd_MsgGet( query, "Scale" ); if( psz_position ) psz_position = strstr( psz_position, "npt=" ); - if( psz_position ) + if( psz_position && !psz_scale ) { double f_pos; char *end; msg_Dbg( p_vod, "seeking request: %s", psz_position ); - psz_position += 4; /* FIXME: npt= is not necessarily formatted as a float */ f_pos = us_strtod( psz_position, &end ); @@ -826,6 +826,37 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, } break; } + if( psz_scale ) + { + double f_scale = 0.0; + char *end; + + f_scale = us_strtod( psz_scale, &end ); + if( end > psz_scale ) + { + f_scale = (f_scale * 30.0); + if( psz_scale[0] == '-' ) /* rewind */ + { + msg_Dbg( p_vod, "rewind request: %s", psz_scale ); + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_REWIND, f_scale ); + } + else if(psz_scale[0] != '1' ) /* fast-forward */ + { + msg_Dbg( p_vod, "fastforward request: %s", psz_scale ); + vod_MediaControl( p_vod, p_media, psz_session, + VOD_MEDIA_FORWARD, f_scale ); + } + + 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 ) diff --git a/src/misc/vlm.c b/src/misc/vlm.c index 19bad42aaf..f5798cc9ea 100644 --- a/src/misc/vlm.c +++ b/src/misc/vlm.c @@ -1276,6 +1276,40 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, const char *psz_id, } } } + else if( !strcmp( psz_command, "rewind" ) ) + { + float f_pos; + float f_scale; + vlc_value_t val; + + if( psz_args ) + { + f_scale = i18n_atof( psz_args ); + f_pos = var_GetFloat( p_instance->p_input, "position" ); + val.f_float = f_pos - (f_scale / 1000.0); + if( val.f_float < 0.0 ) + val.f_float = 0.0; + var_Set( p_instance->p_input, "position", val ); + return VLC_SUCCESS; + } + } + else if( !strcmp( psz_command, "forward" ) ) + { + float f_pos; + float f_scale; + vlc_value_t val; + + if( psz_args ) + { + f_scale = i18n_atof( psz_args ); + f_pos = var_GetFloat( p_instance->p_input, "position" ); + val.f_float = f_pos + (f_scale / 1000.0); + if( val.f_float > 1.0 ) + val.f_float = 1.0; + 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 +2387,26 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media, break; } + case VOD_MEDIA_REWIND: + { + double f_scale = (double)va_arg( args, double ); + char psz_scale[50]; + lldiv_t div = lldiv( f_scale * 10000000, 10000000 ); + sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem ); + i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "rewind", psz_scale ); + break; + } + + case VOD_MEDIA_FORWARD: + { + double f_scale = (double)va_arg( args, double ); + char psz_scale[50]; + lldiv_t div = lldiv( f_scale * 10000000, 10000000 ); + sprintf( psz_scale, I64Fd".%07u", div.quot, (unsigned int) div.rem ); + i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "forward", psz_scale ); + break; + } + default: break; } @@ -2362,6 +2416,7 @@ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media, return i_ret; } + /***************************************************************************** * Manage: *****************************************************************************/ -- 2.39.2