X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fosdmenu.c;h=f5a134e16ce634a1918c062745d716bd1d2eff6e;hb=f94ced49be133b70eb1932f2d4b50fd7947b8612;hp=25e5f3b8e725fed64285e2e5808e51d31c2595f4;hpb=724461bdf250e856eb32f6c0b7c51b065e482982;p=vlc diff --git a/modules/video_filter/osdmenu.c b/modules/video_filter/osdmenu.c index 25e5f3b8e7..f5a134e16c 100644 --- a/modules/video_filter/osdmenu.c +++ b/modules/video_filter/osdmenu.c @@ -30,7 +30,6 @@ #include #include -#include #include #include @@ -97,8 +96,10 @@ static int OSDMenuVisibleEvent( vlc_object_t *, char const *, static int OSDMenuCallback( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); -static int MouseEvent( vlc_object_t *, char const *, - vlc_value_t , vlc_value_t , void * ); +static int MouseEvent( filter_t *, + const vlc_mouse_t *, + const vlc_mouse_t *, + const video_format_t * ); #define OSD_CFG "osdmenu-" @@ -113,16 +114,26 @@ static int MouseEvent( vlc_object_t *, char const *, #define OSD_UPDATE_MAX 1000 vlc_module_begin () - add_integer( OSD_CFG "x", -1, NULL, POSX_TEXT, POSX_LONGTEXT, false ) - add_integer( OSD_CFG "y", -1, NULL, POSY_TEXT, POSY_LONGTEXT, false ) - add_integer( OSD_CFG "position", 8, NULL, POS_TEXT, POS_LONGTEXT, + set_capability( "sub filter", 100 ) + set_description( N_("On Screen Display menu") ) + set_shortname( N_("OSD menu") ) + add_shortcut( "osdmenu" ) + + set_category( CAT_VIDEO ) + set_subcategory( SUBCAT_VIDEO_SUBPIC ) + + set_callbacks( CreateFilter, DestroyFilter ) + + add_integer( OSD_CFG "x", -1, POSX_TEXT, POSX_LONGTEXT, false ) + add_integer( OSD_CFG "y", -1, POSY_TEXT, POSY_LONGTEXT, false ) + add_integer( OSD_CFG "position", 8, POS_TEXT, POS_LONGTEXT, false ) - change_integer_list( pi_pos_values, ppsz_pos_descriptions, NULL ) - add_string( OSD_CFG "file", OSD_DEFAULT_CFG, NULL, OSD_FILE_TEXT, + change_integer_list( pi_pos_values, ppsz_pos_descriptions ) + add_loadfile( OSD_CFG "file", OSD_DEFAULT_CFG, OSD_FILE_TEXT, OSD_FILE_LONGTEXT, false ) - add_string( OSD_CFG "file-path", NULL, NULL, OSD_PATH_TEXT, + add_directory( OSD_CFG "file-path", NULL, OSD_PATH_TEXT, OSD_PATH_LONGTEXT, false ) - add_integer( OSD_CFG "timeout", 15, NULL, TIMEOUT_TEXT, + add_integer( OSD_CFG "timeout", 15, TIMEOUT_TEXT, TIMEOUT_LONGTEXT, false ) add_integer_with_range( OSD_CFG "update", OSD_UPDATE_DEFAULT, OSD_UPDATE_MIN, OSD_UPDATE_MAX, NULL, OSD_UPDATE_TEXT, @@ -130,15 +141,6 @@ vlc_module_begin () add_integer_with_range( OSD_CFG "alpha", 255, 0, 255, NULL, OSD_ALPHA_TEXT, OSD_ALPHA_LONGTEXT, true ) - set_capability( "sub filter", 100 ) - set_description( N_("On Screen Display menu") ) - set_shortname( N_("OSD menu") ) - add_shortcut( "osdmenu" ) - - set_category( CAT_VIDEO ) - set_subcategory( SUBCAT_VIDEO_SUBPIC ) - - set_callbacks( CreateFilter, DestroyFilter ) vlc_module_end () /***************************************************************************** @@ -168,7 +170,6 @@ struct filter_sys_t osd_menu_t *p_menu; /* pointer to OSD Menu object */ /* menu interaction */ - vout_thread_t *p_vout; bool b_clicked; uint32_t i_mouse_x; uint32_t i_mouse_y; @@ -218,6 +219,7 @@ static int CreateFilter ( vlc_object_t *p_this ) if( p_sys->p_menu == NULL ) goto error; + /* FIXME: this plugin is not at all thread-safe w.r.t. callbacks */ p_sys->p_menu->i_position = p_sys->i_position; /* Check if menu position was overridden */ @@ -250,17 +252,7 @@ static int CreateFilter ( vlc_object_t *p_this ) /* Attach subpicture filter callback */ p_filter->pf_sub_filter = Filter; - - p_sys->p_vout = vlc_object_find( p_this, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( p_sys->p_vout ) - { - var_AddCallback( p_sys->p_vout, "mouse-x", - MouseEvent, p_sys ); - var_AddCallback( p_sys->p_vout, "mouse-y", - MouseEvent, p_sys ); - var_AddCallback( p_sys->p_vout, "mouse-clicked", - MouseEvent, p_sys ); - } + p_filter->pf_sub_mouse = MouseEvent; es_format_Init( &p_filter->fmt_out, SPU_ES, VLC_CODEC_SPU ); p_filter->fmt_out.i_priority = 0; @@ -289,26 +281,10 @@ static void DestroyFilter( vlc_object_t *p_this ) var_DelCallback( p_filter, OSD_CFG "update", OSDMenuCallback, p_sys ); var_DelCallback( p_filter, OSD_CFG "alpha", OSDMenuCallback, p_sys ); - if( p_sys ) - { - var_DelCallback( p_sys->p_menu, "osd-menu-update", - OSDMenuUpdateEvent, p_filter ); - var_DelCallback( p_sys->p_menu, "osd-menu-visible", - OSDMenuVisibleEvent, p_filter ); - } - - if( p_sys && p_sys->p_vout ) - { - var_DelCallback( p_sys->p_vout, "mouse-x", - MouseEvent, p_sys ); - var_DelCallback( p_sys->p_vout, "mouse-y", - MouseEvent, p_sys ); - var_DelCallback( p_sys->p_vout, "mouse-clicked", - MouseEvent, p_sys ); - - vlc_object_release( p_sys->p_vout ); - p_sys->p_vout = NULL; - } + var_DelCallback( p_sys->p_menu, "osd-menu-update", + OSDMenuUpdateEvent, p_filter ); + var_DelCallback( p_sys->p_menu, "osd-menu-visible", + OSDMenuVisibleEvent, p_filter ); var_Destroy( p_this, OSD_CFG "file-path" ); var_Destroy( p_this, OSD_CFG "file" ); @@ -319,14 +295,10 @@ static void DestroyFilter( vlc_object_t *p_this ) var_Destroy( p_this, OSD_CFG "update" ); var_Destroy( p_this, OSD_CFG "alpha" ); - if( p_sys ) - { - osd_MenuDelete( p_filter, p_sys->p_menu ); - - free( p_sys->psz_path ); - free( p_sys->psz_file ); - free( p_sys ); - } + osd_MenuDelete( p_filter, p_sys->p_menu ); + free( p_sys->psz_path ); + free( p_sys->psz_file ); + free( p_sys ); } /***************************************************************************** @@ -370,7 +342,6 @@ static subpicture_region_t *create_text_region( filter_t *p_filter, subpicture_t /* Create new SPU region */ memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_chroma = VLC_CODEC_TEXT; - fmt.i_aspect = VOUT_ASPECT_FACTOR; fmt.i_sar_num = fmt.i_sar_den = 1; fmt.i_width = fmt.i_visible_width = i_width; fmt.i_height = fmt.i_visible_height = i_height; @@ -408,7 +379,6 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur /* Create new SPU region */ memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_chroma = (p_pic == NULL) ? VLC_CODEC_YUVP : VLC_CODEC_YUVA; - fmt.i_aspect = VOUT_ASPECT_FACTOR; fmt.i_sar_num = fmt.i_sar_den = 1; fmt.i_width = fmt.i_visible_width = i_width; fmt.i_height = fmt.i_visible_height = i_height; @@ -492,33 +462,19 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) p_sys->i_end_date = p_spu->i_stop; } - p_sys->i_last_date = i_date; p_spu->i_start = p_sys->i_last_date = i_date; /* Send an empty subpicture to clear the display * when OSD menu should be hidden and menu picture is not allocated. */ if( !p_filter->p_sys->p_menu->p_state->p_pic || - ( p_filter->p_sys->b_visible == false ) ) + !p_filter->p_sys->b_visible ) { - /* Create new spu regions and allocate an empty picture in it. */ - p_region = create_picture_region( p_filter, p_spu, - p_filter->p_sys->p_menu->p_state->i_width, - p_filter->p_sys->p_menu->p_state->i_height, - NULL ); - - /* proper positioning of OSD menu image */ - p_region->i_x = p_filter->p_sys->p_menu->p_state->i_x; - p_region->i_y = p_filter->p_sys->p_menu->p_state->i_y; - /* FIXME is it needed ? - p_region->i_align = p_sys->i_position; - */ - p_spu->p_region = p_region; p_spu->i_alpha = 0xFF; /* Picture is completely non transparent. */ return p_spu; } - if( p_sys->p_vout && p_sys->b_clicked ) + if( p_sys->b_clicked ) { p_sys->b_clicked = false; osd_MenuActivate( p_filter ); @@ -615,7 +571,7 @@ static int OSDMenuCallback( vlc_object_t *p_this, char const *psz_var, if( !p_sys ) return VLC_SUCCESS; - if( !strncmp( psz_var, OSD_CFG"position", 16) ) + if( !strcmp( psz_var, OSD_CFG"position") ) { #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) unsigned int i; @@ -629,8 +585,8 @@ static int OSDMenuCallback( vlc_object_t *p_this, char const *psz_var, } #undef ARRAY_SIZE } - else if( !strncmp( psz_var, OSD_CFG"x", 9) || - !strncmp( psz_var, OSD_CFG"y", 9)) + else if( !strcmp( psz_var, OSD_CFG"x") || + !strcmp( psz_var, OSD_CFG"y")) { p_sys->b_absolute = true; if( (p_sys->i_x < 0) || (p_sys->i_y < 0) ) @@ -645,70 +601,39 @@ static int OSDMenuCallback( vlc_object_t *p_this, char const *psz_var, p_sys->p_menu->i_y = p_sys->i_y; } } - else if( !strncmp( psz_var, OSD_CFG"update", 14) ) - p_sys->i_update = (mtime_t)(newval.i_int * 1000); - else if( !strncmp( psz_var, OSD_CFG"timeout", 15) ) + else if( !strcmp( psz_var, OSD_CFG"update") ) + p_sys->i_update = newval.i_int * INT64_C(1000); + else if( !strcmp( psz_var, OSD_CFG"timeout") ) p_sys->i_update = newval.i_int % 1000; - else if( !strncmp( psz_var, OSD_CFG"alpha", 13) ) + else if( !strcmp( psz_var, OSD_CFG"alpha") ) p_sys->i_alpha = newval.i_int % 256; p_sys->b_update = p_sys->b_visible ? true : false; return VLC_SUCCESS; } -/***************************************************************************** - * MouseEvent: callback for mouse events - *****************************************************************************/ -static int MouseEvent( vlc_object_t *p_this, char const *psz_var, - vlc_value_t oldval, vlc_value_t newval, void *p_data ) +static int MouseEvent( filter_t *p_filter, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + const video_format_t *p_fmt ) { - VLC_UNUSED(oldval); VLC_UNUSED(newval); - filter_sys_t *p_sys = (filter_sys_t *)p_data; - vout_thread_t *p_vout = (vout_thread_t*)p_sys->p_vout; - int i_x, i_y; - int i_v; - -#define MOUSE_DOWN 1 -#define MOUSE_CLICKED 2 -#define MOUSE_MOVE_X 4 -#define MOUSE_MOVE_Y 8 -#define MOUSE_MOVE 12 - uint8_t mouse= 0; - - int v_h = p_vout->output.i_height; - int v_w = p_vout->output.i_width; - - if( psz_var[6] == 'x' ) mouse |= MOUSE_MOVE_X; - if( psz_var[6] == 'y' ) mouse |= MOUSE_MOVE_Y; - if( psz_var[6] == 'c' ) mouse |= MOUSE_CLICKED; - - i_v = var_GetInteger( p_sys->p_vout, "mouse-button-down" ); - if( i_v & 0x1 ) mouse |= MOUSE_DOWN; - i_y = var_GetInteger( p_sys->p_vout, "mouse-y" ); - i_x = var_GetInteger( p_sys->p_vout, "mouse-x" ); + filter_sys_t *p_sys = p_filter->p_sys; - if( i_y < 0 || i_x < 0 || i_y >= v_h || i_x >= v_w ) + if( !vlc_mouse_HasPressed( p_old, p_new, MOUSE_BUTTON_LEFT ) ) return VLC_SUCCESS; - if( mouse & MOUSE_CLICKED ) - { - int i_scale_width, i_scale_height; - osd_button_t *p_button = NULL; - - i_scale_width = p_vout->fmt_out.i_visible_width * 1000 / - p_vout->fmt_in.i_visible_width; - i_scale_height = p_vout->fmt_out.i_visible_height * 1000 / - p_vout->fmt_in.i_visible_height; + osd_button_t *p_button = osd_ButtonFind( VLC_OBJECT(p_filter), + p_new->i_x, + p_new->i_y, + p_fmt->i_width, + p_fmt->i_height, + 1000, 1000 ); + if( !p_button ) + return VLC_SUCCESS; - p_button = osd_ButtonFind( p_this, i_x, i_y, v_h, v_w, - i_scale_width, i_scale_height ); - if( p_button ) - { - osd_ButtonSelect( p_this, p_button ); - p_sys->b_update = p_sys->b_visible ? true : false; - p_sys->b_clicked = true; - msg_Dbg( p_this, "mouse clicked %s (%d,%d)", p_button->psz_name, i_x, i_y ); - } - } + osd_ButtonSelect( VLC_OBJECT(p_filter), p_button ); + p_sys->b_update = p_sys->b_visible ? true : false; + p_sys->b_clicked = true; + msg_Dbg( p_filter, "mouse clicked %s (%d,%d)", p_button->psz_name, p_new->i_x, p_new->i_y ); return VLC_SUCCESS; }