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
913a4283
Commit
913a4283
authored
Jun 27, 2013
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vdpau: sharpen/blur filter
parent
db61e2a9
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
203 additions
and
4 deletions
+203
-4
modules/LIST
modules/LIST
+1
-0
modules/hw/vdpau/Makefile.am
modules/hw/vdpau/Makefile.am
+5
-0
modules/hw/vdpau/chroma.c
modules/hw/vdpau/chroma.c
+47
-4
modules/hw/vdpau/picture.c
modules/hw/vdpau/picture.c
+2
-0
modules/hw/vdpau/sharpen.c
modules/hw/vdpau/sharpen.c
+147
-0
modules/hw/vdpau/vlc_vdpau.h
modules/hw/vdpau/vlc_vdpau.h
+1
-0
No files found.
modules/LIST
View file @
913a4283
...
...
@@ -366,6 +366,7 @@ $Id$
* vdpau_chroma: VDPAU hardware surfaces conversion and rendering
* vdpau_deinterlace: VDPAU deinterlacing video filter
* vdpau_display: VDPAU video display
* vdpau_sharpen: VDPAU sharpen/blur video filter
* vdummy: dummy video display
* visual: visualisation system
* vmem: video memory output
...
...
modules/hw/vdpau/Makefile.am
View file @
913a4283
...
...
@@ -31,6 +31,11 @@ libvdpau_deinterlace_plugin_la_CFLAGS = $(AM_CFLAGS) # dummy
libvdpau_deinterlace_plugin_la_LIBADD
=
$(AM_LIBADD)
libvlc_LTLIBRARIES
+=
libvdpau_deinterlace_plugin.la
libvdpau_sharpen_plugin_la_SOURCES
=
sharpen.c picture.c
libvdpau_sharpen_plugin_la_CFLAGS
=
$(AM_CFLAGS)
# dummy
libvdpau_sharpen_plugin_la_LIBADD
=
$(AM_LIBADD)
libvlc_LTLIBRARIES
+=
libvdpau_sharpen_plugin.la
libvdpau_chroma_plugin_la_SOURCES
=
chroma.c picture.c
libvdpau_chroma_plugin_la_CFLAGS
=
$(AM_CFLAGS)
# dummy
libvdpau_chroma_plugin_la_LIBADD
=
$(AM_LIBADD)
...
...
modules/hw/vdpau/chroma.c
View file @
913a4283
...
...
@@ -52,7 +52,21 @@ static VdpVideoMixer MixerCreate(filter_t *filter)
filter_sys_t
*
sys
=
filter
->
p_sys
;
VdpVideoMixer
mixer
;
VdpStatus
err
;
VdpBool
ok
;
/* Check for potentially useful features */
VdpVideoMixerFeature
featv
[
1
];
unsigned
featc
=
0
;
err
=
vdp_video_mixer_query_feature_support
(
sys
->
vdp
,
sys
->
device
,
VDP_VIDEO_MIXER_FEATURE_SHARPNESS
,
&
ok
);
if
(
err
==
VDP_STATUS_OK
&&
ok
==
VDP_TRUE
)
{
msg_Dbg
(
filter
,
"using video mixer %s feature"
,
"sharpness"
);
featv
[
featc
++
]
=
VDP_VIDEO_MIXER_FEATURE_SHARPNESS
;
}
/* Create the mixer */
VdpVideoMixerParameter
parms
[
3
]
=
{
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH
,
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT
,
...
...
@@ -62,7 +76,7 @@ static VdpVideoMixer MixerCreate(filter_t *filter)
uint32_t
height
=
filter
->
fmt_in
.
video
.
i_height
;
const
void
*
values
[
3
]
=
{
&
width
,
&
height
,
&
sys
->
chroma
,
};
err
=
vdp_video_mixer_create
(
sys
->
vdp
,
sys
->
device
,
0
,
NULL
,
err
=
vdp_video_mixer_create
(
sys
->
vdp
,
sys
->
device
,
featc
,
featv
,
3
,
parms
,
values
,
&
mixer
);
if
(
err
!=
VDP_STATUS_OK
)
{
...
...
@@ -268,6 +282,7 @@ static inline VdpVideoSurface picture_GetVideoSurface(const picture_t *pic)
static
picture_t
*
MixerRender
(
filter_t
*
filter
,
picture_t
*
src
)
{
filter_sys_t
*
sys
=
filter
->
p_sys
;
VdpStatus
err
;
picture_t
*
dst
=
OutputAllocate
(
filter
);
if
(
dst
==
NULL
)
...
...
@@ -287,9 +302,38 @@ static picture_t *MixerRender(filter_t *filter, picture_t *src)
goto
skip
;
picture_CopyProperties
(
dst
,
src
);
vlc_vdp_video_field_t
*
f
=
src
->
context
;
/* Enable/Disable features */
const
VdpVideoMixerFeature
features
[]
=
{
VDP_VIDEO_MIXER_FEATURE_SHARPNESS
,
};
const
VdpBool
enables
[]
=
{
f
->
sharpen
!=
0
.
f
,
};
err
=
vdp_video_mixer_set_feature_enables
(
sys
->
vdp
,
sys
->
mixer
,
sizeof
(
features
)
/
sizeof
(
features
[
0
]),
features
,
enables
);
if
(
err
!=
VDP_STATUS_OK
)
msg_Err
(
filter
,
"video %s %s failure: %s"
,
"mixer"
,
"features"
,
vdp_get_error_string
(
sys
->
vdp
,
err
));
/* Configure mixer depending on upstream video filters */
const
VdpVideoMixerAttribute
attrs
[]
=
{
VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL
,
};
const
void
*
const
values
[]
=
{
&
f
->
sharpen
,
};
err
=
vdp_video_mixer_set_attribute_values
(
sys
->
vdp
,
sys
->
mixer
,
sizeof
(
attrs
)
/
sizeof
(
attrs
[
0
]),
attrs
,
values
);
if
(
err
!=
VDP_STATUS_OK
)
msg_Err
(
filter
,
"video %s %s failure: %s"
,
"mixer"
,
"attributes"
,
vdp_get_error_string
(
sys
->
vdp
,
err
));
/* Render video into output */
VdpVideoMixerPictureStructure
structure
=
((
vlc_vdp_video_field_t
*
)(
src
->
context
))
->
structure
;
VdpVideoMixerPictureStructure
structure
=
f
->
structure
;
VdpVideoSurface
past
[
MAX_PAST
];
VdpVideoSurface
surface
=
picture_GetVideoSurface
(
src
);
VdpVideoSurface
future
[
MAX_FUTURE
];
...
...
@@ -304,7 +348,6 @@ static picture_t *MixerRender(filter_t *filter, picture_t *src)
filter
->
fmt_out
.
video
.
i_visible_width
,
filter
->
fmt_out
.
video
.
i_visible_height
};
VdpStatus
err
;
for
(
unsigned
i
=
0
;
i
<
MAX_PAST
;
i
++
)
{
...
...
modules/hw/vdpau/picture.c
View file @
913a4283
...
...
@@ -72,6 +72,7 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface,
field
->
destroy
=
SurfaceDestroy
;
field
->
frame
=
frame
;
field
->
structure
=
VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME
;
field
->
sharpen
=
0
.
f
;
atomic_init
(
&
frame
->
refs
,
1
);
frame
->
surface
=
surface
;
...
...
@@ -93,6 +94,7 @@ VdpStatus vlc_vdp_video_copy(picture_t *restrict dst, picture_t *restrict src)
fnew
->
destroy
=
SurfaceDestroy
;
fnew
->
frame
=
frame
;
fnew
->
structure
=
fold
->
structure
;
fnew
->
sharpen
=
fold
->
sharpen
;
atomic_fetch_add
(
&
frame
->
refs
,
1
);
return
VDP_STATUS_OK
;
...
...
modules/hw/vdpau/sharpen.c
0 → 100644
View file @
913a4283
/*****************************************************************************
* sharpen.c: VDPAU sharpen video filter
*****************************************************************************
* Copyright (C) 2013 Rémi Denis-Courmont
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdlib.h>
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_filter.h>
#include <vlc_atomic.h>
#include "vlc_vdpau.h"
struct
filter_sys_t
{
atomic_uint_fast32_t
sigma
;
};
static
float
vlc_to_vdp_sigma
(
float
sigma
)
{
sigma
/=
2
.
f
;
if
(
sigma
>
+
1
.
f
)
sigma
=
+
1
.
f
;
if
(
sigma
<
-
1
.
f
)
sigma
=
-
1
.
f
;
return
sigma
;
}
static
int
SharpenCallback
(
vlc_object_t
*
obj
,
const
char
*
varname
,
vlc_value_t
prev
,
vlc_value_t
cur
,
void
*
data
)
{
filter_sys_t
*
sys
=
data
;
union
{
uint32_t
u
;
float
f
;
}
u
;
u
.
f
=
vlc_to_vdp_sigma
(
cur
.
f_float
);
atomic_store
(
&
sys
->
sigma
,
u
.
u
);
(
void
)
obj
;
(
void
)
varname
;
(
void
)
prev
;
return
VLC_SUCCESS
;
}
static
picture_t
*
Sharpen
(
filter_t
*
filter
,
picture_t
*
pic
)
{
filter_sys_t
*
sys
=
filter
->
p_sys
;
vlc_vdp_video_field_t
*
f
=
pic
->
context
;
union
{
uint32_t
u
;
float
f
;
}
u
;
if
(
unlikely
(
f
==
NULL
))
return
pic
;
u
.
u
=
atomic_load
(
&
sys
->
sigma
);
f
->
sharpen
+=
u
.
f
;
if
(
f
->
sharpen
>
+
1
.
f
)
f
->
sharpen
=
+
1
.
f
;
if
(
f
->
sharpen
<
-
1
.
f
)
f
->
sharpen
=
-
1
.
f
;
return
pic
;
}
static
const
char
*
const
options
[]
=
{
"sigma"
,
NULL
};
static
int
Open
(
vlc_object_t
*
obj
)
{
filter_t
*
filter
=
(
filter_t
*
)
obj
;
if
(
filter
->
fmt_in
.
video
.
i_chroma
!=
VLC_CODEC_VDPAU_VIDEO_422
&&
filter
->
fmt_in
.
video
.
i_chroma
!=
VLC_CODEC_VDPAU_VIDEO_420
)
return
VLC_EGENERIC
;
if
(
!
video_format_IsSimilar
(
&
filter
->
fmt_in
.
video
,
&
filter
->
fmt_out
.
video
))
return
VLC_EGENERIC
;
/* Check for sharpen support */
vdp_t
*
vdp
;
VdpDevice
device
;
VdpStatus
err
;
VdpBool
ok
;
err
=
vdp_get_x11
(
NULL
,
-
1
,
&
vdp
,
&
device
);
if
(
err
!=
VDP_STATUS_OK
)
return
VLC_EGENERIC
;
/* Weird. The decoder should be active... */
err
=
vdp_video_mixer_query_feature_support
(
vdp
,
device
,
VDP_VIDEO_MIXER_FEATURE_SHARPNESS
,
&
ok
);
if
(
err
!=
VDP_STATUS_OK
)
ok
=
VDP_FALSE
;
vdp_release_x11
(
vdp
);
if
(
ok
!=
VDP_TRUE
)
{
msg_Err
(
filter
,
"sharpening/blurring not supported by VDPAU device"
);
return
VLC_EGENERIC
;
}
/* Initialization */
filter_sys_t
*
sys
=
malloc
(
sizeof
(
*
sys
));
if
(
unlikely
(
sys
==
NULL
))
return
VLC_ENOMEM
;
filter
->
pf_video_filter
=
Sharpen
;
filter
->
p_sys
=
sys
;
config_ChainParse
(
filter
,
"sharpen-"
,
options
,
filter
->
p_cfg
);
var_AddCallback
(
filter
,
"sharpen-sigma"
,
SharpenCallback
,
sys
);
union
{
uint32_t
u
;
float
f
;
}
u
;
u
.
f
=
vlc_to_vdp_sigma
(
var_CreateGetFloatCommand
(
filter
,
"sharpen-sigma"
));
atomic_init
(
&
sys
->
sigma
,
u
.
u
);
return
VLC_SUCCESS
;
}
static
void
Close
(
vlc_object_t
*
obj
)
{
filter_t
*
filter
=
(
filter_t
*
)
obj
;
filter_sys_t
*
sys
=
filter
->
p_sys
;
var_DelCallback
(
filter
,
"sharpen-sigma"
,
SharpenCallback
,
sys
);
free
(
sys
);
}
vlc_module_begin
()
set_description
(
N_
(
"VDPAU sharpen video filter"
))
set_category
(
CAT_VIDEO
)
set_subcategory
(
SUBCAT_VIDEO_VFILTER
)
set_capability
(
"video filter2"
,
0
)
add_shortcut
(
"sharpen"
)
set_callbacks
(
Open
,
Close
)
vlc_module_end
()
modules/hw/vdpau/vlc_vdpau.h
View file @
913a4283
...
...
@@ -259,6 +259,7 @@ typedef struct vlc_vdp_video_field
void
(
*
destroy
)(
void
*
);
/* must be first @ref picture_Release() */
vlc_vdp_video_frame_t
*
frame
;
VdpVideoMixerPictureStructure
structure
;
float
sharpen
;
}
vlc_vdp_video_field_t
;
/**
...
...
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