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
de53ab42
Commit
de53ab42
authored
May 06, 2010
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Used subpicture_updater_t for vout_OSDSlider/Icon.
parent
2991f900
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
232 additions
and
281 deletions
+232
-281
src/video_output/video_widgets.c
src/video_output/video_widgets.c
+232
-281
No files found.
src/video_output/video_widgets.c
View file @
de53ab42
...
...
@@ -5,6 +5,7 @@
* $Id$
*
* Author: Yoann Peronneau <yoann@videolan.org>
* Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -35,339 +36,289 @@
#include <vlc_filter.h>
/* TODO remove access to private vout data */
#include "vout_internal.h"
#define STYLE_EMPTY 0
#define STYLE_FILLED 1
/**
***************************************************************************
* Draws a rectangle at the given position in the
subpic
.
/**
* Draws a rectangle at the given position in the
region
.
* It may be filled (fill == STYLE_FILLED) or empty (fill == STYLE_EMPTY).
*
****************************************************************************
/
static
void
DrawRect
(
subpicture_t
*
p_subpic
,
int
i_x1
,
int
i_y1
,
int
i_x2
,
int
i_y2
,
short
fill
)
*/
static
void
DrawRect
(
subpicture_region_t
*
r
,
int
fill
,
int
x1
,
int
y1
,
int
x2
,
int
y2
)
{
int
x
,
y
;
uint8_t
*
p_a
=
p_subpic
->
p_region
->
p_picture
->
A_PIXELS
;
int
i_pitch
=
p_subpic
->
p_region
->
p_picture
->
Y_PITCH
;
if
(
fill
==
STYLE_FILLED
)
{
for
(
y
=
i_y1
;
y
<=
i_y2
;
y
++
)
{
for
(
x
=
i_x1
;
x
<=
i_x2
;
x
++
)
{
p_a
[
x
+
i_pitch
*
y
]
=
0xff
;
}
}
uint8_t
*
a
=
r
->
p_picture
->
A_PIXELS
;
int
pitch
=
r
->
p_picture
->
A_PITCH
;
if
(
fill
==
STYLE_FILLED
)
{
for
(
int
y
=
y1
;
y
<=
y2
;
y
++
)
{
for
(
int
x
=
x1
;
x
<=
x2
;
x
++
)
a
[
x
+
pitch
*
y
]
=
0xff
;
}
else
{
for
(
y
=
i_y1
;
y
<=
i_y2
;
y
++
)
{
p_a
[
i_x1
+
i_pitch
*
y
]
=
0xff
;
p_a
[
i_x2
+
i_pitch
*
y
]
=
0xff
;
}
else
{
for
(
int
y
=
y1
;
y
<=
y2
;
y
++
)
{
a
[
x1
+
pitch
*
y
]
=
0xff
;
a
[
x2
+
pitch
*
y
]
=
0xff
;
}
for
(
x
=
i_x1
;
x
<=
i_x2
;
x
++
)
{
p_a
[
x
+
i_pitch
*
i_y1
]
=
0xff
;
p_a
[
x
+
i_pitch
*
i_y2
]
=
0xff
;
for
(
int
x
=
x1
;
x
<=
x2
;
x
++
)
{
a
[
x
+
pitch
*
y1
]
=
0xff
;
a
[
x
+
pitch
*
y2
]
=
0xff
;
}
}
}
/**
***************************************************************************
* Draws a triangle at the given position in the
subpic
.
/**
* Draws a triangle at the given position in the
region
.
* It may be filled (fill == STYLE_FILLED) or empty (fill == STYLE_EMPTY).
*
****************************************************************************
/
static
void
DrawTriangle
(
subpicture_t
*
p_subpic
,
int
i_x1
,
int
i_y1
,
int
i_x2
,
int
i_y2
,
short
fill
)
*/
static
void
DrawTriangle
(
subpicture_region_t
*
r
,
int
fill
,
int
x1
,
int
y1
,
int
x2
,
int
y2
)
{
int
x
,
y
,
i_mid
,
h
;
uint8_t
*
p_a
=
p_subpic
->
p_region
->
p_picture
->
A_PIXELS
;
int
i_pitch
=
p_subpic
->
p_region
->
p_picture
->
Y_PITCH
;
i_mid
=
i_y1
+
(
(
i_y2
-
i_y1
)
>>
1
);
if
(
i_x2
>=
i_x1
)
{
if
(
fill
==
STYLE_FILLED
)
{
for
(
y
=
i_y1
;
y
<=
i_mid
;
y
++
)
{
h
=
y
-
i_y1
;
for
(
x
=
i_x1
;
x
<=
i_x1
+
h
&&
x
<=
i_x2
;
x
++
)
{
p_a
[
x
+
i_pitch
*
y
]
=
0xff
;
p_a
[
x
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
uint8_t
*
a
=
r
->
p_picture
->
A_PIXELS
;
int
pitch
=
r
->
p_picture
->
A_PITCH
;
const
int
mid
=
y1
+
(
y2
-
y1
)
/
2
;
/* TODO factorize it */
if
(
x2
>=
x1
)
{
if
(
fill
==
STYLE_FILLED
)
{
for
(
int
y
=
y1
;
y
<=
mid
;
y
++
)
{
int
h
=
y
-
y1
;
for
(
int
x
=
x1
;
x
<=
x1
+
h
&&
x
<=
x2
;
x
++
)
{
a
[
x
+
pitch
*
y
]
=
0xff
;
a
[
x
+
pitch
*
(
y2
-
h
)]
=
0xff
;
}
}
}
else
{
for
(
int
y
=
y1
;
y
<=
mid
;
y
++
)
{
int
h
=
y
-
y1
;
a
[
x1
+
pitch
*
y
]
=
0xff
;
a
[
x1
+
h
+
pitch
*
y
]
=
0xff
;
a
[
x1
+
pitch
*
(
y2
-
h
)]
=
0xff
;
a
[
x1
+
h
+
pitch
*
(
y2
-
h
)]
=
0xff
;
}
else
{
for
(
y
=
i_y1
;
y
<=
i_mid
;
y
++
)
{
h
=
y
-
i_y1
;
p_a
[
i_x1
+
i_pitch
*
y
]
=
0xff
;
p_a
[
i_x1
+
h
+
i_pitch
*
y
]
=
0xff
;
p_a
[
i_x1
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
p_a
[
i_x1
+
h
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
}
}
}
else
{
if
(
fill
==
STYLE_FILLED
)
{
for
(
y
=
i_y1
;
y
<=
i_mid
;
y
++
)
{
h
=
y
-
i_y1
;
for
(
x
=
i_x1
;
x
>=
i_x1
-
h
&&
x
>=
i_x2
;
x
--
)
{
p_a
[
x
+
i_pitch
*
y
]
=
0xff
;
p_a
[
x
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
}
}
else
{
if
(
fill
==
STYLE_FILLED
)
{
for
(
int
y
=
y1
;
y
<=
mid
;
y
++
)
{
int
h
=
y
-
y1
;
for
(
int
x
=
x1
;
x
>=
x1
-
h
&&
x
>=
x2
;
x
--
)
{
a
[
x
+
pitch
*
y
]
=
0xff
;
a
[
x
+
pitch
*
(
y2
-
h
)]
=
0xff
;
}
}
else
{
for
(
y
=
i_y1
;
y
<=
i_mid
;
y
++
)
{
h
=
y
-
i_y1
;
p_a
[
i_x1
+
i_pitch
*
y
]
=
0xff
;
p_a
[
i_x1
-
h
+
i_pitch
*
y
]
=
0xff
;
p_a
[
i_x1
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
p_a
[
i_x1
-
h
+
i_pitch
*
(
i_y2
-
h
)
]
=
0xff
;
}
else
{
for
(
int
y
=
y1
;
y
<=
mid
;
y
++
)
{
int
h
=
y
-
y1
;
a
[
x1
+
pitch
*
y
]
=
0xff
;
a
[
x1
-
h
+
pitch
*
y
]
=
0xff
;
a
[
x1
+
pitch
*
(
y2
-
h
)]
=
0xff
;
a
[
x1
-
h
+
pitch
*
(
y2
-
h
)]
=
0xff
;
}
}
}
}
/*****************************************************************************
* Create Picture: creates subpicture region and picture
*****************************************************************************/
static
int
CreatePicture
(
subpicture_t
*
p_subpic
,
int
i_x
,
int
i_y
,
int
i_width
,
int
i_height
)
/**
* Create a region with a white transparent picture.
*/
static
subpicture_region_t
*
OSDRegion
(
int
x
,
int
y
,
int
width
,
int
height
)
{
uint8_t
*
p_y
,
*
p_u
,
*
p_v
,
*
p_a
;
video_format_t
fmt
;
int
i_pitch
;
/* Create a new subpicture region */
memset
(
&
fmt
,
0
,
sizeof
(
video_format_t
)
);
fmt
.
i_chroma
=
VLC_CODEC_YUVA
;
fmt
.
i_width
=
fmt
.
i_visible_width
=
i_width
;
fmt
.
i_height
=
fmt
.
i_visible_height
=
i_height
;
fmt
.
i_x_offset
=
fmt
.
i_y_offset
=
0
;
p_subpic
->
p_region
=
subpicture_region_New
(
&
fmt
);
if
(
!
p_subpic
->
p_region
)
return
VLC_EGENERIC
;
p_subpic
->
p_region
->
i_x
=
i_x
;
p_subpic
->
p_region
->
i_y
=
i_y
;
p_y
=
p_subpic
->
p_region
->
p_picture
->
Y_PIXELS
;
p_u
=
p_subpic
->
p_region
->
p_picture
->
U_PIXELS
;
p_v
=
p_subpic
->
p_region
->
p_picture
->
V_PIXELS
;
p_a
=
p_subpic
->
p_region
->
p_picture
->
A_PIXELS
;
i_pitch
=
p_subpic
->
p_region
->
p_picture
->
Y_PITCH
;
/* Initialize the region pixels (only the alpha will be changed later) */
memset
(
p_y
,
0xff
,
i_pitch
*
p_subpic
->
p_region
->
fmt
.
i_height
);
memset
(
p_u
,
0x80
,
i_pitch
*
p_subpic
->
p_region
->
fmt
.
i_height
);
memset
(
p_v
,
0x80
,
i_pitch
*
p_subpic
->
p_region
->
fmt
.
i_height
);
memset
(
p_a
,
0x00
,
i_pitch
*
p_subpic
->
p_region
->
fmt
.
i_height
);
return
VLC_SUCCESS
;
video_format_Init
(
&
fmt
,
VLC_CODEC_YUVA
);
fmt
.
i_width
=
fmt
.
i_visible_width
=
width
;
fmt
.
i_height
=
fmt
.
i_visible_height
=
height
;
fmt
.
i_sar_num
=
0
;
fmt
.
i_sar_den
=
1
;
subpicture_region_t
*
r
=
subpicture_region_New
(
&
fmt
);
if
(
!
r
)
return
NULL
;
r
->
i_x
=
x
;
r
->
i_y
=
y
;
for
(
int
i
=
0
;
i
<
r
->
p_picture
->
i_planes
;
i
++
)
{
plane_t
*
p
=
&
r
->
p_picture
->
p
[
i
];
int
colors
[
PICTURE_PLANE_MAX
]
=
{
0xff
,
0x80
,
0x80
,
0x00
};
memset
(
p
->
p_pixels
,
colors
[
i
],
p
->
i_pitch
*
height
);
}
return
r
;
}
/*****************************************************************************
* Creates and initializes an OSD widget.
*****************************************************************************/
static
subpicture_t
*
CreateWidget
(
int
i_channel
)
/**
* Create the region for an OSD slider.
* Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER.
*/
static
subpicture_region_t
*
OSDSlider
(
int
type
,
int
position
,
const
video_format_t
*
fmt
)
{
subpicture_t
*
p_subpic
;
mtime_t
i_now
=
mdate
();
/* Create and initialize a subpicture */
p_subpic
=
subpicture_New
(
NULL
);
if
(
p_subpic
==
NULL
)
return
NULL
;
const
int
size
=
__MAX
(
fmt
->
i_visible_width
,
fmt
->
i_visible_height
);
const
int
margin
=
size
*
0
.
10
;
p_subpic
->
i_channel
=
i_channel
;
p_subpic
->
i_start
=
i_now
;
p_subpic
->
i_stop
=
i_now
+
1200000
;
p_subpic
->
b_ephemer
=
true
;
p_subpic
->
b_fade
=
true
;
int
x
,
y
;
int
width
,
height
;
if
(
type
==
OSD_HOR_SLIDER
)
{
width
=
__MAX
(
fmt
->
i_visible_width
-
2
*
margin
,
1
);
height
=
__MAX
(
fmt
->
i_visible_height
*
0
.
05
,
1
);
x
=
__MIN
(
fmt
->
i_x_offset
+
margin
,
fmt
->
i_visible_width
-
width
);
y
=
__MAX
(
fmt
->
i_y_offset
+
fmt
->
i_visible_height
-
margin
,
0
);
}
else
{
width
=
__MAX
(
fmt
->
i_visible_width
*
0
.
025
,
1
);
height
=
__MAX
(
fmt
->
i_visible_height
-
2
*
margin
,
1
);
x
=
__MAX
(
fmt
->
i_x_offset
+
fmt
->
i_visible_width
-
margin
,
0
);
y
=
__MIN
(
fmt
->
i_y_offset
+
margin
,
fmt
->
i_visible_height
-
height
);
}
return
p_subpic
;
subpicture_region_t
*
r
=
OSDRegion
(
x
,
y
,
width
,
height
);
if
(
!
r
)
return
NULL
;
if
(
type
==
OSD_HOR_SLIDER
)
{
int
pos_x
=
(
width
-
2
)
*
position
/
100
;
DrawRect
(
r
,
STYLE_FILLED
,
pos_x
-
1
,
2
,
pos_x
+
1
,
height
-
3
);
DrawRect
(
r
,
STYLE_EMPTY
,
0
,
0
,
width
-
1
,
height
-
1
);
}
else
{
int
pos_mid
=
height
/
2
;
int
pos_y
=
height
-
(
height
-
2
)
*
position
/
100
;
DrawRect
(
r
,
STYLE_FILLED
,
2
,
pos_y
,
width
-
3
,
height
-
3
);
DrawRect
(
r
,
STYLE_FILLED
,
1
,
pos_mid
,
1
,
pos_mid
);
DrawRect
(
r
,
STYLE_FILLED
,
width
-
2
,
pos_mid
,
width
-
2
,
pos_mid
);
DrawRect
(
r
,
STYLE_EMPTY
,
0
,
0
,
width
-
1
,
height
-
1
);
}
return
r
;
}
/*****************************************************************************
* Displays an OSD slider.
* Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER.
*****************************************************************************/
static
int
OsdSlider
(
spu_t
*
p_spu
,
int
i_render_width
,
int
i_render_height
,
int
i_margin_left
,
int
i_margin_bottom
,
int
i_channel
,
int
i_position
,
short
i_type
)
/**
* Create the region for an OSD slider.
* Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON
*/
static
subpicture_region_t
*
OSDIcon
(
int
type
,
const
video_format_t
*
fmt
)
{
subpicture_t
*
p_subpic
;
int
i_x_margin
,
i_y_margin
,
i_x
,
i_y
,
i_width
,
i_height
;
p_subpic
=
CreateWidget
(
i_channel
);
if
(
p_subpic
==
NULL
)
{
return
VLC_EGENERIC
;
const
float
size_ratio
=
0
.
05
;
const
float
margin_ratio
=
0
.
07
;
const
int
size
=
__MAX
(
fmt
->
i_visible_width
,
fmt
->
i_visible_height
);
const
int
width
=
size
*
size_ratio
;
const
int
height
=
size
*
size_ratio
;
const
int
x
=
fmt
->
i_x_offset
+
fmt
->
i_visible_width
-
margin_ratio
*
size
-
width
;
const
int
y
=
fmt
->
i_y_offset
+
margin_ratio
*
size
;
subpicture_region_t
*
r
=
OSDRegion
(
__MAX
(
x
,
0
),
__MIN
(
y
,
(
int
)
fmt
->
i_visible_height
-
height
),
width
,
height
);
if
(
!
r
)
return
NULL
;
if
(
type
==
OSD_PAUSE_ICON
)
{
int
bar_width
=
width
/
3
;
DrawRect
(
r
,
STYLE_FILLED
,
0
,
0
,
bar_width
-
1
,
height
-
1
);
DrawRect
(
r
,
STYLE_FILLED
,
width
-
bar_width
,
0
,
width
-
1
,
height
-
1
);
}
else
if
(
type
==
OSD_PLAY_ICON
)
{
int
mid
=
height
>>
1
;
int
delta
=
(
width
-
mid
)
>>
1
;
int
y2
=
((
height
-
1
)
>>
1
)
*
2
;
DrawTriangle
(
r
,
STYLE_FILLED
,
delta
,
0
,
width
-
delta
,
y2
);
}
else
{
int
mid
=
height
>>
1
;
int
delta
=
(
width
-
mid
)
>>
1
;
int
y2
=
((
height
-
1
)
>>
1
)
*
2
;
DrawRect
(
r
,
STYLE_FILLED
,
delta
,
mid
/
2
,
width
-
delta
,
height
-
1
-
mid
/
2
);
DrawTriangle
(
r
,
STYLE_FILLED
,
width
-
delta
,
0
,
delta
,
y2
);
if
(
type
==
OSD_MUTE_ICON
)
{
uint8_t
*
a
=
r
->
p_picture
->
A_PIXELS
;
int
pitch
=
r
->
p_picture
->
A_PITCH
;
for
(
int
i
=
1
;
i
<
pitch
;
i
++
)
{
int
k
=
i
+
(
height
-
i
-
1
)
*
pitch
;
a
[
k
]
=
0xff
-
a
[
k
];
}
i_y_margin
=
i_render_height
/
10
;
i_x_margin
=
i_y_margin
+
i_margin_left
;
i_y_margin
+=
i_margin_bottom
;
if
(
i_type
==
OSD_HOR_SLIDER
)
{
i_width
=
i_render_width
-
2
*
i_x_margin
;
i_height
=
i_render_height
/
20
;
i_x
=
i_x_margin
;
i_y
=
i_render_height
-
i_y_margin
-
i_height
;
}
else
{
i_width
=
i_render_width
/
40
;
i_height
=
i_render_height
-
2
*
i_y_margin
;
i_x
=
i_render_width
-
i_x_margin
-
i_width
;
i_y
=
i_y_margin
;
}
return
r
;
}
/* Create subpicture region and picture */
CreatePicture
(
p_subpic
,
i_x
,
i_y
,
i_width
,
i_height
);
if
(
i_type
==
OSD_HOR_SLIDER
)
{
int
i_x_pos
=
(
i_width
-
2
)
*
i_position
/
100
;
DrawRect
(
p_subpic
,
i_x_pos
-
1
,
2
,
i_x_pos
+
1
,
i_height
-
3
,
STYLE_FILLED
);
DrawRect
(
p_subpic
,
0
,
0
,
i_width
-
1
,
i_height
-
1
,
STYLE_EMPTY
);
}
else
if
(
i_type
==
OSD_VERT_SLIDER
)
{
int
i_y_pos
=
i_height
/
2
;
DrawRect
(
p_subpic
,
2
,
i_height
-
(
i_height
-
2
)
*
i_position
/
100
,
i_width
-
3
,
i_height
-
3
,
STYLE_FILLED
);
DrawRect
(
p_subpic
,
1
,
i_y_pos
,
1
,
i_y_pos
,
STYLE_FILLED
);
DrawRect
(
p_subpic
,
i_width
-
2
,
i_y_pos
,
i_width
-
2
,
i_y_pos
,
STYLE_FILLED
);
DrawRect
(
p_subpic
,
0
,
0
,
i_width
-
1
,
i_height
-
1
,
STYLE_EMPTY
);
}
struct
subpicture_updater_sys_t
{
int
type
;
int
position
;
};
spu_DisplaySubpicture
(
p_spu
,
p_subpic
);
static
int
OSDWidgetValidate
(
subpicture_t
*
subpic
,
bool
has_src_changed
,
const
video_format_t
*
fmt_src
,
bool
has_dst_changed
,
const
video_format_t
*
fmt_dst
,
mtime_t
ts
)
{
VLC_UNUSED
(
subpic
);
VLC_UNUSED
(
ts
);
VLC_UNUSED
(
fmt_src
);
VLC_UNUSED
(
has_dst_changed
);
VLC_UNUSED
(
fmt_dst
);
if
(
!
has_src_changed
&&
!
has_dst_changed
)
return
VLC_SUCCESS
;
return
VLC_EGENERIC
;
}
/*****************************************************************************
* Displays an OSD icon.
* Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON
*****************************************************************************/
static
int
OsdIcon
(
spu_t
*
p_spu
,
int
i_render_width
,
int
i_render_height
,
int
i_margin_right
,
int
i_margin_top
,
int
i_channel
,
short
i_type
)
static
void
OSDWidgetUpdate
(
subpicture_t
*
subpic
,
const
video_format_t
*
fmt_src
,
const
video_format_t
*
fmt_dst
,
mtime_t
ts
)
{
subpicture_t
*
p_subpic
;
int
i_x_margin
,
i_y_margin
,
i_x
,
i_y
,
i_width
,
i_height
;
p_subpic
=
CreateWidget
(
i_channel
);
if
(
p_subpic
==
NULL
)
{
return
VLC_EGENERIC
;
}
i_y_margin
=
i_render_height
/
15
;
i_x_margin
=
i_y_margin
+
i_margin_right
;
i_y_margin
+=
i_margin_top
;
i_width
=
i_render_width
/
20
;
i_height
=
i_width
;
i_x
=
i_render_width
-
i_x_margin
-
i_width
;
i_y
=
i_y_margin
;
/* Create subpicture region and picture */
CreatePicture
(
p_subpic
,
i_x
,
i_y
,
i_width
,
i_height
);
if
(
i_type
==
OSD_PAUSE_ICON
)
{
int
i_bar_width
=
i_width
/
3
;
DrawRect
(
p_subpic
,
0
,
0
,
i_bar_width
-
1
,
i_height
-
1
,
STYLE_FILLED
);
DrawRect
(
p_subpic
,
i_width
-
i_bar_width
,
0
,
i_width
-
1
,
i_height
-
1
,
STYLE_FILLED
);
}
else
if
(
i_type
==
OSD_PLAY_ICON
)
{
int
i_mid
=
i_height
>>
1
;
int
i_delta
=
(
i_width
-
i_mid
)
>>
1
;
int
i_y2
=
(
(
i_height
-
1
)
>>
1
)
*
2
;
DrawTriangle
(
p_subpic
,
i_delta
,
0
,
i_width
-
i_delta
,
i_y2
,
STYLE_FILLED
);
}
else
if
(
i_type
==
OSD_SPEAKER_ICON
||
i_type
==
OSD_MUTE_ICON
)
{
int
i_mid
=
i_height
>>
1
;
int
i_delta
=
(
i_width
-
i_mid
)
>>
1
;
int
i_y2
=
(
(
i_height
-
1
)
>>
1
)
*
2
;
DrawRect
(
p_subpic
,
i_delta
,
i_mid
/
2
,
i_width
-
i_delta
,
i_height
-
1
-
i_mid
/
2
,
STYLE_FILLED
);
DrawTriangle
(
p_subpic
,
i_width
-
i_delta
,
0
,
i_delta
,
i_y2
,
STYLE_FILLED
);
if
(
i_type
==
OSD_MUTE_ICON
)
{
uint8_t
*
p_a
=
p_subpic
->
p_region
->
p_picture
->
A_PIXELS
;
int
i_pitch
=
p_subpic
->
p_region
->
p_picture
->
Y_PITCH
;
int
i
;
for
(
i
=
1
;
i
<
i_pitch
;
i
++
)
{
int
k
=
i
+
(
i_height
-
i
-
1
)
*
i_pitch
;
p_a
[
k
]
=
0xff
-
p_a
[
k
];
}
}
}
subpicture_updater_sys_t
*
sys
=
subpic
->
updater
.
p_sys
;
VLC_UNUSED
(
fmt_dst
);
VLC_UNUSED
(
ts
);
spu_DisplaySubpicture
(
p_spu
,
p_subpic
);
subpic
->
i_original_picture_width
=
fmt_src
->
i_width
;
subpic
->
i_original_picture_height
=
fmt_src
->
i_height
;
if
(
sys
->
type
==
OSD_HOR_SLIDER
||
sys
->
type
==
OSD_VERT_SLIDER
)
subpic
->
p_region
=
OSDSlider
(
sys
->
type
,
sys
->
position
,
fmt_src
);
else
subpic
->
p_region
=
OSDIcon
(
sys
->
type
,
fmt_src
);
}
return
VLC_SUCCESS
;
static
void
OSDWidgetDestroy
(
subpicture_t
*
subpic
)
{
free
(
subpic
->
updater
.
p_sys
);
}
/*****************************************************************************
* Displays an OSD slider.
* Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER.
*****************************************************************************/
void
vout_OSDSlider
(
vout_thread_t
*
p_vout
,
int
i_channel
,
int
i_position
,
short
i_type
)
static
void
OSDWidget
(
vout_thread_t
*
vout
,
int
channel
,
int
type
,
int
position
)
{
if
(
!
var_InheritBool
(
p_vout
,
"osd"
)
||
i_position
<
0
)
if
(
!
var_InheritBool
(
vout
,
"osd"
)
)
return
;
if
(
type
==
OSD_HOR_SLIDER
||
type
==
OSD_VERT_SLIDER
)
position
=
__MIN
(
__MAX
(
position
,
0
),
100
);
OsdSlider
(
vout_GetSpu
(
p_vout
),
p_vout
->
p
->
fmt_render
.
i_width
,
p_vout
->
p
->
fmt_render
.
i_height
,
p_vout
->
p
->
fmt_in
.
i_x_offset
,
p_vout
->
p
->
fmt_in
.
i_height
-
p_vout
->
p
->
fmt_in
.
i_visible_height
-
p_vout
->
p
->
fmt_in
.
i_y_offset
,
i_channel
,
i_position
,
i_type
);
subpicture_updater_sys_t
*
sys
=
malloc
(
sizeof
(
*
sys
));
if
(
!
sys
)
return
;
sys
->
type
=
type
;
sys
->
position
=
position
;
subpicture_updater_t
updater
=
{
.
pf_validate
=
OSDWidgetValidate
,
.
pf_update
=
OSDWidgetUpdate
,
.
pf_destroy
=
OSDWidgetDestroy
,
.
p_sys
=
sys
,
};
subpicture_t
*
subpic
=
subpicture_New
(
&
updater
);
if
(
!
subpic
)
{
free
(
sys
);
return
;
}
subpic
->
i_channel
=
channel
;
subpic
->
i_start
=
mdate
();
subpic
->
i_stop
=
subpic
->
i_start
+
1200000
;
subpic
->
b_ephemer
=
true
;
subpic
->
b_absolute
=
true
;
subpic
->
b_fade
=
true
;
spu_DisplaySubpicture
(
vout_GetSpu
(
vout
),
subpic
);
}
/*****************************************************************************
* Displays an OSD icon.
* Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON
*****************************************************************************/
void
vout_OSDIcon
(
vout_thread_t
*
p_vout
,
int
i_channel
,
short
i_type
)
void
vout_OSDSlider
(
vout_thread_t
*
vout
,
int
channel
,
int
position
,
short
type
)
{
if
(
!
var_InheritBool
(
p_vout
,
"osd"
)
)
return
;
OSDWidget
(
vout
,
channel
,
type
,
position
);
}
OsdIcon
(
vout_GetSpu
(
p_vout
),
p_vout
->
p
->
fmt_render
.
i_width
,
p_vout
->
p
->
fmt_render
.
i_height
,
p_vout
->
p
->
fmt_in
.
i_width
-
p_vout
->
p
->
fmt_in
.
i_visible_width
-
p_vout
->
p
->
fmt_in
.
i_x_offset
,
p_vout
->
p
->
fmt_in
.
i_y_offset
,
i_channel
,
i_type
);
void
vout_OSDIcon
(
vout_thread_t
*
vout
,
int
channel
,
short
type
)
{
OSDWidget
(
vout
,
channel
,
type
,
0
);
}
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