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
7e8ca640
Commit
7e8ca640
authored
Oct 14, 2008
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved vout helpers out of decoder.c.
parent
db7ba956
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
103 additions
and
116 deletions
+103
-116
src/input/decoder.c
src/input/decoder.c
+10
-92
src/video_output/video_output.c
src/video_output/video_output.c
+56
-17
src/video_output/vout_internal.h
src/video_output/vout_internal.h
+13
-7
src/video_output/vout_pictures.c
src/video_output/vout_pictures.c
+24
-0
No files found.
src/input/decoder.c
View file @
7e8ca640
...
...
@@ -1160,47 +1160,6 @@ static void DecoderGetCc( decoder_t *p_dec, decoder_t *p_dec_cc )
}
vlc_mutex_unlock
(
&
p_owner
->
lock
);
}
static
void
VoutDisplayedPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
if
(
p_pic
->
i_status
==
READY_PICTURE
)
{
/* Grr cannot destroy ready picture by myself so be sure vout won't like it */
p_pic
->
date
=
1
;
}
else
if
(
p_pic
->
i_refcount
>
0
)
{
p_pic
->
i_status
=
DISPLAYED_PICTURE
;
}
else
{
p_pic
->
i_status
=
DESTROYED_PICTURE
;
picture_CleanupQuant
(
p_pic
);
p_vout
->
i_heap_size
--
;
}
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
static
void
VoutFlushPicture
(
vout_thread_t
*
p_vout
,
mtime_t
i_max_date
)
{
int
i
;
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
for
(
i
=
0
;
i
<
p_vout
->
render
.
i_pictures
;
i
++
)
{
picture_t
*
p_pic
=
p_vout
->
render
.
pp_picture
[
i
];
if
(
p_pic
->
i_status
==
READY_PICTURE
||
p_pic
->
i_status
==
DISPLAYED_PICTURE
)
{
/* We cannot change picture status if it is in READY_PICTURE state,
* Just make sure they won't be displayed */
if
(
p_pic
->
date
>
i_max_date
)
p_pic
->
date
=
i_max_date
;
}
}
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
static
void
DecoderPlayVideo
(
decoder_t
*
p_dec
,
picture_t
*
p_picture
,
int
*
pi_played_sum
,
int
*
pi_lost_sum
)
...
...
@@ -1212,7 +1171,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
{
msg_Warn
(
p_vout
,
"non-dated video buffer received"
);
*
pi_lost_sum
+=
1
;
VoutDisplayed
Picture
(
p_vout
,
p_picture
);
vout_Drop
Picture
(
p_vout
,
p_picture
);
return
;
}
...
...
@@ -1297,7 +1256,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
if
(
i_rate
!=
p_owner
->
i_last_rate
)
{
/* Be sure to not display old picture after our own */
VoutFlushPicture
(
p_vout
,
p_picture
->
date
);
vout_Flush
(
p_vout
,
p_picture
->
date
);
p_owner
->
i_last_rate
=
i_rate
;
}
...
...
@@ -1317,7 +1276,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
p_picture
->
date
-
mdate
()
);
}
*
pi_lost_sum
+=
1
;
VoutDisplayed
Picture
(
p_vout
,
p_picture
);
vout_Drop
Picture
(
p_vout
,
p_picture
);
}
int
i_tmp_display
;
int
i_tmp_lost
;
...
...
@@ -1353,7 +1312,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
if
(
p_dec
->
b_die
)
{
/* It prevent freezing VLC in case of broken decoder */
VoutDisplayed
Picture
(
p_vout
,
p_pic
);
vout_Drop
Picture
(
p_vout
,
p_pic
);
if
(
p_block
)
block_Release
(
p_block
);
break
;
...
...
@@ -1363,7 +1322,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
if
(
p_pic
->
date
<
p_owner
->
i_preroll_end
)
{
VoutDisplayed
Picture
(
p_vout
,
p_pic
);
vout_Drop
Picture
(
p_vout
,
p_pic
);
continue
;
}
...
...
@@ -1371,7 +1330,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
{
msg_Dbg
(
p_dec
,
"End of video preroll"
);
if
(
p_vout
)
VoutFlushPicture
(
p_vout
,
1
);
vout_Flush
(
p_vout
,
1
);
/* */
p_owner
->
i_preroll_end
=
-
1
;
}
...
...
@@ -1513,7 +1472,7 @@ static void DecoderFlushBuffering( decoder_t *p_dec )
p_owner
->
buffer
.
i_count
--
;
if
(
p_owner
->
p_vout
)
VoutDisplayed
Picture
(
p_owner
->
p_vout
,
p_picture
);
vout_Drop
Picture
(
p_owner
->
p_vout
,
p_picture
);
if
(
!
p_owner
->
buffer
.
p_picture
)
p_owner
->
buffer
.
pp_picture_next
=
&
p_owner
->
buffer
.
p_picture
;
...
...
@@ -1655,7 +1614,7 @@ static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block, bool b_flus
}
if
(
b_flush
&&
p_owner
->
p_vout
)
VoutFlushPicture
(
p_owner
->
p_vout
,
1
);
vout_Flush
(
p_owner
->
p_vout
,
1
);
}
/* This function process a audio block
...
...
@@ -2106,7 +2065,6 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
for
(
;;
)
{
picture_t
*
p_picture
;
int
i_pic
,
i_ready_pic
;
if
(
p_dec
->
b_die
||
p_dec
->
b_error
)
return
NULL
;
...
...
@@ -2130,47 +2088,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
DecoderSignalBuffering
(
p_dec
,
true
);
/* Check the decoder doesn't leak pictures */
for
(
i_pic
=
0
,
i_ready_pic
=
0
;
i_pic
<
p_owner
->
p_vout
->
render
.
i_pictures
;
i_pic
++
)
{
const
picture_t
*
p_pic
=
p_owner
->
p_vout
->
render
.
pp_picture
[
i_pic
];
if
(
p_pic
->
i_status
==
READY_PICTURE
)
{
i_ready_pic
++
;
/* If we have at least 2 ready pictures, wait for the vout thread to
* process one */
if
(
i_ready_pic
>=
2
)
break
;
continue
;
}
if
(
p_pic
->
i_status
==
DISPLAYED_PICTURE
)
{
/* If at least one displayed picture is not referenced
* let vout free it */
if
(
p_pic
->
i_refcount
==
0
)
break
;
}
}
if
(
i_pic
==
p_owner
->
p_vout
->
render
.
i_pictures
)
{
/* Too many pictures are still referenced, there is probably a bug
* with the decoder */
msg_Err
(
p_dec
,
"decoder is leaking pictures, resetting the heap"
);
/* Just free all the pictures */
for
(
i_pic
=
0
;
i_pic
<
p_owner
->
p_vout
->
render
.
i_pictures
;
i_pic
++
)
{
picture_t
*
p_pic
=
p_owner
->
p_vout
->
render
.
pp_picture
[
i_pic
];
if
(
p_pic
->
i_status
==
RESERVED_PICTURE
)
vout_DestroyPicture
(
p_owner
->
p_vout
,
p_pic
);
if
(
p_pic
->
i_refcount
>
0
)
vout_UnlinkPicture
(
p_owner
->
p_vout
,
p_pic
);
}
}
vout_FixLeaks
(
p_owner
->
p_vout
);
msleep
(
VOUT_OUTMEM_SLEEP
);
}
...
...
@@ -2178,7 +2096,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
static
void
vout_del_buffer
(
decoder_t
*
p_dec
,
picture_t
*
p_pic
)
{
VoutDisplayed
Picture
(
p_dec
->
p_owner
->
p_vout
,
p_pic
);
vout_Drop
Picture
(
p_dec
->
p_owner
->
p_vout
,
p_pic
);
}
static
void
vout_link_picture
(
decoder_t
*
p_dec
,
picture_t
*
p_pic
)
...
...
src/video_output/video_output.c
View file @
7e8ca640
...
...
@@ -375,7 +375,7 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
p_vout
->
p
->
i_par_den
=
1
;
/* Initialize locks */
vlc_mutex_init
(
&
p_vout
->
picture_lock
);
vlc_mutex_init
_recursive
(
&
p_vout
->
picture_lock
);
vlc_mutex_init
(
&
p_vout
->
change_lock
);
vlc_mutex_init
(
&
p_vout
->
p
->
vfilter_lock
);
...
...
@@ -628,6 +628,58 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
}
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
void
vout_FixLeaks
(
vout_thread_t
*
p_vout
)
{
int
i_pic
,
i_ready_pic
;
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
for
(
i_pic
=
0
,
i_ready_pic
=
0
;
i_pic
<
p_vout
->
render
.
i_pictures
;
i_pic
++
)
{
const
picture_t
*
p_pic
=
p_vout
->
render
.
pp_picture
[
i_pic
];
if
(
p_pic
->
i_status
==
READY_PICTURE
)
{
i_ready_pic
++
;
/* If we have at least 2 ready pictures, wait for the vout thread to
* process one */
if
(
i_ready_pic
>=
2
)
break
;
continue
;
}
if
(
p_pic
->
i_status
==
DISPLAYED_PICTURE
)
{
/* If at least one displayed picture is not referenced
* let vout free it */
if
(
p_pic
->
i_refcount
==
0
)
break
;
}
}
if
(
i_pic
<
p_vout
->
render
.
i_pictures
)
{
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
return
;
}
/* Too many pictures are still referenced, there is probably a bug
* with the decoder */
msg_Err
(
p_vout
,
"pictures leaked, resetting the heap"
);
/* Just free all the pictures */
for
(
i_pic
=
0
;
i_pic
<
p_vout
->
render
.
i_pictures
;
i_pic
++
)
{
picture_t
*
p_pic
=
p_vout
->
render
.
pp_picture
[
i_pic
];
if
(
p_pic
->
i_status
==
RESERVED_PICTURE
)
vout_DestroyPicture
(
p_vout
,
p_pic
);
if
(
p_pic
->
i_refcount
>
0
)
vout_UnlinkPicture
(
p_vout
,
p_pic
);
}
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
/*****************************************************************************
* InitThread: initialize video output thread
*****************************************************************************
...
...
@@ -659,10 +711,6 @@ static int InitThread( vout_thread_t *p_vout )
{
int
i
,
i_aspect_x
,
i_aspect_y
;
#ifdef STATS
p_vout
->
c_loops
=
0
;
#endif
/* Initialize output method, it allocates direct buffers for us */
if
(
p_vout
->
pf_init
(
p_vout
)
)
return
VLC_EGENERIC
;
...
...
@@ -843,7 +891,7 @@ static void* RunThread( vlc_object_t *p_this )
bool
b_drop_late
;
int
canc
=
vlc_savecancel
();
int
canc
=
vlc_savecancel
();
/*
* Initialize thread
...
...
@@ -860,7 +908,7 @@ static void* RunThread( vlc_object_t *p_this )
{
EndThread
(
p_vout
);
vlc_mutex_unlock
(
&
p_vout
->
change_lock
);
vlc_restorecancel
(
canc
);
vlc_restorecancel
(
canc
);
return
NULL
;
}
...
...
@@ -883,15 +931,6 @@ static void* RunThread( vlc_object_t *p_this )
picture_t
*
p_directbuffer
;
int
i_index
;
#if 0
p_vout->c_loops++;
if( !(p_vout->c_loops % VOUT_STATS_NB_LOOPS) )
{
msg_Dbg( p_vout, "picture heap: %d/%d",
I_RENDERPICTURES, p_vout->i_heap_size );
}
#endif
/*
* Find the picture to display (the one with the earliest date).
* This operation does not need lock, since only READY_PICTUREs
...
...
@@ -1236,7 +1275,7 @@ static void* RunThread( vlc_object_t *p_this )
vlc_mutex_unlock
(
&
p_vout
->
change_lock
);
vlc_object_unlock
(
p_vout
);
vlc_restorecancel
(
canc
);
vlc_restorecancel
(
canc
);
return
NULL
;
}
...
...
src/video_output/vout_internal.h
View file @
7e8ca640
...
...
@@ -53,13 +53,6 @@ struct vout_thread_sys_t
/* Statistics */
int
i_picture_lost
;
int
i_picture_displayed
;
#if 0
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
/* Pause */
bool
b_paused
;
...
...
@@ -111,5 +104,18 @@ void vout_GetResetStatistic( vout_thread_t *p_vout, int *pi_displayed, int *pi_l
*/
void
vout_Flush
(
vout_thread_t
*
p_vout
,
mtime_t
i_date
);
/**
* This function will try to detect if pictures are being leaked. If so it
* will release them.
*
* XXX This function is there to workaround bugs in decoder
*/
void
vout_FixLeaks
(
vout_thread_t
*
p_vout
);
/**
* This functions will drop a picture retreived by vout_CreatePicture.
*/
void
vout_DropPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
);
#endif
src/video_output/vout_pictures.c
View file @
7e8ca640
...
...
@@ -268,6 +268,30 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
/* */
void
vout_DropPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vlc_mutex_lock
(
&
p_vout
->
picture_lock
);
if
(
p_pic
->
i_status
==
READY_PICTURE
)
{
/* Grr cannot destroy ready picture by myself so be sure vout won't like it */
p_pic
->
date
=
1
;
}
else
if
(
p_pic
->
i_refcount
>
0
)
{
p_pic
->
i_status
=
DISPLAYED_PICTURE
;
}
else
{
p_pic
->
i_status
=
DESTROYED_PICTURE
;
p_vout
->
i_heap_size
--
;
picture_CleanupQuant
(
p_pic
);
}
vlc_mutex_unlock
(
&
p_vout
->
picture_lock
);
}
/**
* Increment reference counter of a picture
*
...
...
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