[vlc-commits] transcode: encode buffer and flush encoder at the end when using threads
Ilkka Ollakka
git at videolan.org
Sun Nov 10 15:37:17 CET 2013
vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Sun Nov 10 16:34:40 2013 +0200| [804df2252aad707cb3c24aabb0eb7f52b5113f7b] | committer: Ilkka Ollakka
transcode: encode buffer and flush encoder at the end when using threads
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=804df2252aad707cb3c24aabb0eb7f52b5113f7b
---
modules/stream_out/transcode/video.c | 61 ++++++++++++++++++++++++++++------
1 file changed, 50 insertions(+), 11 deletions(-)
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index aa901d0..88fd362 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -101,35 +101,64 @@ static void* EncoderThread( void *obj )
{
sout_stream_sys_t *p_sys = (sout_stream_sys_t*)obj;
sout_stream_id_t *id = p_sys->id_video;
- picture_t *p_pic;
+ picture_t *p_pic = NULL;
int canc = vlc_savecancel ();
+ block_t *p_block = NULL;
for( ;; )
{
- block_t *p_block;
vlc_mutex_lock( &p_sys->lock_out );
while( !p_sys->b_abort &&
(p_pic = picture_fifo_Pop( p_sys->pp_pics )) == NULL )
vlc_cond_wait( &p_sys->cond, &p_sys->lock_out );
- if( p_sys->b_abort )
+ if( p_sys->b_abort && !p_pic )
{
vlc_mutex_unlock( &p_sys->lock_out );
break;
}
vlc_mutex_unlock( &p_sys->lock_out );
- p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
+ if( p_pic )
+ {
+ p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
+
+ vlc_mutex_lock( &p_sys->lock_out );
+ block_ChainAppend( &p_sys->p_buffers, p_block );
+
+ vlc_mutex_unlock( &p_sys->lock_out );
+ picture_Release( p_pic );
+ }
vlc_mutex_lock( &p_sys->lock_out );
+ if( p_sys->b_abort )
+ {
+ vlc_mutex_unlock( &p_sys->lock_out );
+ break;
+ }
+ vlc_mutex_unlock( &p_sys->lock_out );
+ }
+
+ /*Encode what we have in the buffer on closing*/
+ vlc_mutex_lock( &p_sys->lock_out );
+ while( (p_pic = picture_fifo_Pop( p_sys->pp_pics )) != NULL )
+ {
+ p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
+
block_ChainAppend( &p_sys->p_buffers, p_block );
- vlc_mutex_unlock( &p_sys->lock_out );
picture_Release( p_pic );
}
- block_ChainRelease( p_sys->p_buffers );
+ /*Now flush encoder*/
+ do {
+ p_block = id->p_encoder->pf_encode_video(id->p_encoder, NULL );
+ block_ChainAppend( &p_sys->p_buffers, p_block );
+ } while( p_block );
+
+ vlc_mutex_unlock( &p_sys->lock_out );
+
vlc_restorecancel (canc);
return NULL;
@@ -580,6 +609,7 @@ void transcode_video_close( sout_stream_t *p_stream,
vlc_cond_destroy( &p_stream->p_sys->cond );
picture_fifo_Delete( p_stream->p_sys->pp_pics );
+ block_ChainRelease( p_stream->p_sys->p_buffers );
p_stream->p_sys->pp_pics = NULL;
}
@@ -716,7 +746,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id,
{
sout_stream_sys_t *p_sys = p_stream->p_sys;
bool b_need_duplicate = false;
- picture_t *p_pic;
+ picture_t *p_pic = NULL;
*out = NULL;
if( unlikely( in == NULL ) )
@@ -731,10 +761,19 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id,
}
else
{
- /*
- * FIXME: we need EncoderThread() to flush buffers and signal us
- * when it's done so we can send the last frames to the chain
- */
+ msg_Dbg( p_stream, "Flushing thread and waiting that");
+ vlc_mutex_lock( &p_stream->p_sys->lock_out );
+ p_stream->p_sys->b_abort = true;
+ vlc_cond_signal( &p_stream->p_sys->cond );
+ vlc_mutex_unlock( &p_stream->p_sys->lock_out );
+
+ vlc_join( p_stream->p_sys->thread, NULL );
+ vlc_mutex_lock( &p_sys->lock_out );
+ *out = p_sys->p_buffers;
+ p_sys->p_buffers = NULL;
+ vlc_mutex_unlock( &p_sys->lock_out );
+
+ msg_Dbg( p_stream, "Flushing done");
}
return VLC_SUCCESS;
}
More information about the vlc-commits
mailing list