Page 1 of 1
adding a time-seek feature.
Posted: 01 Nov 2006 00:44
by igorh
For some of the work I am doing, i needed a way to seek to a msec position in a VLM stream (not just percentage). i have added a new control command to allow me to do that, called
msecseek. The code changes are minor, isolated to /src/misc/vlm.c. i have tested this for both 0.8.6 and 0.9.0 on my Windows machine and they seem pretty solid (the code basically does what
seek does but changing the time instead of the position.) It also works both from the http & telnet interfaces.
Is this a feature that would be useful to anyone else (i saw defect
465, which may be this functionality). If so, is this something that can get into 0.8.6 or is there a code-freeze for that branch already?
If this is useful to people, I'll send a patch to the mailing list.
Posted: 01 Nov 2006 11:17
by funman
Hi
for 0.8.6 it is too late to introduce new features, unless they are very short and can be verified as bug free
however that could be useful for later releases
you can of course send it to vlc-devel mailing list
patches
Posted: 10 Nov 2006 00:42
by igorh
Here's the patch for trunk (and below it for 0.8.6, if there a chance to get that in). As you can see from the code, it's very simple, and mirrors existing functionality. I would appreciate your help putting this into the code base.
Thanks again,
-igor
trunk patch
Code: Select all
--- src/misc/vlm.c.orig Thu Nov 9 18:14:40 2006
+++ src/misc/vlm.c Tue Oct 31 18:39:28 2006
@@ -613,7 +613,8 @@
if( strcmp( ppsz_command[2], "play" ) &&
strcmp( ppsz_command[2], "stop" ) &&
strcmp( ppsz_command[2], "pause" ) &&
- strcmp( ppsz_command[2], "seek" ) )
+ strcmp( ppsz_command[2], "seek" ) &&
+ strcmp( ppsz_command[2], "msecseek" ) )
{
i_index++;
psz_instance = ppsz_command[2];
@@ -1274,6 +1275,23 @@
}
}
}
+ else if( !strcmp( psz_command, "msecseek" ) )
+ {
+ double d_msec;
+ vlc_value_t val, current;
+
+ if( psz_args )
+ {
+ d_msec = i18n_atof( psz_args );
+ val.i_time = (int64_t)(d_msec * 1000);
+ var_Get( p_instance->p_input, "length", ¤t );
+ if( val.i_time >= 0 && val.i_time <= current.i_time )
+ {
+ var_Set( p_instance->p_input, "time", val );
+ return VLC_SUCCESS;
+ }
+ }
+ }
else if( !strcmp( psz_command, "rewind" ) )
{
float f_pos;
@@ -2044,6 +2062,7 @@
MessageAddChild( "pause" );
MessageAddChild( "stop" );
MessageAddChild( "seek (percentage)" );
+ MessageAddChild( "msecseek (time in milliseconds)" );
return message;
}
0.8.6 patch
Code: Select all
--- src/misc/vlm.c.orig Thu Nov 9 18:26:51 2006
+++ src/misc/vlm.c Wed Nov 1 13:51:46 2006
@@ -615,7 +615,8 @@
if( strcmp( ppsz_command[2], "play" ) &&
strcmp( ppsz_command[2], "stop" ) &&
strcmp( ppsz_command[2], "pause" ) &&
- strcmp( ppsz_command[2], "seek" ) )
+ strcmp( ppsz_command[2], "seek" ) &&
+ strcmp( ppsz_command[2], "msecseek" ) )
{
i_index++;
psz_instance = ppsz_command[2];
@@ -1276,6 +1277,23 @@
}
}
}
+ else if( !strcmp( psz_command, "msecseek" ) )
+ {
+ double d_msec;
+ vlc_value_t val, current;
+
+ if( psz_args )
+ {
+ d_msec = i18n_atof( psz_args );
+ val.i_time = (int64_t)(d_msec * 1000);
+ var_Get( p_instance->p_input, "length", ¤t );
+ if( val.i_time >= 0 && val.i_time <= current.i_time )
+ {
+ var_Set( p_instance->p_input, "time", val );
+ return VLC_SUCCESS;
+ }
+ }
+ }
else if( !strcmp( psz_command, "stop" ) )
{
TAB_REMOVE( media->i_instance, media->instance, p_instance );
@@ -2011,6 +2029,7 @@
MessageAddChild( "pause" );
MessageAddChild( "stop" );
MessageAddChild( "seek (percentage)" );
+ MessageAddChild( "msecseek (time in milliseconds)" );
return message;
}
Posted: 10 Nov 2006 00:45
by dionoea
I'd be glad to apply that patch. Can you give me your real name so we can give you credit for the code ?
Posted: 10 Nov 2006 01:08
by igorh
Great. My real name is Igor Helman. Thanks for your help, Antoine.
-igor
Posted: 10 Nov 2006 01:36
by dionoea
Hum, i just applied that patch (plus some other misc changes) to trunk but i think that i'll still change it some more.
like have
Code: Select all
control media seek 0.23 -> behaves like before (can't break previous behavior)
control media seek +0.23 -> seek 23% forward
control media seek -0.23 -> seek 23% backwards
control media seek 123ms -> msecseek
same with +/-
control media seek 123s -> secseek
don't know if we need something to seek by minutes and hours too ... that will be easy to add if we do.
Posted: 10 Nov 2006 02:03
by dionoea
Posted: 10 Nov 2006 03:45
by igorh
Cool - that would work for me as well. I'll pull down the changes and test out the build. Thanks.
0.8.6 backport?
Posted: 13 Nov 2006 22:03
by igorh
Any way you can back-port this feature into 0.8.6? It seems like its pretty straightforward in terms of functionality and it would really help with my current project, as 0.8.6 seems more stable for our use than 0.9.0.
Thanks again,
-igor
Posted: 19 Nov 2006 18:16
by dionoea
Sure, i'll backport that.
Posted: 20 Nov 2006 17:56
by igorh
Antoine, I rolled a patch for that change (
17599) and the two previous ones to the vlm.c file (they were compiler warning fixes in
17227 and better syntax checking in
17596).
This would backport that "seek" functionality to 0.8.6 and fix a few warnings. If you can put that into the source, that would be great and I could start using the nightlies without having to roll a custom build.
Thanks again,
-igor
Code: Select all
--- src/misc/vlm.c.bak Mon Nov 20 10:49:47 2006
+++ src/misc/vlm.c Mon Nov 20 11:49:21 2006
@@ -51,12 +51,12 @@
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
-static vlm_message_t *vlm_Show( vlm_t *, vlm_media_t *, vlm_schedule_t *, char * );
+static vlm_message_t *vlm_Show( vlm_t *, vlm_media_t *, vlm_schedule_t *, const char * );
static vlm_message_t *vlm_Help( vlm_t *, char * );
static vlm_media_instance_t *vlm_MediaInstanceSearch( vlm_t *, vlm_media_t *, const char * );
-static vlm_message_t *vlm_MessageNew( char *, const char *, ... );
+static vlm_message_t *vlm_MessageNew( const char *, const char *, ... );
static vlm_message_t *vlm_MessageAdd( vlm_message_t *, vlm_message_t * );
static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *, const char * );
@@ -621,6 +621,12 @@
psz_instance = ppsz_command[2];
if( i_command < 4 ) goto syntax_error;
+
+ if( strcmp( ppsz_command[3], "play" ) &&
+ strcmp( ppsz_command[3], "stop" ) &&
+ strcmp( ppsz_command[3], "pause" ) &&
+ strcmp( ppsz_command[3], "seek" ) )
+ goto syntax_error;
}
psz_command = ppsz_command[i_index];
@@ -1263,16 +1269,57 @@
if( !strcmp( psz_command, "seek" ) )
{
vlc_value_t val;
- float f_percentage;
if( psz_args )
{
- f_percentage = i18n_atof( psz_args );
- if( f_percentage >= 0.0 && f_percentage <= 100.0 )
- {
- val.f_float = f_percentage / 100.0 ;
- var_Set( p_instance->p_input, "position", val );
- return VLC_SUCCESS;
+ vlc_bool_t i_rel;
+ float f_value = i18n_atof( psz_args );
+ if( psz_args[0] == '+' || psz_args[0] == '-' )
+ i_rel = VLC_TRUE;
+ else
+ i_rel = VLC_FALSE;
+ if( strstr( psz_args, "ms" ) )
+ {
+ /* milliseconds */
+ int64_t i_msec = 1000 * (int64_t)atoi( psz_args );
+ if( i_rel )
+ {
+ var_SetTime( p_instance->p_input, "time-offset", i_msec );
+ }
+ else if( i_msec >= 0
+ && i_msec < var_GetTime( p_instance->p_input, "length" ) )
+ {
+ var_SetTime( p_instance->p_input, "time", i_msec );
+ }
+ }
+ else if( strchr( psz_args, 's' ) )
+ {
+ /* seconds */
+ int64_t i_sec = 1000000 * (int64_t)atoi( psz_args );
+ if( i_rel )
+ {
+ var_SetTime( p_instance->p_input, "time-offset", i_sec );
+ }
+ else if( i_sec >= 0
+ && i_sec < var_GetTime( p_instance->p_input, "length" ) )
+ {
+ var_SetTime( p_instance->p_input, "time", i_sec );
+ }
+ }
+ else
+ {
+ /* percentage */
+ f_value /= 100.;
+ if( i_rel )
+ {
+ float f_orig = var_GetFloat( p_instance->p_input, "position" );
+ f_value += f_orig;
+ }
+ if( f_value >= 0.0 && f_value <= 1.0 )
+ {
+ var_SetFloat( p_instance->p_input, "position", f_value );
+ return VLC_SUCCESS;
+ }
}
}
}
@@ -1315,7 +1362,7 @@
/*****************************************************************************
* Schedule handling
*****************************************************************************/
-static int64_t vlm_Date()
+static int64_t vlm_Date( void )
{
#ifdef WIN32
struct timeb tm;
@@ -1578,7 +1625,7 @@
/*****************************************************************************
* Message handling functions
*****************************************************************************/
-static vlm_message_t *vlm_MessageNew( char *psz_name,
+static vlm_message_t *vlm_MessageNew( const char *psz_name,
const char *psz_format, ... )
{
vlm_message_t *p_message;
@@ -1641,7 +1688,7 @@
* Misc utility functions
*****************************************************************************/
static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media,
- vlm_schedule_t *schedule, char *psz_filter )
+ vlm_schedule_t *schedule, const char *psz_filter )
{
if( media != NULL )
{
@@ -2010,7 +2057,7 @@
MessageAddChild( "play" );
MessageAddChild( "pause" );
MessageAddChild( "stop" );
- MessageAddChild( "seek (percentage)" );
+ MessageAddChild( "seek [+-](percentage) | [+-](seconds)s | [+-](milliseconds)ms" );
return message;
}
Posted: 21 Nov 2006 22:11
by dionoea
OK you win
I'll apply it.
Posted: 21 Nov 2006 22:15
by dionoea
Posted: 21 Nov 2006 22:35
by igorh
sweet!. thank you! looking forward to testing the nightlies.
bug in updating time.
Posted: 11 Dec 2006 19:57
by igorh
I just pulled down the 0.8.6 build and there seems to be a bug with this feature, where the time doesn't update after a seek until it reaches that initial time again (so that playing to 60 sec, then seeking to 30 sec will freeze the time display at 60 until the video playback passes 60 sec, then it will start updating again).. the video plays fine but without accurate timing information i can't update my display.
this is the same in 0.9.0. my mingw environment is broken at the moment so i can't test why calling var_Set made it work, whereas var_SetTime produces this behavior.. any chance of a fix?
Thanks again,
-igor
Posted: 20 Dec 2006 18:31
by eclip5e
Hi, I'm seeing time update problems with the VLM and seek to time control commands. (Works fine with seek to percentage).
This is a fresh install of the 0.8.6 release.
If i issue seek commands via the telnet or web VLM interface and specify a time previous to the current playback position (time A), the video successfully jumps to the specified seek time (time B), but the time that the VLM interface returns remains to be time A. Time also stops updating from time A, until playback from time B reaches time A. At this point, time continues to update as normal.
My guess is that the code to update the time checks to make sure the time has incremented past the last time, but after a jump, the update is blocked since it is less than the last time it has seen. The code path must be different for seek to time rather and seek to percent.