[vlc-devel] commit: avcodec: drop own threading code and just let ffmpeg handle it own threading ( Ilkka Ollakka )

git version control git at videolan.org
Sun Dec 6 20:31:58 CET 2009


vlc | branch: 1.0-bugfix | Ilkka Ollakka <ileoo at iki.fi> | Sun Nov  8 15:34:35 2009 +0200| [9327b43e5c264e4ebe1816d4e970cfb8398a6c93] | committer: Ilkka Ollakka 

avcodec: drop own threading code and just let ffmpeg handle it own threading

This means that multithread encoding with avcodec now needs
--enable-pthreads/--enable-w32threads.
(cherry picked from commit 0530b1850b04e2cabcdc69bb497fadc46b503dbf)

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

 modules/codec/avcodec/encoder.c |  129 +--------------------------------------
 1 files changed, 1 insertions(+), 128 deletions(-)

diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index 4aefaec..40dcb2b 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -68,10 +68,6 @@ static block_t *EncodeVideo( encoder_t *, picture_t * );
 static block_t *EncodeAudio( encoder_t *, aout_buffer_t * );
 
 struct thread_context_t;
-static void* FfmpegThread( vlc_object_t *p_this );
-static int FfmpegExecute( AVCodecContext *s,
-                          int (*pf_func)(AVCodecContext *c2, void *arg2),
-                          void *arg, int *ret, int count, int );
 
 /*****************************************************************************
  * thread_context_t : for multithreaded encoding
@@ -538,7 +534,7 @@ int OpenEncoder( vlc_object_t *p_this )
             p_context->flags |= CODEC_FLAG_QSCALE;
 
         if ( p_enc->i_threads >= 1 )
-            p_context->thread_count = p_enc->i_threads;
+            avcodec_thread_init( p_context, p_enc->i_threads );
 
         if( p_sys->i_vtolerance > 0 )
             p_context->bit_rate_tolerance = p_sys->i_vtolerance;
@@ -749,82 +745,6 @@ int OpenEncoder( vlc_object_t *p_this )
 }
 
 /****************************************************************************
- * Ffmpeg threading system
- ****************************************************************************/
-static void* FfmpegThread( vlc_object_t *p_this )
-{
-    struct thread_context_t *p_context = (struct thread_context_t *)p_this;
-    int canc = vlc_savecancel ();
-    while ( vlc_object_alive (p_context) && !p_context->b_error )
-    {
-        vlc_mutex_lock( &p_context->lock );
-        while ( !p_context->b_work && vlc_object_alive (p_context) && !p_context->b_error )
-        {
-            vlc_cond_wait( &p_context->cond, &p_context->lock );
-        }
-        p_context->b_work = 0;
-        vlc_mutex_unlock( &p_context->lock );
-        if ( !vlc_object_alive (p_context) || p_context->b_error )
-            break;
-
-        if ( p_context->pf_func )
-        {
-            p_context->i_ret = p_context->pf_func( p_context->p_context,
-                                                   p_context->arg );
-        }
-
-        vlc_mutex_lock( &p_context->lock );
-        p_context->b_done = 1;
-        vlc_cond_signal( &p_context->cond );
-        vlc_mutex_unlock( &p_context->lock );
-    }
-
-    vlc_restorecancel (canc);
-    return NULL;
-}
-
-static int FfmpegExecute( AVCodecContext *s,
-                          int (*pf_func)(AVCodecContext *c2, void *arg2),
-                          void *arg, int *ret, int count, int size )
-{
-    struct thread_context_t ** pp_contexts =
-                         (struct thread_context_t **)s->thread_opaque;
-    void **argv = arg;
-
-    /* Note, we can be certain that this is not called with the same
-     * AVCodecContext by different threads at the same time */
-    for ( int i = 0; i < count; i++ )
-    {
-        vlc_mutex_lock( &pp_contexts[i]->lock );
-        pp_contexts[i]->arg = argv[i];
-        pp_contexts[i]->pf_func = pf_func;
-        pp_contexts[i]->i_ret = 12345;
-        pp_contexts[i]->b_work = 1;
-        vlc_cond_signal( &pp_contexts[i]->cond );
-        vlc_mutex_unlock( &pp_contexts[i]->lock );
-    }
-    for ( int i = 0; i < count; i++ )
-    {
-        vlc_mutex_lock( &pp_contexts[i]->lock );
-        while ( !pp_contexts[i]->b_done )
-        {
-            vlc_cond_wait( &pp_contexts[i]->cond, &pp_contexts[i]->lock );
-        }
-        pp_contexts[i]->b_done = 0;
-        pp_contexts[i]->pf_func = NULL;
-        vlc_mutex_unlock( &pp_contexts[i]->lock );
-
-        if ( ret )
-        {
-            ret[i] = pp_contexts[i]->i_ret;
-        }
-    }
-
-    (void)size;
-    return 0;
-}
-
-/****************************************************************************
  * EncodeVideo: the whole thing
  ****************************************************************************/
 static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
@@ -833,35 +753,6 @@ static block_t *EncodeVideo( encoder_t *p_enc, picture_t *p_pict )
     AVFrame frame;
     int i_out, i_plane;
 
-    if ( !p_sys->b_inited && p_enc->i_threads >= 1 )
-    {
-        struct thread_context_t ** pp_contexts;
-        int i;
-
-        p_sys->b_inited = 1;
-        pp_contexts = malloc( sizeof(struct thread_context_t *)
-                                 * p_enc->i_threads );
-        p_sys->p_context->thread_opaque = (void *)pp_contexts;
-
-        for ( i = 0; i < p_enc->i_threads; i++ )
-        {
-            pp_contexts[i] = vlc_object_create( p_enc,
-                                     sizeof(struct thread_context_t) );
-            pp_contexts[i]->p_context = p_sys->p_context;
-            vlc_mutex_init( &pp_contexts[i]->lock );
-            vlc_cond_init( &pp_contexts[i]->cond );
-            pp_contexts[i]->b_work = 0;
-            pp_contexts[i]->b_done = 0;
-            if ( vlc_thread_create( pp_contexts[i], "encoder", FfmpegThread,
-                                    VLC_THREAD_PRIORITY_VIDEO ) )
-            {
-                msg_Err( p_enc, "cannot spawn encoder thread, expect to die soon" );
-                return NULL;
-            }
-        }
-
-        p_sys->p_context->execute = FfmpegExecute;
-    }
 
     memset( &frame, 0, sizeof( AVFrame ) );
     for( i_plane = 0; i_plane < p_pict->i_planes; i_plane++ )
@@ -1138,24 +1029,6 @@ void CloseEncoder( vlc_object_t *p_this )
     encoder_t *p_enc = (encoder_t *)p_this;
     encoder_sys_t *p_sys = p_enc->p_sys;
 
-    if ( p_sys->b_inited && p_enc->i_threads >= 1 )
-    {
-        int i;
-        struct thread_context_t ** pp_contexts =
-                (struct thread_context_t **)p_sys->p_context->thread_opaque;
-        for ( i = 0; i < p_enc->i_threads; i++ )
-        {
-            vlc_object_kill( pp_contexts[i] );
-            vlc_cond_signal( &pp_contexts[i]->cond );
-            vlc_thread_join( pp_contexts[i] );
-            vlc_mutex_destroy( &pp_contexts[i]->lock );
-            vlc_cond_destroy( &pp_contexts[i]->cond );
-            vlc_object_release( pp_contexts[i] );
-        }
-
-        free( pp_contexts );
-    }
-
     vlc_avcodec_lock();
     avcodec_close( p_sys->p_context );
     vlc_avcodec_unlock();




More information about the vlc-devel mailing list