X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fmotion.c;h=4ab6739623a7a97983b02003b4425cb07648d4ff;hb=4ae811b6cc998370a3213ccd746887f630a42040;hp=ccecf4d0829637af6728c253c20afbb0d3e7e183;hpb=3561b9b28f58eb7a4183e158a8fd973800d31ceb;p=vlc diff --git a/modules/control/motion.c b/modules/control/motion.c index ccecf4d082..4ab6739623 100644 --- a/modules/control/motion.c +++ b/modules/control/motion.c @@ -25,23 +25,32 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include + #include #include #include +#include #include #ifdef HAVE_UNISTD_H -# include +# include #endif #ifdef __APPLE__ -#include "unimotion.h" +# include "TargetConditionals.h" +# if !TARGET_OS_IPHONE +# define HAVE_MACOS_UNIMOTION +# endif +#endif + +#ifdef HAVE_MACOS_UNIMOTION +# include "unimotion.h" #endif /***************************************************************************** @@ -51,7 +60,7 @@ struct intf_sys_t { enum { NO_SENSOR, HDAPS_SENSOR, AMS_SENSOR, APPLESMC_SENSOR, UNIMOTION_SENSOR } sensor; -#ifdef __APPLE__ +#ifdef HAVE_MACOS_UNIMOTION enum sms_hardware unimotion_hw; #endif int i_calibrate; @@ -73,19 +82,20 @@ static int GetOrientation( intf_thread_t *p_intf ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_shortname( N_("motion")); - set_category( CAT_INTERFACE ); - set_description( N_("motion control interface") ); +vlc_module_begin () + set_shortname( N_("motion")) + set_category( CAT_INTERFACE ) + set_subcategory( SUBCAT_INTERFACE_CONTROL ) + set_description( N_("motion control interface") ) set_help( N_("Use HDAPS, AMS, APPLESMC or UNIMOTION motion sensors " \ "to rotate the video") ) - add_bool( "motion-use-rotate", 0, NULL, - USE_ROTATE_TEXT, USE_ROTATE_TEXT, false ); + add_bool( "motion-use-rotate", false, + USE_ROTATE_TEXT, USE_ROTATE_TEXT, false ) - set_capability( "interface", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); + set_capability( "interface", 0 ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * OpenIntf: initialise interface @@ -94,7 +104,7 @@ int Open ( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; FILE *f; - int i_x, i_y; + int i_x = 0, i_y = 0; p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); if( p_intf->p_sys == NULL ) @@ -108,10 +118,8 @@ int Open ( vlc_object_t *p_this ) f = fopen( "/sys/devices/platform/hdaps/calibrate", "r" ); if( f ) { - i_x = i_y = 0; - fscanf( f, "(%d,%d)", &i_x, &i_y ); + p_intf->p_sys->i_calibrate = fscanf( f, "(%d,%d)", &i_x, &i_y ) == 2 ? i_x: 0; fclose( f ); - p_intf->p_sys->i_calibrate = i_x; p_intf->p_sys->sensor = HDAPS_SENSOR; } else @@ -131,10 +139,8 @@ int Open ( vlc_object_t *p_this ) f = fopen( "/sys/devices/applesmc.768/calibrate", "r" ); if( f ) { - i_x = i_y = 0; - fscanf( f, "(%d,%d)", &i_x, &i_y ); + p_intf->p_sys->i_calibrate = fscanf( f, "(%d,%d)", &i_x, &i_y ) == 2 ? i_x: 0; fclose( f ); - p_intf->p_sys->i_calibrate = i_x; p_intf->p_sys->sensor = APPLESMC_SENSOR; } else @@ -142,8 +148,8 @@ int Open ( vlc_object_t *p_this ) p_intf->p_sys->sensor = NO_SENSOR; } } -#ifdef __APPLE__ - else if( p_intf->p_sys->unimotion_hw = detect_sms() ) +#ifdef HAVE_MACOS_UNIMOTION + else if( (p_intf->p_sys->unimotion_hw = detect_sms()) ) p_intf->p_sys->sensor = UNIMOTION_SENSOR; #endif else @@ -154,8 +160,9 @@ int Open ( vlc_object_t *p_this ) p_intf->pf_run = RunIntf; - p_intf->p_sys->b_use_rotate = config_GetInt( p_intf, "motion-use-rotate" ); + p_intf->p_sys->b_use_rotate = var_InheritBool( p_intf, "motion-use-rotate" ); + msg_Dbg( p_intf, "Motion detection correctly loaded" ); return VLC_SUCCESS; } @@ -181,15 +188,16 @@ static void RunIntf( intf_thread_t *p_intf ) int p_oldx[FILTER_LENGTH]; memset( p_oldx, 0, FILTER_LENGTH * sizeof( int ) ); - while( !intf_ShouldDie( p_intf ) ) + for( ;; ) { - vout_thread_t *p_vout; const char *psz_filter, *psz_type; bool b_change = false; /* Wait a bit, get orientation, change filter if necessary */ +#warning FIXME: check once (or less) per picture, not once per interval msleep( INTF_IDLE_SLEEP ); + int canc = vlc_savecancel(); i_x = GetOrientation( p_intf ); i_sum += i_x - p_oldx[i]; p_oldx[i++] = i_x; @@ -211,7 +219,7 @@ static void RunIntf( intf_thread_t *p_intf ) vlc_object_release( p_obj ); } } - continue; + goto loop; } if( i_x < -HIGH_THRESHOLD && i_oldx > -LOW_THRESHOLD ) @@ -234,23 +242,31 @@ static void RunIntf( intf_thread_t *p_intf ) psz_type = "90"; } - if( !b_change ) - { - continue; - } - - p_vout = (vout_thread_t *) - vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( !p_vout ) + if( b_change ) { - continue; - } +#warning FIXME: refactor this plugin as a video filter! + input_thread_t *p_input; - config_PutPsz( p_vout, "transform-type", psz_type ); - var_SetString( p_vout, "vout-filter", psz_filter ); - vlc_object_release( p_vout ); + p_input = playlist_CurrentInput( pl_Get( p_intf ) ); + if( p_input ) + { + vout_thread_t *p_vout; - i_oldx = i_x; + p_vout = input_GetVout( p_input ); + if( p_vout ) + { +#warning FIXME: do not override the permanent configuration! +#warning FIXME: transform-type does not exist anymore + config_PutPsz( p_vout, "transform-type", psz_type ); + var_SetString( p_vout, "video-filter", psz_filter ); + vlc_object_release( p_vout ); + } + vlc_object_release( p_input ); + i_oldx = i_x; + } + } +loop: + vlc_restorecancel( canc ); } } #undef FILTER_LENGTH @@ -263,7 +279,8 @@ static void RunIntf( intf_thread_t *p_intf ) static int GetOrientation( intf_thread_t *p_intf ) { FILE *f; - int i_x, i_y, i_z = 0; + int i_x = 0, i_y = 0, i_z = 0; + int i_ret; switch( p_intf->p_sys->sensor ) { @@ -274,11 +291,13 @@ static int GetOrientation( intf_thread_t *p_intf ) return 0; } - i_x = i_y = 0; - fscanf( f, "(%d,%d)", &i_x, &i_y ); + i_ret = fscanf( f, "(%d,%d)", &i_x, &i_y ); fclose( f ); - return ( i_x - p_intf->p_sys->i_calibrate ) * 10; + if( i_ret < 2 ) + return 0; + else + return ( i_x - p_intf->p_sys->i_calibrate ) * 10; case AMS_SENSOR: f = fopen( "/sys/devices/ams/x", "r" ); @@ -287,10 +306,13 @@ static int GetOrientation( intf_thread_t *p_intf ) return 0; } - fscanf( f, "%d", &i_x); + i_ret = fscanf( f, "%d", &i_x); fclose( f ); - return - i_x * 30; /* FIXME: arbitrary */ + if( i_ret < 1 ) + return 0; + else + return - i_x * 30; /* FIXME: arbitrary */ case APPLESMC_SENSOR: f = fopen( "/sys/devices/applesmc.768/position", "r" ); @@ -299,13 +321,15 @@ static int GetOrientation( intf_thread_t *p_intf ) return 0; } - i_x = i_y = i_z = 0; - fscanf( f, "(%d,%d,%d)", &i_x, &i_y, &i_z ); + i_ret = fscanf( f, "(%d,%d,%d)", &i_x, &i_y, &i_z ); fclose( f ); - return ( i_x - p_intf->p_sys->i_calibrate ) * 10; + if( i_ret < 3 ) + return 0; + else + return ( i_x - p_intf->p_sys->i_calibrate ) * 10; -#ifdef __APPLE__ +#ifdef HAVE_MACOS_UNIMOTION case UNIMOTION_SENSOR: if( read_sms_raw( p_intf->p_sys->unimotion_hw, &i_x, &i_y, &i_z ) ) { @@ -321,6 +345,7 @@ static int GetOrientation( intf_thread_t *p_intf ) else return 0; #endif + case NO_SENSOR: default: return 0; }