From fea7a06ea8469259d53a7d31bb0dea2773cf9330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Mon, 31 Mar 2014 17:54:01 +0200 Subject: [PATCH 14/15] libvlc: add preliminary code path to modify quartztext variables on-the-fly --- include/vlc/libvlc_media_player.h | 21 ++++++++++++++ lib/libvlc.sym | 4 +++ lib/media_player.c | 6 ++++ lib/video.c | 47 ++++++++++++++++++++++++++++++++ modules/text_renderer/quartztext.c | 56 ++++++++++++++++++++++++++++++++++---- 5 files changed, 128 insertions(+), 6 deletions(-) diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 6614340..9c17963 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -1515,6 +1515,27 @@ LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, unsigned option, float value ); +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_textrenderer_option_t { + libvlc_textrender_font = 0, + libvlc_textrender_fontsize, + libvlc_textrender_fontcolor, +}; + +LIBVLC_API int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option ); + +LIBVLC_API void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +LIBVLC_API char *libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option ); + +LIBVLC_API void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option, + const char *psz_text ); + + /** @} video */ /** \defgroup libvlc_audio LibVLC audio controls diff --git a/lib/libvlc.sym b/lib/libvlc.sym index 49207db..9ef430e 100644 --- a/lib/libvlc.sym +++ b/lib/libvlc.sym @@ -229,6 +229,8 @@ libvlc_video_get_spu_count libvlc_video_get_spu_delay libvlc_video_get_spu_description libvlc_video_get_teletext +libvlc_video_get_text_renderer_int +libvlc_video_get_text_renderer_string libvlc_video_get_title_description libvlc_video_get_track libvlc_video_get_track_count @@ -253,6 +255,8 @@ libvlc_video_set_spu libvlc_video_set_spu_delay libvlc_video_set_subtitle_file libvlc_video_set_teletext +libvlc_video_set_text_renderer_int +libvlc_video_set_text_renderer_string libvlc_video_set_track libvlc_video_take_snapshot libvlc_vlm_add_broadcast diff --git a/lib/media_player.c b/lib/media_player.c index eabbbf6..880bbe0 100644 --- a/lib/media_player.c +++ b/lib/media_player.c @@ -628,6 +628,12 @@ libvlc_media_player_new( libvlc_instance_t *instance ) var_Create (mp, "saturation", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); var_Create (mp, "gamma", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); +#ifdef __APPLE__ + var_Create (mp, "quartztext-font", VLC_VAR_STRING | VLC_VAR_DOINHERIT); + var_Create (mp, "quartztext-fontsize", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); + var_Create (mp, "quartztext-color", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); +#endif + /* Audio */ var_Create (mp, "aout", VLC_VAR_STRING | VLC_VAR_DOINHERIT); var_Create (mp, "audio-device", VLC_VAR_STRING); diff --git a/lib/video.c b/lib/video.c index b2c9b34..588aa1d 100644 --- a/lib/video.c +++ b/lib/video.c @@ -910,3 +910,50 @@ float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, { return get_float( p_mi, "adjust", adjust_option_bynumber(option) ); } + + +static const opt_t * +textrenderer_option_bynumber( unsigned option ) +{ + static const opt_t optlist[] = + { + { "quartztext-font", VLC_VAR_STRING }, + { "quartztext-fontsize", VLC_VAR_INTEGER }, + { "quartztext-color", VLC_VAR_INTEGER }, + }; + enum { num_opts = sizeof(optlist) / sizeof(*optlist) }; + + const opt_t *r = option < num_opts ? optlist+option : NULL; + if( !r ) + libvlc_printerr( "Unknown quartztext option" ); + return r; +} + +/* basic text renderer support */ + +void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option, int value ) +{ + set_int( p_mi, "quartztext", textrenderer_option_bynumber(option), value ); +} + + +int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_int( p_mi, "quartztext", textrenderer_option_bynumber(option) ); +} + + +void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ) +{ + set_string( p_mi, "quartztext", textrenderer_option_bynumber(option), psz_value ); +} + + +char * libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_string( p_mi, "quartztext", textrenderer_option_bynumber(option) ); +} diff --git a/modules/text_renderer/quartztext.c b/modules/text_renderer/quartztext.c index 5e2cefe..ac0894e 100644 --- a/modules/text_renderer/quartztext.c +++ b/modules/text_renderer/quartztext.c @@ -67,6 +67,10 @@ static int Create (vlc_object_t *); static void Destroy(vlc_object_t *); +static int QuartztextCallback( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data ); + static int LoadFontsFromAttachments(filter_t *p_filter); static int RenderText(filter_t *, subpicture_region_t *, @@ -128,16 +132,20 @@ vlc_module_begin () false) add_string("quartztext-monofont", DEFAULT_MONOFONT, MONOSPACE_FONT_TEXT, FONT_LONGTEXT, false) - add_integer("quartztext-rel-fontsize", DEFAULT_REL_FONT_SIZE, FONTSIZER_TEXT, + change_safe() + add_integer("quartztext-fontsize", DEFAULT_REL_FONT_SIZE, FONTSIZER_TEXT, FONTSIZER_LONGTEXT, false) + change_safe() change_integer_list(pi_sizes, ppsz_sizes_text) add_integer("quartztext-color", 0x00FFFFFF, COLOR_TEXT, COLOR_LONGTEXT, false) + change_safe() change_integer_list(pi_color_values, ppsz_color_descriptions) add_bool("quartztext-outline", false, OUTLINE_TEXT, NULL, false) add_bool("quartztext-shadow", true, SHADOW_TEXT, NULL, false) set_capability("text renderer", 50) add_shortcut("text") + add_shortcut("quartztext") set_callbacks(Create, Destroy) vlc_module_end () @@ -179,6 +187,7 @@ struct offscreen_bitmap_t *****************************************************************************/ struct filter_sys_t { + vlc_mutex_t lock; text_style_t *p_default_style; #ifndef TARGET_OS_IPHONE @@ -208,11 +217,11 @@ static int Create(vlc_object_t *p_this) free(p_sys); return VLC_ENOMEM; } - p_sys->p_default_style->psz_fontname = var_CreateGetString(p_this, "quartztext-font");; + p_sys->p_default_style->psz_fontname = var_CreateGetStringCommand(p_this, "quartztext-font");; p_sys->p_default_style->psz_monofontname = var_CreateGetString(p_this, "quartztext-monofont"); p_sys->p_default_style->i_font_size = GetFontSize(p_filter); - p_sys->p_default_style->i_font_color = VLC_CLIP(var_CreateGetInteger(p_this, "quartztext-color") , 0, 0xFFFFFF); + p_sys->p_default_style->i_font_color = VLC_CLIP(var_CreateGetIntegerCommand(p_this, "quartztext-color") , 0, 0xFFFFFF); p_sys->p_default_style->i_features |= STYLE_HAS_FONT_COLOR; if( var_InheritBool(p_this, "quartztext-outline") ) @@ -244,6 +253,11 @@ static int Create(vlc_object_t *p_this) p_sys->i_fonts = 0; #endif + vlc_mutex_init( &p_sys->lock ); + var_AddCallback( p_filter, "quartztext-font", QuartztextCallback, p_sys ); + var_AddCallback( p_filter, "quartztext-fontsize", QuartztextCallback, p_sys ); + var_AddCallback( p_filter, "quartztext-color", QuartztextCallback, p_sys ); + LoadFontsFromAttachments(p_filter); return VLC_SUCCESS; @@ -258,6 +272,16 @@ 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, "quartztext-font", QuartztextCallback, p_sys ); + var_DelCallback( p_filter, "quartztext-fontsize", QuartztextCallback, p_sys ); + var_DelCallback( p_filter, "quartztext-color", QuartztextCallback, p_sys ); + vlc_mutex_destroy( &p_sys->lock ); + + var_Destroy( p_filter, "quartztext-font" ) ; + var_Destroy( p_filter, "quartztext-fontsize" ); + var_Destroy( p_filter, "quartztext-color" ); + #ifndef TARGET_OS_IPHONE if (p_sys->p_fonts) { for (int k = 0; k < p_sys->i_fonts; k++) @@ -635,12 +659,12 @@ static int GetFontSize(filter_t *p_filter) { int i_size = 0; - int i_ratio = var_CreateGetInteger( p_filter, "quartztext-rel-fontsize" ); + int i_ratio = var_CreateGetIntegerCommand( p_filter, "quartztext-fontsize" ); + if( i_ratio > 0 ) i_size = (int)p_filter->fmt_out.video.i_height / i_ratio; - if( i_size <= 0 ) - { + if( i_size <= 0 ) { msg_Warn( p_filter, "invalid fontsize, using 12" ); i_size = 12; } @@ -726,3 +750,23 @@ static int RenderYUVA(filter_t *p_filter, subpicture_region_t *p_region, return VLC_SUCCESS; } + +static int QuartztextCallback( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data ) +{ + VLC_UNUSED(oldval); + filter_t *p_filter = (filter_t *)p_this; + filter_sys_t *p_sys = (filter_sys_t *)p_data; + + vlc_mutex_lock( &p_sys->lock ); + if( !strcmp( psz_var, "quartztext-font" ) ) + p_sys->p_default_style->psz_fontname = newval.psz_string; + else if( !strcmp( psz_var, "quartztext-fontsize" ) ) + p_sys->p_default_style->i_font_size = (int)p_filter->fmt_out.video.i_height / newval.i_int; + else if( !strcmp( psz_var, "quartztext-color" ) ) + p_sys->p_default_style->i_font_color = VLC_CLIP(newval.i_int, 0, 0xFFFFFF); + vlc_mutex_unlock( &p_sys->lock ); + + return VLC_SUCCESS; +} -- 2.6.0