]> git.sesse.net Git - vlc/commitdiff
No functionnal changes (vout).
authorLaurent Aimar <fenrir@videolan.org>
Tue, 11 May 2010 19:03:39 +0000 (21:03 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Wed, 12 May 2010 18:19:51 +0000 (20:19 +0200)
src/video_output/control.h
src/video_output/video_output.c
src/video_output/vout_internal.h
src/video_output/vout_wrapper.c

index 0586f4cdf96c475a12cad588bba8797506b2b0f5..9198a7bdefe8c0ffcf175109e414fcdf30cad6ef 100644 (file)
 
 /* */
 enum {
-#if 0
     VOUT_CONTROL_INIT,
-    VOUT_CONTROL_EXIT,
+    VOUT_CONTROL_CLEAN,
 
+#if 0
     /* */
     VOUT_CONTROL_START,
     VOUT_CONTROL_STOP,
index cc706c6ae7dfafc8d307364362a01965fe201bb5..492c576f935a7507e43b73cbae53420f011a967d 100644 (file)
@@ -134,12 +134,8 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
     /* If we now have a video output, check it has the right properties */
     if( p_vout )
     {
-        vlc_mutex_lock( &p_vout->p->change_lock );
-
         if( !video_format_IsSimilar( &p_vout->p->original, p_fmt ) )
         {
-            vlc_mutex_unlock( &p_vout->p->change_lock );
-
             /* We are not interested in this format, close this vout */
             vout_CloseAndRelease( p_vout );
             vlc_object_release( p_vout );
@@ -148,8 +144,6 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
         else
         {
             /* This video output is cool! Hijack it. */
-            vlc_mutex_unlock( &p_vout->p->change_lock );
-
             vlc_object_release( p_vout );
         }
 
@@ -222,6 +216,7 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
 
     /* Initialize misc stuff */
     vout_control_Init( &p_vout->p->control );
+    vout_control_PushVoid( &p_vout->p->control, VOUT_CONTROL_INIT );
     vout_chrono_Init( &p_vout->p->render, 5, 10000 ); /* Arbitrary initial time */
     vout_statistic_Init( &p_vout->p->statistic );
     p_vout->p->i_par_num =
@@ -251,7 +246,6 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
 
     /* Initialize locks */
     vlc_mutex_init( &p_vout->p->picture_lock );
-    vlc_mutex_init( &p_vout->p->change_lock );
     vlc_mutex_init( &p_vout->p->vfilter_lock );
 
     /* Mouse coordinates */
@@ -327,7 +321,6 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
     vlc_object_set_destructor( p_vout, vout_Destructor );
 
     /* */
-    vlc_cond_init( &p_vout->p->change_wait );
     if( vlc_clone( &p_vout->p->thread, Thread, p_vout,
                    VLC_THREAD_PRIORITY_OUTPUT ) )
     {
@@ -338,16 +331,9 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
         return NULL;
     }
 
-    vlc_mutex_lock( &p_vout->p->change_lock );
-    while( !p_vout->p->b_ready )
-    {   /* We are (ab)using the same condition in opposite directions for
-         * b_ready and b_done. This works because of the strict ordering. */
-        assert( !p_vout->p->b_done );
-        vlc_cond_wait( &p_vout->p->change_wait, &p_vout->p->change_lock );
-    }
-    vlc_mutex_unlock( &p_vout->p->change_lock );
+    vout_control_WaitEmpty( &p_vout->p->control );
 
-    if( p_vout->p->b_error )
+    if (p_vout->p->dead )
     {
         msg_Err( p_vout, "video output creation failed" );
         vout_CloseAndRelease( p_vout );
@@ -369,13 +355,9 @@ void vout_Close( vout_thread_t *p_vout )
 {
     assert( p_vout );
 
-    vlc_mutex_lock( &p_vout->p->change_lock );
-    p_vout->p->b_done = true;
-    vlc_cond_signal( &p_vout->p->change_wait );
-    vlc_mutex_unlock( &p_vout->p->change_lock );
-
     vout_snapshot_End( &p_vout->p->snapshot );
 
+    vout_control_PushVoid( &p_vout->p->control, VOUT_CONTROL_CLEAN );
     vlc_join( p_vout->p->thread, NULL );
 }
 
@@ -400,9 +382,7 @@ static void vout_Destructor( vlc_object_t * p_this )
     assert( !p_vout->p->decoder_pool );
 
     /* Destroy the locks */
-    vlc_cond_destroy( &p_vout->p->change_wait );
     vlc_mutex_destroy( &p_vout->p->picture_lock );
-    vlc_mutex_destroy( &p_vout->p->change_lock );
     vlc_mutex_destroy( &p_vout->p->vfilter_lock );
     vout_control_Clean( &p_vout->p->control );
 
@@ -582,29 +562,7 @@ void vout_ControlChangeCropBorder(vout_thread_t *vout,
     vout_control_Push(&vout->p->control, &cmd);
 }
 
-/*****************************************************************************
- * InitThread: initialize video output thread
- *****************************************************************************
- * 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 ThreadInit(vout_thread_t *vout)
-{
-    /* Initialize output method, it allocates direct buffers for us */
-    if (vout_InitWrapper(vout))
-        return VLC_EGENERIC;
-    assert(vout->p->decoder_pool);
-
-    vout->p->displayed.decoded = NULL;
-
-    /* print some usefull debug info about different vout formats
-     */
-    PrintVideoFormat(vout, "pic render", &vout->p->original);
-    return VLC_SUCCESS;
-}
-
+/* */
 static int ThreadDisplayPicture(vout_thread_t *vout,
                                 bool now, mtime_t *deadline)
 {
@@ -794,10 +752,10 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
     return VLC_SUCCESS;
 }
 
-static int ThreadManage(vout_thread_t *vout,
-                        mtime_t *deadline,
-                        vout_interlacing_support_t *interlacing,
-                        vout_postprocessing_support_t *postprocessing)
+static void ThreadManage(vout_thread_t *vout,
+                         mtime_t *deadline,
+                         vout_interlacing_support_t *interlacing,
+                         vout_postprocessing_support_t *postprocessing)
 {
     vlc_mutex_lock(&vout->p->picture_lock);
 
@@ -815,14 +773,7 @@ static int ThreadManage(vout_thread_t *vout,
     /* Deinterlacing */
     vout_SetInterlacingState(vout, interlacing, picture_interlaced);
 
-    if (vout_ManageWrapper(vout)) {
-        /* A fatal error occurred, and the thread must terminate
-         * immediately, without displaying anything - setting b_error to 1
-         * causes the immediate end of the main while() loop. */
-        // FIXME pf_end
-        return VLC_EGENERIC;
-    }
-    return VLC_SUCCESS;
+    vout_ManageWrapper(vout);
 }
 
 static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string)
@@ -830,8 +781,6 @@ static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string)
     if (!vout->p->title.show)
         return;
 
-    vlc_assert_locked(&vout->p->change_lock);
-
     vout_OSDText(vout, SPU_DEFAULT_CHANNEL,
                  vout->p->title.position, INT64_C(1000) * vout->p->title.timeout,
                  string);
@@ -855,7 +804,6 @@ static void ThreadChangeFilters(vout_thread_t *vout, const char *filters)
 
 static void ThreadChangePause(vout_thread_t *vout, bool is_paused, mtime_t date)
 {
-    vlc_assert_locked(&vout->p->change_lock);
     assert(!vout->p->pause.is_on || !is_paused);
 
     if (vout->p->pause.is_on) {
@@ -1031,13 +979,42 @@ static void ThreadExecuteCropRatio(vout_thread_t *vout,
     ThreadExecuteCropWindow(vout, num, den, x, y, width, height);
 }
 
+static int ThreadInit(vout_thread_t *vout)
+{
+    vout->p->dead = false;
+
+    if (vout_OpenWrapper(vout, vout->p->psz_module_name))
+        return VLC_EGENERIC;
+    if (vout_InitWrapper(vout))
+        return VLC_EGENERIC;
+    assert(vout->p->decoder_pool);
+
+    vout->p->displayed.decoded = NULL;
+
+    PrintVideoFormat(vout, "original format", &vout->p->original);
+    return VLC_SUCCESS;
+}
+
 static void ThreadClean(vout_thread_t *vout)
 {
+    /* Destroy the video filters2 */
+    filter_chain_Delete(vout->p->vfilter_chain);
+
     /* Destroy translation tables */
-    if (!vout->p->b_error) {
-        ThreadFlush(vout, true, INT64_MAX);
-        vout_EndWrapper(vout);
+    if (vout->p->display.vd) {
+        if (vout->p->decoder_pool) {
+            ThreadFlush(vout, true, INT64_MAX);
+            vout_EndWrapper(vout);
+        }
+        vout_CloseWrapper(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);
+
+    vout->p->dead = true;
+    vout_control_Dead(&vout->p->control);
 }
 
 /*****************************************************************************
@@ -1050,28 +1027,7 @@ static void ThreadClean(vout_thread_t *vout)
 static void *Thread(void *object)
 {
     vout_thread_t *vout = object;
-    bool          has_wrapper;
 
-    /*
-     * Initialize thread
-     */
-    has_wrapper = !vout_OpenWrapper(vout, vout->p->psz_module_name);
-
-    vlc_mutex_lock(&vout->p->change_lock);
-
-    if (has_wrapper)
-        vout->p->b_error = ThreadInit(vout);
-    else
-        vout->p->b_error = true;
-
-    /* signal the creation of the vout */
-    vout->p->b_ready = true;
-    vlc_cond_signal(&vout->p->change_wait);
-
-    if (vout->p->b_error)
-        goto exit_thread;
-
-    /* */
     vout_interlacing_support_t interlacing = {
         .is_interlaced = false,
         .date = mdate(),
@@ -1080,22 +1036,23 @@ static void *Thread(void *object)
         .qtype = QTYPE_NONE,
     };
 
-    /*
-     * Main loop - it is not executed if an error occurred during
-     * initialization
-     */
     mtime_t deadline = VLC_TS_INVALID;
-    while (!vout->p->b_done && !vout->p->b_error) {
+    for (;;) {
         vout_control_cmd_t cmd;
 
-        vlc_mutex_unlock(&vout->p->change_lock);
         /* FIXME remove thoses ugly timeouts
          */
         while (!vout_control_Pop(&vout->p->control, &cmd, deadline, 100000)) {
-            /* TODO remove the lock when possible (ie when
-             * vout->p->fmt_* are not protected by it anymore) */
-            vlc_mutex_lock(&vout->p->change_lock);
             switch(cmd.type) {
+            case VOUT_CONTROL_INIT:
+                if (ThreadInit(vout)) {
+                    ThreadClean(vout);
+                    return NULL;
+                }
+                break;
+            case VOUT_CONTROL_CLEAN:
+                ThreadClean(vout);
+                return NULL;
             case VOUT_CONTROL_OSD_TITLE:
                 ThreadDisplayOsdTitle(vout, cmd.u.string);
                 break;
@@ -1145,46 +1102,11 @@ static void *Thread(void *object)
             default:
                 break;
             }
-            vlc_mutex_unlock(&vout->p->change_lock);
             vout_control_cmd_Clean(&cmd);
         }
-        vlc_mutex_lock(&vout->p->change_lock);
 
-        /* */
-        if (ThreadManage(vout, &deadline,
-                         &interlacing, &postprocessing)) {
-            vout->p->b_error = true;
-            break;
-        }
+        ThreadManage(vout, &deadline, &interlacing, &postprocessing);
     }
-
-    /*
-     * Error loop - wait until the thread destruction is requested
-     *
-     * XXX I wonder if we should periodically clean the decoder_fifo
-     * or have a way to prevent it filling up.
-     */
-    while (vout->p->b_error && !vout->p->b_done)
-        vlc_cond_wait(&vout->p->change_wait, &vout->p->change_lock);
-
-    /* Clean thread */
-    ThreadClean(vout);
-
-exit_thread:
-    /* 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);
-
-    vlc_mutex_unlock(&vout->p->change_lock);
-
-    if (has_wrapper)
-        vout_CloseWrapper(vout);
-    vout_control_Dead(&vout->p->control);
-
-    /* Destroy the video filters2 */
-    filter_chain_Delete(vout->p->vfilter_chain);
-
-    return NULL;
 }
 
 /*****************************************************************************
index 87d4258c64d3163c098b5d36110401271c8bcaff..41cbf249614808256ff748c4e6d9743e4e7b6ce3 100644 (file)
@@ -53,10 +53,7 @@ struct vout_thread_sys_t
 
     /* Thread & synchronization */
     vlc_thread_t    thread;
-    vlc_cond_t      change_wait;
-    bool            b_ready;
-    bool            b_done;
-    bool            b_error;
+    bool            dead;
     vout_control_t  control;
 
     /* */
@@ -124,8 +121,6 @@ struct vout_thread_sys_t
     picture_fifo_t      *decoder_fifo;
     bool                is_decoder_pool_slow;
     vout_chrono_t       render;           /**< picture render time estimator */
-
-    vlc_mutex_t         change_lock;                 /**< thread change lock */
 };
 
 /* TODO to move them to vlc_vout.h */
@@ -146,7 +141,7 @@ int  vout_OpenWrapper (vout_thread_t *, const char *);
 void vout_CloseWrapper(vout_thread_t *);
 int  vout_InitWrapper(vout_thread_t *);
 void vout_EndWrapper(vout_thread_t *);
-int  vout_ManageWrapper(vout_thread_t *);
+void vout_ManageWrapper(vout_thread_t *);
 void vout_RenderWrapper(vout_thread_t *, picture_t *);
 void vout_DisplayWrapper(vout_thread_t *, picture_t *);
 
index 5130e9dc73e20930c35e5d606eb98d39db2b8027..1d43e61c3acc662328a7448b93a41e7e4b4fb7d7 100644 (file)
@@ -179,7 +179,7 @@ void vout_EndWrapper(vout_thread_t *vout)
 /*****************************************************************************
  *
  *****************************************************************************/
-int vout_ManageWrapper(vout_thread_t *vout)
+void vout_ManageWrapper(vout_thread_t *vout)
 {
     vout_thread_sys_t *sys = vout->p;
     vout_display_t *vd = sys->display.vd;
@@ -189,8 +189,6 @@ int vout_ManageWrapper(vout_thread_t *vout)
 
     if (reset_display_pool)
         sys->display_pool = vout_display_Pool(vd, 3);
-
-    return VLC_SUCCESS;
 }
 
 /*****************************************************************************