[vlc-commits] sout: transcode: fix bogus encoding thread with multiple video es

Francois Cartegnie git at videolan.org
Thu Jun 21 10:49:29 CEST 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jun 20 15:45:09 2018 +0200| [55a1c1a0504f4b291774966a880802a437364951] | committer: Francois Cartegnie

sout: transcode: fix bogus encoding thread with multiple video es

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=55a1c1a0504f4b291774966a880802a437364951
---

 modules/stream_out/transcode/transcode.c |   6 +-
 modules/stream_out/transcode/transcode.h |  17 ++---
 modules/stream_out/transcode/video.c     | 113 +++++++++++++++----------------
 3 files changed, 69 insertions(+), 67 deletions(-)

diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c
index ea8f7d4b5a..a2d8261171 100644
--- a/modules/stream_out/transcode/transcode.c
+++ b/modules/stream_out/transcode/transcode.c
@@ -367,7 +367,11 @@ static int Open( vlc_object_t *p_this )
 
     p_sys->i_threads = var_GetInteger( p_stream, SOUT_CFG_PREFIX "threads" );
     p_sys->pool_size = var_GetInteger( p_stream, SOUT_CFG_PREFIX "pool-size" );
-    p_sys->b_high_priority = var_GetBool( p_stream, SOUT_CFG_PREFIX "high-priority" );
+
+    if( var_GetBool( p_stream, SOUT_CFG_PREFIX "high-priority" ) )
+        p_sys->i_thread_priority = VLC_THREAD_PRIORITY_OUTPUT;
+    else
+        p_sys->i_thread_priority = VLC_THREAD_PRIORITY_VIDEO;
 
     if( p_sys->i_vcodec )
     {
diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h
index 071f5d20bf..be371297bb 100644
--- a/modules/stream_out/transcode/transcode.h
+++ b/modules/stream_out/transcode/transcode.h
@@ -19,14 +19,7 @@ typedef struct sout_stream_id_sys_t sout_stream_id_sys_t;
 typedef struct
 {
     sout_stream_id_sys_t *id_video;
-    block_t         *p_buffers;
-    vlc_mutex_t     lock_out;
-    vlc_cond_t      cond;
-    bool            b_abort;
-    picture_fifo_t *pp_pics;
-    vlc_sem_t       picture_pool_has_room;
     uint32_t        pool_size;
-    vlc_thread_t    thread;
 
     /* Audio */
     vlc_fourcc_t    i_acodec;   /* codec audio (0 if not transcode) */
@@ -50,7 +43,7 @@ typedef struct
     char            *psz_deinterlace;
     config_chain_t  *p_deinterlace_cfg;
     int             i_threads;
-    bool            b_high_priority;
+    int             i_thread_priority;
     bool            b_hurry_up;
     unsigned int    fps_num,fps_den;
 
@@ -125,6 +118,14 @@ struct sout_stream_id_sys_t
 
     /* Encoder */
     encoder_t       *p_encoder;
+    block_t         *p_buffers;
+    vlc_thread_t    thread;
+    vlc_mutex_t     lock_out;
+    bool            b_abort;
+    picture_fifo_t *pp_pics;
+    vlc_sem_t       picture_pool_has_room;
+    vlc_cond_t      cond;
+
 
     /* Sync */
     date_t          next_input_pts; /**< Incoming calculated PTS */
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index f612ddd53a..8e70eb563c 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -101,52 +101,51 @@ static picture_t *transcode_video_filter_buffer_new( filter_t *p_filter )
 
 static void* EncoderThread( void *obj )
 {
-    sout_stream_sys_t *p_sys = (sout_stream_sys_t*)obj;
-    sout_stream_id_sys_t *id = p_sys->id_video;
+    sout_stream_id_sys_t *id = (sout_stream_id_sys_t *) obj;
     picture_t *p_pic = NULL;
     int canc = vlc_savecancel ();
     block_t *p_block = NULL;
 
-    vlc_mutex_lock( &p_sys->lock_out );
+    vlc_mutex_lock( &id->lock_out );
 
     for( ;; )
     {
-        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 );
-        vlc_sem_post( &p_sys->picture_pool_has_room );
+        while( !id->b_abort &&
+               (p_pic = picture_fifo_Pop( id->pp_pics )) == NULL )
+            vlc_cond_wait( &id->cond, &id->lock_out );
+        vlc_sem_post( &id->picture_pool_has_room );
 
         if( p_pic )
         {
             /* release lock while encoding */
-            vlc_mutex_unlock( &p_sys->lock_out );
+            vlc_mutex_unlock( &id->lock_out );
             p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
             picture_Release( p_pic );
-            vlc_mutex_lock( &p_sys->lock_out );
+            vlc_mutex_lock( &id->lock_out );
 
-            block_ChainAppend( &p_sys->p_buffers, p_block );
+            block_ChainAppend( &id->p_buffers, p_block );
         }
 
-        if( p_sys->b_abort )
+        if( id->b_abort )
             break;
     }
 
     /*Encode what we have in the buffer on closing*/
-    while( (p_pic = picture_fifo_Pop( p_sys->pp_pics )) != NULL )
+    while( (p_pic = picture_fifo_Pop( id->pp_pics )) != NULL )
     {
-        vlc_sem_post( &p_sys->picture_pool_has_room );
+        vlc_sem_post( &id->picture_pool_has_room );
         p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
         picture_Release( p_pic );
-        block_ChainAppend( &p_sys->p_buffers, p_block );
+        block_ChainAppend( &id->p_buffers, p_block );
     }
 
     /*Now flush encoder*/
     do {
         p_block = id->p_encoder->pf_encode_video(id->p_encoder, NULL );
-        block_ChainAppend( &p_sys->p_buffers, p_block );
+        block_ChainAppend( &id->p_buffers, p_block );
     } while( p_block );
 
-    vlc_mutex_unlock( &p_sys->lock_out );
+    vlc_mutex_unlock( &id->lock_out );
 
     vlc_restorecancel (canc);
 
@@ -272,11 +271,9 @@ static int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_sys_t *i
     if( p_sys->i_threads <= 0 )
         return VLC_SUCCESS;
 
-    int i_priority = p_sys->b_high_priority ? VLC_THREAD_PRIORITY_OUTPUT :
-                       VLC_THREAD_PRIORITY_VIDEO;
     p_sys->id_video = id;
-    p_sys->pp_pics = picture_fifo_New();
-    if( p_sys->pp_pics == NULL )
+    id->pp_pics = picture_fifo_New();
+    if( id->pp_pics == NULL )
     {
         msg_Err( p_stream, "cannot create picture fifo" );
         module_unneed( id->p_decoder, id->p_decoder->p_module );
@@ -284,17 +281,17 @@ static int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_sys_t *i
         return VLC_ENOMEM;
     }
 
-    vlc_sem_init( &p_sys->picture_pool_has_room, p_sys->pool_size );
-    vlc_mutex_init( &p_sys->lock_out );
-    vlc_cond_init( &p_sys->cond );
-    p_sys->p_buffers = NULL;
-    p_sys->b_abort = false;
-    if( vlc_clone( &p_sys->thread, EncoderThread, p_sys, i_priority ) )
+    vlc_sem_init( &id->picture_pool_has_room, p_sys->pool_size );
+    vlc_mutex_init( &id->lock_out );
+    vlc_cond_init( &id->cond );
+    id->p_buffers = NULL;
+    id->b_abort = false;
+    if( vlc_clone( &id->thread, EncoderThread, id, p_sys->i_thread_priority ) )
     {
         msg_Err( p_stream, "cannot spawn encoder thread" );
-        vlc_mutex_destroy( &p_sys->lock_out );
-        vlc_cond_destroy( &p_sys->cond );
-        picture_fifo_Delete( p_sys->pp_pics );
+        vlc_mutex_destroy( &id->lock_out );
+        vlc_cond_destroy( &id->cond );
+        picture_fifo_Delete( id->pp_pics );
         module_unneed( id->p_decoder, id->p_decoder->p_module );
         id->p_decoder->p_module = NULL;
         return VLC_EGENERIC;
@@ -673,23 +670,23 @@ void transcode_video_close( sout_stream_t *p_stream,
                                    sout_stream_id_sys_t *id )
 {
     sout_stream_sys_t *p_sys = p_stream->p_sys;
-    if( p_sys->i_threads >= 1 && !p_sys->b_abort )
+    if( p_sys->i_threads >= 1 && !id->b_abort )
     {
-        vlc_mutex_lock( &p_sys->lock_out );
-        p_sys->b_abort = true;
-        vlc_cond_signal( &p_sys->cond );
-        vlc_mutex_unlock( &p_sys->lock_out );
+        vlc_mutex_lock( &id->lock_out );
+        id->b_abort = true;
+        vlc_cond_signal( &id->cond );
+        vlc_mutex_unlock( &id->lock_out );
 
-        vlc_join( p_sys->thread, NULL );
+        vlc_join( id->thread, NULL );
 
-        picture_fifo_Delete( p_sys->pp_pics );
-        block_ChainRelease( p_sys->p_buffers );
+        picture_fifo_Delete( id->pp_pics );
+        block_ChainRelease( id->p_buffers );
     }
 
     if( p_sys->i_threads >= 1 )
     {
-        vlc_mutex_destroy( &p_sys->lock_out );
-        vlc_cond_destroy( &p_sys->cond );
+        vlc_mutex_destroy( &id->lock_out );
+        vlc_cond_destroy( &id->cond );
     }
 
     /* Close decoder */
@@ -765,11 +762,11 @@ static void OutputFrame( sout_stream_t *p_stream, picture_t *p_pic, sout_stream_
 
     if( p_sys->i_threads )
     {
-        vlc_sem_wait( &p_sys->picture_pool_has_room );
-        vlc_mutex_lock( &p_sys->lock_out );
-        picture_fifo_Push( p_sys->pp_pics, p_pic );
-        vlc_cond_signal( &p_sys->cond );
-        vlc_mutex_unlock( &p_sys->lock_out );
+        vlc_sem_wait( &id->picture_pool_has_room );
+        vlc_mutex_lock( &id->lock_out );
+        picture_fifo_Push( id->pp_pics, p_pic );
+        vlc_cond_signal( &id->cond );
+        vlc_mutex_unlock( &id->lock_out );
     }
 
     if ( p_sys->i_threads == 0 )
@@ -890,10 +887,10 @@ error:
     if( p_sys->i_threads >= 1 )
     {
         /* Pick up any return data the encoder thread wants to output. */
-        vlc_mutex_lock( &p_sys->lock_out );
-        *out = p_sys->p_buffers;
-        p_sys->p_buffers = NULL;
-        vlc_mutex_unlock( &p_sys->lock_out );
+        vlc_mutex_lock( &id->lock_out );
+        *out = id->p_buffers;
+        id->p_buffers = NULL;
+        vlc_mutex_unlock( &id->lock_out );
     }
 
 end:
@@ -914,16 +911,16 @@ end:
         else
         {
             msg_Dbg( p_stream, "Flushing thread and waiting that");
-            vlc_mutex_lock( &p_sys->lock_out );
-            p_sys->b_abort = true;
-            vlc_cond_signal( &p_sys->cond );
-            vlc_mutex_unlock( &p_sys->lock_out );
-
-            vlc_join( 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 );
+            vlc_mutex_lock( &id->lock_out );
+            id->b_abort = true;
+            vlc_cond_signal( &id->cond );
+            vlc_mutex_unlock( &id->lock_out );
+
+            vlc_join( id->thread, NULL );
+            vlc_mutex_lock( &id->lock_out );
+            *out = id->p_buffers;
+            id->p_buffers = NULL;
+            vlc_mutex_unlock( &id->lock_out );
 
             msg_Dbg( p_stream, "Flushing done");
         }



More information about the vlc-commits mailing list