]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Chroma modules now exactly implement the "video filter2" capability.
[vlc] / src / video_output / video_output.c
index 606a213ee60af92e9ba1502d2a60c20c23343618..2d46908284fe053c8fb390ce2bad59d080e957c9 100644 (file)
@@ -33,7 +33,7 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 
 #include <stdlib.h>                                                /* free() */
 #include <string.h>
@@ -198,7 +198,7 @@ vout_thread_t *__vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
         {
             /* We are not interested in this format, close this vout */
             vlc_object_release( p_vout );
-            vout_Destroy( p_vout );
+            vlc_object_release( p_vout );
             p_vout = NULL;
         }
         else
@@ -314,9 +314,9 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     p_vout->i_par_num = p_vout->i_par_den = 1;
 
     /* Initialize locks */
-    vlc_mutex_init( p_vout, &p_vout->picture_lock );
-    vlc_mutex_init( p_vout, &p_vout->change_lock );
-    vlc_mutex_init( p_vout, &p_vout->vfilter_lock );
+    vlc_mutex_init( &p_vout->picture_lock );
+    vlc_mutex_init( &p_vout->change_lock );
+    vlc_mutex_init( &p_vout->vfilter_lock );
 
     /* Mouse coordinates */
     var_Create( p_vout, "mouse-x", VLC_VAR_INTEGER );
@@ -471,22 +471,6 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     return p_vout;
 }
 
-/*****************************************************************************
- * vout_Destroy: destroys a previously created video output
- *****************************************************************************
- * Destroy a terminated thread.
- * The function will request a destruction of the specified thread. If pi_error
- * is NULL, it will return once the thread is destroyed. Else, it will be
- * update using one of the THREAD_* constants.
- *****************************************************************************/
-void vout_Destroy( vout_thread_t *p_vout )
-{
-    /* XXX: should go in the destructor */
-    var_Destroy( p_vout, "intf-change" );
-
-    vlc_object_release( p_vout );
-}
-
 static void vout_Destructor( vlc_object_t * p_this )
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
@@ -509,26 +493,17 @@ static void vout_Destructor( vlc_object_t * p_this )
 #ifndef __APPLE__
     vout_thread_t *p_another_vout;
 
-    playlist_t *p_playlist = pl_Get( p_vout );
-    if( p_playlist->b_die ) return;
-    vlc_object_yield( p_playlist );
-/* This is a dirty hack for mostly Linux, where there is no way to get the GUI
-   back if you closed it while playing video. This is solved in Mac OS X,
-   where we have this novelty called menubar, that will always allow you access
-   to the applications main functionality. They should try that on linux sometime */
-        p_another_vout = vlc_object_find( p_this->p_libvlc,
-                                          VLC_OBJECT_VOUT, FIND_ANYWHERE );
-        if( p_another_vout == NULL )
-        {
-            vlc_value_t val;
-            val.b_bool = true;
-            var_Set( p_playlist, "intf-show", val );
-    }
+    /* This is a dirty hack mostly for Linux, where there is no way to get the
+     * GUI back if you closed it while playing video. This is solved in
+     * Mac OS X, where we have this novelty called menubar, that will always
+     * allow you access to the applications main functionality. They should try
+     * that on linux sometime. */
+    p_another_vout = vlc_object_find( p_this->p_libvlc,
+                                      VLC_OBJECT_VOUT, FIND_ANYWHERE );
+    if( p_another_vout == NULL )
+        var_SetBool( p_this->p_libvlc, "intf-show", true );
     else
-    {
         vlc_object_release( p_another_vout );
-    }
-    vlc_object_release( p_playlist );
 #endif
 }
 
@@ -539,6 +514,13 @@ static void vout_Destructor( vlc_object_t * p_this )
  * initialization. It returns 0 on success. Note that the thread's flag are not
  * modified inside this function.
  *****************************************************************************/
+static picture_t *get_pic( filter_t *p_filter )
+{
+    picture_t *p_pic = (picture_t *)p_filter->p_owner;
+    p_filter->p_owner = NULL;
+    return p_pic;
+}
+
 static int InitThread( vout_thread_t *p_vout )
 {
     int i, i_aspect_x, i_aspect_y;
@@ -680,17 +662,39 @@ static int InitThread( vout_thread_t *p_vout )
         p_vout->b_direct = 0;
 
         /* Choose the best module */
-        p_vout->chroma.p_module = module_Need( p_vout, "chroma", NULL, 0 );
-
-        if( p_vout->chroma.p_module == NULL )
+        p_vout->p_chroma = vlc_object_create( p_vout, VLC_OBJECT_FILTER );
+        filter_t *p_chroma = p_vout->p_chroma;
+        vlc_object_attach( p_chroma, p_vout );
+        /* TODO: Set the fmt_in and fmt_out stuff here */
+        p_chroma->fmt_in.video = p_vout->fmt_render;
+        p_chroma->fmt_out.video = p_vout->fmt_out;
+
+        /* TODO: put in a function */
+        p_chroma->fmt_out.video.i_rmask = p_vout->output.i_rmask;
+        p_chroma->fmt_out.video.i_gmask = p_vout->output.i_gmask;
+        p_chroma->fmt_out.video.i_bmask = p_vout->output.i_bmask;
+        p_chroma->fmt_out.video.i_rrshift = p_vout->output.i_rrshift;
+        p_chroma->fmt_out.video.i_lrshift = p_vout->output.i_lrshift;
+        p_chroma->fmt_out.video.i_rgshift = p_vout->output.i_rgshift;
+        p_chroma->fmt_out.video.i_lgshift = p_vout->output.i_lgshift;
+        p_chroma->fmt_out.video.i_rbshift = p_vout->output.i_rbshift;
+        p_chroma->fmt_out.video.i_lbshift = p_vout->output.i_lbshift;
+        msg_Err( p_vout, "HOLA! %4.4s", (char*)&p_chroma->fmt_in.video.i_chroma );
+        msg_Err( p_vout, "HOLA! %4.4s", (char*)&p_chroma->fmt_out.video.i_chroma );
+        p_chroma->p_module = module_Need( p_chroma, "video filter2", NULL, 0 );
+
+        if( p_chroma->p_module == NULL )
         {
             msg_Err( p_vout, "no chroma module for %4.4s to %4.4s",
                      (char*)&p_vout->render.i_chroma,
                      (char*)&p_vout->output.i_chroma );
+            vlc_object_detach( p_vout->p_chroma );
+            p_vout->p_chroma = NULL;
             p_vout->pf_end( p_vout );
             vlc_mutex_unlock( &p_vout->change_lock );
             return VLC_EGENERIC;
         }
+        p_chroma->pf_vout_buffer_new = get_pic;
 
         msg_Dbg( p_vout, "indirect render, mapping "
                  "render pictures 0-%i to system pictures %i-%i",
@@ -766,6 +770,8 @@ static void RunThread( vout_thread_t *p_vout)
     if( p_vout->b_error )
         return;
 
+    vlc_object_lock( p_vout );
+
     if( p_vout->b_title_show )
         DisplayTitleOnOSD( p_vout );
 
@@ -773,7 +779,7 @@ static void RunThread( vout_thread_t *p_vout)
      * Main loop - it is not executed if an error occurred during
      * initialization
      */
-    while( (!p_vout->b_die) && (!p_vout->b_error) )
+    while( (vlc_object_alive( p_vout )) && (!p_vout->b_error) )
     {
         /* Initialize loop variables */
         p_picture = NULL;
@@ -883,7 +889,7 @@ static void RunThread( vout_thread_t *p_vout)
                     p_picture->i_status = DESTROYED_PICTURE;
                     p_vout->i_heap_size--;
                 }
-                msg_Warn( p_vout, "late picture skipped ("I64Fd")",
+                msg_Warn( p_vout, "late picture skipped (%"PRId64")",
                                   current_date - display_date );
                 i_lost++;
                 vlc_mutex_unlock( &p_vout->picture_lock );
@@ -910,7 +916,7 @@ static void RunThread( vout_thread_t *p_vout)
                 }
                 i_lost++;
                 msg_Warn( p_vout, "vout warning: early picture skipped "
-                          "("I64Fd")", display_date - current_date
+                          "(%"PRId64")", display_date - current_date
                           - p_vout->i_pts_delay );
                 vlc_mutex_unlock( &p_vout->picture_lock );
 
@@ -1095,6 +1101,8 @@ static void RunThread( vout_thread_t *p_vout)
         /* Give back change lock */
         vlc_mutex_unlock( &p_vout->change_lock );
 
+        vlc_object_unlock( p_vout );
+
         /* Sleep a while or until a given date */
         if( display_date != 0 )
         {
@@ -1112,6 +1120,9 @@ static void RunThread( vout_thread_t *p_vout)
 
         /* On awakening, take back lock and send immediately picture
          * to display. */
+        vlc_object_lock( p_vout );
+        /* Note: vlc_object_alive() could be false here, and we
+         * could be dead */
         vlc_mutex_lock( &p_vout->change_lock );
 
         /*
@@ -1171,11 +1182,11 @@ static void RunThread( vout_thread_t *p_vout)
             }
 
             /* Need to reinitialise the chroma plugin */
-            if( p_vout->chroma.p_module )
+            if( p_vout->p_chroma->p_module )
             {
-                if( p_vout->chroma.p_module->pf_deactivate )
-                    p_vout->chroma.p_module->pf_deactivate( VLC_OBJECT(p_vout) );
-                p_vout->chroma.p_module->pf_activate( VLC_OBJECT(p_vout) );
+                if( p_vout->p_chroma->p_module->pf_deactivate )
+                    p_vout->p_chroma->p_module->pf_deactivate( VLC_OBJECT(p_vout->p_chroma) );
+                p_vout->p_chroma->p_module->pf_activate( VLC_OBJECT(p_vout->p_chroma) );
             }
         }
 
@@ -1190,7 +1201,8 @@ static void RunThread( vout_thread_t *p_vout)
 
             if( !p_vout->b_direct )
             {
-                module_Unneed( p_vout, p_vout->chroma.p_module );
+                module_Unneed( p_vout->p_chroma, p_vout->p_chroma->p_module );
+                p_vout->p_chroma = NULL;
             }
 
             vlc_mutex_lock( &p_vout->picture_lock );
@@ -1205,6 +1217,7 @@ static void RunThread( vout_thread_t *p_vout)
         }
     }
 
+
     if( p_input )
     {
         vlc_object_release( p_input );
@@ -1220,6 +1233,7 @@ static void RunThread( vout_thread_t *p_vout)
 
     /* End of thread */
     EndThread( p_vout );
+    vlc_object_unlock( p_vout );
 }
 
 /*****************************************************************************
@@ -1261,7 +1275,8 @@ static void EndThread( vout_thread_t *p_vout )
 
     if( !p_vout->b_direct )
     {
-        module_Unneed( p_vout, p_vout->chroma.p_module );
+        module_Unneed( p_vout->p_chroma, p_vout->p_chroma->p_module );
+        p_vout->p_chroma->p_module = NULL;
     }
 
     /* Destroy all remaining pictures */