[vlc-devel] [PATCH 2/3] video_output: allow the display to scale the SPU
Steve Lhomme
robux4 at ycbcr.xyz
Fri Nov 23 09:42:13 CET 2018
Don't do it for text based subpictures so they are rendered at the proper
resolution.
---
include/vlc_spu.h | 5 ++++-
include/vlc_vout_display.h | 1 +
modules/stream_out/transcode/video.c | 2 +-
src/video_output/video_output.c | 3 ++-
src/video_output/vout_subpictures.c | 30 ++++++++++++++++++++++++----
5 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/include/vlc_spu.h b/include/vlc_spu.h
index 127d586ac0..7eb3cafc2d 100644
--- a/include/vlc_spu.h
+++ b/include/vlc_spu.h
@@ -73,7 +73,10 @@ VLC_API void spu_PutSubpicture( spu_t *, subpicture_t * );
*
* The returned value if non NULL must be released by subpicture_Delete().
*/
-VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list, const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src, vlc_tick_t render_subtitle_date, vlc_tick_t render_osd_date, bool ignore_osd );
+VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list,
+ const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src,
+ vlc_tick_t render_subtitle_date, vlc_tick_t render_osd_date,
+ bool ignore_osd, bool external_scale );
/**
* It registers a new SPU channel.
diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index 09f257790c..c6d1972ffb 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -112,6 +112,7 @@ typedef struct {
bool is_slow; /* The picture memory has slow read/write */
bool has_double_click; /* Is double-click generated */
bool has_pictures_invalid; /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */
+ bool can_scale_spu; /* Handles subpictures with a non default zoom factor */
const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */
} vout_display_info_t;
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index a209482123..bdb4f8fe32 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -406,7 +406,7 @@ static picture_t * RenderSubpictures( sout_stream_t *p_stream, sout_stream_id_sy
subpicture_t *p_subpic = spu_Render( id->p_spu, NULL, &fmt,
&outfmt,
- p_pic->date, p_pic->date, false );
+ p_pic->date, p_pic->date, false, false );
/* Overlay subpicture */
if( p_subpic )
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index cc95c4d874..0925eb5de1 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1115,7 +1115,8 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
subpicture_chromas, &fmt_spu_rot,
&vd->source,
render_subtitle_date, render_osd_date,
- do_snapshot);
+ do_snapshot,
+ vd->info.can_scale_spu);
/*
* Perform rendering
*
diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 6df7669943..74cefe604d 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -1010,7 +1010,8 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
const video_format_t *fmt_dst,
const video_format_t *fmt_src,
vlc_tick_t render_subtitle_date,
- vlc_tick_t render_osd_date)
+ vlc_tick_t render_osd_date,
+ bool external_scale)
{
spu_private_t *sys = spu->p;
@@ -1114,14 +1115,33 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
if (scale.w <= 0 || scale.h <= 0)
continue;
+ const bool do_external_scale = external_scale && region->fmt.i_chroma != VLC_CODEC_TEXT;
+ spu_scale_t virtual_scale = external_scale ? (spu_scale_t){ SCALE_UNIT, SCALE_UNIT } : scale;
+
/* */
SpuRenderRegion(spu, output_last_ptr, &area,
- subpic, region, scale,
+ subpic, region, virtual_scale,
chroma_list, fmt_dst,
subtitle_area, subtitle_area_count,
subpic->b_subtitle ? render_subtitle_date : render_osd_date);
if (*output_last_ptr)
+ {
+ if (do_external_scale)
+ {
+ if (scale.h != SCALE_UNIT)
+ {
+ (*output_last_ptr)->zoom_h.num = scale.h;
+ (*output_last_ptr)->zoom_h.den = SCALE_UNIT;
+ }
+ if (scale.w != SCALE_UNIT)
+ {
+ (*output_last_ptr)->zoom_v.num = scale.w;
+ (*output_last_ptr)->zoom_v.den = SCALE_UNIT;
+ }
+ }
+
output_last_ptr = &(*output_last_ptr)->p_next;
+ }
if (subpic->b_subtitle) {
area = spu_area_unscaled(area, scale);
@@ -1512,7 +1532,8 @@ subpicture_t *spu_Render(spu_t *spu,
const video_format_t *fmt_src,
vlc_tick_t render_subtitle_date,
vlc_tick_t render_osd_date,
- bool ignore_osd)
+ bool ignore_osd,
+ bool external_scale)
{
spu_private_t *sys = spu->p;
@@ -1596,7 +1617,8 @@ subpicture_t *spu_Render(spu_t *spu,
fmt_dst,
fmt_src,
render_subtitle_date,
- render_osd_date);
+ render_osd_date,
+ external_scale);
vlc_mutex_unlock(&sys->lock);
return render;
--
2.17.1
More information about the vlc-devel
mailing list