Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
fd32a7c3
Commit
fd32a7c3
authored
Apr 23, 2010
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
No functionnal changes (vout).
parent
f0fe302b
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
135 additions
and
194 deletions
+135
-194
src/video_output/video_output.c
src/video_output/video_output.c
+103
-153
src/video_output/vout_internal.h
src/video_output/vout_internal.h
+15
-19
src/video_output/vout_intf.c
src/video_output/vout_intf.c
+9
-9
src/video_output/vout_pictures.c
src/video_output/vout_pictures.c
+0
-13
src/video_output/vout_wrapper.c
src/video_output/vout_wrapper.c
+8
-0
No files found.
src/video_output/video_output.c
View file @
fd32a7c3
...
...
@@ -53,12 +53,8 @@
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
InitThread
(
vout_thread_t
*
);
static
void
*
RunThread
(
void
*
);
static
void
CleanThread
(
vout_thread_t
*
);
static
void
EndThread
(
vout_thread_t
*
);
static
void
vout_Destructor
(
vlc_object_t
*
p_this
);
static
void
*
Thread
(
void
*
);
static
void
vout_Destructor
(
vlc_object_t
*
);
/* Object variables callbacks */
static
int
FilterCallback
(
vlc_object_t
*
,
char
const
*
,
...
...
@@ -76,25 +72,24 @@ static int PostProcessCallback( vlc_object_t *, char const *,
static
void
DeinterlaceEnable
(
vout_thread_t
*
);
static
void
DeinterlaceNeeded
(
vout_thread_t
*
,
bool
);
/* From vout_intf.c */
int
vout_Snapshot
(
vout_thread_t
*
,
picture_t
*
);
/* Display media title in OSD */
static
void
DisplayTitleOnOSD
(
vout_thread_t
*
p_vout
);
/* Time during which the thread will sleep if it has nothing to
* display (in micro-seconds) */
#define VOUT_IDLE_SLEEP ((int)(0.020*CLOCK_FREQ))
/* */
static
void
PrintVideoFormat
(
vout_thread_t
*
,
const
char
*
,
const
video_format_t
*
);
/* Maximum delay between 2 displayed pictures.
* XXX it is needed for now but should be removed in the long term.
*/
#define VOUT_REDISPLAY_DELAY (INT64_C(80000))
/* Maximum lap of time allowed between the beginning of rendering and
* display. If, compared to the current date, the next image is too
* late, the thread will perform an idle loop. This time should be
* at least VOUT_IDLE_SLEEP plus the time required to render a few
* images, to avoid trashing of decoded images */
#define VOUT_DISPLAY_DELAY ((int)(0.200*CLOCK_FREQ))
/**
* Late pictures having a delay higher than this value are thrashed.
*/
#define VOUT_DISPLAY_LATE_THRESHOLD (INT64_C(20000))
/* Better be in advance when awakening than late... */
#define VOUT_MWAIT_TOLERANCE
((mtime_t)(0.020*CLOCK_FREQ
))
#define VOUT_MWAIT_TOLERANCE
(INT64_C(1000
))
/*****************************************************************************
* Video Filter2 functions
...
...
@@ -107,7 +102,7 @@ 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_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_filter
->
p_owner
;
VLC_UNUSED
(
p_filter
)
;
picture_Release
(
p_pic
);
}
...
...
@@ -247,14 +242,13 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
return
p_vout
;
}
#undef vout_Create
/*****************************************************************************
* vout_Create: creates a new video output thread
*****************************************************************************
* This function creates a new video output thread, and returns a pointer
* to its description. On error, it returns NULL.
*****************************************************************************/
vout_thread_t
*
vout_Create
(
vlc_object_t
*
p_parent
,
video_format_t
*
p_fmt
)
vout_thread_t
*
(
vout_Create
)
(
vlc_object_t
*
p_parent
,
video_format_t
*
p_fmt
)
{
vout_thread_t
*
p_vout
;
/* thread descriptor */
vlc_value_t
text
;
...
...
@@ -303,20 +297,22 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
vout_chrono_Init
(
&
p_vout
->
p
->
render
,
5
,
10000
);
/* Arbitrary initial time */
vout_statistic_Init
(
&
p_vout
->
p
->
statistic
);
p_vout
->
p
->
b_filter_change
=
0
;
p_vout
->
p
->
b_paused
=
false
;
p_vout
->
p
->
i_pause_date
=
0
;
p_vout
->
p
->
i_par_num
=
p_vout
->
p
->
i_par_den
=
1
;
p_vout
->
p
->
is_late_dropped
=
var_InheritBool
(
p_vout
,
"drop-late-frames"
);
p_vout
->
p
->
b_picture_empty
=
false
;
p_vout
->
p
->
displayed
.
clock
=
VLC_TS_INVALID
;
p_vout
->
p
->
displayed
.
date
=
VLC_TS_INVALID
;
p_vout
->
p
->
displayed
.
decoded
=
NULL
;
p_vout
->
p
->
displayed
.
timestamp
X
=
VLC_TS_INVALID
;
p_vout
->
p
->
displayed
.
timestamp
=
VLC_TS_INVALID
;
p_vout
->
p
->
displayed
.
qtype
=
QTYPE_NONE
;
p_vout
->
p
->
displayed
.
is_interlaced
=
false
;
p_vout
->
p
->
step
.
is_requested
=
false
;
p_vout
->
p
->
step
.
last
=
VLC_TS_INVALID
;
p_vout
->
p
->
step
.
timestamp
=
VLC_TS_INVALID
;
p_vout
->
p
->
step
.
last
=
VLC_TS_INVALID
;
p_vout
->
p
->
step
.
timestamp
=
VLC_TS_INVALID
;
p_vout
->
p
->
pause
.
is_on
=
false
;
p_vout
->
p
->
pause
.
date
=
VLC_TS_INVALID
;
p_vout
->
p
->
decoder_fifo
=
picture_fifo_New
();
p_vout
->
p
->
decoder_pool
=
NULL
;
...
...
@@ -400,7 +396,7 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
else
{
psz_parser
=
strdup
(
p_vout
->
p
->
psz_filter_chain
);
p_vout
->
p
->
b_title_
show
=
false
;
p_vout
->
p
->
title
.
show
=
false
;
}
/* Create the vout thread */
...
...
@@ -433,7 +429,7 @@ vout_thread_t * vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
/* */
vlc_cond_init
(
&
p_vout
->
p
->
change_wait
);
if
(
vlc_clone
(
&
p_vout
->
p
->
thread
,
Run
Thread
,
p_vout
,
if
(
vlc_clone
(
&
p_vout
->
p
->
thread
,
Thread
,
p_vout
,
VLC_THREAD_PRIORITY_OUTPUT
)
)
{
spu_Attach
(
p_vout
->
p
->
p_spu
,
VLC_OBJECT
(
p_vout
),
false
);
...
...
@@ -519,7 +515,7 @@ static void vout_Destructor( vlc_object_t * p_this )
/* */
free
(
p_vout
->
p
->
psz_filter_chain
);
free
(
p_vout
->
p
->
psz_titl
e
);
free
(
p_vout
->
p
->
title
.
valu
e
);
config_ChainDestroy
(
p_vout
->
p
->
p_cfg
);
...
...
@@ -532,13 +528,13 @@ void vout_ChangePause( vout_thread_t *p_vout, bool b_paused, mtime_t i_date )
{
vlc_mutex_lock
(
&
p_vout
->
p
->
change_lock
);
assert
(
!
p_vout
->
p
->
b_paused
||
!
b_paused
);
assert
(
!
p_vout
->
p
->
pause
.
is_on
||
!
b_paused
);
vlc_mutex_lock
(
&
p_vout
->
p
->
picture_lock
);
if
(
p_vout
->
p
->
b_paused
)
if
(
p_vout
->
p
->
pause
.
is_on
)
{
const
mtime_t
i_duration
=
i_date
-
p_vout
->
p
->
i_pause_
date
;
const
mtime_t
i_duration
=
i_date
-
p_vout
->
p
->
pause
.
date
;
if
(
p_vout
->
p
->
step
.
timestamp
>
VLC_TS_INVALID
)
p_vout
->
p
->
step
.
timestamp
+=
i_duration
;
...
...
@@ -559,8 +555,8 @@ void vout_ChangePause( vout_thread_t *p_vout, bool b_paused, mtime_t i_date )
p_vout
->
p
->
step
.
last
=
p_vout
->
p
->
step
.
timestamp
;
vlc_mutex_unlock
(
&
p_vout
->
p
->
picture_lock
);
}
p_vout
->
p
->
b_paused
=
b_paused
;
p_vout
->
p
->
i_pause_date
=
i_date
;
p_vout
->
p
->
pause
.
is_on
=
b_paused
;
p_vout
->
p
->
pause
.
date
=
i_date
;
vlc_mutex_unlock
(
&
p_vout
->
p
->
change_lock
);
}
...
...
@@ -673,8 +669,8 @@ void vout_DisplayTitle( vout_thread_t *p_vout, const char *psz_title )
return
;
vlc_mutex_lock
(
&
p_vout
->
p
->
change_lock
);
free
(
p_vout
->
p
->
psz_titl
e
);
p_vout
->
p
->
psz_titl
e
=
strdup
(
psz_title
);
free
(
p_vout
->
p
->
title
.
valu
e
);
p_vout
->
p
->
title
.
valu
e
=
strdup
(
psz_title
);
vlc_mutex_unlock
(
&
p_vout
->
p
->
change_lock
);
}
...
...
@@ -686,75 +682,48 @@ spu_t *vout_GetSpu( vout_thread_t *p_vout )
/*****************************************************************************
* InitThread: initialize video output thread
*****************************************************************************
* This function is called from
Run
Thread and performs the second step of the
* This function is called from Thread and performs the second step of the
* initialization. It returns 0 on success. Note that the thread's flag are not
* modified inside this function.
* XXX You have to enter it with change_lock taken.
*****************************************************************************/
static
int
InitThread
(
vout_thread_t
*
p_vout
)
static
int
ThreadInit
(
vout_thread_t
*
vout
)
{
int
i
;
/* Initialize output method, it allocates direct buffers for us */
if
(
vout_InitWrapper
(
p_vout
)
)
if
(
vout_InitWrapper
(
vout
)
)
return
VLC_EGENERIC
;
assert
(
vout
->
p
->
decoder_pool
);
p_vout
->
p
->
displayed
.
decoded
=
NULL
;
assert
(
p_vout
->
fmt_out
.
i_width
>
0
&&
p_vout
->
fmt_out
.
i_height
>
0
);
if
(
!
p_vout
->
fmt_out
.
i_sar_num
||
!
p_vout
->
fmt_out
.
i_sar_num
)
{
/* FIXME is it possible to end up here ? */
p_vout
->
fmt_out
.
i_sar_num
=
1
;
p_vout
->
fmt_out
.
i_sar_den
=
1
;
}
vlc_ureduce
(
&
p_vout
->
fmt_out
.
i_sar_num
,
&
p_vout
->
fmt_out
.
i_sar_den
,
p_vout
->
fmt_out
.
i_sar_num
,
p_vout
->
fmt_out
.
i_sar_den
,
0
);
/* FIXME removed the need of both fmt_* and heap infos */
/* Calculate shifts from system-updated masks */
video_format_FixRgb
(
&
p_vout
->
fmt_render
);
video_format_FixRgb
(
&
p_vout
->
fmt_out
);
vout
->
p
->
displayed
.
decoded
=
NULL
;
/* print some usefull debug info about different vout formats
*/
msg_Dbg
(
p_vout
,
"pic render sz %ix%i, of (%i,%i), vsz %ix%i, 4cc %4.4s, sar %i:%i, msk r0x%x g0x%x b0x%x"
,
p_vout
->
fmt_render
.
i_width
,
p_vout
->
fmt_render
.
i_height
,
p_vout
->
fmt_render
.
i_x_offset
,
p_vout
->
fmt_render
.
i_y_offset
,
p_vout
->
fmt_render
.
i_visible_width
,
p_vout
->
fmt_render
.
i_visible_height
,
(
char
*
)
&
p_vout
->
fmt_render
.
i_chroma
,
p_vout
->
fmt_render
.
i_sar_num
,
p_vout
->
fmt_render
.
i_sar_den
,
p_vout
->
fmt_render
.
i_rmask
,
p_vout
->
fmt_render
.
i_gmask
,
p_vout
->
fmt_render
.
i_bmask
);
msg_Dbg
(
p_vout
,
"pic in sz %ix%i, of (%i,%i), vsz %ix%i, 4cc %4.4s, sar %i:%i, msk r0x%x g0x%x b0x%x"
,
p_vout
->
fmt_in
.
i_width
,
p_vout
->
fmt_in
.
i_height
,
p_vout
->
fmt_in
.
i_x_offset
,
p_vout
->
fmt_in
.
i_y_offset
,
p_vout
->
fmt_in
.
i_visible_width
,
p_vout
->
fmt_in
.
i_visible_height
,
(
char
*
)
&
p_vout
->
fmt_in
.
i_chroma
,
p_vout
->
fmt_in
.
i_sar_num
,
p_vout
->
fmt_in
.
i_sar_den
,
p_vout
->
fmt_in
.
i_rmask
,
p_vout
->
fmt_in
.
i_gmask
,
p_vout
->
fmt_in
.
i_bmask
);
msg_Dbg
(
p_vout
,
"pic out sz %ix%i, of (%i,%i), vsz %ix%i, 4cc %4.4s, sar %i:%i, msk r0x%x g0x%x b0x%x"
,
p_vout
->
fmt_out
.
i_width
,
p_vout
->
fmt_out
.
i_height
,
p_vout
->
fmt_out
.
i_x_offset
,
p_vout
->
fmt_out
.
i_y_offset
,
p_vout
->
fmt_out
.
i_visible_width
,
p_vout
->
fmt_out
.
i_visible_height
,
(
char
*
)
&
p_vout
->
fmt_out
.
i_chroma
,
p_vout
->
fmt_out
.
i_sar_num
,
p_vout
->
fmt_out
.
i_sar_den
,
p_vout
->
fmt_out
.
i_rmask
,
p_vout
->
fmt_out
.
i_gmask
,
p_vout
->
fmt_out
.
i_bmask
);
assert
(
p_vout
->
fmt_out
.
i_width
==
p_vout
->
fmt_render
.
i_width
&&
p_vout
->
fmt_out
.
i_height
==
p_vout
->
fmt_render
.
i_height
&&
p_vout
->
fmt_out
.
i_chroma
==
p_vout
->
fmt_render
.
i_chroma
);
assert
(
p_vout
->
p
->
decoder_pool
);
PrintVideoFormat
(
vout
,
"pic render"
,
&
vout
->
fmt_render
);
PrintVideoFormat
(
vout
,
"pic in"
,
&
vout
->
fmt_in
);
PrintVideoFormat
(
vout
,
"pic out"
,
&
vout
->
fmt_out
);
assert
(
vout
->
fmt_out
.
i_width
==
vout
->
fmt_render
.
i_width
&&
vout
->
fmt_out
.
i_height
==
vout
->
fmt_render
.
i_height
&&
vout
->
fmt_out
.
i_chroma
==
vout
->
fmt_render
.
i_chroma
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* CleanThread: clean up after InitThread
*****************************************************************************
* This function is called after a sucessful
* initialization. It frees all resources allocated by InitThread.
* XXX You have to enter it with change_lock taken.
*****************************************************************************/
static
void
ThreadClean
(
vout_thread_t
*
vout
)
{
/* Destroy translation tables */
if
(
!
vout
->
p
->
b_error
)
{
picture_fifo_Flush
(
vout
->
p
->
decoder_fifo
,
INT64_MAX
,
false
);
vout_EndWrapper
(
vout
);
}
}
static
int
ThreadDisplayPicture
(
vout_thread_t
*
vout
,
bool
now
,
mtime_t
*
deadline
)
{
...
...
@@ -763,7 +732,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
for
(;;)
{
const
mtime_t
date
=
mdate
();
const
bool
is_paused
=
vout
->
p
->
b_paused
;
const
bool
is_paused
=
vout
->
p
->
pause
.
is_on
;
bool
redisplay
=
is_paused
&&
!
now
;
bool
is_forced
;
...
...
@@ -788,8 +757,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
}
if
(
redisplay
)
{
/* FIXME a better way for this delay is needed */
const
mtime_t
paused_display_period
=
80000
;
const
mtime_t
date_update
=
vout
->
p
->
displayed
.
clock
+
paused_display_period
;
const
mtime_t
date_update
=
vout
->
p
->
displayed
.
date
+
VOUT_REDISPLAY_DELAY
;
if
(
date_update
>
date
||
!
vout
->
p
->
displayed
.
decoded
)
{
*
deadline
=
vout
->
p
->
displayed
.
decoded
?
date_update
:
VLC_TS_INVALID
;
break
;
...
...
@@ -798,8 +766,10 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
is_forced
=
true
;
*
deadline
=
date
-
vout_chrono_GetHigh
(
&
vout
->
p
->
render
);
}
if
(
*
deadline
>
VOUT_MWAIT_TOLERANCE
)
*
deadline
-=
VOUT_MWAIT_TOLERANCE
;
/* If we are too early and can wait, do it */
/* If we are too early and can wait, do it */
if
(
date
<
*
deadline
&&
!
now
)
break
;
...
...
@@ -814,9 +784,8 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
const
mtime_t
predicted
=
date
+
vout_chrono_GetLow
(
&
vout
->
p
->
render
);
const
mtime_t
late
=
predicted
-
decoded
->
date
;
if
(
late
>
0
)
{
const
mtime_t
late_threshold
=
20000
;
/* 20ms */
msg_Dbg
(
vout
,
"picture might be displayed late (missing %d ms)"
,
(
int
)(
late
/
1000
));
if
(
late
>
late_threshold
)
{
if
(
late
>
VOUT_DISPLAY_LATE_THRESHOLD
)
{
msg_Warn
(
vout
,
"rejected picture because of render time"
);
/* TODO */
picture_Release
(
decoded
);
...
...
@@ -829,7 +798,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
vout
->
p
->
displayed
.
is_interlaced
=
!
decoded
->
b_progressive
;
vout
->
p
->
displayed
.
qtype
=
decoded
->
i_qtype
;
}
vout
->
p
->
displayed
.
timestamp
X
=
decoded
->
date
;
vout
->
p
->
displayed
.
timestamp
=
decoded
->
date
;
/* */
if
(
vout
->
p
->
displayed
.
decoded
)
...
...
@@ -855,8 +824,8 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
*/
const
bool
do_snapshot
=
vout_snapshot_IsRequested
(
&
vout
->
p
->
snapshot
);
mtime_t
spu_render_time
=
is_forced
?
mdate
()
:
filtered
->
date
;
if
(
vout
->
p
->
b_paused
)
spu_render_time
=
vout
->
p
->
i_pause_
date
;
if
(
vout
->
p
->
pause
.
is_on
)
spu_render_time
=
vout
->
p
->
pause
.
date
;
else
spu_render_time
=
filtered
->
date
>
1
?
filtered
->
date
:
mdate
();
...
...
@@ -929,7 +898,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
mwait
(
decoded
->
date
);
/* Display the direct buffer returned by vout_RenderPicture */
vout
->
p
->
displayed
.
clock
=
mdate
();
vout
->
p
->
displayed
.
date
=
mdate
();
if
(
direct
)
vout_DisplayWrapper
(
vout
,
direct
);
...
...
@@ -944,13 +913,13 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
}
/*****************************************************************************
*
Run
Thread: video output thread
* Thread: video output thread
*****************************************************************************
* Video output thread. This function does only returns when the thread is
* terminated. It handles the pictures arriving in the video heap and the
* display device events.
*****************************************************************************/
static
void
*
Run
Thread
(
void
*
object
)
static
void
*
Thread
(
void
*
object
)
{
vout_thread_t
*
vout
=
object
;
bool
has_wrapper
;
...
...
@@ -963,7 +932,7 @@ static void *RunThread(void *object)
vlc_mutex_lock
(
&
vout
->
p
->
change_lock
);
if
(
has_wrapper
)
vout
->
p
->
b_error
=
InitThread
(
vout
);
vout
->
p
->
b_error
=
ThreadInit
(
vout
);
else
vout
->
p
->
b_error
=
true
;
...
...
@@ -985,7 +954,7 @@ static void *RunThread(void *object)
*/
while
(
!
vout
->
p
->
b_done
&&
!
vout
->
p
->
b_error
)
{
/* */
if
(
vout
->
p
->
b_title_show
&&
vout
->
p
->
psz_titl
e
)
if
(
vout
->
p
->
title
.
show
&&
vout
->
p
->
title
.
valu
e
)
DisplayTitleOnOSD
(
vout
);
vlc_mutex_lock
(
&
vout
->
p
->
picture_lock
);
...
...
@@ -994,7 +963,7 @@ static void *RunThread(void *object)
bool
has_displayed
=
!
ThreadDisplayPicture
(
vout
,
vout
->
p
->
step
.
is_requested
,
&
deadline
);
if
(
has_displayed
)
{
vout
->
p
->
step
.
timestamp
=
vout
->
p
->
displayed
.
timestamp
X
;
vout
->
p
->
step
.
timestamp
=
vout
->
p
->
displayed
.
timestamp
;
if
(
vout
->
p
->
step
.
last
<=
VLC_TS_INVALID
)
vout
->
p
->
step
.
last
=
vout
->
p
->
step
.
timestamp
;
}
...
...
@@ -1090,11 +1059,16 @@ static void *RunThread(void *object)
vlc_cond_wait
(
&
vout
->
p
->
change_wait
,
&
vout
->
p
->
change_lock
);
/* Clean thread */
CleanThread
(
vout
);
ThreadClean
(
vout
);
exit_thread:
/* End of thread */
EndThread
(
vout
);
/* Detach subpicture unit from both input and vout */
spu_Attach
(
vout
->
p
->
p_spu
,
VLC_OBJECT
(
vout
),
false
);
vlc_object_detach
(
vout
->
p
->
p_spu
);
/* Destroy the video filters2 */
filter_chain_Delete
(
vout
->
p
->
p_vf2_chain
);
vlc_mutex_unlock
(
&
vout
->
p
->
change_lock
);
if
(
has_wrapper
)
...
...
@@ -1103,44 +1077,6 @@ exit_thread:
return
NULL
;
}
/*****************************************************************************
* CleanThread: clean up after InitThread
*****************************************************************************
* This function is called after a sucessful
* initialization. It frees all resources allocated by InitThread.
* XXX You have to enter it with change_lock taken.
*****************************************************************************/
static
void
CleanThread
(
vout_thread_t
*
p_vout
)
{
/* Destroy translation tables */
if
(
!
p_vout
->
p
->
b_error
)
{
picture_fifo_Flush
(
p_vout
->
p
->
decoder_fifo
,
INT64_MAX
,
false
);
vout_EndWrapper
(
p_vout
);
}
}
/*****************************************************************************
* EndThread: thread destruction
*****************************************************************************
* This function is called when the thread ends.
* It frees all resources not allocated by InitThread.
* XXX You have to enter it with change_lock taken.
*****************************************************************************/
static
void
EndThread
(
vout_thread_t
*
p_vout
)
{
/* FIXME does that function *really* need to be called inside the thread ? */
/* Detach subpicture unit from both input and vout */
spu_Attach
(
p_vout
->
p
->
p_spu
,
VLC_OBJECT
(
p_vout
),
false
);
vlc_object_detach
(
p_vout
->
p
->
p_spu
);
/* Destroy the video filters2 */
filter_chain_Delete
(
p_vout
->
p
->
p_vf2_chain
);
}
/* following functions are local */
/*****************************************************************************
* object variables callbacks: a bunch of object variables are used by the
* interfaces to interact with the vout.
...
...
@@ -1299,7 +1235,7 @@ static void PostProcessSetFilterQuality( vout_thread_t *p_vout )
static
void
DisplayTitleOnOSD
(
vout_thread_t
*
p_vout
)
{
const
mtime_t
i_start
=
mdate
();
const
mtime_t
i_stop
=
i_start
+
INT64_C
(
1000
)
*
p_vout
->
p
->
i_title_
timeout
;
const
mtime_t
i_stop
=
i_start
+
INT64_C
(
1000
)
*
p_vout
->
p
->
title
.
timeout
;
if
(
i_stop
<=
i_start
)
return
;
...
...
@@ -1307,17 +1243,17 @@ static void DisplayTitleOnOSD( vout_thread_t *p_vout )
vlc_assert_locked
(
&
p_vout
->
p
->
change_lock
);
vout_ShowTextAbsolute
(
p_vout
,
DEFAULT_CHAN
,
p_vout
->
p
->
psz_titl
e
,
NULL
,
p_vout
->
p
->
i_title_
position
,
p_vout
->
p
->
title
.
valu
e
,
NULL
,
p_vout
->
p
->
title
.
position
,
30
+
p_vout
->
fmt_in
.
i_width
-
p_vout
->
fmt_in
.
i_visible_width
-
p_vout
->
fmt_in
.
i_x_offset
,
20
+
p_vout
->
fmt_in
.
i_y_offset
,
i_start
,
i_stop
);
free
(
p_vout
->
p
->
psz_titl
e
);
free
(
p_vout
->
p
->
title
.
valu
e
);
p_vout
->
p
->
psz_titl
e
=
NULL
;
p_vout
->
p
->
title
.
valu
e
=
NULL
;
}
/*****************************************************************************
...
...
@@ -1617,3 +1553,17 @@ static void DeinterlaceNeeded( vout_thread_t *p_vout, bool is_interlaced )
var_SetBool
(
p_vout
,
"deinterlace-needed"
,
is_interlaced
);
}
/* */
static
void
PrintVideoFormat
(
vout_thread_t
*
vout
,
const
char
*
description
,
const
video_format_t
*
fmt
)
{
msg_Dbg
(
vout
,
"%s sz %ix%i, of (%i,%i), vsz %ix%i, 4cc %4.4s, sar %i:%i, msk r0x%x g0x%x b0x%x"
,
description
,
fmt
->
i_width
,
fmt
->
i_height
,
fmt
->
i_x_offset
,
fmt
->
i_y_offset
,
fmt
->
i_visible_width
,
fmt
->
i_visible_height
,
(
char
*
)
&
fmt
->
i_chroma
,
fmt
->
i_sar_num
,
fmt
->
i_sar_den
,
fmt
->
i_rmask
,
fmt
->
i_gmask
,
fmt
->
i_bmask
);
}
src/video_output/vout_internal.h
View file @
fd32a7c3
...
...
@@ -66,18 +66,31 @@ struct vout_thread_sys_t
bool
b_picture_empty
;
vlc_cond_t
picture_wait
;
struct
{
mtime_t
clock
;
mtime_t
timestamp
X
;
mtime_t
date
;
mtime_t
timestamp
;
int
qtype
;
bool
is_interlaced
;
picture_t
*
decoded
;
}
displayed
;
struct
{
bool
is_requested
;
mtime_t
last
;
mtime_t
timestamp
;
}
step
;
struct
{
bool
is_on
;
mtime_t
date
;
}
pause
;
struct
{
bool
show
;
mtime_t
timeout
;
int
position
;
char
*
value
;
}
title
;
/* */
vlc_mutex_t
vfilter_lock
;
/**< video filter2 lock */
...
...
@@ -89,10 +102,6 @@ struct vout_thread_sys_t
/* Statistics */
vout_statistic_t
statistic
;
/* Pause */
bool
b_paused
;
mtime_t
i_pause_date
;
/* Filter chain */
bool
b_first_vout
;
/* True if it is the first vout of the filter chain */
char
*
psz_filter_chain
;
...
...
@@ -105,13 +114,6 @@ struct vout_thread_sys_t
/* Snapshot interface */
vout_snapshot_t
snapshot
;
/* Show media title on videoutput */
bool
b_title_show
;
mtime_t
i_title_timeout
;
int
i_title_position
;
char
*
psz_title
;
/* Subpicture unit */
spu_t
*
p_spu
;
...
...
@@ -158,12 +160,6 @@ struct vout_thread_sys_t
/* */
void
vout_IntfInit
(
vout_thread_t
*
);
/* DO NOT use vout_UsePictureLocked unless you are in src/video_ouput
*
* This function supposes that you call it with picture_lock taken.
*/
void
vout_UsePictureLocked
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
);
/* */
int
vout_OpenWrapper
(
vout_thread_t
*
,
const
char
*
);
void
vout_CloseWrapper
(
vout_thread_t
*
);
...
...
src/video_output/vout_intf.c
View file @
fd32a7c3
...
...
@@ -175,12 +175,12 @@ void vout_IntfInit( vout_thread_t *p_vout )
var_Create
(
p_vout
,
"mouse-hide-timeout"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
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
->
p
->
i_title_position
=
var_CreateGetInteger
(
p_vout
,
"video-title-position"
);
p_vout
->
p
->
psz_titl
e
=
NULL
;
p_vout
->
p
->
title
.
show
=
var_CreateGetBool
(
p_vout
,
"video-title-show"
);
p_vout
->
p
->
title
.
timeout
=
var_CreateGetInteger
(
p_vout
,
"video-title-timeout"
);
p_vout
->
p
->
title
.
position
=
var_CreateGetInteger
(
p_vout
,
"video-title-position"
);
p_vout
->
p
->
title
.
valu
e
=
NULL
;
var_AddCallback
(
p_vout
,
"video-title-show"
,
TitleShowCallback
,
NULL
);
var_AddCallback
(
p_vout
,
"video-title-timeout"
,
TitleTimeoutCallback
,
NULL
);
...
...
@@ -923,7 +923,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
->
p
->
b_title_
show
=
newval
.
b_bool
;
p_vout
->
p
->
title
.
show
=
newval
.
b_bool
;
return
VLC_SUCCESS
;
}
...
...
@@ -932,7 +932,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
->
p
->
i_title_
timeout
=
(
mtime_t
)
newval
.
i_int
;
p_vout
->
p
->
title
.
timeout
=
(
mtime_t
)
newval
.
i_int
;
return
VLC_SUCCESS
;
}
...
...
@@ -942,6 +942,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
->
p
->
i_title_
position
=
newval
.
i_int
;
p_vout
->
p
->
title
.
position
=
newval
.
i_int
;
return
VLC_SUCCESS
;
}
src/video_output/vout_pictures.c
View file @
fd32a7c3
...
...
@@ -44,12 +44,6 @@
#include "vout_pictures.h"
#include "vout_internal.h"
static
void
tracep
(
const
char
*
msg
,
picture_t
*
picture
)
{
//fprintf(stderr, "########## %s === picture=%p::%d\n", msg,
// picture, picture ? picture->i_refcount : -1);
}
/**
* Display a picture
*
...
...
@@ -60,8 +54,6 @@ void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
vlc_mutex_lock
(
&
p_vout
->
p
->
picture_lock
);
tracep
(
"vout_DisplayPicture"
,
p_pic
);
p_pic
->
p_next
=
NULL
;
picture_fifo_Push
(
p_vout
->
p
->
decoder_fifo
,
p_pic
);
...
...
@@ -97,7 +89,6 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
picture_Reset
(
p_pic
);
p_pic
->
p_next
=
NULL
;
// FIXME put it in picture_Reset ?
}
tracep
(
"vout_CreatePicture"
,
p_pic
);
vlc_mutex_unlock
(
&
p_vout
->
p
->
picture_lock
);
return
p_pic
;
...
...
@@ -108,7 +99,6 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
vlc_mutex_lock
(
&
p_vout
->
p
->
picture_lock
);
tracep
(
"vout_DropPicture"
,
p_pic
);
picture_Release
(
p_pic
);
vlc_cond_signal
(
&
p_vout
->
p
->
picture_wait
);
...
...
@@ -117,7 +107,6 @@ void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic )
void
vout_DestroyPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
tracep
(
"vout_DestroyPicture"
,
p_pic
);
vout_DropPicture
(
p_vout
,
p_pic
);
}
...
...
@@ -131,7 +120,6 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
void
vout_LinkPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vlc_mutex_lock
(
&
p_vout
->
p
->
picture_lock
);
tracep
(
"vout_LinkPicture"
,
p_pic
);
picture_Hold
(
p_pic
);
vlc_mutex_unlock
(
&
p_vout
->
p
->
picture_lock
);
}
...
...
@@ -144,7 +132,6 @@ void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
void
vout_UnlinkPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vlc_mutex_lock
(
&
p_vout
->
p
->
picture_lock
);
tracep
(
"vout_UnlinkPicture"
,
p_pic
);
picture_Release
(
p_pic
);
vlc_cond_signal
(
&
p_vout
->
p
->
picture_wait
);
...
...
src/video_output/vout_wrapper.c
View file @
fd32a7c3
...
...
@@ -160,6 +160,13 @@ int vout_InitWrapper(vout_thread_t *vout)
vout
->
fmt_out
.
i_visible_width
=
source
.
i_width
;
vout
->
fmt_out
.
i_height
=
vout
->
fmt_out
.
i_visible_height
=
source
.
i_height
;
if
(
source
.
i_sar_num
>
0
&&
source
.
i_sar_den
>
0
)
{
vlc_ureduce
(
&
vout
->
fmt_out
.
i_sar_num
,
&
vout
->
fmt_out
.
i_sar_den
,
source
.
i_sar_num
,
source
.
i_sar_den
,
0
);
}
else
{
vout
->
fmt_out
.
i_sar_num
=
1
;
vout
->
fmt_out
.
i_sar_den
=
1
;
}
vout
->
fmt_out
.
i_sar_num
=
source
.
i_sar_num
;
vout
->
fmt_out
.
i_sar_den
=
source
.
i_sar_den
;
vout
->
fmt_out
.
i_x_offset
=
0
;
...
...
@@ -167,6 +174,7 @@ int vout_InitWrapper(vout_thread_t *vout)
vout
->
fmt_out
.
i_rmask
=
source
.
i_rmask
;
vout
->
fmt_out
.
i_gmask
=
source
.
i_gmask
;
vout
->
fmt_out
.
i_bmask
=
source
.
i_bmask
;
video_format_FixRgb
(
&
vout
->
fmt_out
);
if
(
vout
->
fmt_in
.
i_visible_width
!=
source
.
i_visible_width
||
vout
->
fmt_in
.
i_visible_height
!=
source
.
i_visible_height
||
...
...
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