Commit 2bf01e19 authored by Pierre Ynard's avatar Pierre Ynard
Browse files

motion: move rotate code into the rotate video filter

Where it belongs. Used with --video-filter rotate --rotate-use-motion
parent 96a19d6c
......@@ -46,7 +46,6 @@
struct intf_sys_t
{
motion_sensors_t *p_motion;
bool b_use_rotate;
};
/*****************************************************************************
......@@ -57,8 +56,6 @@ static void Close ( vlc_object_t * );
static void RunIntf( intf_thread_t *p_intf );
#define USE_ROTATE_TEXT N_("Use the rotate video filter instead of transform")
/*****************************************************************************
* Module descriptor
*****************************************************************************/
......@@ -70,8 +67,7 @@ vlc_module_begin ()
set_help( N_("Use HDAPS, AMS, APPLESMC or UNIMOTION motion sensors " \
"to rotate the video") )
add_bool( "motion-use-rotate", false,
USE_ROTATE_TEXT, USE_ROTATE_TEXT, false )
add_obsolete_bool( "motion-use-rotate" ) /* since 2.1.0 */
set_capability( "interface", 0 )
set_callbacks( Open, Close )
......@@ -99,8 +95,6 @@ int Open ( vlc_object_t *p_this )
p_intf->pf_run = RunIntf;
p_intf->p_sys->b_use_rotate = var_InheritBool( p_intf, "motion-use-rotate" );
return VLC_SUCCESS;
}
......@@ -136,24 +130,6 @@ static void RunIntf( intf_thread_t *p_intf )
int canc = vlc_savecancel();
i_x = motion_get_angle( p_intf->p_sys->p_motion );
if( p_intf->p_sys->b_use_rotate )
{
if( i_oldx != i_x )
{
/* TODO: cache object pointer */
vlc_object_t *p_obj =
vlc_object_find_name( p_intf->p_libvlc, "rotate" );
if( p_obj )
{
var_SetInteger( p_obj, "rotate-deciangle",
((3600+i_x/2)%3600) );
i_oldx = i_x;
vlc_object_release( p_obj );
}
}
goto loop;
}
if( i_x < -HIGH_THRESHOLD && i_oldx > -LOW_THRESHOLD )
{
b_change = true;
......@@ -197,7 +173,7 @@ static void RunIntf( intf_thread_t *p_intf )
i_oldx = i_x;
}
}
loop:
vlc_restorecancel( canc );
}
}
......
......@@ -70,7 +70,19 @@ SOURCES_ball = ball.c
SOURCES_panoramix = panoramix.c
SOURCES_opencv_wrapper = opencv_wrapper.c
SOURCES_opencv_example = opencv_example.cpp filter_event_info.h
SOURCES_rotate = rotate.c
if HAVE_DARWIN
motion_extra = unimotion.c unimotion.h
else
motion_extra = $(NULL)
endif
SOURCES_rotate = \
rotate.c \
../control/motionlib.c \
../control/motionlib.h \
$(motion_extra) \
$(NULL)
SOURCES_puzzle = puzzle.c
SOURCES_colorthres = colorthres.c
SOURCES_extract = extract.c
......
......@@ -36,6 +36,7 @@
#include <vlc_filter.h>
#include "filter_picture.h"
#include "../control/motionlib.h"
/*****************************************************************************
* Local prototypes
......@@ -56,6 +57,9 @@ static int PreciseRotateCallback( vlc_object_t *p_this, char const *psz_var,
#define ANGLE_TEXT N_("Angle in degrees")
#define ANGLE_LONGTEXT N_("Angle in degrees (0 to 359)")
#define MOTION_TEXT N_("Use motion sensors")
#define MOTION_LONGTEXT N_("Use HDAPS, AMS, APPLESMC or UNIMOTION motion " \
"sensors to rotate the video")
#define FILTER_PREFIX "rotate-"
......@@ -71,13 +75,15 @@ vlc_module_begin ()
add_integer_with_range( FILTER_PREFIX "angle", 30, 0, 359,
ANGLE_TEXT, ANGLE_LONGTEXT, false )
add_bool( FILTER_PREFIX "use-motion", false, MOTION_TEXT,
MOTION_LONGTEXT, false )
add_shortcut( "rotate" )
set_callbacks( Create, Destroy )
vlc_module_end ()
static const char *const ppsz_filter_options[] = {
"angle", NULL
"angle", "use-motion", NULL
};
/*****************************************************************************
......@@ -88,6 +94,9 @@ struct filter_sys_t
vlc_spinlock_t lock;
int i_cos;
int i_sin;
int i_angle;
bool b_motion;
motion_sensors_t *p_motion;
};
static inline void cache_trigo( int i_angle, int *i_sin, int *i_cos )
......@@ -136,15 +145,29 @@ static int Create( vlc_object_t *p_this )
config_ChainParse( p_filter, FILTER_PREFIX, ppsz_filter_options,
p_filter->p_cfg );
int i_angle = var_CreateGetIntegerCommand( p_filter,
FILTER_PREFIX "angle" ) * 10;
cache_trigo( i_angle, &p_sys->i_sin, &p_sys->i_cos );
var_Create( p_filter, FILTER_PREFIX "deciangle",
VLC_VAR_INTEGER|VLC_VAR_ISCOMMAND );
vlc_spin_init( &p_sys->lock );
var_AddCallback( p_filter, FILTER_PREFIX "angle", RotateCallback, p_sys );
var_AddCallback( p_filter, FILTER_PREFIX "deciangle",
PreciseRotateCallback, p_sys );
p_sys->b_motion = var_InheritBool( p_filter, FILTER_PREFIX "use-motion" );
if( p_sys->b_motion )
{
p_sys->p_motion = motion_create( VLC_OBJECT( p_filter ) );
if( p_sys->p_motion == NULL )
{
free( p_filter->p_sys );
return VLC_EGENERIC;
}
}
else
{
int i_angle = var_CreateGetIntegerCommand( p_filter,
FILTER_PREFIX "angle" ) * 10;
cache_trigo( i_angle, &p_sys->i_sin, &p_sys->i_cos );
var_Create( p_filter, FILTER_PREFIX "deciangle",
VLC_VAR_INTEGER|VLC_VAR_ISCOMMAND );
vlc_spin_init( &p_sys->lock );
var_AddCallback( p_filter, FILTER_PREFIX "angle",
RotateCallback, p_sys );
var_AddCallback( p_filter, FILTER_PREFIX "deciangle",
PreciseRotateCallback, p_sys );
}
return VLC_SUCCESS;
}
......@@ -155,12 +178,19 @@ static int Create( vlc_object_t *p_this )
static void Destroy( vlc_object_t *p_this )
{
filter_t *p_filter = (filter_t *)p_this;
filter_sys_t *p_sys = p_filter->p_sys;
var_DelCallback( p_filter, FILTER_PREFIX "angle", RotateCallback, p_filter->p_sys );
var_DelCallback( p_filter, FILTER_PREFIX "deciangle",
PreciseRotateCallback, p_filter->p_sys );
vlc_spin_destroy( &p_filter->p_sys->lock );
free( p_filter->p_sys );
if( p_sys->b_motion )
motion_destroy( p_sys->p_motion );
else
{
var_DelCallback( p_filter, FILTER_PREFIX "angle",
RotateCallback, p_sys );
var_DelCallback( p_filter, FILTER_PREFIX "deciangle",
PreciseRotateCallback, p_sys );
vlc_spin_destroy( &p_sys->lock );
}
free( p_sys );
}
/*****************************************************************************
......@@ -180,10 +210,24 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
return NULL;
}
vlc_spin_lock( &p_sys->lock );
if( p_sys->b_motion )
{
int i_angle = motion_get_angle( p_sys->p_motion );
if( p_sys->i_angle != i_angle )
{
p_sys->i_angle = i_angle;
i_angle = ((3600+i_angle/2)%3600);
cache_trigo( i_angle, &p_sys->i_sin, &p_sys->i_cos );
}
}
else
vlc_spin_lock( &p_sys->lock );
const int i_sin = p_sys->i_sin;
const int i_cos = p_sys->i_cos;
vlc_spin_unlock( &p_sys->lock );
if( !p_sys->b_motion )
vlc_spin_unlock( &p_sys->lock );
for( int i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )
{
......@@ -331,10 +375,24 @@ static picture_t *FilterPacked( filter_t *p_filter, picture_t *p_pic )
const int i_line_center = i_visible_lines>>1;
const int i_col_center = i_visible_pitch>>1;
vlc_spin_lock( &p_sys->lock );
if( p_sys->b_motion )
{
int i_angle = motion_get_angle( p_sys->p_motion );
if( p_sys->i_angle != i_angle )
{
p_sys->i_angle = i_angle;
i_angle = ((3600+i_angle/2)%3600);
cache_trigo( i_angle, &p_sys->i_sin, &p_sys->i_cos );
}
}
else
vlc_spin_lock( &p_sys->lock );
const int i_sin = p_sys->i_sin;
const int i_cos = p_sys->i_cos;
vlc_spin_unlock( &p_sys->lock );
if( !p_sys->b_motion )
vlc_spin_unlock( &p_sys->lock );
int i_col, i_line;
for( i_line = 0; i_line < i_visible_lines; i_line++ )
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment