p_scale->p_module = module_Need( p_spu->p_scale, "video filter2", 0, 0 );
}
+//__MIN(i_scale_width_orig, i_scale_height_orig) );
+static void SpuRenderText( spu_t *p_spu, bool *pb_rerender_text,
+ subpicture_t *p_subpic, subpicture_region_t *p_region, int i_min_scale_ratio )
+{
+ assert( p_region->fmt.i_chroma == VLC_FOURCC('T','E','X','T') );
+
+ if( !p_spu->p_text || !p_spu->p_text->p_module )
+ goto exit;
+
+ /* Setup 3 variables which can be used to render
+ * time-dependent text (and effects). The first indicates
+ * the total amount of time the text will be on screen,
+ * the second the amount of time it has already been on
+ * screen (can be a negative value as text is layed out
+ * before it is rendered) and the third is a feedback
+ * variable from the renderer - if the renderer sets it
+ * then this particular text is time-dependent, eg. the
+ * visual progress bar inside the text in karaoke and the
+ * text needs to be rendered multiple times in order for
+ * the effect to work - we therefore need to return the
+ * region to its original state at the end of the loop,
+ * instead of leaving it in YUVA or YUVP.
+ * Any renderer which is unaware of how to render
+ * time-dependent text can happily ignore the variables
+ * and render the text the same as usual - it should at
+ * least show up on screen, but the effect won't change
+ * the text over time.
+ */
+
+ /* FIXME why these variables are recreated every time and not
+ * when text renderer module was created ? */
+ var_Create( p_spu->p_text, "spu-duration", VLC_VAR_TIME );
+ var_Create( p_spu->p_text, "spu-elapsed", VLC_VAR_TIME );
+ var_Create( p_spu->p_text, "text-rerender", VLC_VAR_BOOL );
+ var_Create( p_spu->p_text, "scale", VLC_VAR_INTEGER );
+
+ var_SetTime( p_spu->p_text, "spu-duration", p_subpic->i_stop - p_subpic->i_start );
+ var_SetTime( p_spu->p_text, "spu-elapsed", mdate() - p_subpic->i_start );
+ var_SetBool( p_spu->p_text, "text-rerender", false );
+ var_SetInteger( p_spu->p_text, "scale", i_min_scale_ratio );
+
+ if( p_spu->p_text->pf_render_html && p_region->psz_html )
+ {
+ p_spu->p_text->pf_render_html( p_spu->p_text,
+ p_region, p_region );
+ }
+ else if( p_spu->p_text->pf_render_text )
+ {
+ p_spu->p_text->pf_render_text( p_spu->p_text,
+ p_region, p_region );
+ }
+ *pb_rerender_text = var_GetBool( p_spu->p_text, "text-rerender" );
+
+ var_Destroy( p_spu->p_text, "spu-duration" );
+ var_Destroy( p_spu->p_text, "spu-elapsed" );
+ var_Destroy( p_spu->p_text, "text-rerender" );
+ var_Destroy( p_spu->p_text, "scale" );
+
+exit:
+ p_region->i_align |= SUBPICTURE_RENDERED;
+}
+
static void SpuRenderRegion( spu_t *p_spu,
picture_t *p_pic_dst, picture_t *p_pic_src,
subpicture_t *p_subpic, subpicture_region_t *p_region,
const int pi_scale_height[SCALE_SIZE],
const video_format_t *p_fmt )
{
- video_format_t orig_fmt = p_region->fmt;
- bool b_rerender_text = false;
- int i_fade_alpha = 255;
+ video_format_t orig_fmt;
+ bool b_rerender_text;
+ int i_fade_alpha;
int i_x_offset;
int i_y_offset;
int i_scale_idx;
int i_inv_scale_x;
int i_inv_scale_y;
+ orig_fmt = p_region->fmt;
+ b_rerender_text = false;
if( p_region->fmt.i_chroma == VLC_FOURCC('T','E','X','T') )
- {
- if( p_spu->p_text && p_spu->p_text->p_module )
- {
- vlc_value_t val;
-
- /* Setup 3 variables which can be used to render
- * time-dependent text (and effects). The first indicates
- * the total amount of time the text will be on screen,
- * the second the amount of time it has already been on
- * screen (can be a negative value as text is layed out
- * before it is rendered) and the third is a feedback
- * variable from the renderer - if the renderer sets it
- * then this particular text is time-dependent, eg. the
- * visual progress bar inside the text in karaoke and the
- * text needs to be rendered multiple times in order for
- * the effect to work - we therefore need to return the
- * region to its original state at the end of the loop,
- * instead of leaving it in YUVA or YUVP.
- * Any renderer which is unaware of how to render
- * time-dependent text can happily ignore the variables
- * and render the text the same as usual - it should at
- * least show up on screen, but the effect won't change
- * the text over time.
- */
-
- var_Create( p_spu->p_text, "spu-duration", VLC_VAR_TIME );
- var_SetTime( p_spu->p_text, "spu-duration", p_subpic->i_stop - p_subpic->i_start );
-
- var_Create( p_spu->p_text, "spu-elapsed", VLC_VAR_TIME );
- var_SetTime( p_spu->p_text, "spu-elapsed", mdate() - p_subpic->i_start );
-
- var_Create( p_spu->p_text, "text-rerender", VLC_VAR_BOOL );
- var_SetBool( p_spu->p_text, "text-rerender", false );
-
- var_Create( p_spu->p_text, "scale", VLC_VAR_INTEGER );
- var_SetInteger( p_spu->p_text, "scale",
- __MIN(i_scale_width_orig, i_scale_height_orig) );
-
- if( p_spu->p_text->pf_render_html && p_region->psz_html )
- {
- p_spu->p_text->pf_render_html( p_spu->p_text,
- p_region, p_region );
- }
- else if( p_spu->p_text->pf_render_text )
- {
- p_spu->p_text->pf_render_text( p_spu->p_text,
- p_region, p_region );
- }
- b_rerender_text = var_GetBool( p_spu->p_text, "text-rerender" );
-
- var_Destroy( p_spu->p_text, "spu-duration" );
- var_Destroy( p_spu->p_text, "spu-elapsed" );
- var_Destroy( p_spu->p_text, "text-rerender" );
- var_Destroy( p_spu->p_text, "scale" );
- }
- p_region->i_align |= SUBPICTURE_RENDERED;
- }
+ SpuRenderText( p_spu, &b_rerender_text, p_subpic, p_region, __MIN(i_scale_width_orig, i_scale_height_orig) );
/* From now on, we can only process non text data */
if( p_region->fmt.i_chroma == VLC_FOURCC('T','E','X','T') )
/* Force palette if requested */
if( p_spu->b_force_palette &&
- ( VLC_FOURCC('Y','U','V','P') == p_region->fmt.i_chroma ) )
+ p_region->fmt.i_chroma == VLC_FOURCC('Y','U','V','P') )
{
- /* It look so wrong I won't comment
+ /* It looks so wrong I won't comment
* p_palette->palette is [256][4] with a int i_entries
* p_spu->palette is [4][4]
* */
{
p_subpic->pf_destroy_region( VLC_OBJECT(p_spu),
p_region->p_cache );
- p_region->p_cache = 0;
+ p_region->p_cache = NULL;
}
}
- if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) ||
- ( pi_scale_height[ i_scale_idx ] != 1000 ) ) &&
- ( ( pi_scale_width[ i_scale_idx ] > 0 ) ||
- ( pi_scale_height[ i_scale_idx ] > 0 ) ) &&
- p_spu->p_scale && !p_region->p_cache )
+ if( p_spu->p_scale &&
+ ( ( pi_scale_width[i_scale_idx] > 0 && pi_scale_width[i_scale_idx] != 1000 ) ||
+ ( pi_scale_height[i_scale_idx] > 0 && pi_scale_height[i_scale_idx] != 1000 ) ) )
{
- picture_t *p_pic;
-
- p_spu->p_scale->fmt_in.video = p_region->fmt;
- p_spu->p_scale->fmt_out.video = p_region->fmt;
-
- p_region->p_cache =
- p_subpic->pf_create_region( VLC_OBJECT(p_spu),
- &p_spu->p_scale->fmt_out.video );
- if( p_spu->p_scale->fmt_out.video.p_palette )
- *p_spu->p_scale->fmt_out.video.p_palette =
- *p_region->fmt.p_palette;
- p_region->p_cache->p_next = p_region->p_next;
-
- vout_CopyPicture( p_spu, &p_region->p_cache->picture,
- &p_region->picture );
-
- p_spu->p_scale->fmt_out.video.i_width =
- p_region->fmt.i_width * pi_scale_width[ i_scale_idx ] / 1000;
- p_spu->p_scale->fmt_out.video.i_visible_width =
- p_region->fmt.i_visible_width * pi_scale_width[ i_scale_idx ] / 1000;
- p_spu->p_scale->fmt_out.video.i_height =
- p_region->fmt.i_height * pi_scale_height[ i_scale_idx ] / 1000;
- p_spu->p_scale->fmt_out.video.i_visible_height =
- p_region->fmt.i_visible_height * pi_scale_height[ i_scale_idx ] / 1000;
- p_region->p_cache->fmt = p_spu->p_scale->fmt_out.video;
- p_region->p_cache->i_x = p_region->i_x * pi_scale_width[ i_scale_idx ] / 1000;
- p_region->p_cache->i_y = p_region->i_y * pi_scale_height[ i_scale_idx ] / 1000;
- p_region->p_cache->i_align = p_region->i_align;
- p_region->p_cache->i_alpha = p_region->i_alpha;
-
- p_pic = p_spu->p_scale->pf_video_filter(
- p_spu->p_scale, &p_region->p_cache->picture );
- if( p_pic )
+ if( !p_region->p_cache )
{
- picture_t p_pic_tmp = p_region->p_cache->picture;
- p_region->p_cache->picture = *p_pic;
- *p_pic = p_pic_tmp;
- free( p_pic );
+ picture_t *p_pic;
+
+ p_spu->p_scale->fmt_in.video = p_region->fmt;
+ p_spu->p_scale->fmt_out.video = p_region->fmt;
+
+ p_region->p_cache =
+ p_subpic->pf_create_region( VLC_OBJECT(p_spu),
+ &p_spu->p_scale->fmt_out.video );
+ if( p_spu->p_scale->fmt_out.video.p_palette )
+ *p_spu->p_scale->fmt_out.video.p_palette =
+ *p_region->fmt.p_palette;
+ p_region->p_cache->p_next = p_region->p_next;
+
+ vout_CopyPicture( p_spu, &p_region->p_cache->picture,
+ &p_region->picture );
+
+ p_spu->p_scale->fmt_out.video.i_width =
+ p_region->fmt.i_width * pi_scale_width[ i_scale_idx ] / 1000;
+ p_spu->p_scale->fmt_out.video.i_visible_width =
+ p_region->fmt.i_visible_width * pi_scale_width[ i_scale_idx ] / 1000;
+ p_spu->p_scale->fmt_out.video.i_height =
+ p_region->fmt.i_height * pi_scale_height[ i_scale_idx ] / 1000;
+ p_spu->p_scale->fmt_out.video.i_visible_height =
+ p_region->fmt.i_visible_height * pi_scale_height[ i_scale_idx ] / 1000;
+ p_region->p_cache->fmt = p_spu->p_scale->fmt_out.video;
+ p_region->p_cache->i_x = p_region->i_x * pi_scale_width[ i_scale_idx ] / 1000;
+ p_region->p_cache->i_y = p_region->i_y * pi_scale_height[ i_scale_idx ] / 1000;
+ p_region->p_cache->i_align = p_region->i_align;
+ p_region->p_cache->i_alpha = p_region->i_alpha;
+
+ p_pic = p_spu->p_scale->pf_video_filter(
+ p_spu->p_scale, &p_region->p_cache->picture );
+ if( p_pic )
+ {
+ picture_t p_pic_tmp = p_region->p_cache->picture;
+ p_region->p_cache->picture = *p_pic;
+ *p_pic = p_pic_tmp;
+ free( p_pic );
+ }
}
- }
- if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) ||
- ( pi_scale_height[ i_scale_idx ] != 1000 ) ) &&
- ( ( pi_scale_width[ i_scale_idx ] > 0 ) ||
- ( pi_scale_height[ i_scale_idx ] > 0 ) ) &&
- p_spu->p_scale && p_region->p_cache )
- {
- p_region = p_region->p_cache;
+ if( p_region->p_cache )
+ p_region = p_region->p_cache;
}
if( p_region->i_align & SUBPICTURE_ALIGN_BOTTOM )
i_x_offset = __MAX( i_x_offset, 0 );
i_y_offset = __MAX( i_y_offset, 0 );
- if( ( p_spu->i_margin != 0 ) &&
- ( p_spu->b_force_crop == false ) )
+ if( p_spu->i_margin != 0 && !p_spu->b_force_crop )
{
int i_diff = 0;
int i_low = (i_y_offset - p_spu->i_margin) * i_inv_scale_y / 1000;
i_y_offset -= ( p_spu->i_margin * i_inv_scale_y / 1000 + i_diff );
}
+ i_fade_alpha = 255;
if( p_subpic->b_fade )
{
mtime_t i_fade_start = ( p_subpic->i_stop +
/* Update the output picture size */
p_spu->p_blend->fmt_out.video.i_width =
- p_spu->p_blend->fmt_out.video.i_visible_width =
- p_fmt->i_width;
+ p_spu->p_blend->fmt_out.video.i_visible_width = p_fmt->i_width;
p_spu->p_blend->fmt_out.video.i_height =
- p_spu->p_blend->fmt_out.video.i_visible_height =
- p_fmt->i_height;
+ p_spu->p_blend->fmt_out.video.i_visible_height = p_fmt->i_height;
if( p_spu->p_blend->p_module )
{
p_fmt->i_height;
}
}
+
+ /* */
+ pi_scale_width[SCALE_TEXT] = p_fmt->i_width * 1000 /
+ p_spu->p_text->fmt_out.video.i_width;
+ pi_scale_height[SCALE_TEXT]= p_fmt->i_height * 1000 /
+ p_spu->p_text->fmt_out.video.i_height;
}
pi_scale_width[ SCALE_DEFAULT ] = i_scale_width_orig;
pi_scale_height[ SCALE_DEFAULT ] = i_scale_height_orig;
- if( p_spu->p_text )
- {
- pi_scale_width[ SCALE_TEXT ] = ( p_fmt->i_width * 1000 ) /
- p_spu->p_text->fmt_out.video.i_width;
- pi_scale_height[ SCALE_TEXT ] = ( p_fmt->i_height * 1000 ) /
- p_spu->p_text->fmt_out.video.i_height;
- }
/* If we have an explicit size plane to render to, then turn off
* the fontsize rescaling.
*/