X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fosdmenu.c;h=377f7407b23d657002931dac12b9d1c0af06c98b;hb=bdcee1948728fa600f992c29be0b63dd905c5678;hp=2367e5ac715e1ab7623d7d51fbda84aa6dde094e;hpb=df61d33b06e2b3cbbe746b2f5a9bea5b370c24ff;p=vlc diff --git a/modules/video_filter/osdmenu.c b/modules/video_filter/osdmenu.c index 2367e5ac71..377f7407b2 100644 --- a/modules/video_filter/osdmenu.c +++ b/modules/video_filter/osdmenu.c @@ -28,7 +28,8 @@ # include "config.h" #endif -#include +#include +#include #include #include @@ -79,8 +80,8 @@ "means less transparency. The default is being not transparent " \ "(value 255) the minimum is fully transparent (value 0)." ) -static int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 }; -static const char *ppsz_pos_descriptions[] = +static const int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 }; +static const char *const ppsz_pos_descriptions[] = { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"), N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") }; @@ -111,34 +112,35 @@ static int MouseEvent( vlc_object_t *, char const *, #define OSD_UPDATE_DEFAULT 300 #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 ); +vlc_module_begin () + 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, 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, - false ); - change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); + false ) + change_integer_list( pi_pos_values, ppsz_pos_descriptions, NULL ) add_string( OSD_CFG "file", OSD_DEFAULT_CFG, NULL, OSD_FILE_TEXT, - OSD_FILE_LONGTEXT, false ); + OSD_FILE_LONGTEXT, false ) add_string( OSD_CFG "file-path", NULL, NULL, OSD_PATH_TEXT, - OSD_PATH_LONGTEXT, false ); + OSD_PATH_LONGTEXT, false ) add_integer( OSD_CFG "timeout", 15, NULL, TIMEOUT_TEXT, - TIMEOUT_LONGTEXT, false ); + TIMEOUT_LONGTEXT, false ) add_integer_with_range( OSD_CFG "update", OSD_UPDATE_DEFAULT, OSD_UPDATE_MIN, OSD_UPDATE_MAX, NULL, OSD_UPDATE_TEXT, - OSD_UPDATE_LONGTEXT, true ); + OSD_UPDATE_LONGTEXT, true ) 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( _("On Screen Display menu") ); - set_shortname( _("OSD menu") ); - add_shortcut( "osdmenu" ); - - set_category( CAT_VIDEO ); - set_subcategory( SUBCAT_VIDEO_SUBPIC ); + OSD_ALPHA_TEXT, OSD_ALPHA_LONGTEXT, true ) - set_callbacks( CreateFilter, DestroyFilter ); -vlc_module_end(); +vlc_module_end () /***************************************************************************** * Sub filter code @@ -183,10 +185,7 @@ static int CreateFilter ( vlc_object_t *p_this ) p_filter->p_sys = p_sys = (filter_sys_t *) malloc( sizeof(filter_sys_t) ); if( !p_filter->p_sys ) - { - msg_Err( p_filter, "out of memory" ); return VLC_ENOMEM; - } memset( p_sys, 0, sizeof(filter_sys_t) ); /* Populating struct */ @@ -220,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 */ @@ -230,18 +230,11 @@ static int CreateFilter ( vlc_object_t *p_this ) p_sys->p_menu->i_x = 0; p_sys->p_menu->i_y = 0; } - else if( (p_sys->i_x >= 0) || (p_sys->i_y >= 0) ) + else { p_sys->p_menu->i_x = p_sys->i_x; p_sys->p_menu->i_y = p_sys->i_y; } - else if( (p_sys->p_menu->i_x < 0) || - (p_sys->p_menu->i_y < 0) ) - { - p_sys->b_absolute = false; - p_sys->p_menu->i_x = 0; - p_sys->p_menu->i_y = 0; - } /* Set up p_filter */ p_sys->i_last_date = mdate(); @@ -260,18 +253,12 @@ 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 ); + p_sys->p_vout = vlc_object_find( p_this, VLC_OBJECT_VOUT, FIND_PARENT ); 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 ); - } - es_format_Init( &p_filter->fmt_out, SPU_ES, VLC_FOURCC( 's','p','u',' ' ) ); + es_format_Init( &p_filter->fmt_out, SPU_ES, VLC_CODEC_SPU ); p_filter->fmt_out.i_priority = 0; return VLC_SUCCESS; @@ -279,8 +266,7 @@ static int CreateFilter ( vlc_object_t *p_this ) error: msg_Err( p_filter, "osdmenu filter discarded" ); - osd_MenuDelete( p_this, p_sys->p_menu ); - p_sys->p_menu = NULL; + free( p_sys->psz_path ); free( p_sys->psz_file ); free( p_sys ); return VLC_EGENERIC; @@ -306,15 +292,9 @@ static void DestroyFilter( vlc_object_t *p_this ) if( 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_Destroy( p_this, OSD_CFG "file-path" ); @@ -327,7 +307,7 @@ static void DestroyFilter( vlc_object_t *p_this ) var_Destroy( p_this, OSD_CFG "alpha" ); osd_MenuDelete( p_filter, p_sys->p_menu ); - + free( p_sys->psz_path ); free( p_sys->psz_file ); free( p_sys ); } @@ -372,13 +352,12 @@ 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_FOURCC( 'T','E','X','T' ); - fmt.i_aspect = VOUT_ASPECT_FACTOR; + fmt.i_chroma = VLC_CODEC_TEXT; 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; fmt.i_x_offset = fmt.i_y_offset = 0; - p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt ); + p_region = subpicture_region_New( &fmt ); if( !p_region ) { msg_Err( p_filter, "cannot allocate another SPU region" ); @@ -404,33 +383,35 @@ static subpicture_region_t *create_picture_region( filter_t *p_filter, subpictur { subpicture_region_t *p_region = NULL; video_format_t fmt; + video_palette_t palette; if( !p_spu ) return NULL; /* Create new SPU region */ memset( &fmt, 0, sizeof(video_format_t) ); - fmt.i_chroma = (p_pic == NULL) ? VLC_FOURCC('Y','U','V','P') : VLC_FOURCC('Y','U','V','A'); - fmt.i_aspect = VOUT_ASPECT_FACTOR; + fmt.i_chroma = (p_pic == NULL) ? VLC_CODEC_YUVP : VLC_CODEC_YUVA; 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; fmt.i_x_offset = fmt.i_y_offset = 0; + if( fmt.i_chroma == VLC_CODEC_YUVP ) + { + fmt.p_palette = &palette; + fmt.p_palette->i_entries = 0; + fmt.i_visible_width = 0; + fmt.i_visible_height = 0; + } - p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt ); + p_region = subpicture_region_New( &fmt ); if( !p_region ) { msg_Err( p_filter, "cannot allocate SPU region" ); p_filter->pf_sub_buffer_del( p_filter, p_spu ); return NULL; } - if( !p_pic && ( fmt.i_chroma == VLC_FOURCC('Y','U','V','P') ) ) - { - p_region->fmt.p_palette->i_entries = 0; - p_region->fmt.i_width = p_region->fmt.i_visible_width = 0; - p_region->fmt.i_height = p_region->fmt.i_visible_height = 0; - } + /* FIXME the copy is probably not needed anymore */ if( p_pic ) - vout_CopyPicture( p_filter, &p_region->picture, p_pic ); + picture_Copy( p_region->p_picture, p_pic ); p_region->i_x = 0; p_region->i_y = 0; @@ -454,6 +435,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) filter_sys_t *p_sys = p_filter->p_sys; subpicture_t *p_spu = NULL; subpicture_region_t *p_region = NULL; + int i_x, i_y; if( !p_sys->b_update || (p_sys->i_update <= 0) ) return NULL; @@ -465,8 +447,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) return NULL; /* we are too early, so wait */ /* Allocate the subpicture internal data. */ - p_spu = p_filter->pf_sub_buffer_new( p_filter ); - if( !p_spu ) return NULL; + p_spu = filter_NewSubpicture( p_filter ); + if( !p_spu ) + return NULL; p_spu->b_ephemer = true; p_spu->b_fade = true; @@ -474,7 +457,6 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) p_spu->b_absolute = true; else p_spu->b_absolute = p_sys->b_absolute; - p_spu->i_flags = p_sys->i_position; /* Determine the duration of the subpicture */ if( p_sys->i_end_date > 0 ) @@ -507,8 +489,11 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) NULL ); /* proper positioning of OSD menu image */ - p_spu->i_x = p_filter->p_sys->p_menu->p_state->i_x; - p_spu->i_y = p_filter->p_sys->p_menu->p_state->i_y; + 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; @@ -532,21 +517,21 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) return NULL; } - p_spu->i_width = p_region->fmt.i_visible_width; - p_spu->i_height = p_region->fmt.i_visible_height; p_spu->i_alpha = p_filter->p_sys->i_alpha; /* proper positioning of OSD menu image */ if( p_filter->p_sys->p_menu->i_style == OSD_MENU_STYLE_CONCAT ) { - p_spu->i_x = p_filter->p_sys->p_menu->p_button->i_x; - p_spu->i_y = p_filter->p_sys->p_menu->p_button->i_y; + i_x = p_filter->p_sys->p_menu->p_button->i_x; + i_y = p_filter->p_sys->p_menu->p_button->i_y; } else { - p_spu->i_x = p_filter->p_sys->p_menu->p_state->i_x; - p_spu->i_y = p_filter->p_sys->p_menu->p_state->i_y; + i_x = p_filter->p_sys->p_menu->p_state->i_x; + i_y = p_filter->p_sys->p_menu->p_state->i_y; } + p_region->i_x = i_x; + p_region->i_y = i_y; if( p_filter->p_sys->p_menu->i_style == OSD_MENU_STYLE_CONCAT ) { @@ -568,20 +553,13 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) if( !p_new ) { /* Cleanup when bailing out */ - subpicture_region_t *p_tmp = NULL; - while( p_region_list ) - { - p_tmp = p_region_list->p_next; - p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region_list ); - }; - p_spu->pf_destroy_region( VLC_OBJECT(p_filter), p_region ); + subpicture_region_ChainDelete( p_region_list ); + subpicture_region_Delete( p_region ); + p_filter->pf_sub_buffer_del( p_filter, p_spu ); return NULL; } - p_spu->i_width += p_new->fmt.i_visible_width; - p_spu->i_height += p_new->fmt.i_visible_height; - if( !p_region_list ) { p_region_list = p_new; @@ -589,8 +567,8 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t i_date ) } else { - p_new->i_x = p_region_tail->fmt.i_visible_width; - p_new->i_y = p_button->i_y; + p_new->i_x = i_x+p_region_tail->fmt.i_visible_width; + p_new->i_y = i_y+p_button->i_y; p_region_tail->p_next = p_new; p_region_tail = p_new; } @@ -665,35 +643,18 @@ static int OSDMenuCallback( vlc_object_t *p_this, char const *psz_var, static int MouseEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { - VLC_UNUSED(oldval); VLC_UNUSED(newval); + VLC_UNUSED(oldval); 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 i_x = newval.coords.x; + int i_y = newval.coords.y; 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" ); - if( i_y < 0 || i_x < 0 || i_y >= v_h || i_x >= v_w ) return VLC_SUCCESS; - if( mouse & MOUSE_CLICKED ) + do { int i_scale_width, i_scale_height; osd_button_t *p_button = NULL; @@ -710,8 +671,9 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, 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)\n", p_button->psz_name, i_x, i_y ); + msg_Dbg( p_this, "mouse clicked %s (%d,%d)", p_button->psz_name, i_x, i_y ); } } + while(0); return VLC_SUCCESS; }