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
d36e5c73
Commit
d36e5c73
authored
Nov 06, 2004
by
Yoann Peronneau
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/video_filter/blend.c: added an i_alpha parameter for blending
parent
d1fa3fae
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
105 additions
and
98 deletions
+105
-98
include/vlc_filter.h
include/vlc_filter.h
+1
-1
modules/video_filter/blend.c
modules/video_filter/blend.c
+101
-95
modules/video_filter/logo.c
modules/video_filter/logo.c
+2
-1
src/video_output/vout_subpictures.c
src/video_output/vout_subpictures.c
+1
-1
No files found.
include/vlc_filter.h
View file @
d36e5c73
...
...
@@ -55,7 +55,7 @@ struct filter_t
block_t
*
(
*
pf_audio_filter
)
(
filter_t
*
,
block_t
*
);
void
(
*
pf_video_blend
)
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
);
int
,
int
,
int
);
subpicture_t
*
(
*
pf_sub_filter
)
(
filter_t
*
,
mtime_t
);
subpicture_t
*
(
*
pf_render_string
)
(
filter_t
*
,
block_t
*
);
...
...
modules/video_filter/blend.c
View file @
d36e5c73
...
...
@@ -42,22 +42,23 @@ struct filter_sys_t
static
int
OpenFilter
(
vlc_object_t
*
);
static
void
CloseFilter
(
vlc_object_t
*
);
/* TODO i_alpha support for BlendR16 */
static
void
Blend
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
);
int
,
int
,
int
);
static
void
BlendI420
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendR16
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendR24
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendYUY2
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendPalI420
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendPalYUY2
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
static
void
BlendPalRV
(
filter_t
*
,
picture_t
*
,
picture_t
*
,
picture_t
*
,
int
,
int
,
int
,
int
);
int
,
int
,
int
,
int
,
int
);
/*****************************************************************************
* Module descriptor
...
...
@@ -116,7 +117,7 @@ static int OpenFilter( vlc_object_t *p_this )
****************************************************************************/
static
void
Blend
(
filter_t
*
p_filter
,
picture_t
*
p_dst
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
)
int
i_x_offset
,
int
i_y_offset
,
int
i_alpha
)
{
int
i_width
,
i_height
;
...
...
@@ -133,21 +134,21 @@ static void Blend( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
)
)
)
{
BlendI420
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
)
&&
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
)
)
{
BlendYUY2
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
)
&&
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
{
BlendR16
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'A'
)
&&
...
...
@@ -155,7 +156,7 @@ static void Blend( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
)
)
)
{
BlendR24
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
&&
...
...
@@ -163,14 +164,14 @@ static void Blend( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
)
)
)
{
BlendPalI420
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
&&
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
)
)
{
BlendPalYUY2
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
if
(
p_filter
->
fmt_in
.
video
.
i_chroma
==
VLC_FOURCC
(
'Y'
,
'U'
,
'V'
,
'P'
)
&&
...
...
@@ -179,7 +180,7 @@ static void Blend( filter_t *p_filter, picture_t *p_dst,
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
)
)
)
{
BlendPalRV
(
p_filter
,
p_dst
,
p_dst_orig
,
p_src
,
i_x_offset
,
i_y_offset
,
i_width
,
i_height
);
i_x_offset
,
i_y_offset
,
i_width
,
i_height
,
i_alpha
);
return
;
}
...
...
@@ -189,14 +190,14 @@ static void Blend( filter_t *p_filter, picture_t *p_dst,
static
void
BlendI420
(
filter_t
*
p_filter
,
picture_t
*
p_dst
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_src1_y
,
*
p_src2_y
,
*
p_dst_y
;
uint8_t
*
p_src1_u
,
*
p_src2_u
,
*
p_dst_u
;
uint8_t
*
p_src1_v
,
*
p_src2_v
,
*
p_dst_v
;
uint8_t
*
p_trans
;
int
i_x
,
i_y
;
int
i_x
,
i_y
,
i_trans
;
vlc_bool_t
b_even_scanline
=
i_y_offset
%
2
;
i_dst_pitch
=
p_dst
->
p
[
Y_PLANE
].
i_pitch
;
...
...
@@ -261,12 +262,13 @@ static void BlendI420( 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
(
!
p_trans
[
i_x
]
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
p_trans
[
i_x
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst_y
[
i_x
]
=
p_src2_y
[
i_x
];
...
...
@@ -280,17 +282,17 @@ static void BlendI420( filter_t *p_filter, picture_t *p_dst,
}
/* Blending */
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
p_trans
[
i_x
]
)
)
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
;
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
p_src2_u
[
i_x
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
p_trans
[
i_x
]
)
)
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
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
p_trans
[
i_x
]
)
)
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
;
}
}
...
...
@@ -328,7 +330,7 @@ static inline void yuv_to_rgb( int *r, int *g, int *b,
static
void
BlendR16
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_dst
,
*
p_src1
,
*
p_src2_y
;
...
...
@@ -409,13 +411,13 @@ static void BlendR16( filter_t *p_filter, picture_t *p_dst_pic,
static
void
BlendR24
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_dst
,
*
p_src1
,
*
p_src2_y
;
uint8_t
*
p_src2_u
,
*
p_src2_v
;
uint8_t
*
p_trans
;
int
i_x
,
i_y
,
i_pix_pitch
;
int
i_x
,
i_y
,
i_pix_pitch
,
i_trans
;
int
r
,
g
,
b
;
i_pix_pitch
=
p_dst_pic
->
p
->
i_pixel_pitch
;
...
...
@@ -458,12 +460,13 @@ static void BlendR24( 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
(
!
p_trans
[
i_x
]
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
p_trans
[
i_x
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
yuv_to_rgb
(
&
r
,
&
g
,
&
b
,
...
...
@@ -479,15 +482,15 @@ 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_x
*
i_pix_pitch
]
=
(
r
*
p_trans
[
i_x
]
+
p_dst
[
i_x
*
i_pix_pitch
]
=
(
r
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
]
*
(
MAX_TRANS
-
p_trans
[
i_x
]
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
1
]
=
(
g
*
p_trans
[
i_x
]
+
(
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
-
p_trans
[
i_x
]
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
i_pix_pitch
+
2
]
=
(
b
*
p_trans
[
i_x
]
+
(
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
-
p_trans
[
i_x
]
)
)
>>
TRANS_BITS
;
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
}
...
...
@@ -500,13 +503,13 @@ static void BlendR24( filter_t *p_filter, picture_t *p_dst_pic,
static
void
BlendYUY2
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_dst
,
*
p_src1
,
*
p_src2_y
;
uint8_t
*
p_src2_u
,
*
p_src2_v
;
uint8_t
*
p_trans
;
int
i_x
,
i_y
,
i_pix_pitch
;
int
i_x
,
i_y
,
i_pix_pitch
,
i_trans
;
i_pix_pitch
=
2
;
i_dst_pitch
=
p_dst_pic
->
p
->
i_pitch
;
...
...
@@ -548,11 +551,12 @@ static void BlendYUY2( 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
+=
2
)
{
if
(
!
p_trans
[
i_x
]
)
i_trans
=
(
p_trans
[
i_x
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
p_trans
[
i_x
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
]
=
p_src2_y
[
i_x
];
...
...
@@ -562,22 +566,23 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic,
else
{
/* Blending */
p_dst
[
i_x
*
2
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
]
*
(
MAX_TRANS
-
p_trans
[
i_x
])
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
1
]
=
(
(
uint16_t
)
p_src2_u
[
i_x
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
1
]
*
(
MAX_TRANS
-
p_trans
[
i_x
])
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
3
]
=
(
(
uint16_t
)
p_src2_v
[
i_x
]
*
p_trans
[
i_x
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
3
]
*
(
MAX_TRANS
-
p_trans
[
i_x
])
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
1
]
=
(
(
uint16_t
)
p_src2_u
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
1
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
3
]
=
(
(
uint16_t
)
p_src2_v
[
i_x
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
3
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
if
(
!
p_trans
[
i_x
+
1
]
)
i_trans
=
(
p_trans
[
i_x
+
1
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
p_trans
[
i_x
+
1
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
+
2
]
=
p_src2_y
[
i_x
+
1
];
...
...
@@ -585,9 +590,9 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic,
else
{
/* Blending */
p_dst
[
i_x
*
2
+
2
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
+
1
]
*
p_trans
[
i_x
+
1
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
2
]
*
(
MAX_TRANS
-
p_trans
[
i_x
+
1
])
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
2
]
=
(
(
uint16_t
)
p_src2_y
[
i_x
+
1
]
*
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
}
}
...
...
@@ -601,13 +606,13 @@ static void BlendYUY2( filter_t *p_filter, picture_t *p_dst_pic,
static
void
BlendPalI420
(
filter_t
*
p_filter
,
picture_t
*
p_dst
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_src1_y
,
*
p_src2
,
*
p_dst_y
;
uint8_t
*
p_src1_u
,
*
p_dst_u
;
uint8_t
*
p_src1_v
,
*
p_dst_v
;
int
i_x
,
i_y
;
int
i_x
,
i_y
,
i_trans
;
vlc_bool_t
b_even_scanline
=
i_y_offset
%
2
;
i_dst_pitch
=
p_dst
->
p
[
Y_PLANE
].
i_pitch
;
...
...
@@ -661,12 +666,13 @@ static void BlendPalI420( 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
(
!
p_pal
[
p_trans
[
i_x
]][
3
]
)
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
p_pal
[
p_trans
[
i_x
]][
3
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst_y
[
i_x
]
=
p_pal
[
p_src2
[
i_x
]][
0
];
...
...
@@ -680,18 +686,18 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst,
}
/* Blending */
p_dst_y
[
i_x
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
0
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1_y
[
i_x
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
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
;
if
(
b_even_scanline
&&
i_x
%
2
==
0
)
{
p_dst_u
[
i_x
/
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
1
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1_u
[
i_x
/
2
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
p_dst_v
[
i_x
/
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
2
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1_v
[
i_x
/
2
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
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
;
}
}
}
...
...
@@ -707,11 +713,11 @@ static void BlendPalI420( filter_t *p_filter, picture_t *p_dst,
static
void
BlendPalYUY2
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_src1
,
*
p_src2
,
*
p_dst
;
int
i_x
,
i_y
,
i_pix_pitch
;
int
i_x
,
i_y
,
i_pix_pitch
,
i_trans
;
i_pix_pitch
=
2
;
i_dst_pitch
=
p_dst_pic
->
p
->
i_pitch
;
...
...
@@ -740,11 +746,12 @@ static void BlendPalYUY2( 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
+=
2
)
{
if
(
!
p_pal
[
p_trans
[
i_x
]][
3
]
)
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
p_pal
[
p_trans
[
i_x
]][
3
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
]
=
p_pal
[
p_src2
[
i_x
]][
0
];
...
...
@@ -755,21 +762,22 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic,
{
/* Blending */
p_dst
[
i_x
*
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
0
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
]
)
)
>>
TRANS_BITS
;
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
1
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
1
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
1
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
]
)
)
>>
TRANS_BITS
;
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
1
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
p_dst
[
i_x
*
2
+
3
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
]][
2
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
3
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
]
)
)
>>
TRANS_BITS
;
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
3
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
if
(
!
p_pal
[
p_trans
[
i_x
+
1
]][
3
]
)
i_trans
=
(
p_pal
[
p_trans
[
i_x
+
1
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
}
else
if
(
p_pal
[
p_trans
[
i_x
+
1
]][
3
]
==
MAX_TRANS
)
else
if
(
i_trans
==
MAX_TRANS
)
{
/* Completely opaque. Completely overwrite underlying pixel */
p_dst
[
i_x
*
2
+
2
]
=
p_pal
[
p_src2
[
i_x
+
1
]][
0
];
...
...
@@ -778,8 +786,8 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic,
{
/* Blending */
p_dst
[
i_x
*
2
+
2
]
=
(
(
uint16_t
)
p_pal
[
p_src2
[
i_x
+
1
]][
0
]
*
p_pal
[
p_trans
[
i_x
+
1
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
2
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
+
1
]][
3
]
)
)
>>
TRANS_BITS
;
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
2
+
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
}
}
...
...
@@ -795,11 +803,11 @@ static void BlendPalYUY2( filter_t *p_filter, picture_t *p_dst_pic,
static
void
BlendPalRV
(
filter_t
*
p_filter
,
picture_t
*
p_dst_pic
,
picture_t
*
p_dst_orig
,
picture_t
*
p_src
,
int
i_x_offset
,
int
i_y_offset
,
int
i_width
,
int
i_height
)
int
i_width
,
int
i_height
,
int
i_alpha
)
{
int
i_src1_pitch
,
i_src2_pitch
,
i_dst_pitch
;
uint8_t
*
p_src1
,
*
p_src2
,
*
p_dst
;
int
i_x
,
i_y
,
i_pix_pitch
;
int
i_x
,
i_y
,
i_pix_pitch
,
i_trans
;
int
r
,
g
,
b
;
video_palette_t
rgbpalette
;
...
...
@@ -848,12 +856,13 @@ static void BlendPalRV( 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
(
!
p_pal
[
p_trans
[
i_x
]][
3
]
)
i_trans
=
(
p_pal
[
p_trans
[
i_x
]][
3
]
*
i_alpha
)
/
255
;
if
(
!
i_trans
)
{
/* Completely transparent. Don't change pixel */
continue
;
}
else
if
(
p_pal
[
p_trans
[
i_x
]][
3
]
==
MAX_TRANS
||
else
if
(
i_trans
==
MAX_TRANS
||
p_filter
->
fmt_out
.
video
.
i_chroma
==
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
)
)
{
...
...
@@ -868,17 +877,14 @@ static void BlendPalRV( filter_t *p_filter, picture_t *p_dst_pic,
/* Blending */
p_dst
[
i_x
*
i_pix_pitch
]
=
(
(
uint16_t
)
rgbpal
[
p_src2
[
i_x
]][
0
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
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
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
1
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
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
]
*
p_pal
[
p_trans
[
i_x
]][
3
]
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
2
]
*
(
MAX_TRANS
-
p_pal
[
p_trans
[
i_x
]][
3
])
)
>>
TRANS_BITS
;
i_trans
+
(
uint16_t
)
p_src1
[
i_x
*
i_pix_pitch
+
2
]
*
(
MAX_TRANS
-
i_trans
)
)
>>
TRANS_BITS
;
}
}
...
...
modules/video_filter/logo.c
View file @
d36e5c73
...
...
@@ -441,7 +441,8 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
vout_DatePicture
(
p_sys
->
p_vout
,
p_outpic
,
p_pic
->
date
);
p_sys
->
p_blend
->
pf_video_blend
(
p_sys
->
p_blend
,
p_outpic
,
p_outpic
,
p_sys
->
p_pic
,
p_sys
->
posx
,
p_sys
->
posy
);
p_sys
->
p_pic
,
p_sys
->
posx
,
p_sys
->
posy
,
255
);
vout_DisplayPicture
(
p_sys
->
p_vout
,
p_outpic
);
}
...
...
src/video_output/vout_subpictures.c
View file @
d36e5c73
...
...
@@ -725,7 +725,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
p_fmt
->
i_height
;
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
);
p_pic_src
,
&
p_region
->
picture
,
i_x_offset
,
i_y_offset
,
255
);
p_region
=
p_region
->
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