Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
623941a7
Commit
623941a7
authored
Dec 12, 2010
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extended spu_Render to accept a list of supported chroma for blending.
parent
3a87c7d0
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
46 additions
and
11 deletions
+46
-11
include/vlc_spu.h
include/vlc_spu.h
+2
-1
modules/stream_out/transcode/osd.c
modules/stream_out/transcode/osd.c
+1
-1
modules/stream_out/transcode/video.c
modules/stream_out/transcode/video.c
+1
-1
src/video_output/video_output.c
src/video_output/video_output.c
+1
-1
src/video_output/vout_subpictures.c
src/video_output/vout_subpictures.c
+41
-7
No files found.
include/vlc_spu.h
View file @
623941a7
...
@@ -74,12 +74,13 @@ VLC_EXPORT( void, spu_PutSubpicture, ( spu_t *, subpicture_t * ) );
...
@@ -74,12 +74,13 @@ VLC_EXPORT( void, spu_PutSubpicture, ( spu_t *, subpicture_t * ) );
* This function will return an unique subpicture containing the OSD and
* This function will return an unique subpicture containing the OSD and
* subtitles visibles at the requested date.
* subtitles visibles at the requested date.
*
*
* \param p_chroma_list is a list of supported chroma for the output (can be NULL)
* \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered.
* \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered.
* \param p_fmt_src is the format of the original(source) video.
* \param p_fmt_src is the format of the original(source) video.
*
*
* The returned value if non NULL must be released by subpicture_Delete().
* The returned value if non NULL must be released by subpicture_Delete().
*/
*/
VLC_EXPORT
(
subpicture_t
*
,
spu_Render
,
(
spu_t
*
,
const
video_format_t
*
p_fmt_dst
,
const
video_format_t
*
p_fmt_src
,
mtime_t
render_subtitle_date
,
mtime_t
render_osd_date
,
bool
b_subtitle_only
)
);
VLC_EXPORT
(
subpicture_t
*
,
spu_Render
,
(
spu_t
*
,
const
v
lc_fourcc_t
*
p_chroma_list
,
const
v
ideo_format_t
*
p_fmt_dst
,
const
video_format_t
*
p_fmt_src
,
mtime_t
render_subtitle_date
,
mtime_t
render_osd_date
,
bool
b_subtitle_only
)
);
/**
/**
* It registers a new SPU channel.
* It registers a new SPU channel.
...
...
modules/stream_out/transcode/osd.c
View file @
623941a7
...
@@ -122,7 +122,7 @@ int transcode_osd_process( sout_stream_t *p_stream, sout_stream_id_t *id,
...
@@ -122,7 +122,7 @@ int transcode_osd_process( sout_stream_t *p_stream, sout_stream_id_t *id,
video_format_t
fmt
;
video_format_t
fmt
;
video_format_Init
(
&
fmt
,
0
);
video_format_Init
(
&
fmt
,
0
);
video_format_Setup
(
&
fmt
,
0
,
720
,
576
,
1
,
1
);
video_format_Setup
(
&
fmt
,
0
,
720
,
576
,
1
,
1
);
p_subpic
=
spu_Render
(
p_sys
->
p_spu
,
&
fmt
,
&
fmt
,
in
->
i_dts
,
in
->
i_dts
,
false
);
p_subpic
=
spu_Render
(
p_sys
->
p_spu
,
NULL
,
&
fmt
,
&
fmt
,
in
->
i_dts
,
in
->
i_dts
,
false
);
}
}
else
else
{
{
...
...
modules/stream_out/transcode/video.c
View file @
623941a7
...
@@ -712,7 +712,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id,
...
@@ -712,7 +712,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id,
else
else
fmt
=
id
->
p_decoder
->
fmt_out
.
video
;
fmt
=
id
->
p_decoder
->
fmt_out
.
video
;
subpicture_t
*
p_subpic
=
spu_Render
(
p_sys
->
p_spu
,
&
fmt
,
&
fmt
,
subpicture_t
*
p_subpic
=
spu_Render
(
p_sys
->
p_spu
,
NULL
,
&
fmt
,
&
fmt
,
p_pic
->
date
,
p_pic
->
date
,
false
);
p_pic
->
date
,
p_pic
->
date
,
false
);
/* Overlay subpicture */
/* Overlay subpicture */
...
...
src/video_output/video_output.c
View file @
623941a7
...
@@ -900,7 +900,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
...
@@ -900,7 +900,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
render_subtitle_date
=
filtered
->
date
>
1
?
filtered
->
date
:
mdate
();
render_subtitle_date
=
filtered
->
date
>
1
?
filtered
->
date
:
mdate
();
mtime_t
render_osd_date
=
mdate
();
/* FIXME wrong */
mtime_t
render_osd_date
=
mdate
();
/* FIXME wrong */
subpicture_t
*
subpic
=
spu_Render
(
vout
->
p
->
spu
,
&
vd
->
source
,
&
vd
->
source
,
subpicture_t
*
subpic
=
spu_Render
(
vout
->
p
->
spu
,
NULL
,
&
vd
->
source
,
&
vd
->
source
,
render_subtitle_date
,
render_osd_date
,
render_subtitle_date
,
render_osd_date
,
do_snapshot
);
do_snapshot
);
...
...
src/video_output/vout_subpictures.c
View file @
623941a7
...
@@ -289,7 +289,7 @@ static void SpuRenderCreateAndLoadScale( spu_t *p_spu )
...
@@ -289,7 +289,7 @@ static void SpuRenderCreateAndLoadScale( spu_t *p_spu )
/* XXX p_spu->p_scale is used for all conversion/scaling except yuvp to
/* XXX p_spu->p_scale is used for all conversion/scaling except yuvp to
* yuva/rgba */
* yuva/rgba */
p_spu
->
p
->
p_scale
=
CreateAndLoadScale
(
VLC_OBJECT
(
p_spu
),
p_spu
->
p
->
p_scale
=
CreateAndLoadScale
(
VLC_OBJECT
(
p_spu
),
VLC_CODEC_YUVA
,
VLC_CODEC_
YUV
A
,
true
);
VLC_CODEC_YUVA
,
VLC_CODEC_
RGB
A
,
true
);
/* This one is used for YUVP to YUVA/RGBA without scaling
/* This one is used for YUVP to YUVA/RGBA without scaling
* FIXME rename it */
* FIXME rename it */
p_spu
->
p
->
p_scale_yuvp
=
CreateAndLoadScale
(
VLC_OBJECT
(
p_spu
),
p_spu
->
p
->
p_scale_yuvp
=
CreateAndLoadScale
(
VLC_OBJECT
(
p_spu
),
...
@@ -769,6 +769,7 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -769,6 +769,7 @@ static void SpuRenderRegion( spu_t *p_spu,
subpicture_region_t
**
pp_dst
,
spu_area_t
*
p_dst_area
,
subpicture_region_t
**
pp_dst
,
spu_area_t
*
p_dst_area
,
subpicture_t
*
p_subpic
,
subpicture_region_t
*
p_region
,
subpicture_t
*
p_subpic
,
subpicture_region_t
*
p_region
,
const
spu_scale_t
scale_size
,
const
spu_scale_t
scale_size
,
const
vlc_fourcc_t
*
p_chroma_list
,
const
video_format_t
*
p_fmt
,
const
video_format_t
*
p_fmt
,
const
spu_area_t
*
p_subtitle_area
,
int
i_subtitle_area
,
const
spu_area_t
*
p_subtitle_area
,
int
i_subtitle_area
,
mtime_t
render_date
)
mtime_t
render_date
)
...
@@ -810,7 +811,6 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -810,7 +811,6 @@ static void SpuRenderRegion( spu_t *p_spu,
const
bool
b_force_crop
=
b_force_palette
&&
p_sys
->
b_force_crop
;
const
bool
b_force_crop
=
b_force_palette
&&
p_sys
->
b_force_crop
;
bool
b_changed_palette
=
false
;
bool
b_changed_palette
=
false
;
/* Compute the margin which is expressed in destination pixel unit
/* Compute the margin which is expressed in destination pixel unit
* The margin is applied only to subtitle and when no forced crop is
* The margin is applied only to subtitle and when no forced crop is
* requested (dvd menu) */
* requested (dvd menu) */
...
@@ -881,11 +881,18 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -881,11 +881,18 @@ static void SpuRenderRegion( spu_t *p_spu,
region_fmt
=
p_region
->
fmt
;
region_fmt
=
p_region
->
fmt
;
p_region_picture
=
p_region
->
p_picture
;
p_region_picture
=
p_region
->
p_picture
;
bool
b_convert_chroma
=
true
;
for
(
int
i
=
0
;
p_chroma_list
[
i
]
&&
b_convert_chroma
;
i
++
)
{
if
(
region_fmt
.
i_chroma
==
p_chroma_list
[
i
]
)
b_convert_chroma
=
false
;
}
/* Scale from rendered size to destination size */
/* Scale from rendered size to destination size */
if
(
p_sys
->
p_scale
&&
p_sys
->
p_scale
->
p_module
&&
if
(
p_sys
->
p_scale
&&
p_sys
->
p_scale
->
p_module
&&
(
!
b_using_palette
||
(
p_sys
->
p_scale_yuvp
&&
p_sys
->
p_scale_yuvp
->
p_module
)
)
&&
(
!
b_using_palette
||
(
p_sys
->
p_scale_yuvp
&&
p_sys
->
p_scale_yuvp
->
p_module
)
)
&&
(
scale_size
.
w
!=
SCALE_UNIT
||
scale_size
.
h
!=
SCALE_UNIT
||
b_using_palette
)
)
(
scale_size
.
w
!=
SCALE_UNIT
||
scale_size
.
h
!=
SCALE_UNIT
||
b_using_palette
||
b_convert_chroma
)
)
{
{
const
unsigned
i_dst_width
=
spu_scale_w
(
p_region
->
fmt
.
i_width
,
scale_size
);
const
unsigned
i_dst_width
=
spu_scale_w
(
p_region
->
fmt
.
i_width
,
scale_size
);
const
unsigned
i_dst_height
=
spu_scale_h
(
p_region
->
fmt
.
i_height
,
scale_size
);
const
unsigned
i_dst_height
=
spu_scale_h
(
p_region
->
fmt
.
i_height
,
scale_size
);
...
@@ -905,6 +912,9 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -905,6 +912,9 @@ static void SpuRenderRegion( spu_t *p_spu,
if
(
b_changed_palette
)
if
(
b_changed_palette
)
b_changed
=
true
;
b_changed
=
true
;
if
(
b_convert_chroma
&&
p_private
->
fmt
.
i_chroma
!=
p_chroma_list
[
0
]
)
b_changed
=
true
;
if
(
b_changed
)
if
(
b_changed
)
{
{
subpicture_region_private_Delete
(
p_private
);
subpicture_region_private_Delete
(
p_private
);
...
@@ -927,9 +937,8 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -927,9 +937,8 @@ static void SpuRenderRegion( spu_t *p_spu,
p_scale_yuvp
->
fmt_in
.
video
=
p_region
->
fmt
;
p_scale_yuvp
->
fmt_in
.
video
=
p_region
->
fmt
;
/* TODO converting to RGBA for RGB video output is better */
p_scale_yuvp
->
fmt_out
.
video
=
p_region
->
fmt
;
p_scale_yuvp
->
fmt_out
.
video
=
p_region
->
fmt
;
p_scale_yuvp
->
fmt_out
.
video
.
i_chroma
=
VLC_CODEC_YUVA
;
p_scale_yuvp
->
fmt_out
.
video
.
i_chroma
=
p_chroma_list
[
0
]
;
p_picture
=
p_scale_yuvp
->
pf_video_filter
(
p_scale_yuvp
,
p_picture
);
p_picture
=
p_scale_yuvp
->
pf_video_filter
(
p_scale_yuvp
,
p_picture
);
if
(
!
p_picture
)
if
(
!
p_picture
)
...
@@ -944,10 +953,14 @@ static void SpuRenderRegion( spu_t *p_spu,
...
@@ -944,10 +953,14 @@ static void SpuRenderRegion( spu_t *p_spu,
/* Conversion(except from YUVP)/Scaling */
/* Conversion(except from YUVP)/Scaling */
if
(
p_picture
&&
if
(
p_picture
&&
(
p_picture
->
format
.
i_width
!=
i_dst_width
||
(
p_picture
->
format
.
i_width
!=
i_dst_width
||
p_picture
->
format
.
i_height
!=
i_dst_height
)
)
p_picture
->
format
.
i_height
!=
i_dst_height
||
(
b_convert_chroma
&&
!
b_using_palette
)
)
)
{
{
p_scale
->
fmt_in
.
video
=
p_picture
->
format
;
p_scale
->
fmt_in
.
video
=
p_picture
->
format
;
p_scale
->
fmt_out
.
video
=
p_picture
->
format
;
p_scale
->
fmt_out
.
video
=
p_picture
->
format
;
if
(
b_convert_chroma
)
p_scale
->
fmt_out
.
i_codec
=
p_scale
->
fmt_out
.
video
.
i_chroma
=
p_chroma_list
[
0
];
p_scale
->
fmt_out
.
video
.
i_width
=
i_dst_width
;
p_scale
->
fmt_out
.
video
.
i_width
=
i_dst_width
;
p_scale
->
fmt_out
.
video
.
i_height
=
i_dst_height
;
p_scale
->
fmt_out
.
video
.
i_height
=
i_dst_height
;
...
@@ -1076,6 +1089,7 @@ exit:
...
@@ -1076,6 +1089,7 @@ exit:
* This function renders all sub picture units in the list.
* This function renders all sub picture units in the list.
*/
*/
static
subpicture_t
*
SpuRenderSubpictures
(
spu_t
*
p_spu
,
static
subpicture_t
*
SpuRenderSubpictures
(
spu_t
*
p_spu
,
const
vlc_fourcc_t
*
p_chroma_list
,
const
video_format_t
*
p_fmt_dst
,
const
video_format_t
*
p_fmt_dst
,
subpicture_t
*
p_subpic_list
,
subpicture_t
*
p_subpic_list
,
const
video_format_t
*
p_fmt_src
,
const
video_format_t
*
p_fmt_src
,
...
@@ -1208,7 +1222,8 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
...
@@ -1208,7 +1222,8 @@ static subpicture_t *SpuRenderSubpictures( spu_t *p_spu,
/* */
/* */
subpicture_region_t
*
p_render
;
subpicture_region_t
*
p_render
;
SpuRenderRegion
(
p_spu
,
&
p_render
,
&
area
,
SpuRenderRegion
(
p_spu
,
&
p_render
,
&
area
,
p_subpic
,
p_region
,
scale
,
p_fmt_dst
,
p_subpic
,
p_region
,
scale
,
p_chroma_list
,
p_fmt_dst
,
p_subtitle_area
,
i_subtitle_area
,
p_subtitle_area
,
i_subtitle_area
,
p_subpic
->
b_subtitle
?
render_subtitle_date
:
render_osd_date
);
p_subpic
->
b_subtitle
?
render_subtitle_date
:
render_osd_date
);
if
(
p_render
)
if
(
p_render
)
...
@@ -1515,6 +1530,7 @@ void spu_PutSubpicture( spu_t *p_spu, subpicture_t *p_subpic )
...
@@ -1515,6 +1530,7 @@ void spu_PutSubpicture( spu_t *p_spu, subpicture_t *p_subpic )
}
}
subpicture_t
*
spu_Render
(
spu_t
*
p_spu
,
subpicture_t
*
spu_Render
(
spu_t
*
p_spu
,
const
vlc_fourcc_t
*
p_chroma_list
,
const
video_format_t
*
p_fmt_dst
,
const
video_format_t
*
p_fmt_dst
,
const
video_format_t
*
p_fmt_src
,
const
video_format_t
*
p_fmt_src
,
mtime_t
render_subtitle_date
,
mtime_t
render_subtitle_date
,
...
@@ -1542,6 +1558,23 @@ subpicture_t *spu_Render( spu_t *p_spu,
...
@@ -1542,6 +1558,23 @@ subpicture_t *spu_Render( spu_t *p_spu,
filter_chain_SubFilter
(
p_sys
->
p_chain
,
render_osd_date
);
filter_chain_SubFilter
(
p_sys
->
p_chain
,
render_osd_date
);
vlc_mutex_unlock
(
&
p_sys
->
chain_lock
);
vlc_mutex_unlock
(
&
p_sys
->
chain_lock
);
static
const
vlc_fourcc_t
p_chroma_list_default_yuv
[]
=
{
VLC_CODEC_YUVA
,
VLC_CODEC_RGBA
,
VLC_CODEC_YUVP
,
0
,
};
static
const
vlc_fourcc_t
p_chroma_list_default_rgb
[]
=
{
VLC_CODEC_RGBA
,
VLC_CODEC_YUVA
,
VLC_CODEC_YUVP
,
0
,
};
if
(
!
p_chroma_list
||
*
p_chroma_list
==
0
)
p_chroma_list
=
vlc_fourcc_IsYUV
(
p_fmt_dst
->
i_chroma
)
?
p_chroma_list_default_yuv
:
p_chroma_list_default_rgb
;
/* Get the sorted list of subpicture to render */
/* Get the sorted list of subpicture to render */
vlc_mutex_lock
(
&
p_sys
->
lock
);
vlc_mutex_lock
(
&
p_sys
->
lock
);
...
@@ -1557,6 +1590,7 @@ subpicture_t *spu_Render( spu_t *p_spu,
...
@@ -1557,6 +1590,7 @@ subpicture_t *spu_Render( spu_t *p_spu,
/* Render the current list of subpictures */
/* Render the current list of subpictures */
subpicture_t
*
p_render
=
SpuRenderSubpictures
(
p_spu
,
subpicture_t
*
p_render
=
SpuRenderSubpictures
(
p_spu
,
p_chroma_list
,
p_fmt_dst
,
p_fmt_dst
,
p_list
,
p_list
,
p_fmt_src
,
p_fmt_src
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment