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
350148d3
Commit
350148d3
authored
Jun 04, 2008
by
Antoine Cellerier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use filter chain in video output core.
parent
9675983e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
66 additions
and
197 deletions
+66
-197
include/vlc_vout.h
include/vlc_vout.h
+30
-40
src/video_output/video_output.c
src/video_output/video_output.c
+36
-157
No files found.
include/vlc_vout.h
View file @
350148d3
...
...
@@ -31,6 +31,7 @@
#define _VLC_VOUT_H_ 1
#include <vlc_es.h>
#include <vlc_filter.h>
/** Description of a planar graphic field */
typedef
struct
plane_t
...
...
@@ -78,7 +79,7 @@ struct picture_t
* @{*/
int
i_status
;
/**< picture flags */
int
i_type
;
/**< is picture a direct buffer ? */
bool
b_slow
;
/**< is picture in slow memory ? */
bool
b_slow
;
/**< is picture in slow memory ? */
int
i_matrix_coefficients
;
/**< in YUV type, encoding type */
/**@}*/
...
...
@@ -88,16 +89,16 @@ struct picture_t
/**@{*/
unsigned
i_refcount
;
/**< link reference counter */
mtime_t
date
;
/**< display date */
bool
b_force
;
bool
b_force
;
/**@}*/
/** \name Picture dynamic properties
* Those properties can be changed by the decoder
* @{
*/
bool
b_progressive
;
/**< is it a progressive frame ? */
bool
b_progressive
;
/**< is it a progressive frame ? */
unsigned
int
i_nb_fields
;
/**< # of displayed fields */
bool
b_top_field_first
;
/**< which field is first */
bool
b_top_field_first
;
/**< which field is first */
/**@}*/
/** The picture heap we are attached to */
...
...
@@ -139,7 +140,7 @@ struct picture_heap_t
/* Real pictures */
picture_t
*
pp_picture
[
VOUT_MAX_PICTURES
];
/**< pictures */
int
i_last_used_pic
;
/**< last used pic in heap */
bool
b_allow_modify_pics
;
bool
b_allow_modify_pics
;
/* Stuff used for truecolor RGB planes */
uint32_t
i_rmask
;
int
i_rrshift
,
i_lrshift
;
...
...
@@ -248,10 +249,10 @@ struct subpicture_t
/**@{*/
mtime_t
i_start
;
/**< beginning of display date */
mtime_t
i_stop
;
/**< end of display date */
bool
b_ephemer
;
/**< If this flag is set to true the subtitle
bool
b_ephemer
;
/**< If this flag is set to true the subtitle
will be displayed untill the next one appear */
bool
b_fade
;
/**< enable fading */
bool
b_pausable
;
/**< subpicture will be paused if
bool
b_fade
;
/**< enable fading */
bool
b_pausable
;
/**< subpicture will be paused if
stream is paused */
/**@}*/
...
...
@@ -269,7 +270,7 @@ struct subpicture_t
int
i_alpha
;
/**< transparency */
int
i_original_picture_width
;
/**< original width of the movie */
int
i_original_picture_height
;
/**< original height of the movie */
bool
b_absolute
;
/**< position is absolute */
bool
b_absolute
;
/**< position is absolute */
int
i_flags
;
/**< position flags */
/**@}*/
...
...
@@ -365,9 +366,6 @@ VLC_EXPORT( int, __vout_AllocatePicture,( vlc_object_t *p_this, picture_t *p_pic
* @{
*/
/** Maximum numbers of video filters2 that can be attached to a vout */
#define MAX_VFILTERS 10
/**
* Video output thread descriptor
*
...
...
@@ -393,11 +391,11 @@ struct vout_thread_t
uint16_t
i_changes
;
/**< changes made to the thread.
\see \ref vout_changes */
float
f_gamma
;
/**< gamma */
bool
b_grayscale
;
/**< color or grayscale display */
bool
b_info
;
/**< print additional information */
bool
b_interface
;
/**< render interface */
bool
b_scale
;
/**< allow picture scaling */
bool
b_fullscreen
;
/**< toogle fullscreen display */
bool
b_grayscale
;
/**< color or grayscale display */
bool
b_info
;
/**< print additional information */
bool
b_interface
;
/**< render interface */
bool
b_scale
;
/**< allow picture scaling */
bool
b_fullscreen
;
/**< toogle fullscreen display */
uint32_t
render_time
;
/**< last picture render time */
unsigned
int
i_window_width
;
/**< video window width */
unsigned
int
i_window_height
;
/**< video window height */
...
...
@@ -436,8 +434,8 @@ struct vout_thread_t
int
i_heap_size
;
/**< heap size */
picture_heap_t
render
;
/**< rendered pictures */
picture_heap_t
output
;
/**< direct buffers */
bool
b_direct
;
/**< rendered are like direct ? */
filter_t
*
p_chroma
;
/**< translation tables */
bool
b_direct
;
/**< rendered are like direct ? */
filter_t
*
p_chroma
;
/**< translation tables */
video_format_t
fmt_render
;
/* render format (from the decoder) */
video_format_t
fmt_in
;
/* input (modified render) format */
...
...
@@ -448,42 +446,34 @@ struct vout_thread_t
picture_t
p_picture
[
2
*
VOUT_MAX_PICTURES
+
1
];
/**< pictures */
/* Subpicture unit */
spu_t
*
p_spu
;
spu_t
*
p_spu
;
/* Statistics */
count_t
c_loops
;
count_t
c_pictures
,
c_late_pictures
;
mtime_t
display_jitter
;
/**< average deviation from the PTS */
count_t
c_jitter_samples
;
/**< number of samples used
count_t
c_loops
;
count_t
c_pictures
,
c_late_pictures
;
mtime_t
display_jitter
;
/**< average deviation from the PTS */
count_t
c_jitter_samples
;
/**< number of samples used
for the calculation of the
jitter */
/** delay created by internal caching */
int
i_pts_delay
;
int
i_pts_delay
;
/* Filter chain */
char
*
psz_filter_chain
;
bool
b_filter_change
;
/* Video filter2 chain
* these are handled like in transcode.c
* XXX: we might need to merge the two chains (v1 and v2 filters) */
char
*
psz_vfilters
[
MAX_VFILTERS
];
config_chain_t
*
p_vfilters_cfg
[
MAX_VFILTERS
];
int
i_vfilters_cfg
;
filter_t
*
pp_vfilters
[
MAX_VFILTERS
];
int
i_vfilters
;
char
*
psz_filter_chain
;
bool
b_filter_change
;
bool
b_vfilter_change
;
/* Video filter2 chain */
filter_chain_t
*
p_vf2_chain
;
char
*
psz_vf2
;
/* Misc */
bool
b_snapshot
;
/**< take one snapshot on the next loop */
bool
b_snapshot
;
/**< take one snapshot on the next loop */
/* Video output configuration */
config_chain_t
*
p_cfg
;
/* Show media title on videoutput */
bool
b_title_show
;
bool
b_title_show
;
mtime_t
i_title_timeout
;
int
i_title_position
;
};
...
...
src/video_output/video_output.c
View file @
350148d3
...
...
@@ -84,25 +84,16 @@ static int VideoFilter2Callback( vlc_object_t *, char const *,
/* From vout_intf.c */
int
vout_Snapshot
(
vout_thread_t
*
,
picture_t
*
);
/* Video filter2 parsing */
static
int
ParseVideoFilter2Chain
(
vout_thread_t
*
,
char
*
);
static
void
RemoveVideoFilters2
(
vout_thread_t
*
p_vout
);
/* Display media title in OSD */
static
void
DisplayTitleOnOSD
(
vout_thread_t
*
p_vout
);
/*****************************************************************************
* Video Filter2 functions
*****************************************************************************/
struct
filter_owner_sys_t
{
vout_thread_t
*
p_vout
;
};
static
picture_t
*
video_new_buffer_filter
(
filter_t
*
p_filter
)
{
picture_t
*
p_picture
;
vout_thread_t
*
p_vout
=
p_filter
->
p_owner
->
p_vout
;
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_filter
->
p_owner
;
p_picture
=
vout_CreatePicture
(
p_vout
,
0
,
0
,
0
);
...
...
@@ -111,7 +102,15 @@ static picture_t *video_new_buffer_filter( filter_t *p_filter )
static
void
video_del_buffer_filter
(
filter_t
*
p_filter
,
picture_t
*
p_pic
)
{
vout_DestroyPicture
(
p_filter
->
p_owner
->
p_vout
,
p_pic
);
vout_DestroyPicture
(
(
vout_thread_t
*
)
p_filter
->
p_owner
,
p_pic
);
}
static
int
video_filter_buffer_allocation_init
(
filter_t
*
p_filter
,
void
*
p_data
)
{
p_filter
->
pf_vout_buffer_new
=
video_new_buffer_filter
;
p_filter
->
pf_vout_buffer_del
=
video_del_buffer_filter
;
p_filter
->
p_owner
=
p_data
;
/* p_vout */
return
VLC_SUCCESS
;
}
/*****************************************************************************
...
...
@@ -342,16 +341,12 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
if
(
p_parent
->
i_object_type
!=
VLC_OBJECT_VOUT
)
{
/* Look for the default filter configuration */
var_Create
(
p_vout
,
"vout-filter"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_vout
,
"vout-filter"
,
&
val
);
p_vout
->
psz_filter_chain
=
val
.
psz_string
;
p_vout
->
psz_filter_chain
=
var_CreateGetStringCommand
(
p_vout
,
"vout-filter"
);
/* Apply video filter2 objects on the first vout */
var_Create
(
p_vout
,
"video-filter"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_vout
,
"video-filter"
,
&
val
);
ParseVideoFilter2Chain
(
p_vout
,
val
.
psz_string
);
free
(
val
.
psz_string
);
p_vout
->
psz_vf2
=
var_CreateGetStringCommand
(
p_vout
,
"video-filter"
);
}
else
{
...
...
@@ -367,13 +362,14 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
free
(
psz_tmp
);
/* Create a video filter2 var ... but don't inherit values */
var_Create
(
p_vout
,
"video-filter"
,
VLC_VAR_STRING
);
ParseVideoFilter2Chain
(
p_vout
,
NULL
);
var_Create
(
p_vout
,
"video-filter"
,
VLC_VAR_STRING
|
VLC_VAR_ISCOMMAND
);
p_vout
->
psz_vf2
=
var_GetString
(
p_vout
,
"video-filter"
);
}
var_AddCallback
(
p_vout
,
"video-filter"
,
VideoFilter2Callback
,
NULL
);
p_vout
->
b_vfilter_change
=
true
;
p_vout
->
i_vfilters
=
0
;
p_vout
->
p_vf2_chain
=
filter_chain_New
(
p_vout
,
"video filter2"
,
false
,
video_filter_buffer_allocation_init
,
NULL
,
p_vout
)
;
/* Choose the video output module */
if
(
!
p_vout
->
psz_filter_chain
||
!*
p_vout
->
psz_filter_chain
)
...
...
@@ -956,90 +952,32 @@ static void RunThread( vout_thread_t *p_vout)
}
/* Video Filter2 stuff */
if
(
p_vout
->
b_vfilter_change
==
true
)
if
(
p_vout
->
psz_vf2
)
{
int
i
;
vlc_mutex_lock
(
&
p_vout
->
vfilter_lock
);
RemoveVideoFilters2
(
p_vout
);
for
(
i
=
0
;
i
<
p_vout
->
i_vfilters_cfg
;
i
++
)
{
filter_t
*
p_vfilter
=
p_vout
->
pp_vfilters
[
p_vout
->
i_vfilters
]
=
vlc_object_create
(
p_vout
,
VLC_OBJECT_FILTER
);
vlc_object_attach
(
p_vfilter
,
p_vout
);
es_format_t
fmt
;
p_vfilter
->
pf_vout_buffer_new
=
video_new_buffer_filter
;
p_vfilter
->
pf_vout_buffer_del
=
video_del_buffer_filter
;
vlc_mutex_lock
(
&
p_vout
->
vfilter_lock
);
if
(
!
p_vout
->
i_vfilters
)
{
p_vfilter
->
fmt_in
.
video
=
p_vout
->
fmt_render
;
}
else
{
p_vfilter
->
fmt_in
.
video
=
(
p_vfilter
-
1
)
->
fmt_out
.
video
;
}
/* TODO: one day filters in the middle of the chain might
* have a different fmt_out.video than fmt_render ... */
p_vfilter
->
fmt_out
.
video
=
p_vout
->
fmt_render
;
es_format_Init
(
&
fmt
,
VIDEO_ES
,
p_vout
->
fmt_render
.
i_chroma
);
fmt
.
video
=
p_vout
->
fmt_render
;
filter_chain_Reset
(
p_vout
->
p_vf2_chain
,
&
fmt
,
&
fmt
);
p_vfilter
->
p_cfg
=
p_vout
->
p_vfilters_cfg
[
i
];
p_vfilter
->
p_module
=
module_Need
(
p_vfilter
,
"video filter2"
,
p_vout
->
psz_vfilters
[
i
],
true
);
if
(
filter_chain_AppendFromString
(
p_vout
->
p_vf2_chain
,
p_vout
->
psz_vf2
)
<
0
)
msg_Err
(
p_vout
,
"Video filter chain creation failed"
);
if
(
p_vfilter
->
p_module
)
{
p_vfilter
->
p_owner
=
malloc
(
sizeof
(
filter_owner_sys_t
)
);
p_vfilter
->
p_owner
->
p_vout
=
p_vout
;
p_vout
->
i_vfilters
++
;
msg_Dbg
(
p_vout
,
"video filter found (%s)"
,
p_vout
->
psz_vfilters
[
i
]
);
}
else
{
msg_Err
(
p_vout
,
"no video filter found (%s)"
,
p_vout
->
psz_vfilters
[
i
]
);
vlc_object_detach
(
p_vfilter
);
vlc_object_release
(
p_vfilter
);
}
else
{
free
(
p_vout
->
psz_vf2
);
p_vout
->
psz_vf2
=
NULL
;
}
p_vout
->
b_vfilter_change
=
false
;
vlc_mutex_unlock
(
&
p_vout
->
vfilter_lock
);
}
if
(
p_picture
)
{
int
i
;
for
(
i
=
0
;
i
<
p_vout
->
i_vfilters
;
i
++
)
{
picture_t
*
p_old
=
p_picture
;
p_picture
=
p_vout
->
pp_vfilters
[
i
]
->
pf_video_filter
(
p_vout
->
pp_vfilters
[
i
],
p_picture
);
if
(
!
p_picture
)
{
break
;
}
/* FIXME: this is kind of wrong
* if you have 2 or more vfilters and the 2nd breaks,
* on the next loop the 1st one will be applied again */
/* if p_old and p_picture are the same (ie the filter
* worked on the old picture), then following code is
* still alright since i_status gets changed back to
* the right value */
if
(
p_old
->
i_refcount
)
{
p_old
->
i_status
=
DISPLAYED_PICTURE
;
}
else
{
p_old
->
i_status
=
DESTROYED_PICTURE
;
}
p_picture
->
i_status
=
READY_PICTURE
;
}
p_picture
=
filter_chain_VideoFilter
(
p_vout
->
p_vf2_chain
,
p_picture
);
}
if
(
p_picture
&&
p_vout
->
b_snapshot
)
...
...
@@ -1293,7 +1231,7 @@ static void EndThread( vout_thread_t *p_vout )
spu_Destroy
(
p_vout
->
p_spu
);
/* Destroy the video filters2 */
RemoveVideoFilters2
(
p_vout
);
filter_chain_Delete
(
p_vout
->
p_vf2_chain
);
/* Destroy translation tables */
p_vout
->
pf_end
(
p_vout
);
...
...
@@ -1550,46 +1488,6 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd,
/*****************************************************************************
* Video Filter2 stuff
*****************************************************************************/
static
int
ParseVideoFilter2Chain
(
vout_thread_t
*
p_vout
,
char
*
psz_vfilters
)
{
int
i
;
for
(
i
=
0
;
i
<
p_vout
->
i_vfilters_cfg
;
i
++
)
{
struct
config_chain_t
*
p_cfg
=
p_vout
->
p_vfilters_cfg
[
p_vout
->
i_vfilters_cfg
];
config_ChainDestroy
(
p_cfg
);
free
(
p_vout
->
psz_vfilters
[
p_vout
->
i_vfilters_cfg
]
);
p_vout
->
psz_vfilters
[
p_vout
->
i_vfilters_cfg
]
=
NULL
;
}
p_vout
->
i_vfilters_cfg
=
0
;
if
(
psz_vfilters
&&
*
psz_vfilters
)
{
char
*
psz_parser
=
psz_vfilters
;
while
(
psz_parser
&&
*
psz_parser
)
{
psz_parser
=
config_ChainCreate
(
&
p_vout
->
psz_vfilters
[
p_vout
->
i_vfilters_cfg
],
&
p_vout
->
p_vfilters_cfg
[
p_vout
->
i_vfilters_cfg
],
psz_parser
);
msg_Dbg
(
p_vout
,
"adding vfilter: %s"
,
p_vout
->
psz_vfilters
[
p_vout
->
i_vfilters_cfg
]
);
p_vout
->
i_vfilters_cfg
++
;
if
(
psz_parser
&&
*
psz_parser
)
{
if
(
p_vout
->
i_vfilters_cfg
==
MAX_VFILTERS
)
{
msg_Warn
(
p_vout
,
"maximum number of video filters reached.
\"
%s
\"
discarded"
,
psz_parser
);
break
;
}
}
}
}
return
VLC_SUCCESS
;
}
static
int
VideoFilter2Callback
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
...
...
@@ -1597,31 +1495,12 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd,
(
void
)
psz_cmd
;
(
void
)
oldval
;
(
void
)
p_data
;
vlc_mutex_lock
(
&
p_vout
->
vfilter_lock
);
ParseVideoFilter2Chain
(
p_vout
,
newval
.
psz_string
);
p_vout
->
b_vfilter_change
=
true
;
p_vout
->
psz_vf2
=
strdup
(
newval
.
psz_string
);
vlc_mutex_unlock
(
&
p_vout
->
vfilter_lock
);
return
VLC_SUCCESS
;
}
static
void
RemoveVideoFilters2
(
vout_thread_t
*
p_vout
)
{
int
i
;
for
(
i
=
0
;
i
<
p_vout
->
i_vfilters
;
i
++
)
{
vlc_object_detach
(
p_vout
->
pp_vfilters
[
i
]
);
if
(
p_vout
->
pp_vfilters
[
i
]
->
p_module
)
{
module_Unneed
(
p_vout
->
pp_vfilters
[
i
],
p_vout
->
pp_vfilters
[
i
]
->
p_module
);
}
free
(
p_vout
->
pp_vfilters
[
i
]
->
p_owner
);
vlc_object_release
(
p_vout
->
pp_vfilters
[
i
]
);
}
p_vout
->
i_vfilters
=
0
;
}
static
void
DisplayTitleOnOSD
(
vout_thread_t
*
p_vout
)
{
input_thread_t
*
p_input
;
...
...
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