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
af034357
Commit
af034357
authored
Aug 07, 2008
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Begin clean up of giant blend ctl-c ctl-v.
parent
2b7961e1
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
133 additions
and
499 deletions
+133
-499
modules/video_filter/blend.c
modules/video_filter/blend.c
+133
-499
No files found.
modules/video_filter/blend.c
View file @
af034357
...
...
@@ -321,6 +321,19 @@ static inline uint8_t vlc_uint8( int v )
return
v
;
}
#define MAX_TRANS 255
#define TRANS_BITS 8
static
inline
int
vlc_blend
(
int
v1
,
int
v2
,
int
a
)
{
/* TODO bench if the tests really increase speed */
if
(
a
==
0
)
return
v2
;
else
if
(
a
==
MAX_TRANS
)
return
v1
;
return
(
v1
*
a
+
v2
*
(
MAX_TRANS
-
a
)
)
>>
TRANS_BITS
;
}
static
inline
void
yuv_to_rgb
(
int
*
r
,
int
*
g
,
int
*
b
,
uint8_t
y1
,
uint8_t
u1
,
uint8_t
v1
)
{
...
...
@@ -413,9 +426,6 @@ static void BlendI420( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_in
.
video
.
i_x_offset
+
p_src
->
p
[
A_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_trans
+=
i_src2_pitch
,
p_dst_y
+=
i_dst_pitch
,
p_src1_y
+=
i_src1_pitch
,
...
...
@@ -434,45 +444,19 @@ static void BlendI420( filter_t *p_filter, picture_t *p_dst,
{
if
(
p_trans
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst_y
[
i_x
]
=
p_src2_y
[
i_x
];
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
p_src2_u
[
i_x
];
p_dst_v
[
i_x
/
2
]
=
p_src2_v
[
i_x
];
}
if
(
!
i_trans
)
continue
;
}
/* Blending */
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_y
[
i_x
]
=
vlc_blend
(
p_src2_y
[
i_x
],
p_src1_y
[
i_x
],
i_trans
);
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
p_src2_u
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_v
[
i_x
/
2
]
=
(
(
uint16_t
)
p_src2_v
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_u
[
i_x
/
2
]
=
vlc_blend
(
p_src2_u
[
i_x
],
p_src1_u
[
i_x
/
2
],
i_trans
);
p_dst_v
[
i_x
/
2
]
=
vlc_blend
(
p_src2_v
[
i_x
],
p_src1_v
[
i_x
/
2
],
i_trans
);
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendR16
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -515,9 +499,6 @@ static void BlendR16( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
+
p_src
->
p
[
A_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_trans
+=
i_src2_pitch
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -530,33 +511,17 @@ static void BlendR16( filter_t *p_filter, picture_t *p_dst_pic,
if
(
p_trans
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
],
p_src2_v
[
i_x
]
);
((
uint16_t
*
)(
&
p_dst
[
i_x
*
i_pix_pitch
]))[
0
]
=
((
r
>>
3
)
<<
11
)
|
((
g
>>
2
)
<<
5
)
|
(
b
>>
3
);
continue
;
}
/* Blending */
/* FIXME: do the blending */
/* FIXME: do the blending
* FIXME use rgb shift (when present) */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
],
p_src2_v
[
i_x
]
);
((
uint16_t
*
)(
&
p_dst
[
i_x
*
i_pix_pitch
]))[
0
]
=
((
r
>>
3
)
<<
11
)
|
((
g
>>
2
)
<<
5
)
|
(
b
>>
3
);
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendR24
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -599,9 +564,6 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
+
p_src
->
p
[
A_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
if
(
(
i_pix_pitch
==
4
)
&&
(((((
intptr_t
)
p_dst
)
|
((
intptr_t
)
p_src1
)
|
i_dst_pitch
|
i_src1_pitch
)
&
3
)
==
0
)
)
...
...
@@ -668,19 +630,17 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
if
(
p_trans
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
],
p_src2_v
[
i_x
]
);
p32_dst
[
i_x
]
=
(
r
<<
i_rshift
)
+
(
g
<<
i_gshift
)
+
(
b
<<
i_bshift
);
p32_dst
[
i_x
]
=
(
r
<<
i_rshift
)
|
(
g
<<
i_gshift
)
|
(
b
<<
i_bshift
);
}
else
{
...
...
@@ -689,15 +649,9 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
],
p_src2_v
[
i_x
]
);
p32_dst
[
i_x
]
=
(
(
r
*
i_trans
+
(
uint16_t
)((
i_pix_src1
&
i_rmask
)
>>
i_rshift
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
<<
i_rshift
|
(
(
g
*
i_trans
+
(
uint16_t
)((
i_pix_src1
&
i_gmask
)
>>
i_gshift
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
<<
i_gshift
|
(
(
b
*
i_trans
+
(
uint16_t
)((
i_pix_src1
&
i_bmask
)
>>
i_bshift
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
<<
i_bshift
;
p32_dst
[
i_x
]
=
(
vlc_blend
(
r
,
(
i_pix_src1
&
i_rmask
)
>>
i_rshift
,
i_trans
)
<<
i_rshift
)
|
(
vlc_blend
(
g
,
(
i_pix_src1
&
i_gmask
)
>>
i_gshift
,
i_trans
)
<<
i_gshift
)
|
(
vlc_blend
(
b
,
(
i_pix_src1
&
i_bmask
)
>>
i_bshift
,
i_trans
)
<<
i_bshift
);
}
}
}
...
...
@@ -752,13 +706,9 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
if
(
p_trans
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
{
int
i_pos
=
i_x
*
i_pix_pitch
;
const
int
i_pos
=
i_x
*
i_pix_pitch
;
if
(
i_trans
==
MAX_TRANS
)
{
...
...
@@ -780,25 +730,13 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
],
p_src2_v
[
i_x
]
);
p_dst
[
i_rpos
]
=
(
r
*
i_trans
+
(
uint16_t
)
p_src1
[
i_rpos
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_gpos
]
=
(
r
*
i_trans
+
(
uint16_t
)
p_src1
[
i_gpos
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_bpos
]
=
(
r
*
i_trans
+
(
uint16_t
)
p_src1
[
i_gpos
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_rpos
]
=
vlc_blend
(
r
,
p_src1
[
i_rpos
],
i_trans
);
p_dst
[
i_gpos
]
=
vlc_blend
(
g
,
p_src1
[
i_gpos
],
i_trans
);
p_dst
[
i_bpos
]
=
vlc_blend
(
b
,
p_src1
[
i_gpos
],
i_trans
);
}
}
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendYUVPacked
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -863,9 +801,6 @@ static void BlendYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_width
=
(
i_width
>>
1
)
<<
1
;
/* Needs to be a multiple of 2 */
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_trans
+=
i_src2_pitch
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -877,39 +812,15 @@ static void BlendYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
{
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
p_src2_y
[
i_x
];
continue
;
if
(
b_even
)
{
if
(
p_trans
[
i_x
+
1
]
>
0xaa
)
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
p_src2_u
[
i_x
]
+
p_src2_u
[
i_x
+
1
])
>>
1
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
p_src2_v
[
i_x
]
+
p_src2_v
[
i_x
+
1
])
>>
1
;
}
else
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
p_src2_u
[
i_x
];
p_dst
[
i_x
*
2
+
i_v_offset
]
=
p_src2_v
[
i_x
];
}
}
}
else
{
/* Blending */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_l_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_l_offset
]
=
vlc_blend
(
p_src2_y
[
i_x
],
p_src1
[
i_x
*
2
+
i_l_offset
],
i_trans
);
if
(
b_even
)
{
uint16_t
i_u
=
0
;
uint16_t
i_v
=
0
;
int
i_u
;
int
i_v
;
/* FIXME what's with 0xaa ? */
if
(
p_trans
[
i_x
+
1
]
>
0xaa
)
{
i_u
=
(
p_src2_u
[
i_x
]
+
p_src2_u
[
i_x
+
1
])
>>
1
;
...
...
@@ -920,21 +831,11 @@ static void BlendYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_u
=
p_src2_u
[
i_x
];
i_v
=
p_src2_v
[
i_x
];
}
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
(
uint16_t
)
i_u
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_u_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
(
uint16_t
)
i_v
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_v_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
p_dst
[
i_x
*
2
+
i_u_offset
]
=
vlc_blend
(
i_u
,
p_src1
[
i_x
*
2
+
i_u_offset
],
i_trans
);
p_dst
[
i_x
*
2
+
i_v_offset
]
=
vlc_blend
(
i_v
,
p_src1
[
i_x
*
2
+
i_v_offset
],
i_trans
);
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
/***********************************************************************
* I420, YV12
...
...
@@ -990,9 +891,6 @@ static void BlendI420I420( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_in
.
video
.
i_x_offset
/
2
+
p_src
->
p
[
V_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
/
2
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst_y
+=
i_dst_pitch
,
p_src1_y
+=
i_src1_pitch
,
...
...
@@ -1010,32 +908,15 @@ static void BlendI420I420( filter_t *p_filter, picture_t *p_dst,
/* Draw until we reach the end of the line */
for
(
i_x
=
0
;
i_x
<
i_width
;
i_x
++
)
{
if
(
i_alpha
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst_y
[
i_x
]
=
p_src2_y
[
i_x
];
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
p_src2_u
[
i_x
/
2
];
p_dst_v
[
i_x
/
2
]
=
p_src2_v
[
i_x
/
2
];
}
if
(
!
i_alpha
)
continue
;
}
/* Blending */
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
i_alpha
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst_y
[
i_x
]
=
vlc_blend
(
p_src2_y
[
i_x
],
p_src1_y
[
i_x
],
i_alpha
);
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
p_src2_u
[
i_x
/
2
]
*
i_alpha
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst_v
[
i_x
/
2
]
=
(
(
uint16_t
)
p_src2_v
[
i_x
/
2
]
*
i_alpha
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst_u
[
i_x
/
2
]
=
vlc_blend
(
p_src2_u
[
i_x
/
2
],
p_src1_u
[
i_x
/
2
],
i_alpha
);
p_dst_v
[
i_x
/
2
]
=
vlc_blend
(
p_src2_v
[
i_x
/
2
],
p_src1_v
[
i_x
/
2
],
i_alpha
);
}
}
if
(
i_y
%
2
==
1
)
...
...
@@ -1044,11 +925,6 @@ static void BlendI420I420( filter_t *p_filter, picture_t *p_dst,
p_src2_v
+=
i_src2_pitch
/
2
;
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendI420I420_no_alpha
(
filter_t
*
p_filter
,
picture_t
*
p_dst
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
...
...
@@ -1168,9 +1044,6 @@ static void BlendI420R16( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
/
2
+
p_src
->
p
[
V_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
/
2
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -1190,7 +1063,8 @@ static void BlendI420R16( filter_t *p_filter, picture_t *p_dst_pic,
}
/* Blending */
/* FIXME: do the blending */
/* FIXME: do the blending
* FIXME use rgb shifts */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
/
2
],
p_src2_v
[
i_x
/
2
]
);
...
...
@@ -1202,11 +1076,6 @@ static void BlendI420R16( filter_t *p_filter, picture_t *p_dst_pic,
p_src2_v
+=
i_src2_pitch
/
2
;
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendI420R24
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1244,9 +1113,6 @@ static void BlendI420R24( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
/
2
+
p_src
->
p
[
V_PLANE
].
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
/
2
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -1256,31 +1122,16 @@ static void BlendI420R24( filter_t *p_filter, picture_t *p_dst_pic,
/* Draw until we reach the end of the line */
for
(
i_x
=
0
;
i_x
<
i_width
;
i_x
++
)
{
if
(
i_alpha
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
/
2
],
p_src2_v
[
i_x
/
2
]
);
p_dst
[
i_x
*
i_pix_pitch
]
=
r
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
g
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
b
;
if
(
!
i_alpha
)
continue
;
}
/* Blending */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
p_src2_y
[
i_x
],
p_src2_u
[
i_x
/
2
],
p_src2_v
[
i_x
/
2
]
);
p_dst
[
i_x
*
i_pix_pitch
]
=
(
r
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
(
g
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
1
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
(
b
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
2
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
0
]
=
vlc_blend
(
r
,
p_src1
[
i_x
*
i_pix_pitch
+
0
],
i_alpha
);
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
vlc_blend
(
g
,
p_src1
[
i_x
*
i_pix_pitch
+
1
],
i_alpha
);
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
vlc_blend
(
b
,
p_src1
[
i_x
*
i_pix_pitch
+
2
],
i_alpha
);
}
if
(
i_y
%
2
==
1
)
{
...
...
@@ -1288,11 +1139,6 @@ static void BlendI420R24( filter_t *p_filter, picture_t *p_dst_pic,
p_src2_v
+=
i_src2_pitch
/
2
;
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendI420YUVPacked
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1352,9 +1198,6 @@ static void BlendI420YUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_width
&=
~
1
;
/* Needs to be a multiple of 2 */
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -1364,35 +1207,17 @@ static void BlendI420YUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
/* Draw until we reach the end of the line */
for
(
i_x
=
0
;
i_x
<
i_width
;
i_x
++
,
b_even
=
!
b_even
)
{
if
(
i_alpha
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
p_src2_y
[
i_x
];
if
(
!
i_alpha
)
continue
;
if
(
b_even
)
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
p_src2_u
[
i_x
/
2
];
p_dst
[
i_x
*
2
+
i_v_offset
]
=
p_src2_v
[
i_x
/
2
];
}
}
else
{
/* Blending */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_l_offset
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_l_offset
]
=
vlc_blend
(
p_src2_y
[
i_x
],
p_src1
[
i_x
*
2
+
i_l_offset
],
i_alpha
);
if
(
b_even
)
{
uint16_t
i_u
=
p_src2_u
[
i_x
/
2
];
uint16_t
i_v
=
p_src2_v
[
i_x
/
2
];
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
(
uint16_t
)
i_u
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_u_offset
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
(
uint16_t
)
i_v
*
i_alpha
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_v_offset
]
*
(
MAX_TRANS
-
i_alpha
)
)
>>
TRANS_BITS
;
}
p_dst
[
i_x
*
2
+
i_u_offset
]
=
vlc_blend
(
i_u
,
p_src1
[
i_x
*
2
+
i_u_offset
],
i_alpha
);
p_dst
[
i_x
*
2
+
i_v_offset
]
=
vlc_blend
(
i_v
,
p_src1
[
i_x
*
2
+
i_v_offset
],
i_alpha
);
}
}
if
(
i_y
%
2
==
1
)
...
...
@@ -1401,11 +1226,6 @@ static void BlendI420YUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
p_src2_v
+=
i_src2_pitch
/
2
;
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
/***********************************************************************
...
...
@@ -1455,9 +1275,7 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst,
p_src2
=
p_src
->
p
->
p_pixels
+
p_filter
->
fmt_in
.
video
.
i_x_offset
+
i_src2_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
#define p_trans p_src2
const
uint8_t
*
p_trans
=
p_src2
;
#define p_pal p_filter->fmt_in.video.p_palette->palette
/* Draw until we reach the bottom of the subtitle */
...
...
@@ -1476,46 +1294,18 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst,
{
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst_y
[
i_x
]
=
p_pal
[
p_src2
[
i_x
]][
0
];
if
(
b_even_scanline
&&
((
i_x
%
2
)
==
0
)
)
{
p_dst_u
[
i_x
/
2
]
=
p_pal
[
p_src2
[
i_x
]][
1
];
p_dst_v
[
i_x
/
2
]
=
p_pal
[
p_src2
[
i_x
]][
2
];
}
continue
;
}
/* Blending */
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
0
]
*
i_trans
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_y
[
i_x
]
=
vlc_blend
(
p_pal
[
p_src2
[
i_x
]][
0
],
p_src1_y
[
i_x
],
i_trans
);
if
(
b_even_scanline
&&
((
i_x
%
2
)
==
0
)
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
1
]
*
i_trans
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_v
[
i_x
/
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
2
]
*
i_trans
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_u
[
i_x
/
2
]
=
vlc_blend
(
p_pal
[
p_src2
[
i_x
]][
1
],
p_src1_u
[
i_x
/
2
],
i_trans
);
p_dst_v
[
i_x
/
2
]
=
vlc_blend
(
p_pal
[
p_src2
[
i_x
]][
2
],
p_src1_v
[
i_x
/
2
],
i_trans
);
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
#undef p_trans
#undef p_pal
return
;
}
static
void
BlendPalYUVPacked
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1565,9 +1355,7 @@ static void BlendPalYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_width
=
(
i_width
>>
1
)
<<
1
;
/* Needs to be a multiple of 2 */
#define MAX_TRANS 255
#define TRANS_BITS 8
#define p_trans p_src2
const
uint8_t
*
p_trans
=
p_src2
;
#define p_pal p_filter->fmt_in.video.p_palette->palette
/* Draw until we reach the bottom of the subtitle */
...
...
@@ -1579,39 +1367,14 @@ static void BlendPalYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
{
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
p_pal
[
p_src2
[
i_x
]][
0
];
continue
;
if
(
b_even
)
{
if
(
p_trans
[
i_x
+
1
]
>
0xaa
)
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
p_pal
[
p_src2
[
i_x
]][
1
]
+
p_pal
[
p_src2
[
i_x
+
1
]][
1
])
>>
1
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
p_pal
[
p_src2
[
i_x
]][
2
]
+
p_pal
[
p_src2
[
i_x
+
1
]][
2
])
>>
1
;
}
else
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
p_pal
[
p_src2
[
i_x
]][
1
];
p_dst
[
i_x
*
2
+
i_v_offset
]
=
p_pal
[
p_src2
[
i_x
]][
2
];
}
}
}
else
{
/* Blending */
p_dst
[
i_x
*
2
+
i_l_offset
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
0
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_l_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_l_offset
]
=
vlc_blend
(
p_pal
[
p_src2
[
i_x
]][
0
],
p_src1
[
i_x
*
2
+
i_l_offset
],
i_trans
);
if
(
b_even
)
{
uint16_t
i_u
=
0
;
uint16_t
i_v
=
0
;
uint16_t
i_u
;
uint16_t
i_v
;
if
(
p_trans
[
i_x
+
1
]
>
0xaa
)
{
i_u
=
(
p_pal
[
p_src2
[
i_x
]][
1
]
+
p_pal
[
p_src2
[
i_x
+
1
]][
1
])
>>
1
;
...
...
@@ -1623,23 +1386,12 @@ static void BlendPalYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_v
=
p_pal
[
p_src2
[
i_x
]][
2
];
}
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
(
uint16_t
)
i_u
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_u_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
(
uint16_t
)
i_v
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_v_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_u_offset
]
=
vlc_blend
(
i_u
,
p_src1
[
i_x
*
2
+
i_u_offset
],
i_trans
);
p_dst
[
i_x
*
2
+
i_v_offset
]
=
vlc_blend
(
i_v
,
p_src1
[
i_x
*
2
+
i_v_offset
],
i_trans
);
}
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
#undef p_trans
#undef p_pal
return
;
}
static
void
BlendPalRV
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1668,9 +1420,7 @@ static void BlendPalRV( filter_t *p_filter, picture_t *p_dst_pic,
p_src2
=
p_src
->
p
->
p_pixels
+
p_filter
->
fmt_in
.
video
.
i_x_offset
+
i_src2_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
#define p_trans p_src2
const
uint8_t
*
p_trans
=
p_src2
;
#define p_pal p_filter->fmt_in.video.p_palette->palette
#define rgbpal rgbpalette.palette
...
...
@@ -1700,43 +1450,29 @@ static void BlendPalRV( filter_t *p_filter, picture_t *p_dst_pic,
{
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
||
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
if
(
i_trans
==
MAX_TRANS
||
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
{
/* FIXME implement blending for RV16 */
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
i_pix_pitch
]
=
rgbpal
[
p_src2
[
i_x
]][
0
];
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
rgbpal
[
p_src2
[
i_x
]][
1
];
if
(
p_filter
->
fmt_out
.
video
.
i_chroma
!=
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
if
(
p_filter
->
fmt_out
.
video
.
i_chroma
!=
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
rgbpal
[
p_src2
[
i_x
]][
2
];
continue
;
}
/* Blending */
p_dst
[
i_x
*
i_pix_pitch
]
=
(
(
uint16_t
)
rgbpal
[
p_src2
[
i_x
]][
0
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
(
(
uint16_t
)
rgbpal
[
p_src2
[
i_x
]][
1
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
1
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
(
(
uint16_t
)
rgbpal
[
p_src2
[
i_x
]][
2
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
0
]
=
vlc_blend
(
rgbpal
[
p_src2
[
i_x
]][
0
],
p_src1
[
i_x
*
i_pix_pitch
+
0
],
i_trans
);
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
vlc_blend
(
rgbpal
[
p_src2
[
i_x
]][
1
],
p_src1
[
i_x
*
i_pix_pitch
+
1
],
i_trans
);
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
vlc_blend
(
rgbpal
[
p_src2
[
i_x
]][
2
],
p_src1
[
i_x
*
i_pix_pitch
+
2
],
i_trans
);
}
}
#undef MAX_TRANS
#undef TRANS_BITS
#undef p_trans
#undef p_pal
#undef rgbpal
return
;
}
/***********************************************************************
...
...
@@ -1792,9 +1528,6 @@ static void BlendRGBAI420( filter_t *p_filter, picture_t *p_dst,
p_src
->
p
->
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst_y
+=
i_dst_pitch
,
p_src1_y
+=
i_src1_pitch
,
...
...
@@ -1814,49 +1547,22 @@ static void BlendRGBAI420( filter_t *p_filter, picture_t *p_dst,
#define B ( p_src2[i_x * i_src_pix_pitch + 2] )
i_trans
=
(
p_src2
[
i_x
*
i_src_pix_pitch
+
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
rgb_to_yuv
(
&
y
,
&
u
,
&
v
,
R
,
G
,
B
);
p_dst_y
[
i_x
]
=
y
;
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
u
;
p_dst_v
[
i_x
/
2
]
=
v
;
}
continue
;
}
/* Blending */
rgb_to_yuv
(
&
y
,
&
u
,
&
v
,
R
,
G
,
B
);
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
y
*
i_trans
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_y
[
i_x
]
=
vlc_blend
(
y
,
p_src1_y
[
i_x
],
i_trans
);
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
u
*
i_trans
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_v
[
i_x
/
2
]
=
(
(
uint16_t
)
v
*
i_trans
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst_u
[
i_x
/
2
]
=
vlc_blend
(
u
,
p_src1_u
[
i_x
/
2
],
i_trans
);
p_dst_v
[
i_x
/
2
]
=
vlc_blend
(
v
,
p_src1_v
[
i_x
/
2
],
i_trans
);
}
#undef R
#undef G
#undef B
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendRGBAR24
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1887,9 +1593,6 @@ static void BlendRGBAR24( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
*
i_pix_pitch
+
p_src
->
p
->
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
p_src2
+=
i_src2_pitch
)
...
...
@@ -1902,39 +1605,17 @@ static void BlendRGBAR24( filter_t *p_filter, picture_t *p_dst_pic,
#define B ( p_src2[i_x * i_src_pix_pitch + 2] )
i_trans
=
(
p_src2
[
i_x
*
i_src_pix_pitch
+
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
i_pix_pitch
+
0
]
=
R
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
G
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
B
;
continue
;
}
/* Blending */
p_dst
[
i_x
*
i_pix_pitch
+
0
]
=
(
R
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
0
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
(
G
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
1
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
(
B
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
0
]
=
vlc_blend
(
R
,
p_src1
[
i_x
*
i_pix_pitch
+
0
],
i_trans
);
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
vlc_blend
(
G
,
p_src1
[
i_x
*
i_pix_pitch
+
1
],
i_trans
);
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
vlc_blend
(
B
,
p_src1
[
i_x
*
i_pix_pitch
+
2
],
i_trans
);
#undef R
#undef G
#undef B
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendRGBAR16
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -1966,9 +1647,6 @@ static void BlendRGBAR16( filter_t *p_filter, picture_t *p_dst_pic,
p_filter
->
fmt_in
.
video
.
i_x_offset
*
i_pix_pitch
+
p_src
->
p
->
i_pitch
*
p_filter
->
fmt_in
.
video
.
i_y_offset
;
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
p_src2
+=
i_src2_pitch
)
...
...
@@ -1981,10 +1659,8 @@ static void BlendRGBAR16( filter_t *p_filter, picture_t *p_dst_pic,
#define B ( p_src2[i_x * i_src_pix_pitch + 2] )
i_trans
=
(
p_src2
[
i_x
*
i_src_pix_pitch
+
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
...
...
@@ -1995,25 +1671,14 @@ static void BlendRGBAR16( filter_t *p_filter, picture_t *p_dst_pic,
/* Blending */
i_pix
=
*
((
uint16_t
*
)(
&
p_dst
[
i_x
*
i_pix_pitch
]));
*
((
uint16_t
*
)(
&
p_dst
[
i_x
*
i_pix_pitch
]))
=
(
(
(
(
R
>>
3
)
*
i_trans
+
(
i_pix
>>
11
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
<<
11
)
|
(
(
(
(
G
>>
2
)
*
i_trans
+
((
i_pix
&
0x07e0
)
>>
5
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
<<
5
)
|
(
(
(
(
B
>>
3
)
*
i_trans
+
(
i_pix
&
0x001f
)
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
)
);
(
vlc_blend
(
R
>>
3
,
((
i_pix
)
>>
11
),
i_trans
)
<<
11
)
|
(
vlc_blend
(
G
>>
2
,
((
i_pix
&
0x07e0
)
>>
5
),
i_trans
)
<<
5
)
|
(
vlc_blend
(
B
>>
3
,
((
i_pix
&
0x001f
)
),
i_trans
)
);
#undef R
#undef G
#undef B
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
static
void
BlendRGBAYUVPacked
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
...
...
@@ -2069,9 +1734,6 @@ static void BlendRGBAYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
i_width
=
(
i_width
>>
1
)
<<
1
;
/* Needs to be a multiple of 2 */
#define MAX_TRANS 255
#define TRANS_BITS 8
/* Draw until we reach the bottom of the subtitle */
for
(
i_y
=
0
;
i_y
<
i_height
;
i_y
++
,
p_trans
+=
i_src2_pitch
,
p_dst
+=
i_dst_pitch
,
p_src1
+=
i_src1_pitch
,
...
...
@@ -2085,44 +1747,16 @@ static void BlendRGBAYUVPacked( filter_t *p_filter, picture_t *p_dst_pic,
#define B ( p_src2[i_x * i_src_pix_pitch + 2] )
i_trans
=
(
p_src2
[
i_x
*
i_src_pix_pitch
+
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
rgb_to_yuv
(
&
y
,
&
u
,
&
v
,
R
,
G
,
B
);
p_dst
[
i_x
*
2
+
i_l_offset
]
=
y
;
continue
;
if
(
b_even
)
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
u
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
v
;
}
}
else
{
/* Blending */
rgb_to_yuv
(
&
y
,
&
u
,
&
v
,
R
,
G
,
B
);
p_dst
[
i_x
*
2
+
i_l_offset
]
=
(
(
uint16_t
)
y
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_l_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_l_offset
]
=
vlc_blend
(
y
,
p_src1
[
i_x
*
2
+
i_l_offset
],
i_trans
);
if
(
b_even
)
{
p_dst
[
i_x
*
2
+
i_u_offset
]
=
(
(
uint16_t
)
u
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_u_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
i_v_offset
]
=
(
(
uint16_t
)
v
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
i_v_offset
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
p_dst
[
i_x
*
2
+
i_u_offset
]
=
vlc_blend
(
u
,
p_src1
[
i_x
*
2
+
i_u_offset
],
i_trans
);
p_dst
[
i_x
*
2
+
i_v_offset
]
=
vlc_blend
(
v
,
p_src1
[
i_x
*
2
+
i_v_offset
],
i_trans
);
}
}
}
#undef MAX_TRANS
#undef TRANS_BITS
return
;
}
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