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
b0123347
Commit
b0123347
authored
Sep 28, 2008
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Privatized part of vout fields.
parent
c6021166
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
164 additions
and
153 deletions
+164
-153
include/vlc_vout.h
include/vlc_vout.h
+7
-47
modules/gui/beos/VideoOutput.cpp
modules/gui/beos/VideoOutput.cpp
+0
-2
modules/gui/qnx/vout.c
modules/gui/qnx/vout.c
+0
-6
src/video_output/video_output.c
src/video_output/video_output.c
+85
-77
src/video_output/vout_internal.h
src/video_output/vout_internal.h
+49
-0
src/video_output/vout_intf.c
src/video_output/vout_intf.c
+17
-16
src/video_output/vout_pictures.c
src/video_output/vout_pictures.c
+6
-5
No files found.
include/vlc_vout.h
View file @
b0123347
...
...
@@ -469,6 +469,11 @@ VLC_EXPORT( int, __vout_AllocatePicture,( vlc_object_t *p_this, picture_t *p_pic
* @{
*/
/**
* Video ouput thread private structure
*/
typedef
struct
vout_thread_sys_t
vout_thread_sys_t
;
/**
* Video output thread descriptor
*
...
...
@@ -484,7 +489,6 @@ struct vout_thread_t
/**@{*/
vlc_mutex_t
picture_lock
;
/**< picture heap lock */
vlc_mutex_t
change_lock
;
/**< thread change lock */
vlc_mutex_t
vfilter_lock
;
/**< video filter2 change lock */
vout_sys_t
*
p_sys
;
/**< system output method */
/**@}*/
...
...
@@ -492,18 +496,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 */
uint32_t
render_time
;
/**< last picture render time */
unsigned
int
i_window_width
;
/**< video window width */
unsigned
int
i_window_height
;
/**< video window height */
unsigned
int
i_alignment
;
/**< video alignment in window */
unsigned
int
i_par_num
;
/**< monitor pixel aspect-ratio */
unsigned
int
i_par_den
;
/**< monitor pixel aspect-ratio */
struct
vout_window_t
*
p_window
;
/**< window for embedded vout (if any) */
/**@}*/
...
...
@@ -522,21 +519,11 @@ struct vout_thread_t
int
(
*
pf_control
)
(
vout_thread_t
*
,
int
,
va_list
);
/**@}*/
/** \name Statistics
* These numbers are not supposed to be accurate, but are a
* good indication of the thread status */
/**@{*/
count_t
c_fps_samples
;
/**< picture counts */
mtime_t
p_fps_sample
[
VOUT_FPS_SAMPLES
];
/**< FPS samples dates */
/**@}*/
/** \name Video heap and translation tables */
/**@{*/
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 */
video_format_t
fmt_render
;
/* render format (from the decoder) */
video_format_t
fmt_in
;
/* input (modified render) format */
...
...
@@ -549,34 +536,11 @@ struct vout_thread_t
/* Subpicture unit */
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
for the calculation of the
jitter */
/** delay created by internal caching */
int
i_pts_delay
;
/* Filter chain */
char
*
psz_filter_chain
;
bool
b_filter_change
;
/* Video filter2 chain */
filter_chain_t
*
p_vf2_chain
;
char
*
psz_vf2
;
/* Misc */
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
;
mtime_t
i_title_timeout
;
int
i_title_position
;
/* Private vout_thread data */
vout_thread_sys_t
*
p
;
};
#define I_OUTPUTPICTURES p_vout->output.i_pictures
...
...
@@ -591,14 +555,10 @@ struct vout_thread_t
*/
/** b_info changed */
#define VOUT_INFO_CHANGE 0x0001
/** b_grayscale changed */
#define VOUT_GRAYSCALE_CHANGE 0x0002
/** b_interface changed */
#define VOUT_INTF_CHANGE 0x0004
/** b_scale changed */
#define VOUT_SCALE_CHANGE 0x0008
/** gamma changed */
#define VOUT_GAMMA_CHANGE 0x0010
/** b_cursor changed */
#define VOUT_CURSOR_CHANGE 0x0020
/** b_fullscreen changed */
...
...
modules/gui/beos/VideoOutput.cpp
View file @
b0123347
...
...
@@ -1271,8 +1271,6 @@ int Init( vout_thread_t *p_vout )
p_vout
->
output
.
i_chroma
=
colspace
[
p_vout
->
p_sys
->
p_window
->
colspace_index
].
chroma
;
p_vout
->
p_sys
->
i_index
=
0
;
p_vout
->
b_direct
=
1
;
p_vout
->
output
.
i_rmask
=
0x00ff0000
;
p_vout
->
output
.
i_gmask
=
0x0000ff00
;
p_vout
->
output
.
i_bmask
=
0x000000ff
;
...
...
modules/gui/qnx/vout.c
View file @
b0123347
...
...
@@ -378,12 +378,6 @@ static int QNXManage( vout_thread_t *p_vout )
p_vout
->
i_changes
|=
VOUT_FULLSCREEN_CHANGE
;
break
;
case
Pk_c
:
case
Pk_C
:
p_vout
->
b_grayscale
=
!
p_vout
->
b_grayscale
;
p_vout
->
i_changes
|=
VOUT_GRAYSCALE_CHANGE
;
break
;
default:
break
;
}
...
...
src/video_output/video_output.c
View file @
b0123347
...
...
@@ -160,7 +160,7 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
/* We don't directly check for the "vout-filter" variable for obvious
* performance reasons. */
if
(
p_vout
->
b_filter_change
)
if
(
p_vout
->
p
->
b_filter_change
)
{
var_Get
(
p_vout
,
"vout-filter"
,
&
val
);
psz_filter_chain
=
val
.
psz_string
;
...
...
@@ -170,15 +170,15 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
free
(
psz_filter_chain
);
psz_filter_chain
=
NULL
;
}
if
(
p_vout
->
p
sz_filter_chain
&&
!*
p_vout
->
psz_filter_chain
)
if
(
p_vout
->
p
->
psz_filter_chain
&&
!*
p_vout
->
p
->
psz_filter_chain
)
{
free
(
p_vout
->
psz_filter_chain
);
p_vout
->
psz_filter_chain
=
NULL
;
free
(
p_vout
->
p
->
p
sz_filter_chain
);
p_vout
->
p
->
p
sz_filter_chain
=
NULL
;
}
if
(
!
psz_filter_chain
&&
!
p_vout
->
psz_filter_chain
)
if
(
!
psz_filter_chain
&&
!
p_vout
->
p
->
p
sz_filter_chain
)
{
p_vout
->
b_filter_change
=
false
;
p_vout
->
p
->
b_filter_change
=
false
;
}
free
(
psz_filter_chain
);
...
...
@@ -187,7 +187,7 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
if
(
p_vout
->
fmt_render
.
i_chroma
!=
p_fmt
->
i_chroma
||
p_vout
->
fmt_render
.
i_width
!=
p_fmt
->
i_width
||
p_vout
->
fmt_render
.
i_height
!=
p_fmt
->
i_height
||
p_vout
->
b_filter_change
)
p_vout
->
p
->
b_filter_change
)
{
vlc_mutex_unlock
(
&
p_vout
->
change_lock
);
...
...
@@ -254,7 +254,7 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
/* Display title if we are not using the vout given to vout_Request.
* XXX for now b_vout_provided is always true at this stage */
if
(
p_vout
->
b_title_show
&&
!
b_vout_provided
)
if
(
p_vout
->
p
->
b_title_show
&&
!
b_vout_provided
)
DisplayTitleOnOSD
(
p_vout
);
}
}
...
...
@@ -306,6 +306,14 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
if
(
p_vout
==
NULL
)
return
NULL
;
/* */
p_vout
->
p
=
calloc
(
1
,
sizeof
(
p_vout
->
p
)
);
if
(
!
p_vout
->
p
)
{
vlc_object_release
(
p_vout
);
return
NULL
;
}
/* Initialize pictures - translation tables and functions
* will be initialized later in InitThread */
for
(
i_index
=
0
;
i_index
<
2
*
VOUT_MAX_PICTURES
+
1
;
i_index
++
)
...
...
@@ -351,24 +359,21 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
/* Initialize misc stuff */
p_vout
->
i_changes
=
0
;
p_vout
->
f_gamma
=
0
;
p_vout
->
b_grayscale
=
0
;
p_vout
->
b_info
=
0
;
p_vout
->
b_interface
=
0
;
p_vout
->
b_scale
=
1
;
p_vout
->
b_fullscreen
=
0
;
p_vout
->
i_alignment
=
0
;
p_vout
->
render_time
=
10
;
p_vout
->
c_fps_samples
=
0
;
p_vout
->
b_filter_change
=
0
;
p_vout
->
p
->
render_time
=
10
;
p_vout
->
p
->
c_fps_samples
=
0
;
p_vout
->
p
->
b_filter_change
=
0
;
p_vout
->
pf_control
=
NULL
;
p_vout
->
p_window
=
NULL
;
p_vout
->
i_par_num
=
p_vout
->
i_par_den
=
1
;
p_vout
->
p
->
i_par_num
=
p_vout
->
p
->
i_par_den
=
1
;
/* Initialize locks */
vlc_mutex_init
(
&
p_vout
->
picture_lock
);
vlc_mutex_init
(
&
p_vout
->
change_lock
);
vlc_mutex_init
(
&
p_vout
->
vfilter_lock
);
vlc_mutex_init
(
&
p_vout
->
p
->
vfilter_lock
);
/* Mouse coordinates */
var_Create
(
p_vout
,
"mouse-x"
,
VLC_VAR_INTEGER
);
...
...
@@ -394,11 +399,11 @@ 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 */
p_vout
->
psz_filter_chain
=
p_vout
->
p
->
p
sz_filter_chain
=
var_CreateGetStringCommand
(
p_vout
,
"vout-filter"
);
/* Apply video filter2 objects on the first vout */
p_vout
->
psz_vf2
=
p_vout
->
p
->
p
sz_vf2
=
var_CreateGetStringCommand
(
p_vout
,
"video-filter"
);
}
else
...
...
@@ -407,25 +412,25 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
char
*
psz_tmp
;
/* Ugly hack to jump to our configuration chain */
p_vout
->
psz_filter_chain
=
((
vout_thread_t
*
)
p_parent
)
->
psz_filter_chain
;
p_vout
->
psz_filter_chain
=
config_ChainCreate
(
&
psz_tmp
,
&
p_cfg
,
p_vout
->
psz_filter_chain
);
p_vout
->
p
->
p
sz_filter_chain
=
((
vout_thread_t
*
)
p_parent
)
->
p
->
p
sz_filter_chain
;
p_vout
->
p
->
p
sz_filter_chain
=
config_ChainCreate
(
&
psz_tmp
,
&
p_cfg
,
p_vout
->
p
->
p
sz_filter_chain
);
config_ChainDestroy
(
p_cfg
);
free
(
psz_tmp
);
/* Create a video filter2 var ... but don't inherit values */
var_Create
(
p_vout
,
"video-filter"
,
VLC_VAR_STRING
|
VLC_VAR_ISCOMMAND
);
p_vout
->
psz_vf2
=
var_GetString
(
p_vout
,
"video-filter"
);
p_vout
->
p
->
p
sz_vf2
=
var_GetString
(
p_vout
,
"video-filter"
);
}
var_AddCallback
(
p_vout
,
"video-filter"
,
VideoFilter2Callback
,
NULL
);
p_vout
->
p_vf2_chain
=
filter_chain_New
(
p_vout
,
"video filter2"
,
p_vout
->
p
->
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
->
p
sz_filter_chain
||
!*
p_vout
->
psz_filter_chain
)
if
(
!
p_vout
->
p
->
psz_filter_chain
||
!*
p_vout
->
p
->
psz_filter_chain
)
{
var_Create
(
p_vout
,
"vout"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_vout
,
"vout"
,
&
val
);
...
...
@@ -433,8 +438,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
}
else
{
psz_parser
=
strdup
(
p_vout
->
psz_filter_chain
);
p_vout
->
b_title_show
=
false
;
psz_parser
=
strdup
(
p_vout
->
p
->
p
sz_filter_chain
);
p_vout
->
p
->
b_title_show
=
false
;
}
/* Create the vout thread */
...
...
@@ -443,8 +448,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
free
(
psz_tmp
);
p_vout
->
p_cfg
=
p_cfg
;
p_vout
->
p_module
=
module_need
(
p_vout
,
(
p_vout
->
p
sz_filter_chain
&&
*
p_vout
->
psz_filter_chain
)
?
"video filter"
:
"video output"
,
psz_name
,
p_vout
->
p
sz_filter_chain
&&
*
p_vout
->
psz_filter_chain
);
(
p_vout
->
p
->
psz_filter_chain
&&
*
p_vout
->
p
->
psz_filter_chain
)
?
"video filter"
:
"video output"
,
psz_name
,
p_vout
->
p
->
psz_filter_chain
&&
*
p_vout
->
p
->
psz_filter_chain
);
free
(
psz_name
);
if
(
p_vout
->
p_module
==
NULL
)
...
...
@@ -493,12 +498,12 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
if
(
p_input_thread
)
{
p_vout
->
i_pts_delay
=
p_input_thread
->
i_pts_delay
;
p_vout
->
p
->
i_pts_delay
=
p_input_thread
->
i_pts_delay
;
vlc_object_release
(
p_input_thread
);
}
else
{
p_vout
->
i_pts_delay
=
DEFAULT_PTS_DELAY
;
p_vout
->
p
->
i_pts_delay
=
DEFAULT_PTS_DELAY
;
}
if
(
vlc_thread_create
(
p_vout
,
"video output"
,
RunThread
,
...
...
@@ -550,12 +555,14 @@ static void vout_Destructor( vlc_object_t * p_this )
/* Destroy the locks */
vlc_mutex_destroy
(
&
p_vout
->
picture_lock
);
vlc_mutex_destroy
(
&
p_vout
->
change_lock
);
vlc_mutex_destroy
(
&
p_vout
->
vfilter_lock
);
vlc_mutex_destroy
(
&
p_vout
->
p
->
vfilter_lock
);
free
(
p_vout
->
psz_filter_chain
);
free
(
p_vout
->
p
->
p
sz_filter_chain
);
config_ChainDestroy
(
p_vout
->
p_cfg
);
free
(
p_vout
->
p
);
#ifndef __APPLE__
vout_thread_t
*
p_another_vout
;
...
...
@@ -706,7 +713,7 @@ static int InitThread( vout_thread_t *p_vout )
* directly decode into them ! Map the first render buffers to
* the first direct buffers, but keep the first direct buffer
* for memcpy operations */
p_vout
->
b_direct
=
1
;
p_vout
->
p
->
b_direct
=
true
;
for
(
i
=
1
;
i
<
VOUT_MAX_PICTURES
;
i
++
)
{
...
...
@@ -731,7 +738,7 @@ static int InitThread( vout_thread_t *p_vout )
/* Rats... Something is wrong here, we could not find an output
* plugin able to directly render what we decode. See if we can
* find a chroma plugin to do the conversion */
p_vout
->
b_direct
=
0
;
p_vout
->
p
->
b_direct
=
false
;
if
(
ChromaCreate
(
p_vout
)
)
{
...
...
@@ -812,7 +819,7 @@ static void* RunThread( vlc_object_t *p_this )
vlc_object_lock
(
p_vout
);
if
(
p_vout
->
b_title_show
)
if
(
p_vout
->
p
->
b_title_show
)
DisplayTitleOnOSD
(
p_vout
);
/*
...
...
@@ -898,12 +905,12 @@ static void* RunThread( vlc_object_t *p_this )
}
/* Compute FPS rate */
p_vout
->
p
_fps_sample
[
p_vout
->
c_fps_samples
++
%
VOUT_FPS_SAMPLES
]
p_vout
->
p
->
p_fps_sample
[
p_vout
->
p
->
c_fps_samples
++
%
VOUT_FPS_SAMPLES
]
=
display_date
;
if
(
!
p_picture
->
b_force
&&
p_picture
!=
p_last_picture
&&
display_date
<
current_date
+
p_vout
->
render_time
&&
display_date
<
current_date
+
p_vout
->
p
->
render_time
&&
b_drop_late
)
{
/* Picture is late: it will be destroyed and the thread
...
...
@@ -916,14 +923,14 @@ static void* RunThread( vlc_object_t *p_this )
}
if
(
display_date
>
current_date
+
p_vout
->
i_pts_delay
+
VOUT_BOGUS_DELAY
)
current_date
+
p_vout
->
p
->
i_pts_delay
+
VOUT_BOGUS_DELAY
)
{
/* Picture is waaay too early: it will be destroyed */
DropPicture
(
p_vout
,
p_picture
);
i_lost
++
;
msg_Warn
(
p_vout
,
"vout warning: early picture skipped "
"(%"
PRId64
")"
,
display_date
-
current_date
-
p_vout
->
i_pts_delay
);
-
p_vout
->
p
->
i_pts_delay
);
continue
;
}
...
...
@@ -949,7 +956,7 @@ static void* RunThread( vlc_object_t *p_this )
{
/* We set the display date to something high, otherwise
* we'll have lots of problems with late pictures */
display_date
=
current_date
+
p_vout
->
render_time
;
display_date
=
current_date
+
p_vout
->
p
->
render_time
;
}
}
}
...
...
@@ -959,14 +966,14 @@ static void* RunThread( vlc_object_t *p_this )
p_filtered_picture
=
NULL
;
if
(
p_picture
)
p_filtered_picture
=
filter_chain_VideoFilter
(
p_vout
->
p_vf2_chain
,
p_filtered_picture
=
filter_chain_VideoFilter
(
p_vout
->
p
->
p
_vf2_chain
,
p_picture
);
/* FIXME it is a bit ugly that b_snapshot is not locked but I do not
* know which lock to use (here and in the snapshot callback) */
const
bool
b_snapshot
=
p_vout
->
b_snapshot
;
const
bool
b_snapshot
=
p_vout
->
p
->
b_snapshot
;
if
(
b_snapshot
)
p_vout
->
b_snapshot
=
false
;
p_vout
->
p
->
b_snapshot
=
false
;
/*
* Check for subpictures to display
...
...
@@ -1010,14 +1017,14 @@ static void* RunThread( vlc_object_t *p_this )
{
mtime_t
current_render_time
=
mdate
()
-
current_date
;
/* if render time is very large we don't include it in the mean */
if
(
current_render_time
<
p_vout
->
render_time
+
if
(
current_render_time
<
p_vout
->
p
->
render_time
+
VOUT_DISPLAY_DELAY
)
{
/* Store render time using a sliding mean weighting to
* current value in a 3 to 1 ratio*/
p_vout
->
render_time
*=
3
;
p_vout
->
render_time
+=
current_render_time
;
p_vout
->
render_time
>>=
2
;
p_vout
->
p
->
render_time
*=
3
;
p_vout
->
p
->
render_time
+=
current_render_time
;
p_vout
->
p
->
render_time
>>=
2
;
}
}
...
...
@@ -1031,7 +1038,7 @@ static void* RunThread( vlc_object_t *p_this )
{
/* If there are filters in the chain, better give them the picture
* in advance */
if
(
!
p_vout
->
p
sz_filter_chain
||
!*
p_vout
->
psz_filter_chain
)
if
(
!
p_vout
->
p
->
psz_filter_chain
||
!*
p_vout
->
p
->
psz_filter_chain
)
{
mwait
(
display_date
-
VOUT_MWAIT_TOLERANCE
);
}
...
...
@@ -1096,7 +1103,7 @@ static void* RunThread( vlc_object_t *p_this )
p_vout
->
i_changes
&=
~
VOUT_SIZE_CHANGE
;
assert
(
!
p_vout
->
b_direct
);
assert
(
!
p_vout
->
p
->
b_direct
);
ChromaDestroy
(
p_vout
);
...
...
@@ -1140,7 +1147,7 @@ static void* RunThread( vlc_object_t *p_this )
* buffer!! */
p_vout
->
i_changes
&=
~
VOUT_PICTURE_BUFFERS_CHANGE
;
if
(
!
p_vout
->
b_direct
)
if
(
!
p_vout
->
p
->
b_direct
)
ChromaDestroy
(
p_vout
);
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
...
...
@@ -1160,23 +1167,23 @@ static void* RunThread( vlc_object_t *p_this )
}
/* Check for "video filter2" changes */
vlc_mutex_lock
(
&
p_vout
->
vfilter_lock
);
if
(
p_vout
->
psz_vf2
)
vlc_mutex_lock
(
&
p_vout
->
p
->
vfilter_lock
);
if
(
p_vout
->
p
->
p
sz_vf2
)
{
es_format_t
fmt
;
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
);
filter_chain_Reset
(
p_vout
->
p
->
p
_vf2_chain
,
&
fmt
,
&
fmt
);
if
(
filter_chain_AppendFromString
(
p_vout
->
p_vf2_chain
,
p_vout
->
psz_vf2
)
<
0
)
if
(
filter_chain_AppendFromString
(
p_vout
->
p
->
p
_vf2_chain
,
p_vout
->
p
->
p
sz_vf2
)
<
0
)
msg_Err
(
p_vout
,
"Video filter chain creation failed"
);
free
(
p_vout
->
psz_vf2
);
p_vout
->
psz_vf2
=
NULL
;
free
(
p_vout
->
p
->
p
sz_vf2
);
p_vout
->
p
->
p
sz_vf2
=
NULL
;
}
vlc_mutex_unlock
(
&
p_vout
->
vfilter_lock
);
vlc_mutex_unlock
(
&
p_vout
->
p
->
vfilter_lock
);
}
/*
...
...
@@ -1220,7 +1227,7 @@ static void CleanThread( vout_thread_t *p_vout )
{
int
i_index
;
/* index in heap */
if
(
!
p_vout
->
b_direct
)
if
(
!
p_vout
->
p
->
b_direct
)
ChromaDestroy
(
p_vout
);
/* Destroy all remaining pictures */
...
...
@@ -1263,7 +1270,7 @@ static void EndThread( vout_thread_t *p_vout )
spu_Destroy
(
p_vout
->
p_spu
);
/* Destroy the video filters2 */
filter_chain_Delete
(
p_vout
->
p_vf2_chain
);
filter_chain_Delete
(
p_vout
->
p
->
p
_vf2_chain
);
}
/* Thread helpers */
...
...
@@ -1280,7 +1287,7 @@ static int ChromaCreate( vout_thread_t *p_vout )
filter_t
*
p_chroma
;
/* Choose the best module */
p_chroma
=
p_vout
->
p_chroma
=
p_chroma
=
p_vout
->
p
->
p
_chroma
=
vlc_custom_create
(
p_vout
,
sizeof
(
filter_t
),
VLC_OBJECT_GENERIC
,
typename
);
...
...
@@ -1303,8 +1310,9 @@ static int ChromaCreate( vout_thread_t *p_vout )
p_chroma
->
fmt_out
.
video
.
i_width
,
p_chroma
->
fmt_out
.
video
.
i_height
);
vlc_object_release
(
p_vout
->
p_chroma
);
p_vout
->
p_chroma
=
NULL
;
vlc_object_release
(
p_vout
->
p
->
p_chroma
);
p_vout
->
p
->
p_chroma
=
NULL
;
return
VLC_EGENERIC
;
}
p_chroma
->
pf_vout_buffer_new
=
ChromaGetPicture
;
...
...
@@ -1313,14 +1321,14 @@ static int ChromaCreate( vout_thread_t *p_vout )
static
void
ChromaDestroy
(
vout_thread_t
*
p_vout
)
{
assert
(
!
p_vout
->
b_direct
);
assert
(
!
p_vout
->
p
->
b_direct
);
if
(
!
p_vout
->
p_chroma
)
if
(
!
p_vout
->
p
->
p
_chroma
)
return
;
module_unneed
(
p_vout
->
p
_chroma
,
p_vout
->
p_chroma
->
p_module
);
vlc_object_release
(
p_vout
->
p_chroma
);
p_vout
->
p_chroma
=
NULL
;
module_unneed
(
p_vout
->
p
->
p_chroma
,
p_vout
->
p
->
p_chroma
->
p_module
);
vlc_object_release
(
p_vout
->
p
->
p
_chroma
);
p_vout
->
p
->
p
_chroma
=
NULL
;
}
static
void
DropPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_picture
)
...
...
@@ -1539,9 +1547,9 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd,
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
(
void
)
psz_cmd
;
(
void
)
oldval
;
(
void
)
p_data
;
vlc_mutex_lock
(
&
p_vout
->
vfilter_lock
);
p_vout
->
psz_vf2
=
strdup
(
newval
.
psz_string
);
vlc_mutex_unlock
(
&
p_vout
->
vfilter_lock
);
vlc_mutex_lock
(
&
p_vout
->
p
->
vfilter_lock
);
p_vout
->
p
->
p
sz_vf2
=
strdup
(
newval
.
psz_string
);
vlc_mutex_unlock
(
&
p_vout
->
p
->
vfilter_lock
);
return
VLC_SUCCESS
;
}
...
...
@@ -1558,7 +1566,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
if
(
p_input
)
{
i_now
=
mdate
();
i_stop
=
i_now
+
(
mtime_t
)(
p_vout
->
i_title_timeout
*
1000
);
i_stop
=
i_now
+
(
mtime_t
)(
p_vout
->
p
->
i_title_timeout
*
1000
);
char
*
psz_nowplaying
=
input_item_GetNowPlaying
(
input_GetItem
(
p_input
)
);
char
*
psz_artist
=
input_item_GetArtist
(
input_GetItem
(
p_input
)
);
...
...
@@ -1572,7 +1580,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{
vout_ShowTextAbsolute
(
p_vout
,
DEFAULT_CHAN
,
psz_nowplaying
,
NULL
,
p_vout
->
i_title_position
,
p_vout
->
p
->
i_title_position
,
30
+
p_vout
->
fmt_in
.
i_width
-
p_vout
->
fmt_in
.
i_visible_width
-
p_vout
->
fmt_in
.
i_x_offset
,
...
...
@@ -1586,7 +1594,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{
vout_ShowTextAbsolute
(
p_vout
,
DEFAULT_CHAN
,
psz_string
,
NULL
,
p_vout
->
i_title_position
,
p_vout
->
p
->
i_title_position
,
30
+
p_vout
->
fmt_in
.
i_width
-
p_vout
->
fmt_in
.
i_visible_width
-
p_vout
->
fmt_in
.
i_x_offset
,
...
...
@@ -1599,7 +1607,7 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
{
vout_ShowTextAbsolute
(
p_vout
,
DEFAULT_CHAN
,
psz_name
,
NULL
,
p_vout
->
i_title_position
,
p_vout
->
p
->
i_title_position
,
30
+
p_vout
->
fmt_in
.
i_width
-
p_vout
->
fmt_in
.
i_visible_width
-
p_vout
->
fmt_in
.
i_x_offset
,
...
...
src/video_output/vout_internal.h
View file @
b0123347
...
...
@@ -30,6 +30,55 @@
#ifndef _VOUT_INTERNAL_H
#define _VOUT_INTERNAL_H 1
struct
vout_thread_sys_t
{
/* */
vlc_mutex_t
vfilter_lock
;
/**< video filter2 change lock */
/* */
uint32_t
render_time
;
/**< last picture render time */
unsigned
int
i_par_num
;
/**< monitor pixel aspect-ratio */
unsigned
int
i_par_den
;
/**< monitor pixel aspect-ratio */
/* */
bool
b_direct
;
/**< rendered are like direct ? */
filter_t
*
p_chroma
;
/**
* These numbers are not supposed to be accurate, but are a
* good indication of the thread status */
count_t
c_fps_samples
;
/**< picture counts */
mtime_t
p_fps_sample
[
VOUT_FPS_SAMPLES
];
/**< FPS samples dates */
#if 0
/* 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
for the calculation of the jitter */
#endif
/** delay created by internal caching */
int
i_pts_delay
;
/* Filter chain */
char
*
psz_filter_chain
;
bool
b_filter_change
;
/* Video filter2 chain */
filter_chain_t
*
p_vf2_chain
;
char
*
psz_vf2
;
/* Misc */
bool
b_snapshot
;
/**< take one snapshot on the next loop */
/* Show media title on videoutput */
bool
b_title_show
;
mtime_t
i_title_timeout
;
int
i_title_position
;
};
/* DO NOT use vout_RenderPicture unless you are in src/video_ouput */
picture_t
*
vout_RenderPicture
(
vout_thread_t
*
,
picture_t
*
,
subpicture_t
*
,
bool
b_paused
);
...
...
src/video_output/vout_intf.c
View file @
b0123347
...
...
@@ -50,6 +50,7 @@
#include <vlc_strings.h>
#include <vlc_charset.h>
#include "../libvlc.h"
#include "vout_internal.h"
/*****************************************************************************
* Local prototypes
...
...
@@ -257,10 +258,10 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_Create
(
p_vout
,
"mouse-hide-timeout"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
p_vout
->
b_title_show
=
var_CreateGetBool
(
p_vout
,
"video-title-show"
);
p_vout
->
i_title_timeout
=
p_vout
->
p
->
b_title_show
=
var_CreateGetBool
(
p_vout
,
"video-title-show"
);
p_vout
->
p
->
i_title_timeout
=
(
mtime_t
)
var_CreateGetInteger
(
p_vout
,
"video-title-timeout"
);
p_vout
->
i_title_position
=
p_vout
->
p
->
i_title_position
=
var_CreateGetInteger
(
p_vout
,
"video-title-position"
);
var_AddCallback
(
p_vout
,
"video-title-show"
,
TitleShowCallback
,
NULL
);
...
...
@@ -352,14 +353,14 @@ void vout_IntfInit( vout_thread_t *p_vout )
}
if
(
!
i_aspect_num
||
!
i_aspect_den
)
i_aspect_num
=
i_aspect_den
=
1
;
p_vout
->
i_par_num
=
i_aspect_num
;
p_vout
->
i_par_den
=
i_aspect_den
;
p_vout
->
p
->
i_par_num
=
i_aspect_num
;
p_vout
->
p
->
i_par_den
=
i_aspect_den
;
vlc_ureduce
(
&
p_vout
->
i_par_num
,
&
p_vout
->
i_par_den
,
p_vout
->
i_par_num
,
p_vout
->
i_par_den
,
0
);
vlc_ureduce
(
&
p_vout
->
p
->
i_par_num
,
&
p_vout
->
p
->
i_par_den
,
p_vout
->
p
->
i_par_num
,
p_vout
->
p
->
i_par_den
,
0
);
msg_Dbg
(
p_vout
,
"overriding monitor pixel aspect-ratio: %i:%i"
,
p_vout
->
i_par_num
,
p_vout
->
i_par_den
);
p_vout
->
p
->
i_par_num
,
p_vout
->
p
->
i_par_den
);
b_force_par
=
true
;
}
free
(
val
.
psz_string
);
...
...
@@ -877,7 +878,7 @@ int vout_vaControlDefault( vout_thread_t *p_vout, int i_query, va_list args )
return
VLC_SUCCESS
;
case
VOUT_SNAPSHOT
:
p_vout
->
b_snapshot
=
true
;
p_vout
->
p
->
b_snapshot
=
true
;
return
VLC_SUCCESS
;
default:
...
...
@@ -1158,12 +1159,12 @@ static int AspectCallback( vlc_object_t *p_this, char const *psz_cmd,
p_vout
->
render
.
i_aspect
=
p_vout
->
fmt_in
.
i_aspect
;
aspect_end:
if
(
p_vout
->
i_par_num
&&
p_vout
->
i_par_den
)
if
(
p_vout
->
p
->
i_par_num
&&
p_vout
->
p
->
i_par_den
)
{
p_vout
->
fmt_in
.
i_sar_num
*=
p_vout
->
i_par_den
;
p_vout
->
fmt_in
.
i_sar_den
*=
p_vout
->
i_par_num
;
p_vout
->
fmt_in
.
i_sar_num
*=
p_vout
->
p
->
i_par_den
;
p_vout
->
fmt_in
.
i_sar_den
*=
p_vout
->
p
->
i_par_num
;
p_vout
->
fmt_in
.
i_aspect
=
p_vout
->
fmt_in
.
i_aspect
*
p_vout
->
i_par_den
/
p_vout
->
i_par_num
;
p_vout
->
p
->
i_par_den
/
p_vout
->
p
->
i_par_num
;
p_vout
->
render
.
i_aspect
=
p_vout
->
fmt_in
.
i_aspect
;
}
...
...
@@ -1231,7 +1232,7 @@ static int TitleShowCallback( vlc_object_t *p_this, char const *psz_cmd,
VLC_UNUSED
(
psz_cmd
);
VLC_UNUSED
(
oldval
);
VLC_UNUSED
(
p_data
);
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
p_vout
->
b_title_show
=
newval
.
b_bool
;
p_vout
->
p
->
b_title_show
=
newval
.
b_bool
;
return
VLC_SUCCESS
;
}
...
...
@@ -1240,7 +1241,7 @@ static int TitleTimeoutCallback( vlc_object_t *p_this, char const *psz_cmd,
{
VLC_UNUSED
(
psz_cmd
);
VLC_UNUSED
(
oldval
);
VLC_UNUSED
(
p_data
);
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
p_vout
->
i_title_timeout
=
(
mtime_t
)
newval
.
i_int
;
p_vout
->
p
->
i_title_timeout
=
(
mtime_t
)
newval
.
i_int
;
return
VLC_SUCCESS
;
}
...
...
@@ -1250,6 +1251,6 @@ static int TitlePositionCallback( vlc_object_t *p_this, char const *psz_cmd,
VLC_UNUSED
(
psz_cmd
);
VLC_UNUSED
(
oldval
);
VLC_UNUSED
(
p_data
);
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
p_vout
->
i_title_position
=
newval
.
i_int
;
p_vout
->
p
->
i_title_position
=
newval
.
i_int
;
return
VLC_SUCCESS
;
}
src/video_output/vout_pictures.c
View file @
b0123347
...
...
@@ -35,6 +35,7 @@
#include <vlc_osd.h>
#include <vlc_filter.h>
#include "vout_pictures.h"
#include "vout_internal.h"
#include <assert.h>
...
...
@@ -357,7 +358,7 @@ picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
/* Not a direct buffer. We either need to copy it to a direct buffer,
* or render it if the chroma isn't the same. */
if
(
p_vout
->
b_direct
)
if
(
p_vout
->
p
->
b_direct
)
{
/* Picture is not in a direct buffer, but is exactly the
* same size as the direct buffers. A memcpy() is enough,
...
...
@@ -401,8 +402,8 @@ picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
}
/* Convert image to the first direct buffer */
p_vout
->
p_chroma
->
p_owner
=
(
filter_owner_sys_t
*
)
p_tmp_pic
;
p_vout
->
p
_chroma
->
pf_video_filter
(
p_vout
->
p_chroma
,
p_pic
);
p_vout
->
p
->
p
_chroma
->
p_owner
=
(
filter_owner_sys_t
*
)
p_tmp_pic
;
p_vout
->
p
->
p_chroma
->
pf_video_filter
(
p_vout
->
p
->
p_chroma
,
p_pic
);
/* Render subpictures on the first direct buffer */
spu_RenderSubpictures
(
p_vout
->
p_spu
,
...
...
@@ -420,8 +421,8 @@ picture_t *vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
return
NULL
;
/* Convert image to the first direct buffer */
p_vout
->
p_chroma
->
p_owner
=
(
filter_owner_sys_t
*
)
&
p_vout
->
p_picture
[
0
];
p_vout
->
p
_chroma
->
pf_video_filter
(
p_vout
->
p_chroma
,
p_pic
);
p_vout
->
p
->
p
_chroma
->
p_owner
=
(
filter_owner_sys_t
*
)
&
p_vout
->
p_picture
[
0
];
p_vout
->
p
->
p_chroma
->
pf_video_filter
(
p_vout
->
p
->
p_chroma
,
p_pic
);
/* Render subpictures on the first direct buffer */
spu_RenderSubpictures
(
p_vout
->
p_spu
,
...
...
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