X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Ffbosd.c;h=ef3de6dc43a69419dcf9dd1d3e73c048d1c47729;hb=9747e57450a51020af9b7754b5369a1e6b4bf84b;hp=54985c4ed53a56bd9652e5934d3d2d88531fe5e9;hpb=27d483e9ef7a451397d7857251c8d67097661f1d;p=vlc diff --git a/modules/gui/fbosd.c b/modules/gui/fbosd.c index 54985c4ed5..ef3de6dc43 100644 --- a/modules/gui/fbosd.c +++ b/modules/gui/fbosd.c @@ -29,7 +29,7 @@ # include "config.h" #endif -#include +#include #include #include @@ -159,16 +159,18 @@ static picture_t *RenderText( intf_thread_t *, const char *, #define DISPLAY_LONGTEXT N_( "All rendered images and text will be " \ "displayed on the overlay framebuffer." ) -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") }; -static int pi_color_values[] = { 0xf0000000, 0x00000000, 0x00808080, 0x00C0C0C0, +static const int pi_color_values[] = { + 0xf0000000, 0x00000000, 0x00808080, 0x00C0C0C0, 0x00FFFFFF, 0x00800000, 0x00FF0000, 0x00FF00FF, 0x00FFFF00, 0x00808000, 0x00008000, 0x00008080, 0x0000FF00, 0x00800080, 0x00000080, 0x000000FF, 0x0000FFFF}; -static const char *ppsz_color_descriptions[] = { N_("Default"), N_("Black"), +static const char *const ppsz_color_descriptions[] = { + N_("Default"), N_("Black"), N_("Gray"), N_("Silver"), N_("White"), N_("Maroon"), N_("Red"), N_("Fuchsia"), N_("Yellow"), N_("Olive"), N_("Green"), N_("Teal"), N_("Lime"), N_("Purple"), N_("Navy"), N_("Blue"), @@ -189,26 +191,23 @@ vlc_module_begin(); add_string( "fbosd-text", NULL, NULL, FBOSD_TEXT, FBOSD_LONGTEXT, true ); -#if defined(FBOSD_BLENDING) add_integer_with_range( "fbosd-alpha", 255, 0, 255, NULL, ALPHA_TEXT, ALPHA_LONGTEXT, true ); -#endif - set_section( N_("Position"), NULL ); add_integer( "fbosd-x", 0, NULL, POSX_TEXT, POSX_LONGTEXT, false ); add_integer( "fbosd-y", 0, NULL, POSY_TEXT, POSY_LONGTEXT, false ); add_integer( "fbosd-position", 8, NULL, POS_TEXT, POS_LONGTEXT, true ); - change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); + change_integer_list( pi_pos_values, ppsz_pos_descriptions, NULL ); set_section( N_("Font"), NULL ); add_integer_with_range( "fbosd-font-opacity", 255, 0, 255, NULL, OPACITY_TEXT, OPACITY_LONGTEXT, false ); add_integer( "fbosd-font-color", 0x00FFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, false ); - change_integer_list( pi_color_values, ppsz_color_descriptions, 0 ); + change_integer_list( pi_color_values, ppsz_color_descriptions, NULL ); add_integer( "fbosd-font-size", -1, NULL, SIZE_TEXT, SIZE_LONGTEXT, false ); @@ -217,7 +216,7 @@ vlc_module_begin(); add_bool( "fbosd-render", false, NULL, RENDER_TEXT, RENDER_LONGTEXT, true ); add_bool( "fbosd-display", false, NULL, DISPLAY_TEXT, DISPLAY_LONGTEXT, true ); - set_description( _("GNU/Linux osd/overlay framebuffer interface") ); + set_description( N_("GNU/Linux osd/overlay framebuffer interface") ); set_capability( "interface", 10 ); set_callbacks( Create, Destroy ); vlc_module_end(); @@ -241,7 +240,7 @@ struct fbosd_render_t char *psz_string; /* Position */ - bool b_absolute; + bool b_absolute; int i_x; int i_y; int i_pos; @@ -311,17 +310,13 @@ static int Create( vlc_object_t *p_this ) /* Allocate instance and initialize some members */ p_intf->p_sys = p_sys = malloc( sizeof( intf_sys_t ) ); if( !p_intf->p_sys ) - { - msg_Err( p_intf, "out of memory" ); return VLC_ENOMEM; - }; memset( p_sys, 0, sizeof(intf_sys_t) ); p_sys->p_style = malloc( sizeof( text_style_t ) ); if( !p_sys->p_style ) { free( p_intf->p_sys ); - msg_Err( p_intf, "out of memory" ); return VLC_ENOMEM; } vlc_memcpy( p_sys->p_style, &default_text_style, sizeof( text_style_t ) ); @@ -333,16 +328,12 @@ static int Create( vlc_object_t *p_this ) { free( p_intf->p_sys->p_style ); free( p_intf->p_sys ); - msg_Err( p_intf, "out of memory" ); return VLC_ENOMEM; } -#if defined(FBOSD_BLENDING) p_sys->i_alpha = var_CreateGetIntegerCommand( p_intf, "fbosd-alpha" ); var_AddCallback( p_intf, "fbosd-alpha", OverlayCallback, NULL ); -#else - p_sys->i_alpha = 255; -#endif + p_sys->i_aspect = -1; psz_aspect = var_CreateGetNonEmptyString( p_intf, "fbosd-aspect-ratio" ); @@ -485,10 +476,8 @@ static void Destroy( vlc_object_t *p_this ) p_sys->b_render = false; p_sys->b_clear = false; -#if defined(FBOSD_BLENDING) var_DelCallback( p_intf, "fbosd-alpha", OverlayCallback, NULL ); var_Destroy( p_intf, "fbosd-alpha" ); -#endif var_DelCallback( p_intf, "fbosd-x", OverlayCallback, NULL ); var_DelCallback( p_intf, "fbosd-y", OverlayCallback, NULL ); @@ -532,7 +521,7 @@ static void Destroy( vlc_object_t *p_this ) if( p_sys->p_image ) image_HandlerDelete( p_sys->p_image ); if( p_sys->p_overlay ) - p_sys->p_overlay->pf_release( p_sys->p_overlay ); + picture_Release( p_sys->p_overlay ); free( p_sys->p_style ); free( p_sys ); @@ -544,7 +533,7 @@ static int OpenBlending( intf_thread_t *p_intf ) if( p_intf->p_sys->p_blend ) return VLC_EGENERIC; p_intf->p_sys->p_blend = - vlc_object_create( p_intf, VLC_OBJECT_FILTER ); + vlc_object_create( p_intf, sizeof(filter_t) ); vlc_object_attach( p_intf->p_sys->p_blend, p_intf ); p_intf->p_sys->p_blend->fmt_out.video.i_x_offset = p_intf->p_sys->p_blend->fmt_out.video.i_y_offset = 0; @@ -589,7 +578,7 @@ static int OpenTextRenderer( intf_thread_t *p_intf ) if( p_intf->p_sys->p_text ) return VLC_EGENERIC; p_intf->p_sys->p_text = - vlc_object_create( p_intf, VLC_OBJECT_FILTER ); + vlc_object_create( p_intf, sizeof(filter_t) ); vlc_object_attach( p_intf->p_sys->p_text, p_intf ); p_intf->p_sys->p_text->fmt_out.video.i_width = @@ -639,8 +628,11 @@ static void CloseTextRenderer( intf_thread_t *p_intf ) static picture_t *AllocatePicture( vlc_object_t *p_this, video_format_t *p_fmt ) { - picture_t *p_pic = malloc( sizeof( picture_t ) ); - if( !p_pic ) return NULL; + picture_t *p_picture = picture_New( p_fmt->i_chroma, + p_fmt->i_width, p_fmt->i_height, + p_fmt->i_aspect ); + if( !p_picture ) + return NULL; if( !p_fmt->p_palette && ( p_fmt->i_chroma == VLC_FOURCC('Y','U','V','P') ) ) @@ -648,24 +640,16 @@ static picture_t *AllocatePicture( vlc_object_t *p_this, p_fmt->p_palette = malloc( sizeof(video_palette_t) ); if( !p_fmt->p_palette ) { - free( p_pic ); + picture_Release( p_picture ); return NULL; } } - else p_fmt->p_palette = NULL; - - p_pic->p_data_orig = NULL; - - vout_AllocatePicture( p_this, p_pic, p_fmt->i_chroma, - p_fmt->i_width, p_fmt->i_height, p_fmt->i_aspect ); - - if( !p_pic->i_planes ) + else { - free( p_pic ); - free( p_fmt->p_palette ); - return NULL; + p_fmt->p_palette = NULL; } - return p_pic; + + return p_picture; } /***************************************************************************** @@ -676,17 +660,15 @@ static void DeAllocatePicture( vlc_object_t *p_this, picture_t *p_pic, video_format_t *p_fmt ) { VLC_UNUSED(p_this); - if( p_pic ) - { - free( p_pic->p_data_orig ); - if( p_pic->pf_release ) p_pic->pf_release( p_pic ); - } + if( p_fmt ) { free( p_fmt->p_palette ); p_fmt->p_palette = NULL; } - p_pic = NULL; + + if( p_pic ) + picture_Release( p_pic ); } /***************************************************************************** @@ -707,9 +689,10 @@ static void SetOverlayTransparency( intf_thread_t *p_intf, { msg_Dbg( p_intf, "Make overlay %s", b_transparent ? "transparent" : "opaque" ); - memset( p_sys->p_overlay->p[0].p_pixels, 0x00, i_page_size ); if( b_transparent ) memset( p_sys->p_overlay->p[0].p_pixels, 0xFF, i_page_size ); + else + memset( p_sys->p_overlay->p[0].p_pixels, 0x00, i_page_size ); } } @@ -784,9 +767,9 @@ static int InvertAlpha( intf_thread_t *p_intf, picture_t **p_pic, video_format_t for( ; p_begin < p_end; p_begin += i_skip ) { - uint8_t i_opacity; + uint8_t i_opacity = 0; - if( i_opacity != 0xFF ) + if( *p_begin != 0xFF ) i_opacity = 255 - *p_begin; *p_begin = i_opacity; } @@ -876,6 +859,11 @@ static picture_t *RenderText( intf_thread_t *p_intf, const char *psz_string, memset( p_region, 0, sizeof(subpicture_region_t) ); p_region->psz_text = strdup( psz_string ); + if( !p_region->psz_text ) + { + free( p_region ); + return NULL; + } p_region->p_style = p_style; p_region->fmt.i_chroma = VLC_FOURCC('T','E','X','T'); @@ -1061,7 +1049,8 @@ static void End( intf_thread_t *p_intf ) if( p_sys->p_overlay ) { int ret; - ret = write( p_sys->i_fd, p_sys->p_overlay->p[0].p_pixels, p_sys->i_page_size ); + ret = write( p_sys->i_fd, p_sys->p_overlay->p[0].p_pixels, + p_sys->i_page_size ); if( ret < 0 ) msg_Err( p_intf, "unable to clear overlay" ); } @@ -1210,7 +1199,7 @@ static void Render( intf_thread_t *p_intf, struct fbosd_render_t *render ) { RenderPicture( p_intf, render->i_x, render->i_y, p_pic, p_sys->p_overlay ); - p_pic->pf_release( p_pic ); + picture_Release( p_pic ); } } else if( render->i_type == FBOSD_RENDER_TEXT ) @@ -1235,7 +1224,7 @@ static void Render( intf_thread_t *p_intf, struct fbosd_render_t *render ) { RenderPicture( p_intf, render->i_x, render->i_y, p_text, p_sys->p_overlay ); - p_text->pf_release( p_text ); + picture_Release( p_text ); } #endif } @@ -1273,7 +1262,7 @@ static bool isRendererReady( intf_thread_t *p_intf ) } /***************************************************************************** - * Run: rc thread + * Run: thread ***************************************************************************** * This part of the interface is in a separate thread so that we can call * exec() from within it without annoying the rest of the program. @@ -1281,8 +1270,9 @@ static bool isRendererReady( intf_thread_t *p_intf ) static void Run( intf_thread_t *p_intf ) { intf_sys_t *p_sys = (intf_sys_t*) p_intf->p_sys; + int canc = vlc_savecancel(); - while( !intf_ShouldDie( p_intf ) ) + while( vlc_object_alive( p_intf ) ) { int i; @@ -1333,6 +1323,7 @@ static void Run( intf_thread_t *p_intf ) } End( p_intf ); + vlc_restorecancel( canc ); } static int OverlayCallback( vlc_object_t *p_this, char const *psz_cmd, @@ -1435,12 +1426,10 @@ static int OverlayCallback( vlc_object_t *p_this, char const *psz_cmd, { p_sys->render[i].text_style.i_font_alpha = 255 - newval.i_int; } -#if defined(FBOSD_BLENDING) else if( !strncmp( psz_cmd, "fbosd-alpha", 11 ) ) { p_sys->render[i].i_alpha = newval.i_int; } -#endif } return VLC_SUCCESS; }