Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
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-gpu
Commits
4c4c4e48
Commit
4c4c4e48
authored
Jan 09, 2003
by
Sam Hocevar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* ./modules/video_filter/adjust.c: rehandled code and enhanced the
config variables descriptions.
parent
c8363465
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
115 additions
and
148 deletions
+115
-148
modules/video_filter/adjust.c
modules/video_filter/adjust.c
+115
-148
No files found.
modules/video_filter/adjust.c
View file @
4c4c4e48
...
...
@@ -2,7 +2,7 @@
* adjust.c : Contrast/Hue/Saturation/Brightness video plugin for vlc
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
* $Id: adjust.c,v 1.
5 2003/01/06 00:37:30 garf
Exp $
* $Id: adjust.c,v 1.
6 2003/01/09 15:38:09 sam
Exp $
*
* Authors: Simon Latapie <garf@via.ecp.fr>, Samuel Hocevar <sam@zoy.org>
*
...
...
@@ -10,7 +10,7 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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
...
...
@@ -34,6 +34,9 @@
#include "filter_common.h"
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
#define eight_times( x ) x x x x x x x x
...
...
@@ -51,23 +54,23 @@ static void Render ( vout_thread_t *, picture_t * );
* Module descriptor
*****************************************************************************/
#define CONT_TEXT N_("
C
ontrast")
#define CONT_LONGTEXT N_("
Default
to 1")
#define HUE_TEXT N_("
H
ue")
#define HUE_LONGTEXT N_("
Between 0 and 360. Default
to 0")
#define SAT_TEXT N_("
S
aturation")
#define SAT_LONGTEXT N_("
Default
to 1")
#define LUM_TEXT N_("
B
rightness")
#define LUM_LONGTEXT N_("
Default
to 1")
#define CONT_TEXT N_("
set image c
ontrast")
#define CONT_LONGTEXT N_("
Set the image contrast. Defaults
to 1")
#define HUE_TEXT N_("
set image h
ue")
#define HUE_LONGTEXT N_("
Set the image hue, between 0 and 360. Defaults
to 0")
#define SAT_TEXT N_("
set image s
aturation")
#define SAT_LONGTEXT N_("
Set the image saturation. Defaults
to 1")
#define LUM_TEXT N_("
set image b
rightness")
#define LUM_LONGTEXT N_("
Set the image brightness. Defaults
to 1")
vlc_module_begin
();
add_category_hint
(
N_
(
"
Miscellaneous
"
),
NULL
);
add_float_with_range
(
"
C
ontrast"
,
1
.
0
,
0
.
0
,
2
.
0
,
NULL
,
CONT_TEXT
,
CONT_LONGTEXT
);
add_float_with_range
(
"
B
rightness"
,
1
.
0
,
0
.
0
,
2
.
0
,
NULL
,
LUM_TEXT
,
LUM_LONGTEXT
);
add_integer_with_range
(
"
H
ue"
,
0
,
0
,
360
,
NULL
,
HUE_TEXT
,
HUE_LONGTEXT
);
add_float_with_range
(
"
S
aturation"
,
1
.
0
,
0
.
0
,
3
.
0
,
NULL
,
SAT_TEXT
,
SAT_LONGTEXT
);
set_description
(
_
(
"
Contrast/Hue/Saturation/B
rightness filter"
)
);
add_category_hint
(
N_
(
"
Adjust
"
),
NULL
);
add_float_with_range
(
"
c
ontrast"
,
1
.
0
,
0
.
0
,
2
.
0
,
NULL
,
CONT_TEXT
,
CONT_LONGTEXT
);
add_float_with_range
(
"
b
rightness"
,
1
.
0
,
0
.
0
,
2
.
0
,
NULL
,
LUM_TEXT
,
LUM_LONGTEXT
);
add_integer_with_range
(
"
h
ue"
,
0
,
0
,
360
,
NULL
,
HUE_TEXT
,
HUE_LONGTEXT
);
add_float_with_range
(
"
s
aturation"
,
1
.
0
,
0
.
0
,
3
.
0
,
NULL
,
SAT_TEXT
,
SAT_LONGTEXT
);
set_description
(
_
(
"
contrast/hue/saturation/b
rightness filter"
)
);
set_capability
(
"video filter"
,
0
);
add_shortcut
(
"adjust"
);
set_callbacks
(
Create
,
Destroy
);
...
...
@@ -81,20 +84,14 @@ vlc_module_end();
*****************************************************************************/
struct
vout_sys_t
{
vout_thread_t
*
p_vout
;
vout_thread_t
*
p_vout
;
};
inline
static
int32_t
maxmin
(
int32_t
a
)
inline
static
int32_t
clip
(
int32_t
a
)
{
if
(
a
>
255
)
return
255
;
else
if
(
a
<
0
)
return
0
;
else
return
a
;
return
(
a
>
255
)
?
255
:
(
a
<
0
)
?
0
:
a
;
}
/*****************************************************************************
* Create: allocates adjust video thread output method
*****************************************************************************
...
...
@@ -109,7 +106,7 @@ static int Create( vlc_object_t *p_this )
if
(
p_vout
->
p_sys
==
NULL
)
{
msg_Err
(
p_vout
,
"out of memory"
);
return
(
1
)
;
return
VLC_ENOMEM
;
}
p_vout
->
pf_init
=
Init
;
...
...
@@ -118,7 +115,7 @@ static int Create( vlc_object_t *p_this )
p_vout
->
pf_render
=
Render
;
p_vout
->
pf_display
=
NULL
;
return
(
0
)
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
...
...
@@ -149,12 +146,12 @@ static int Init( vout_thread_t *p_vout )
{
msg_Err
(
p_vout
,
"can't open vout, aborting"
);
return
(
0
)
;
return
VLC_EGENERIC
;
}
ALLOCATE_DIRECTBUFFERS
(
VOUT_MAX_PICTURES
);
return
(
0
)
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
...
...
@@ -178,7 +175,7 @@ static void End( vout_thread_t *p_vout )
* Terminate an output method created by adjustCreateOutputMethod
*****************************************************************************/
static
void
Destroy
(
vlc_object_t
*
p_this
)
{
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
vout_Destroy
(
p_vout
->
p_sys
->
p_vout
);
...
...
@@ -189,40 +186,23 @@ static void Destroy( vlc_object_t *p_this )
/*****************************************************************************
* Render: displays previously rendered output
*****************************************************************************
* This function send the currently rendered image to adjust modified image,
* This function send the currently rendered image to adjust modified image,
* waits until it is displayed and switch the two rendering buffers, preparing
* next frame.
*****************************************************************************/
static
void
Render
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
int
pi_luma
[
256
];
picture_t
*
p_outpic
;
int
i_index
;
s32
cont
;
s32
lum
;
/* Contrast is a fast but cludged function, so I put this gap to be
cleaner :) */
s32
dec
;
double
hue
;
int
i_sat
;
int
i_Sin
;
int
i_Cos
;
int
p_lum_func
[
256
];
int
i
;
/* This is a new frame. Get a structure from the video_output. */
uint8_t
*
p_in
,
*
p_out
,
*
p_in_u
,
*
p_in_v
,
*
p_in_end
,
*
p_out_u
,
*
p_out_v
;
cont
=
(
s32
)
(
config_GetFloat
(
p_vout
,
"Contrast"
)
*
255
);
lum
=
(
s32
)
(
(
config_GetFloat
(
p_vout
,
"Brightness"
)
*
255
)
-
255
);
hue
=
config_GetInt
(
p_vout
,
"Hue"
)
*
3
.
14159
/
180
;
/* convert in radian */
i_sat
=
(
int
)
(
config_GetFloat
(
p_vout
,
"Saturation"
)
*
256
);
dec
=
128
-
(
cont
/
2
);
i_Sin
=
(
int
)
(
sin
(
hue
)
*
256
);
i_Cos
=
(
int
)
(
cos
(
hue
)
*
256
);
double
f_hue
;
int32_t
i_cont
,
i_lum
;
int
i_sat
,
i_sin
,
i_cos
,
i_x
,
i_y
;
int
i
;
/* This is a new frame. Get a structure from the video_output. */
while
(
(
p_outpic
=
vout_CreatePicture
(
p_vout
->
p_sys
->
p_vout
,
0
,
0
,
0
)
)
==
NULL
)
{
...
...
@@ -231,129 +211,116 @@ cleaner :) */
return
;
}
msleep
(
VOUT_OUTMEM_SLEEP
);
}
}
vout_DatePicture
(
p_vout
->
p_sys
->
p_vout
,
p_outpic
,
p_pic
->
date
);
vout_LinkPicture
(
p_vout
->
p_sys
->
p_vout
,
p_outpic
);
for
(
i_index
=
0
;
i_index
<
p_pic
->
i_planes
;
i_index
++
)
/* Get configuration variables */
i_cont
=
config_GetFloat
(
p_vout
,
"contrast"
)
*
255
;
i_lum
=
(
config_GetFloat
(
p_vout
,
"brightness"
)
-
1
.
0
)
*
255
;
f_hue
=
config_GetInt
(
p_vout
,
"hue"
)
*
M_PI
/
180
;
i_sat
=
config_GetFloat
(
p_vout
,
"saturation"
)
*
256
;
/* Contrast is a fast but kludged function, so I put this gap to be
* cleaner :) */
i_lum
+=
128
-
i_cont
/
2
;
/* Fill the luma lookup table */
for
(
i
=
0
;
i
<
256
;
i
++
)
{
pi_luma
[
i
]
=
clip
(
i_lum
+
i_cont
*
i
/
256
);
}
/* Do the Y plane */
p_in
=
p_pic
->
p
[
0
].
p_pixels
;
p_in_end
=
p_in
+
p_pic
->
p
[
0
].
i_lines
*
p_pic
->
p
[
0
].
i_pitch
-
8
;
p_out
=
p_outpic
->
p
[
0
].
p_pixels
;
if
(
i_index
==
0
)
for
(
;
p_in
<
p_in_end
;
)
{
/* Do 8 pixels at a time */
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
*
p_out
++
=
pi_luma
[
*
p_in
++
];
}
u8
*
p_in
,
*
p_in_end
,
*
p_out
;
p_in_end
+=
8
;
p_in
=
p_pic
->
p
[
i_index
].
p_pixels
;
p_in_end
=
p_in
+
p_pic
->
p
[
i_index
].
i_lines
*
p_pic
->
p
[
i_index
].
i_pitch
-
8
;
p_out
=
p_outpic
->
p
[
i_index
].
p_pixels
;
for
(
;
p_in
<
p_in_end
;
)
{
*
p_out
++
=
pi_luma
[
*
p_in
++
];
}
for
(
i
=
0
;
i
<
256
;
i
++
)
{
p_lum_func
[
i
]
=
maxmin
(
((
i
*
cont
)
>>
8
)
+
lum
+
dec
)
;
}
/* Do the U and V planes */
p_in_u
=
p_pic
->
p
[
1
].
p_pixels
;
p_in_v
=
p_pic
->
p
[
2
].
p_pixels
;
p_in_end
=
p_in_u
+
p_pic
->
p
[
1
].
i_lines
*
p_pic
->
p
[
1
].
i_pitch
-
8
;
for
(
;
p_in
<
p_in_end
;
)
{
/* Do 8 pixels at a time */
p_out_u
=
p_outpic
->
p
[
1
].
p_pixels
;
p_out_v
=
p_outpic
->
p
[
2
].
p_pixels
;
i_sin
=
sin
(
f_hue
)
*
256
;
i_cos
=
cos
(
f_hue
)
*
256
;
i_x
=
(
cos
(
f_hue
)
+
sin
(
f_hue
)
)
*
32768
;
i_y
=
(
cos
(
f_hue
)
-
sin
(
f_hue
)
)
*
32768
;
if
(
i_sat
>
256
)
{
#define WRITE_UV_CLIP() \
i_u = *p_in_u++ ; i_v = *p_in_v++ ; \
*p_out_u++ = clip( (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
* i_sat) >> 8) + 128); \
*p_out_v++ = clip( (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
* i_sat) >> 8) + 128)
eight_times
(
*
p_out
=
p_lum_func
[
*
p_in
];
p_out
++
;
p_in
++
;
)
uint8_t
i_u
,
i_v
;
for
(
;
p_in_u
<
p_in_end
;
)
{
/* Do 8 pixels at a time */
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
WRITE_UV_CLIP
();
}
p_in_end
+=
8
;
for
(
;
p_in
<
p_in_end
;
)
for
(
;
p_in
_u
<
p_in_end
;
)
{
/* Do 1 pixel at a time */
*
p_out
=
p_lum_func
[
*
p_in
];
p_out
++
;
p_in
++
;
WRITE_UV_CLIP
();
}
}
else
{
if
(
i_index
==
1
)
{
#define WRITE_UV() \
i_u = *p_in_u++ ; i_v = *p_in_v++ ; \
*p_out_u++ = (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
* i_sat) >> 8) + 128; \
*p_out_v++ = (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
* i_sat) >> 8) + 128
u8
*
p_in_u
,
*
p_in_v
,
*
p_in_end
,
*
p_out_u
,
*
p_out_v
,
i_u
,
i_v
;
s32
cospsin
,
cosmsin
;
p_in_u
=
p_pic
->
p
[
i_index
].
p_pixels
;
p_in_v
=
p_pic
->
p
[
i_index
+
1
].
p_pixels
;
p_in_end
=
p_in_u
+
p_pic
->
p
[
i_index
].
i_lines
*
p_pic
->
p
[
i_index
].
i_pitch
-
8
;
p_out_u
=
p_outpic
->
p
[
i_index
].
p_pixels
;
p_out_v
=
p_outpic
->
p
[
i_index
+
1
].
p_pixels
;
uint8_t
i_u
,
i_v
;
cospsin
=
32768
*
(
cos
(
hue
)
+
sin
(
hue
)
);
cosmsin
=
32768
*
(
cos
(
hue
)
-
sin
(
hue
)
);
if
(
i_sat
>
256
)
for
(
;
p_in_u
<
p_in_end
;
)
{
for
(
;
p_in_u
<
p_in_end
;
)
{
/* Do 8 pixels at a time */
eight_times
(
i_u
=
*
p_in_u
;
i_v
=
*
p_in_v
;
*
p_out_u
=
maxmin
(
((
((
i_u
*
i_Cos
+
i_v
*
i_Sin
-
cospsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
);
*
p_out_v
=
maxmin
(
((
((
i_v
*
i_Cos
-
i_u
*
i_Sin
-
cosmsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
);
p_out_u
++
;
p_in_u
++
;
p_out_v
++
;
p_in_v
++
;
)
}
p_in_end
+=
8
;
for
(
;
p_in_u
<
p_in_end
;
)
{
/* Do 1 pixel at a time */
i_u
=
*
p_in_u
;
i_v
=
*
p_in_v
;
*
p_out_u
=
maxmin
(
((
((
i_u
*
i_Cos
+
i_v
*
i_Sin
-
cospsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
);
*
p_out_v
=
maxmin
(
((
((
i_v
*
i_Cos
-
i_u
*
i_Sin
-
cosmsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
);
p_out_u
++
;
p_in_u
++
;
p_out_v
++
;
p_in_v
++
;
/* Do 8 pixels at a time */
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
WRITE_UV
();
}
p_in_end
+=
8
;
}
}
else
for
(
;
p_in_u
<
p_in_end
;
)
{
for
(
;
p_in_u
<
p_in_end
;
)
{
/* Do 8 pixels at a time */
eight_times
(
i_u
=
*
p_in_u
;
i_v
=
*
p_in_v
;
*
p_out_u
=
((
((
i_u
*
i_Cos
+
i_v
*
i_Sin
-
cospsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
;
*
p_out_v
=
((
((
i_v
*
i_Cos
-
i_u
*
i_Sin
-
cosmsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
;
p_out_u
++
;
p_in_u
++
;
p_out_v
++
;
p_in_v
++
;
)
}
p_in_end
+=
8
;
for
(
;
p_in_u
<
p_in_end
;
)
{
/* Do 1 pixel at a time */
i_u
=
*
p_in_u
;
i_v
=
*
p_in_v
;
*
p_out_u
=
((
((
i_u
*
i_Cos
+
i_v
*
i_Sin
-
cospsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
;
*
p_out_v
=
((
((
i_v
*
i_Cos
-
i_u
*
i_Sin
-
cosmsin
)
>>
8
)
*
i_sat
)
>>
8
)
+
128
;
p_out_u
++
;
p_in_u
++
;
p_out_v
++
;
p_in_v
++
;
}
WRITE_UV
();
}
}
}
}
vout_UnlinkPicture
(
p_vout
->
p_sys
->
p_vout
,
p_outpic
);
vout_DisplayPicture
(
p_vout
->
p_sys
->
p_vout
,
p_outpic
);
}
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