#include <vlc_plugin.h>
#include <vlc_input.h>
#include <vlc_codec.h>
-#include <vlc_osd.h>
#include "../demux/xiph.h"
#include <kate/kate.h>
* Tiger properties
*/
tiger_renderer *p_tr;
- mtime_t last_render_ts;
bool b_dirty;
uint32_t i_tiger_default_font_color;
bool b_use_tiger;
};
-struct subpicture_sys_t
+struct subpicture_updater_sys_t
{
decoder_sys_t *p_dec_sys;
mtime_t i_start;
set_subcategory( SUBCAT_INPUT_SCODEC )
add_shortcut( "kate" )
- add_bool( "kate-formatted", true, NULL, FORMAT_TEXT, FORMAT_LONGTEXT,
+ add_bool( "kate-formatted", true, FORMAT_TEXT, FORMAT_LONGTEXT,
true )
#ifdef HAVE_TIGER
- add_bool( "kate-use-tiger", true, NULL, TIGER_TEXT, TIGER_LONGTEXT,
+ add_bool( "kate-use-tiger", true, TIGER_TEXT, TIGER_LONGTEXT,
true )
add_float_with_range( "kate-tiger-quality",
- TIGER_QUALITY_DEFAULT, 0.0f, 1.0f, TigerConfigurationCallback,
+ TIGER_QUALITY_DEFAULT, 0.0f, 1.0f,
TIGER_QUALITY_TEXT, TIGER_QUALITY_LONGTEXT,
true )
set_section( N_("Tiger rendering defaults"), NULL );
- add_string( "kate-tiger-default-font-desc",
- TIGER_DEFAULT_FONT_DESC_DEFAULT, TigerConfigurationCallback,
+ add_string( "kate-tiger-default-font-desc", TIGER_DEFAULT_FONT_DESC_DEFAULT,
TIGER_DEFAULT_FONT_DESC_TEXT, TIGER_DEFAULT_FONT_DESC_LONGTEXT, true);
add_integer_with_range( "kate-tiger-default-font-effect",
TIGER_DEFAULT_FONT_EFFECT_DEFAULT,
- 0, sizeof(pi_font_effects)/sizeof(pi_font_effects[0])-1, TigerConfigurationCallback,
+ 0, sizeof(pi_font_effects)/sizeof(pi_font_effects[0])-1,
TIGER_DEFAULT_FONT_EFFECT_TEXT, TIGER_DEFAULT_FONT_EFFECT_LONGTEXT,
true )
- change_integer_list( pi_font_effects, ppsz_font_effect_names, NULL );
+ change_integer_list( pi_font_effects, ppsz_font_effect_names );
add_float_with_range( "kate-tiger-default-font-effect-strength",
- TIGER_DEFAULT_FONT_EFFECT_STRENGTH_DEFAULT, 0.0f, 1.0f, TigerConfigurationCallback,
+ TIGER_DEFAULT_FONT_EFFECT_STRENGTH_DEFAULT, 0.0f, 1.0f,
TIGER_DEFAULT_FONT_EFFECT_STRENGTH_TEXT, TIGER_DEFAULT_FONT_EFFECT_STRENGTH_LONGTEXT,
true )
add_integer_with_range( "kate-tiger-default-font-color",
- TIGER_DEFAULT_FONT_COLOR_DEFAULT, 0, 0x00ffffff, TigerConfigurationCallback,
+ TIGER_DEFAULT_FONT_COLOR_DEFAULT, 0, 0x00ffffff,
TIGER_DEFAULT_FONT_COLOR_TEXT, TIGER_DEFAULT_FONT_COLOR_LONGTEXT,
true);
- change_integer_list( pi_color_values, ppsz_color_descriptions, NULL );
+ change_integer_list( pi_color_values, ppsz_color_descriptions );
add_integer_with_range( "kate-tiger-default-font-alpha",
- TIGER_DEFAULT_FONT_ALPHA_DEFAULT, 0, 255, TigerConfigurationCallback,
+ TIGER_DEFAULT_FONT_ALPHA_DEFAULT, 0, 255,
TIGER_DEFAULT_FONT_ALPHA_TEXT, TIGER_DEFAULT_FONT_ALPHA_LONGTEXT,
true);
add_integer_with_range( "kate-tiger-default-background-color",
- TIGER_DEFAULT_BACKGROUND_COLOR_DEFAULT, 0, 0x00ffffff, TigerConfigurationCallback,
+ TIGER_DEFAULT_BACKGROUND_COLOR_DEFAULT, 0, 0x00ffffff,
TIGER_DEFAULT_BACKGROUND_COLOR_TEXT, TIGER_DEFAULT_BACKGROUND_COLOR_LONGTEXT,
true);
- change_integer_list( pi_color_values, ppsz_color_descriptions, NULL );
+ change_integer_list( pi_color_values, ppsz_color_descriptions );
add_integer_with_range( "kate-tiger-default-background-alpha",
- TIGER_DEFAULT_BACKGROUND_ALPHA_DEFAULT, 0, 255, TigerConfigurationCallback,
+ TIGER_DEFAULT_BACKGROUND_ALPHA_DEFAULT, 0, 255,
TIGER_DEFAULT_BACKGROUND_ALPHA_TEXT, TIGER_DEFAULT_BACKGROUND_ALPHA_LONGTEXT,
true);
#endif
p_sys->b_use_tiger = var_CreateGetBool( p_dec, "kate-use-tiger" );
p_sys->p_tr = NULL;
- p_sys->last_render_ts = 0;
/* get initial value of configuration */
p_sys->i_tiger_default_font_color = GetTigerColor( p_dec, "kate-tiger-default-font" );
p_sys->p_tr = NULL;
p_sys->b_use_tiger = false;
}
-
- CHECK_TIGER_RET( tiger_renderer_set_surface_clear_color( p_sys->p_tr, 1, 0, 0, 0, 0 ) );
-
- UpdateTigerFontEffect( p_dec );
- UpdateTigerFontColor( p_dec );
- UpdateTigerBackgroundColor( p_dec );
- UpdateTigerQuality( p_dec );
- UpdateTigerFontDesc( p_dec );
+ else {
+ CHECK_TIGER_RET( tiger_renderer_set_surface_clear_color( p_sys->p_tr, 1, 0, 0, 0, 0 ) );
+
+ UpdateTigerFontEffect( p_dec );
+ UpdateTigerFontColor( p_dec );
+ UpdateTigerBackgroundColor( p_dec );
+ UpdateTigerQuality( p_dec );
+ UpdateTigerFontDesc( p_dec );
+ }
}
#else
{
/* searching for vout to get its size is frowned upon, so we don't and
use a default size if the original canvas size is not specified. */
-#if 1
decoder_sys_t *p_sys = p_dec->p_sys;
if( p_sys->ki.original_canvas_width > 0 && p_sys->ki.original_canvas_height > 0 )
{
/* nothing, leave defaults */
msg_Dbg( p_dec, "original canvas size unknown");
}
-#else
- /* keep this just in case it might be allowed one day ;) */
- vout_thread_t *p_vout;
- p_vout = vlc_object_find( (vlc_object_t*)p_dec, VLC_OBJECT_VOUT, FIND_CHILD );
- if( p_vout )
- {
- decoder_sys_t *p_sys = p_dec->p_sys;
- if( p_sys->ki.original_canvas_width > 0 && p_sys->ki.original_canvas_height > 0 )
- {
- *w = p_sys->ki.original_canvas_width;
- *h = p_sys->ki.original_canvas_height;
- }
- else
- {
- *w = p_vout->fmt_in.i_width;
- *h = p_vout->fmt_in.i_height;
- }
- msg_Dbg( p_dec, "video: in %d %d, out %d %d, original canvas %zu %zu",
- p_vout->fmt_in.i_width, p_vout->fmt_in.i_height,
- p_vout->fmt_out.i_width, p_vout->fmt_out.i_height,
- p_sys->ki.original_canvas_width, p_sys->ki.original_canvas_height );
- vlc_object_release( p_vout );
- }
-#endif
}
static void CreateKateBitmap( picture_t *pic, const kate_bitmap *bitmap )
static void TigerDestroySubpicture( subpicture_t *p_subpic )
{
- DecSysRelease( p_subpic->p_sys->p_dec_sys );
-}
-
-static void SubpictureReleaseRegions( subpicture_t *p_subpic )
-{
- if( p_subpic->p_region)
- {
- subpicture_region_ChainDelete( p_subpic->p_region );
- p_subpic->p_region = NULL;
- }
+ DecSysRelease( p_subpic->updater.p_sys->p_dec_sys );
+ free( p_subpic->updater.p_sys );
}
-
/*
* We get premultiplied alpha, but VLC doesn't expect this, so we demultiply
* alpha to avoid double multiply (and thus thinner text than we should)).
PROFILE_STOP( tiger_renderer_postprocess );
}
-/* Tiger renders can end up looking a bit crap since they get overlaid on top of
- a subsampled YUV image, so there can be a fair amount of chroma bleeding.
- Looks good with white though since it's all luma. Hopefully that will be the
- common case. */
-static void TigerUpdateRegions( spu_t *p_spu, subpicture_t *p_subpic, const video_format_t *p_fmt, mtime_t ts )
+static int TigerValidateSubpicture( subpicture_t *p_subpic,
+ bool b_fmt_src, const video_format_t *p_fmt_src,
+ bool b_fmt_dst, const video_format_t *p_fmt_dst,
+ mtime_t ts )
{
- decoder_sys_t *p_sys = p_subpic->p_sys->p_dec_sys;
- subpicture_region_t *p_r;
- video_format_t fmt;
- plane_t *p_plane;
- kate_float t;
- int i_ret;
-
- VLC_UNUSED( p_spu );
-
- PROFILE_START( TigerUpdateRegions );
+ decoder_sys_t *p_sys = p_subpic->updater.p_sys->p_dec_sys;
- /* do not render more than once per frame, libtiger renders all events at once */
- if (ts <= p_sys->last_render_ts)
- {
- SubpictureReleaseRegions( p_subpic );
- return;
- }
+ if( b_fmt_src || b_fmt_dst )
+ return VLC_EGENERIC;
- /* remember what frame we've rendered already */
- p_sys->last_render_ts = ts;
+ PROFILE_START( TigerValidateSubpicture );
/* time in seconds from the start of the stream */
- t = (p_subpic->p_sys->i_start + ts - p_subpic->i_start ) / 1000000.0f;
+ kate_float t = (p_subpic->updater.p_sys->i_start + ts - p_subpic->i_start ) / 1000000.0f;
/* it is likely that the current region (if any) can be kept as is; test for this */
vlc_mutex_lock( &p_sys->lock );
- if( p_subpic->p_region && !p_sys->b_dirty && !tiger_renderer_is_dirty( p_sys->p_tr ))
+ int i_ret;
+ if( p_sys->b_dirty || tiger_renderer_is_dirty( p_sys->p_tr ) )
{
- PROFILE_START( tiger_renderer_update1 );
- i_ret = tiger_renderer_update( p_sys->p_tr, t, 1 );
- PROFILE_STOP( tiger_renderer_update1 );
- if( i_ret < 0 )
- {
- SubpictureReleaseRegions( p_subpic );
- vlc_mutex_unlock( &p_sys->lock );
- return;
- }
-
- if( !tiger_renderer_is_dirty( p_sys->p_tr ) )
- {
- /* we can keep the current region list */
- PROFILE_STOP( TigerUpdateRegions );
- vlc_mutex_unlock( &p_sys->lock );
- return;
- }
+ i_ret = VLC_EGENERIC;
+ goto exit;
+ }
+ if( tiger_renderer_update( p_sys->p_tr, t, 1 ) >= 0 &&
+ tiger_renderer_is_dirty( p_sys->p_tr ) )
+ {
+ i_ret = VLC_EGENERIC;
+ goto exit;
}
+
+ i_ret = VLC_SUCCESS;
+exit:
vlc_mutex_unlock( &p_sys->lock );
+ PROFILE_STOP( TigerValidateSubpicture );
+ return i_ret;
+}
- /* we have to render again, reset current region list */
- SubpictureReleaseRegions( p_subpic );
+/* Tiger renders can end up looking a bit crap since they get overlaid on top of
+ a subsampled YUV image, so there can be a fair amount of chroma bleeding.
+ Looks good with white though since it's all luma. Hopefully that will be the
+ common case. */
+static void TigerUpdateSubpicture( subpicture_t *p_subpic,
+ const video_format_t *p_fmt_src,
+ const video_format_t *p_fmt_dst,
+ mtime_t ts )
+{
+ decoder_sys_t *p_sys = p_subpic->updater.p_sys->p_dec_sys;
+ plane_t *p_plane;
+ kate_float t;
+ int i_ret;
+
+
+ /* time in seconds from the start of the stream */
+ t = (p_subpic->updater.p_sys->i_start + ts - p_subpic->i_start ) / 1000000.0f;
+
+ PROFILE_START( TigerUpdateSubpicture );
/* create a full frame region - this will also tell Tiger the size of the frame */
- fmt = *p_fmt;
- fmt.i_chroma = VLC_CODEC_RGBA;
- fmt.i_width = fmt.i_visible_width;
- fmt.i_height = fmt.i_visible_height;
+ video_format_t fmt = *p_fmt_dst;
+ fmt.i_chroma = VLC_CODEC_RGBA;
fmt.i_bits_per_pixel = 0;
- fmt.i_x_offset = fmt.i_y_offset = 0;
+ fmt.i_width =
+ fmt.i_visible_width = p_fmt_src->i_width;
+ fmt.i_height =
+ fmt.i_visible_height = p_fmt_src->i_height;
+ fmt.i_x_offset = fmt.i_y_offset = 0;
- p_r = subpicture_region_New( &fmt );
+ subpicture_region_t *p_r = subpicture_region_New( &fmt );
if( !p_r )
- {
return;
- }
p_r->i_x = 0;
p_r->i_y = 0;
p_subpic->p_region = p_r;
p_sys->b_dirty = false;
- PROFILE_STOP( TigerUpdateRegions );
+ PROFILE_STOP( TigerUpdateSubpicture );
vlc_mutex_unlock( &p_sys->lock );
/* we have an event */
/* Get a new spu */
- p_spu = decoder_NewSubpicture( p_dec );
+ subpicture_updater_sys_t *p_spu_sys = NULL;
+ if( p_sys->b_use_tiger)
+ {
+ p_spu_sys = malloc( sizeof(*p_spu_sys) );
+ if( !p_spu_sys )
+ return NULL;
+ }
+ subpicture_updater_t updater = {
+#ifdef HAVE_TIGER
+ .pf_validate = TigerValidateSubpicture,
+ .pf_update = TigerUpdateSubpicture,
+ .pf_destroy = TigerDestroySubpicture,
+#endif
+ .p_sys = p_spu_sys,
+ };
+ p_spu = decoder_NewSubpicture( p_dec, p_sys->b_use_tiger ? &updater : NULL );
if( !p_spu )
{
+ free( p_spu_sys );
/* this will happen for lyrics as there is no vout - so no error */
/* msg_Err( p_dec, "Failed to allocate spu buffer" ); */
return NULL;
#ifdef HAVE_TIGER
if( p_sys->b_use_tiger)
{
- /* setup the structure to get our decoder struct back */
- p_spu->p_sys = malloc( sizeof( subpicture_sys_t ));
- if( !p_spu->p_sys )
- {
- decoder_DeleteSubpicture( p_dec, p_spu );
- return NULL;
- }
- p_spu->p_sys->p_dec_sys = p_sys;
- p_spu->p_sys->i_start = p_block->i_pts;
+ p_spu_sys->p_dec_sys = p_sys;
+ p_spu_sys->i_start = p_block->i_pts;
DecSysHold( p_sys );
p_spu->i_stop = __MAX( p_sys->i_max_stop, p_spu->i_stop );
vlc_mutex_lock( &p_sys->lock );
CHECK_TIGER_RET( tiger_renderer_add_event( p_sys->p_tr, ev->ki, ev ) );
vlc_mutex_unlock( &p_sys->lock );
-
- /* hookup render/update routines */
- p_spu->pf_update_regions = TigerUpdateRegions;
- p_spu->pf_destroy = TigerDestroySubpicture;
}
else
#endif