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
a560082d
Commit
a560082d
authored
Nov 04, 2007
by
Jean-Paul Saman
Committed by
Jean-Paul Saman
Mar 05, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Backport of subtitle core enhancements from trunk.
parent
101d635d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
252 additions
and
124 deletions
+252
-124
include/vlc_video.h
include/vlc_video.h
+6
-1
src/video_output/vout_subpictures.c
src/video_output/vout_subpictures.c
+246
-123
No files found.
include/vlc_video.h
View file @
a560082d
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
* includes all common video types and constants.
* includes all common video types and constants.
*****************************************************************************
*****************************************************************************
* Copyright (C) 1999 - 2005 the VideoLAN team
* Copyright (C) 1999 - 2005 the VideoLAN team
* $Id$
* $Id
: f4b8947c9c5576a9034df60c231e35edfde36710
$
*
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
*
...
@@ -302,6 +302,11 @@ struct subpicture_t
...
@@ -302,6 +302,11 @@ struct subpicture_t
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_RIGHT 0x2
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_TOP 0x4
#define SUBPICTURE_ALIGN_BOTTOM 0x8
#define SUBPICTURE_ALIGN_BOTTOM 0x8
#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \
SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM )
/* Subpicture rendered flag - should only be used by vout_subpictures */
#define SUBPICTURE_RENDERED 0x10
/*****************************************************************************
/*****************************************************************************
* Prototypes
* Prototypes
...
...
src/video_output/vout_subpictures.c
View file @
a560082d
...
@@ -37,6 +37,7 @@
...
@@ -37,6 +37,7 @@
#include "video_output.h"
#include "video_output.h"
#include "vlc_spu.h"
#include "vlc_spu.h"
#include "vlc_filter.h"
#include "vlc_filter.h"
#include "vlc_osd.h"
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
...
@@ -60,6 +61,12 @@ struct filter_owner_sys_t
...
@@ -60,6 +61,12 @@ struct filter_owner_sys_t
int
i_channel
;
int
i_channel
;
};
};
enum
{
SCALE_DEFAULT
,
SCALE_TEXT
,
SCALE_SIZE
};
/**
/**
* Creates the subpicture unit
* Creates the subpicture unit
*
*
...
@@ -255,10 +262,10 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
...
@@ -255,10 +262,10 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
if
(
!
p_region
)
return
NULL
;
if
(
!
p_region
)
return
NULL
;
memset
(
p_region
,
0
,
sizeof
(
subpicture_region_t
)
);
memset
(
p_region
,
0
,
sizeof
(
subpicture_region_t
)
);
p_region
->
p_next
=
0
;
p_region
->
p_next
=
NULL
;
p_region
->
p_cache
=
0
;
p_region
->
p_cache
=
NULL
;
p_region
->
fmt
=
*
p_fmt
;
p_region
->
fmt
=
*
p_fmt
;
p_region
->
psz_text
=
0
;
p_region
->
psz_text
=
NULL
;
p_region
->
p_style
=
NULL
;
p_region
->
p_style
=
NULL
;
if
(
p_fmt
->
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
)
if
(
p_fmt
->
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
)
...
@@ -299,10 +306,10 @@ subpicture_region_t *__spu_MakeRegion( vlc_object_t *p_this,
...
@@ -299,10 +306,10 @@ subpicture_region_t *__spu_MakeRegion( vlc_object_t *p_this,
subpicture_region_t
*
p_region
=
malloc
(
sizeof
(
subpicture_region_t
)
);
subpicture_region_t
*
p_region
=
malloc
(
sizeof
(
subpicture_region_t
)
);
if
(
!
p_region
)
return
NULL
;
if
(
!
p_region
)
return
NULL
;
memset
(
p_region
,
0
,
sizeof
(
subpicture_region_t
)
);
memset
(
p_region
,
0
,
sizeof
(
subpicture_region_t
)
);
p_region
->
p_next
=
0
;
p_region
->
p_next
=
NULL
;
p_region
->
p_cache
=
0
;
p_region
->
p_cache
=
NULL
;
p_region
->
fmt
=
*
p_fmt
;
p_region
->
fmt
=
*
p_fmt
;
p_region
->
psz_text
=
0
;
p_region
->
psz_text
=
NULL
;
p_region
->
p_style
=
NULL
;
p_region
->
p_style
=
NULL
;
if
(
p_fmt
->
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
)
if
(
p_fmt
->
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
)
...
@@ -412,10 +419,10 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
...
@@ -412,10 +419,10 @@ subpicture_t *spu_CreateSubpicture( spu_t *p_spu )
p_subpic
->
b_pausable
=
VLC_FALSE
;
p_subpic
->
b_pausable
=
VLC_FALSE
;
p_subpic
->
b_fade
=
VLC_FALSE
;
p_subpic
->
b_fade
=
VLC_FALSE
;
p_subpic
->
i_alpha
=
0xFF
;
p_subpic
->
i_alpha
=
0xFF
;
p_subpic
->
p_region
=
0
;
p_subpic
->
p_region
=
NULL
;
p_subpic
->
pf_render
=
0
;
p_subpic
->
pf_render
=
NULL
;
p_subpic
->
pf_destroy
=
0
;
p_subpic
->
pf_destroy
=
NULL
;
p_subpic
->
p_sys
=
0
;
p_subpic
->
p_sys
=
NULL
;
vlc_mutex_unlock
(
&
p_spu
->
subpicture_lock
);
vlc_mutex_unlock
(
&
p_spu
->
subpicture_lock
);
p_subpic
->
pf_create_region
=
__spu_CreateRegion
;
p_subpic
->
pf_create_region
=
__spu_CreateRegion
;
...
@@ -480,15 +487,34 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -480,15 +487,34 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
subpicture_t
*
p_subpic
,
subpicture_t
*
p_subpic
,
int
i_scale_width_orig
,
int
i_scale_height_orig
)
int
i_scale_width_orig
,
int
i_scale_height_orig
)
{
{
int
i_source_video_width
=
p_fmt
->
i_width
*
1000
/
i_scale_width_orig
;
int
i_source_video_height
=
p_fmt
->
i_height
*
1000
/
i_scale_height_orig
;
/* Get lock */
/* Get lock */
vlc_mutex_lock
(
&
p_spu
->
subpicture_lock
);
vlc_mutex_lock
(
&
p_spu
->
subpicture_lock
);
/* Check i_status again to make sure spudec hasn't destroyed the subpic */
/* Check i_status again to make sure spudec hasn't destroyed the subpic */
while
(
p_subpic
!=
NULL
&&
p_subpic
->
i_status
!=
FREE_SUBPICTURE
)
while
(
(
p_subpic
!=
NULL
)
&&
(
p_subpic
->
i_status
!=
FREE_SUBPICTURE
)
)
{
{
subpicture_region_t
*
p_region
=
p_subpic
->
p_region
;
subpicture_region_t
*
p_region
=
p_subpic
->
p_region
;
int
i_scale_width
,
i_scale_height
;
int
pi_scale_width
[
SCALE_SIZE
];
int
i_subpic_x
=
p_subpic
->
i_x
;
int
pi_scale_height
[
SCALE_SIZE
];
int
pi_subpic_x
[
SCALE_SIZE
];
int
k
;
/* If the source video and subtitles stream agree on the size of
* the video then disregard all further references to the subtitle
* stream.
*/
if
(
(
i_source_video_height
==
p_subpic
->
i_original_picture_height
)
&&
(
i_source_video_width
==
p_subpic
->
i_original_picture_width
)
)
{
p_subpic
->
i_original_picture_height
=
0
;
p_subpic
->
i_original_picture_width
=
0
;
}
for
(
k
=
0
;
k
<
SCALE_SIZE
;
k
++
)
pi_subpic_x
[
k
]
=
p_subpic
->
i_x
;
/* Load the blending module */
/* Load the blending module */
if
(
!
p_spu
->
p_blend
&&
p_region
)
if
(
!
p_spu
->
p_blend
&&
p_region
)
...
@@ -499,14 +525,16 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -499,14 +525,16 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
p_spu
->
p_blend
->
fmt_out
.
video
.
i_y_offset
=
0
;
p_spu
->
p_blend
->
fmt_out
.
video
.
i_y_offset
=
0
;
p_spu
->
p_blend
->
fmt_out
.
video
.
i_aspect
=
p_fmt
->
i_aspect
;
p_spu
->
p_blend
->
fmt_out
.
video
.
i_aspect
=
p_fmt
->
i_aspect
;
p_spu
->
p_blend
->
fmt_out
.
video
.
i_chroma
=
p_fmt
->
i_chroma
;
p_spu
->
p_blend
->
fmt_out
.
video
.
i_chroma
=
p_fmt
->
i_chroma
;
p_spu
->
p_blend
->
fmt_in
.
video
.
i_chroma
=
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
);
/* FIXME: We'll also be using it for YUVA and RGBA blending ... */
p_spu
->
p_blend
->
p_module
=
/* The blend module will be loaded when needed with the real input format */
module_Need
(
p_spu
->
p_blend
,
"video blending"
,
0
,
0
);
memset
(
&
p_spu
->
p_blend
->
fmt_in
,
0
,
sizeof
(
p_spu
->
p_blend
->
fmt_in
)
);
p_spu
->
p_blend
->
p_module
=
NULL
;
}
}
/* Load the text rendering module */
/* Load the text rendering module; it is possible there is a
* text region somewhere in the subpicture other than the first
* element in the region list, so just load it anyway as we'll
* probably want it sooner or later. */
if
(
!
p_spu
->
p_text
&&
p_region
)
if
(
!
p_spu
->
p_text
&&
p_region
)
{
{
char
*
psz_modulename
=
NULL
;
char
*
psz_modulename
=
NULL
;
...
@@ -556,33 +584,65 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -556,33 +584,65 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
p_text_region
=
p_text_region
->
p_next
;
p_text_region
=
p_text_region
->
p_next
;
}
}
if
(
p_text_region
)
if
(
p_text_region
&&
(
(
p_text_region
->
i_align
&
SUBPICTURE_RENDERED
)
==
0
)
)
{
{
p_spu
->
p_text
->
fmt_out
.
video
.
i_width
=
if
(
(
p_subpic
->
i_original_picture_height
>
0
)
&&
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_width
=
(
p_subpic
->
i_original_picture_width
>
0
)
)
p_fmt
->
i_width
;
{
p_spu
->
p_text
->
fmt_out
.
video
.
i_height
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_width
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_height
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_width
=
p_fmt
->
i_height
;
p_subpic
->
i_original_picture_width
;
p_spu
->
p_text
->
fmt_out
.
video
.
i_height
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_height
=
p_subpic
->
i_original_picture_height
;
}
else
{
p_spu
->
p_text
->
fmt_out
.
video
.
i_width
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_width
=
p_fmt
->
i_width
;
p_spu
->
p_text
->
fmt_out
.
video
.
i_height
=
p_spu
->
p_text
->
fmt_out
.
video
.
i_visible_height
=
p_fmt
->
i_height
;
}
}
}
}
}
i_scale_width
=
i_scale_width_orig
;
pi_scale_width
[
SCALE_DEFAULT
]
=
i_scale_width_orig
;
i_scale_height
=
i_scale_height_orig
;
pi_scale_height
[
SCALE_DEFAULT
]
=
i_scale_height_orig
;
if
(
p_subpic
->
i_original_picture_height
>
0
&&
if
(
p_spu
->
p_text
)
p_subpic
->
i_original_picture_width
>
0
)
{
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.
*/
if
(
(
p_subpic
->
i_original_picture_height
>
0
)
&&
(
p_subpic
->
i_original_picture_width
>
0
)
)
{
{
i_scale_width
=
i_scale_width
*
p_fmt
->
i_width
/
i_scale_width_orig
=
1000
;
p_subpic
->
i_original_picture_width
;
i_scale_height_orig
=
1000
;
i_scale_height
=
i_scale_height
*
p_fmt
->
i_height
/
p_subpic
->
i_original_picture_height
;
}
}
else
if
(
p_subpic
->
i_original_picture_height
>
0
)
for
(
k
=
0
;
k
<
SCALE_SIZE
;
k
++
)
{
{
i_scale_height
=
i_scale_height
*
p_fmt
->
i_height
/
/* Case of both width and height being specified has been dealt with
p_subpic
->
i_original_picture_height
;
* above by instead rendering to an output pane of the explicit
i_scale_width
=
i_scale_height
*
i_scale_height
/
p_fmt
->
i_height
;
* dimensions specified - we don't need to scale it.
*/
if
(
(
p_subpic
->
i_original_picture_height
>
0
)
&&
(
p_subpic
->
i_original_picture_width
<=
0
)
)
{
pi_scale_height
[
k
]
=
pi_scale_height
[
k
]
*
i_source_video_height
/
p_subpic
->
i_original_picture_height
;
pi_scale_width
[
k
]
=
pi_scale_width
[
k
]
*
i_source_video_height
/
p_subpic
->
i_original_picture_height
;
}
}
}
/* Set default subpicture aspect ratio */
/* Set default subpicture aspect ratio */
...
@@ -604,15 +664,21 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -604,15 +664,21 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
(
(
p_region
->
fmt
.
i_sar_num
*
p_fmt
->
i_sar_den
)
!=
(
(
p_region
->
fmt
.
i_sar_num
*
p_fmt
->
i_sar_den
)
!=
(
p_region
->
fmt
.
i_sar_den
*
p_fmt
->
i_sar_num
)
)
)
(
p_region
->
fmt
.
i_sar_den
*
p_fmt
->
i_sar_num
)
)
)
{
{
i_scale_width
=
i_scale_width
*
for
(
k
=
0
;
k
<
SCALE_SIZE
;
k
++
)
(
int64_t
)
p_region
->
fmt
.
i_sar_num
*
p_fmt
->
i_sar_den
/
{
p_region
->
fmt
.
i_sar_den
/
p_fmt
->
i_sar_num
;
pi_scale_width
[
k
]
=
pi_scale_width
[
k
]
*
i_subpic_x
=
p_subpic
->
i_x
*
i_scale_width
/
1000
;
(
int64_t
)
p_region
->
fmt
.
i_sar_num
*
p_fmt
->
i_sar_den
/
p_region
->
fmt
.
i_sar_den
/
p_fmt
->
i_sar_num
;
pi_subpic_x
[
k
]
=
p_subpic
->
i_x
*
pi_scale_width
[
k
]
/
1000
;
}
}
}
/* Load the scaling module */
/* Load the scaling module */
if
(
!
p_spu
->
p_scale
&&
(
i_scale_width
!=
1000
||
if
(
!
p_spu
->
p_scale
&&
i_scale_height
!=
1000
)
)
((((
pi_scale_width
[
SCALE_TEXT
]
>
0
)
||
(
pi_scale_height
[
SCALE_TEXT
]
>
0
))
&&
((
pi_scale_width
[
SCALE_TEXT
]
!=
1000
)
||
(
pi_scale_height
[
SCALE_TEXT
]
!=
1000
)))
||
(((
pi_scale_width
[
SCALE_DEFAULT
]
>
0
)
||
(
pi_scale_height
[
SCALE_DEFAULT
]
>
0
))
&&
((
pi_scale_width
[
SCALE_DEFAULT
]
!=
1000
)
||
(
pi_scale_height
[
SCALE_DEFAULT
]
!=
1000
))))
)
{
{
p_spu
->
p_scale
=
vlc_object_create
(
p_spu
,
VLC_OBJECT_FILTER
);
p_spu
->
p_scale
=
vlc_object_create
(
p_spu
,
VLC_OBJECT_FILTER
);
vlc_object_attach
(
p_spu
->
p_scale
,
p_spu
);
vlc_object_attach
(
p_spu
->
p_scale
,
p_spu
);
...
@@ -632,23 +698,38 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -632,23 +698,38 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
module_Need
(
p_spu
->
p_scale
,
"video filter2"
,
0
,
0
);
module_Need
(
p_spu
->
p_scale
,
"video filter2"
,
0
,
0
);
}
}
while
(
p_region
&&
p_spu
->
p_blend
&&
p_spu
->
p_blend
->
pf_video_blend
)
while
(
p_region
)
{
{
int
i_fade_alpha
=
255
;
int
i_fade_alpha
=
255
;
int
i_x_offset
=
p_region
->
i_x
+
i_subpic_x
;
int
i_x_offset
;
int
i_y_offset
=
p_region
->
i_y
+
p_subpic
->
i_y
;
int
i_y_offset
;
int
i_scale_idx
=
SCALE_DEFAULT
;
int
i_inv_scale_x
=
1000
;
int
i_inv_scale_y
=
1000
;
if
(
p_region
->
fmt
.
i_chroma
==
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
if
(
p_region
->
fmt
.
i_chroma
==
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
{
{
if
(
p_spu
->
p_text
&&
p_spu
->
p_text
->
p_module
&&
if
(
p_spu
->
p_text
&&
p_spu
->
p_text
->
p_module
)
p_spu
->
p_text
->
pf_render_text
)
{
{
p_region
->
i_align
=
p_subpic
->
i_flags
;
if
(
p_spu
->
p_text
->
pf_render_text
)
p_spu
->
p_text
->
pf_render_text
(
p_spu
->
p_text
,
{
p_region
,
p_region
);
p_spu
->
p_text
->
pf_render_text
(
p_spu
->
p_text
,
p_region
,
p_region
);
}
}
}
p_region
->
i_align
|=
SUBPICTURE_RENDERED
;
}
if
(
p_region
->
i_align
&
SUBPICTURE_RENDERED
)
{
i_scale_idx
=
SCALE_TEXT
;
i_inv_scale_x
=
i_scale_width_orig
;
i_inv_scale_y
=
i_scale_height_orig
;
}
}
i_x_offset
=
(
p_region
->
i_x
+
pi_subpic_x
[
i_scale_idx
])
*
i_inv_scale_x
/
1000
;
i_y_offset
=
(
p_region
->
i_y
+
p_subpic
->
i_y
)
*
i_inv_scale_y
/
1000
;
/* Force palette if requested */
/* Force palette if requested */
if
(
p_spu
->
b_force_palette
&&
if
(
p_spu
->
b_force_palette
&&
(
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
==
p_region
->
fmt
.
i_chroma
)
)
(
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
==
p_region
->
fmt
.
i_chroma
)
)
...
@@ -661,10 +742,10 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -661,10 +742,10 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
if
(
p_region
->
p_cache
&&
if
(
p_region
->
p_cache
&&
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
{
{
if
(
(
i_scale_width
*
p_region
->
fmt
.
i_width
/
1000
!=
if
(
pi_scale_width
[
i_scale_idx
]
*
p_region
->
fmt
.
i_width
/
1000
!=
p_region
->
p_cache
->
fmt
.
i_width
)
||
p_region
->
p_cache
->
fmt
.
i_width
||
(
i_scale_height
*
p_region
->
fmt
.
i_height
/
1000
!=
pi_scale_height
[
i_scale_idx
]
*
p_region
->
fmt
.
i_height
/
1000
!=
p_region
->
p_cache
->
fmt
.
i_height
)
)
p_region
->
p_cache
->
fmt
.
i_height
)
{
{
p_subpic
->
pf_destroy_region
(
VLC_OBJECT
(
p_spu
),
p_subpic
->
pf_destroy_region
(
VLC_OBJECT
(
p_spu
),
p_region
->
p_cache
);
p_region
->
p_cache
);
...
@@ -672,7 +753,10 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -672,7 +753,10 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
}
}
}
}
if
(
(
(
i_scale_width
!=
1000
)
||
(
i_scale_height
!=
1000
)
)
&&
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_spu
->
p_scale
&&
!
p_region
->
p_cache
&&
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
{
{
...
@@ -693,16 +777,17 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -693,16 +777,17 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
&
p_region
->
picture
);
&
p_region
->
picture
);
p_spu
->
p_scale
->
fmt_out
.
video
.
i_width
=
p_spu
->
p_scale
->
fmt_out
.
video
.
i_width
=
p_region
->
fmt
.
i_width
*
i_scale_width
/
1000
;
p_region
->
fmt
.
i_width
*
pi_scale_width
[
i_scale_idx
]
/
1000
;
p_spu
->
p_scale
->
fmt_out
.
video
.
i_visible_width
=
p_spu
->
p_scale
->
fmt_out
.
video
.
i_visible_width
=
p_region
->
fmt
.
i_visible_width
*
i_scale_width
/
1000
;
p_region
->
fmt
.
i_visible_width
*
pi_scale_width
[
i_scale_idx
]
/
1000
;
p_spu
->
p_scale
->
fmt_out
.
video
.
i_height
=
p_spu
->
p_scale
->
fmt_out
.
video
.
i_height
=
p_region
->
fmt
.
i_height
*
i_scale_height
/
1000
;
p_region
->
fmt
.
i_height
*
pi_scale_height
[
i_scale_idx
]
/
1000
;
p_spu
->
p_scale
->
fmt_out
.
video
.
i_visible_height
=
p_spu
->
p_scale
->
fmt_out
.
video
.
i_visible_height
=
p_region
->
fmt
.
i_visible_height
*
i_scale_height
/
1000
;
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
->
fmt
=
p_spu
->
p_scale
->
fmt_out
.
video
;
p_region
->
p_cache
->
i_x
=
p_region
->
i_x
*
i_scale_width
/
1000
;
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
*
i_scale_height
/
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_pic
=
p_spu
->
p_scale
->
pf_video_filter
(
p_pic
=
p_spu
->
p_scale
->
pf_video_filter
(
p_spu
->
p_scale
,
&
p_region
->
p_cache
->
picture
);
p_spu
->
p_scale
,
&
p_region
->
p_cache
->
picture
);
...
@@ -715,95 +800,65 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -715,95 +800,65 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
}
}
}
}
if
(
(
(
i_scale_width
!=
1000
)
||
(
i_scale_height
!=
1000
)
)
&&
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_spu
->
p_scale
&&
p_region
->
p_cache
&&
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
)
{
{
p_region
=
p_region
->
p_cache
;
p_region
=
p_region
->
p_cache
;
}
}
if
(
p_
subpic
->
i_flags
&
SUBPICTURE_ALIGN_BOTTOM
)
if
(
p_
region
->
i_align
&
SUBPICTURE_ALIGN_BOTTOM
)
{
{
i_y_offset
=
p_fmt
->
i_height
-
p_region
->
fmt
.
i_height
-
i_y_offset
=
p_fmt
->
i_height
-
p_region
->
fmt
.
i_height
-
p_subpic
->
i_y
;
(
p_subpic
->
i_y
+
p_region
->
i_y
)
*
i_inv_scale_y
/
1000
;
}
}
else
if
(
!
(
p_
subpic
->
i_flags
&
SUBPICTURE_ALIGN_TOP
)
)
else
if
(
!
(
p_
region
->
i_align
&
SUBPICTURE_ALIGN_TOP
)
)
{
{
i_y_offset
=
p_fmt
->
i_height
/
2
-
p_region
->
fmt
.
i_height
/
2
;
i_y_offset
=
p_fmt
->
i_height
/
2
-
p_region
->
fmt
.
i_height
/
2
;
}
}
if
(
p_
subpic
->
i_flags
&
SUBPICTURE_ALIGN_RIGHT
)
if
(
p_
region
->
i_align
&
SUBPICTURE_ALIGN_RIGHT
)
{
{
i_x_offset
=
p_fmt
->
i_width
-
p_region
->
fmt
.
i_width
-
i_x_offset
=
p_fmt
->
i_width
-
p_region
->
fmt
.
i_width
-
i_subpic_x
;
(
pi_subpic_x
[
i_scale_idx
]
+
p_region
->
i_x
)
*
i_inv_scale_x
/
1000
;
}
}
else
if
(
!
(
p_
subpic
->
i_flags
&
SUBPICTURE_ALIGN_LEFT
)
)
else
if
(
!
(
p_
region
->
i_align
&
SUBPICTURE_ALIGN_LEFT
)
)
{
{
i_x_offset
=
p_fmt
->
i_width
/
2
-
p_region
->
fmt
.
i_width
/
2
;
i_x_offset
=
p_fmt
->
i_width
/
2
-
p_region
->
fmt
.
i_width
/
2
;
}
}
if
(
p_subpic
->
b_absolute
)
if
(
p_subpic
->
b_absolute
)
{
{
i_x_offset
=
p_region
->
i_x
+
i_x_offset
=
(
p_region
->
i_x
+
i_subpic_x
*
i_scale_width
/
1000
;
pi_subpic_x
[
i_scale_idx
]
*
i_y_offset
=
p_region
->
i_y
+
pi_scale_width
[
i_scale_idx
]
/
1000
)
p_subpic
->
i_y
*
i_scale_height
/
1000
;
*
i_inv_scale_x
/
1000
;
i_y_offset
=
(
p_region
->
i_y
+
p_subpic
->
i_y
*
pi_scale_height
[
i_scale_idx
]
/
1000
)
*
i_inv_scale_y
/
1000
;
}
}
i_x_offset
=
__MAX
(
i_x_offset
,
0
);
i_x_offset
=
__MAX
(
i_x_offset
,
0
);
i_y_offset
=
__MAX
(
i_y_offset
,
0
);
i_y_offset
=
__MAX
(
i_y_offset
,
0
);
if
(
p_spu
->
i_margin
!=
0
&&
(
p_spu
->
b_force_crop
==
VLC_FALSE
)
)
if
(
(
p_spu
->
i_margin
!=
0
)
&&
(
p_spu
->
b_force_crop
==
VLC_FALSE
)
)
{
{
int
i_diff
=
0
;
int
i_diff
=
0
;
int
i_low
=
i_y_offset
-
p_spu
->
i_margin
;
int
i_low
=
(
i_y_offset
-
p_spu
->
i_margin
)
*
i_inv_scale_y
/
1000
;
int
i_high
=
i_
y_offset
+
p_region
->
fmt
.
i_height
-
p_spu
->
i_margin
;
int
i_high
=
i_
low
+
p_region
->
fmt
.
i_height
;
/* crop extra margin to keep within bounds */
/* crop extra margin to keep within bounds */
if
(
i_low
<
0
)
i_diff
=
i_low
;
if
(
i_low
<
0
)
if
(
i_high
>
(
int
)
p_fmt
->
i_height
)
i_diff
=
i_high
-
p_fmt
->
i_height
;
i_diff
=
i_low
;
i_y_offset
-=
(
p_spu
->
i_margin
+
i_diff
);
if
(
i_high
>
(
int
)
p_fmt
->
i_height
)
}
i_diff
=
i_high
-
p_fmt
->
i_height
;
i_y_offset
-=
(
p_spu
->
i_margin
*
i_inv_scale_y
/
1000
+
i_diff
);
p_spu
->
p_blend
->
fmt_in
.
video
=
p_region
->
fmt
;
/* Force cropping if requested */
if
(
p_spu
->
b_force_crop
)
{
video_format_t
*
p_fmt
=
&
p_spu
->
p_blend
->
fmt_in
.
video
;
int
i_crop_x
=
p_spu
->
i_crop_x
*
i_scale_width
/
1000
;
int
i_crop_y
=
p_spu
->
i_crop_y
*
i_scale_height
/
1000
;
int
i_crop_width
=
p_spu
->
i_crop_width
*
i_scale_width
/
1000
;
int
i_crop_height
=
p_spu
->
i_crop_height
*
i_scale_height
/
1000
;
/* Find the intersection */
if
(
i_crop_x
+
i_crop_width
<=
i_x_offset
||
i_x_offset
+
(
int
)
p_fmt
->
i_visible_width
<
i_crop_x
||
i_crop_y
+
i_crop_height
<=
i_y_offset
||
i_y_offset
+
(
int
)
p_fmt
->
i_visible_height
<
i_crop_y
)
{
/* No intersection */
p_fmt
->
i_visible_width
=
p_fmt
->
i_visible_height
=
0
;
}
else
{
int
i_x
,
i_y
,
i_x_end
,
i_y_end
;
i_x
=
__MAX
(
i_crop_x
,
i_x_offset
);
i_y
=
__MAX
(
i_crop_y
,
i_y_offset
);
i_x_end
=
__MIN
(
i_crop_x
+
i_crop_width
,
i_x_offset
+
(
int
)
p_fmt
->
i_visible_width
);
i_y_end
=
__MIN
(
i_crop_y
+
i_crop_height
,
i_y_offset
+
(
int
)
p_fmt
->
i_visible_height
);
p_fmt
->
i_x_offset
=
i_x
-
i_x_offset
;
p_fmt
->
i_y_offset
=
i_y
-
i_y_offset
;
p_fmt
->
i_visible_width
=
i_x_end
-
i_x
;
p_fmt
->
i_visible_height
=
i_y_end
-
i_y
;
i_x_offset
=
i_x
;
i_y_offset
=
i_y
;
}
}
}
if
(
p_subpic
->
b_fade
)
if
(
p_subpic
->
b_fade
)
...
@@ -823,6 +878,66 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -823,6 +878,66 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
if
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
if
(
p_region
->
fmt
.
i_chroma
!=
VLC_FOURCC
(
'T'
,
'E'
,
'X'
,
'T'
)
)
{
{
if
(
p_spu
->
p_blend
->
fmt_in
.
video
.
i_chroma
!=
p_region
->
fmt
.
i_chroma
)
{
/* The chroma is not the same, we need to reload the blend module
* XXX to match the old behaviour just test !p_spu->p_blend->fmt_in.video.i_chroma */
if
(
p_spu
->
p_blend
->
p_module
)
module_Unneed
(
p_spu
->
p_blend
,
p_spu
->
p_blend
->
p_module
);
p_spu
->
p_blend
->
fmt_in
.
video
=
p_region
->
fmt
;
p_spu
->
p_blend
->
p_module
=
module_Need
(
p_spu
->
p_blend
,
"video blending"
,
0
,
0
);
}
else
{
p_spu
->
p_blend
->
fmt_in
.
video
=
p_region
->
fmt
;
}
/* Force cropping if requested */
if
(
p_spu
->
b_force_crop
)
{
video_format_t
*
p_fmt
=
&
p_spu
->
p_blend
->
fmt_in
.
video
;
int
i_crop_x
=
p_spu
->
i_crop_x
*
pi_scale_width
[
i_scale_idx
]
/
1000
*
i_inv_scale_x
/
1000
;
int
i_crop_y
=
p_spu
->
i_crop_y
*
pi_scale_height
[
i_scale_idx
]
/
1000
*
i_inv_scale_y
/
1000
;
int
i_crop_width
=
p_spu
->
i_crop_width
*
pi_scale_width
[
i_scale_idx
]
/
1000
*
i_inv_scale_x
/
1000
;
int
i_crop_height
=
p_spu
->
i_crop_height
*
pi_scale_height
[
i_scale_idx
]
/
1000
*
i_inv_scale_y
/
1000
;
/* Find the intersection */
if
(
i_crop_x
+
i_crop_width
<=
i_x_offset
||
i_x_offset
+
(
int
)
p_fmt
->
i_visible_width
<
i_crop_x
||
i_crop_y
+
i_crop_height
<=
i_y_offset
||
i_y_offset
+
(
int
)
p_fmt
->
i_visible_height
<
i_crop_y
)
{
/* No intersection */
p_fmt
->
i_visible_width
=
p_fmt
->
i_visible_height
=
0
;
}
else
{
int
i_x
,
i_y
,
i_x_end
,
i_y_end
;
i_x
=
__MAX
(
i_crop_x
,
i_x_offset
);
i_y
=
__MAX
(
i_crop_y
,
i_y_offset
);
i_x_end
=
__MIN
(
i_crop_x
+
i_crop_width
,
i_x_offset
+
(
int
)
p_fmt
->
i_visible_width
);
i_y_end
=
__MIN
(
i_crop_y
+
i_crop_height
,
i_y_offset
+
(
int
)
p_fmt
->
i_visible_height
);
p_fmt
->
i_x_offset
=
i_x
-
i_x_offset
;
p_fmt
->
i_y_offset
=
i_y
-
i_y_offset
;
p_fmt
->
i_visible_width
=
i_x_end
-
i_x
;
p_fmt
->
i_visible_height
=
i_y_end
-
i_y
;
i_x_offset
=
i_x
;
i_y_offset
=
i_y
;
}
}
i_x_offset
=
__MAX
(
i_x_offset
,
0
);
i_y_offset
=
__MAX
(
i_y_offset
,
0
);
/* Update the output picture size */
/* Update the output picture size */
p_spu
->
p_blend
->
fmt_out
.
video
.
i_width
=
p_spu
->
p_blend
->
fmt_out
.
video
.
i_width
=
p_spu
->
p_blend
->
fmt_out
.
video
.
i_visible_width
=
p_spu
->
p_blend
->
fmt_out
.
video
.
i_visible_width
=
...
@@ -831,13 +946,21 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
...
@@ -831,13 +946,21 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
p_spu
->
p_blend
->
fmt_out
.
video
.
i_visible_height
=
p_spu
->
p_blend
->
fmt_out
.
video
.
i_visible_height
=
p_fmt
->
i_height
;
p_fmt
->
i_height
;
p_spu
->
p_blend
->
pf_video_blend
(
p_spu
->
p_blend
,
p_pic_dst
,
if
(
p_spu
->
p_blend
->
p_module
)
p_pic_src
,
&
p_region
->
picture
,
i_x_offset
,
i_y_offset
,
{
i_fade_alpha
*
p_subpic
->
i_alpha
/
255
);
p_spu
->
p_blend
->
pf_video_blend
(
p_spu
->
p_blend
,
p_pic_dst
,
p_pic_src
,
&
p_region
->
picture
,
i_x_offset
,
i_y_offset
,
i_fade_alpha
*
p_subpic
->
i_alpha
/
255
);
}
else
{
msg_Err
(
p_spu
,
"blending %4.4s to %4.4s failed"
,
(
char
*
)
&
p_spu
->
p_blend
->
fmt_out
.
video
.
i_chroma
,
(
char
*
)
&
p_spu
->
p_blend
->
fmt_out
.
video
.
i_chroma
);
}
}
}
p_region
=
p_region
->
p_next
;
p_region
=
p_region
->
p_next
;
}
}
p_subpic
=
p_subpic
->
p_next
;
p_subpic
=
p_subpic
->
p_next
;
}
}
...
...
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