Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
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-1.1
Commits
f8a7b336
Commit
f8a7b336
authored
Jul 11, 2008
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More clean up...
parent
8c75d5ed
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
126 additions
and
126 deletions
+126
-126
src/video_output/vout_subpictures.c
src/video_output/vout_subpictures.c
+126
-126
No files found.
src/video_output/vout_subpictures.c
View file @
f8a7b336
...
...
@@ -581,6 +581,68 @@ static void SpuRenderCreateAndLoadScale( spu_t *p_spu )
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
,
...
...
@@ -590,73 +652,19 @@ static void SpuRenderRegion( spu_t *p_spu,
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'
)
)
...
...
@@ -681,9 +689,9 @@ static void SpuRenderRegion( spu_t *p_spu,
/* 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 look
s
so wrong I won't comment
* p_palette->palette is [256][4] with a int i_entries
* p_spu->palette is [4][4]
* */
...
...
@@ -700,64 +708,59 @@ static void SpuRenderRegion( spu_t *p_spu,
{
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
)
...
...
@@ -796,8 +799,7 @@ static void SpuRenderRegion( spu_t *p_spu,
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
;
...
...
@@ -811,6 +813,7 @@ static void SpuRenderRegion( spu_t *p_spu,
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
+
...
...
@@ -873,11 +876,9 @@ static void SpuRenderRegion( spu_t *p_spu,
/* 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
)
{
...
...
@@ -1036,18 +1037,17 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
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.
*/
...
...
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