]> git.sesse.net Git - vlc/commitdiff
Converted more commands to vout_control.
authorLaurent Aimar <fenrir@videolan.org>
Mon, 26 Apr 2010 19:32:17 +0000 (21:32 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Mon, 26 Apr 2010 20:01:24 +0000 (22:01 +0200)
src/video_output/control.h
src/video_output/video_output.c
src/video_output/vout_internal.h
src/video_output/vout_intf.c
src/video_output/vout_wrapper.c

index 7abc64e11e9466ea206826e8a4bad55bc66a9616..a8010d0a32acaec89b3718105db2b42845e98a00 100644 (file)
@@ -39,10 +39,6 @@ enum {
     VOUT_CONTROL_STOP,
 
     /* Controls */
-    VOUT_CONTROL_FULLSCREEN,
-    VOUT_CONTROL_DISPLAY_FILLED,
-    VOUT_CONTROL_ZOOM,
-    VOUT_CONTROL_ON_TOP,
 
     VOUT_CONTROL_SOURCE_ASPECT,
     VOUT_CONTROL_SOURCE_CROP_BORDER,
@@ -63,6 +59,11 @@ enum {
     VOUT_CONTROL_RESET,
     VOUT_CONTROL_FLUSH,                 /* time */
     VOUT_CONTROL_STEP,                  /* time_ptr */
+
+    VOUT_CONTROL_FULLSCREEN,            /* bool */
+    VOUT_CONTROL_ON_TOP,                /* bool */
+    VOUT_CONTROL_DISPLAY_FILLED,        /* bool */
+    VOUT_CONTROL_ZOOM,                  /* pair */
 };
 
 typedef struct {
index 81ea0c96d3c03b69d8c1d24805616b9ce1213b02..26b78e38241551d2a9f96b35a88db4aeecbfa59b 100644 (file)
@@ -51,6 +51,7 @@
 #include "vout_internal.h"
 #include "interlacing.h"
 #include "postprocessing.h"
+#include "display.h"
 
 /*****************************************************************************
  * Local prototypes
@@ -283,7 +284,6 @@ 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 );
     p_vout->p->i_changes    = 0;
-    p_vout->p->b_fullscreen = 0;
     vout_chrono_Init( &p_vout->p->render, 5, 10000 ); /* Arbitrary initial time */
     vout_statistic_Init( &p_vout->p->statistic );
     p_vout->p->b_filter_change = 0;
@@ -560,6 +560,28 @@ spu_t *vout_GetSpu( vout_thread_t *p_vout )
     return p_vout->p->p_spu;
 }
 
+/* vout_Control* are usable by anyone at anytime */
+void vout_ControlChangeFullscreen(vout_thread_t *vout, bool fullscreen)
+{
+    vout_control_PushBool(&vout->p->control, VOUT_CONTROL_FULLSCREEN,
+                          fullscreen);
+}
+void vout_ControlChangeOnTop(vout_thread_t *vout, bool is_on_top)
+{
+    vout_control_PushBool(&vout->p->control, VOUT_CONTROL_ON_TOP,
+                          is_on_top);
+}
+void vout_ControlChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
+{
+    vout_control_PushBool(&vout->p->control, VOUT_CONTROL_DISPLAY_FILLED,
+                          is_filled);
+}
+void vout_ControlChangeZoom(vout_thread_t *vout, int num, int den)
+{
+    vout_control_PushPair(&vout->p->control, VOUT_CONTROL_ZOOM,
+                          num, den);
+}
+
 /*****************************************************************************
  * InitThread: initialize video output thread
  *****************************************************************************
@@ -938,6 +960,36 @@ static void ThreadStep(vout_thread_t *vout, mtime_t *duration)
     }
 }
 
+static void ThreadChangeFullscreen(vout_thread_t *vout, bool fullscreen)
+{
+    /* FIXME not sure setting "fullscreen" is good ... */
+    var_SetBool(vout, "fullscreen", fullscreen);
+    vout_SetDisplayFullscreen(vout->p->display.vd, fullscreen);
+}
+
+static void ThreadChangeOnTop(vout_thread_t *vout, bool is_on_top)
+{
+    vout_SetWindowState(vout->p->display.vd,
+                        is_on_top ? VOUT_WINDOW_STATE_ABOVE :
+                                    VOUT_WINDOW_STATE_NORMAL);
+}
+
+static void ThreadChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
+{
+    vout_SetDisplayFilled(vout->p->display.vd, is_filled);
+}
+
+static void ThreadChangeZoom(vout_thread_t *vout, int num, int den)
+{
+    if (num * 10 < den) {
+        num = den;
+        den *= 10;
+    } else if (num > den * 10) {
+        num = den * 10;
+    }
+
+    vout_SetDisplayZoom(vout->p->display.vd, num, den);
+}
 
 /*****************************************************************************
  * Thread: video output thread
@@ -1013,6 +1065,18 @@ static void *Thread(void *object)
             case VOUT_CONTROL_STEP:
                 ThreadStep(vout, cmd.u.time_ptr);
                 break;
+            case VOUT_CONTROL_FULLSCREEN:
+                ThreadChangeFullscreen(vout, cmd.u.boolean);
+                break;
+            case VOUT_CONTROL_ON_TOP:
+                ThreadChangeOnTop(vout, cmd.u.boolean);
+                break;
+            case VOUT_CONTROL_DISPLAY_FILLED:
+                ThreadChangeDisplayFilled(vout, cmd.u.boolean);
+                break;
+            case VOUT_CONTROL_ZOOM:
+                ThreadChangeZoom(vout, cmd.u.pair.a, cmd.u.pair.b);
+                break;
             default:
                 break;
             }
index 2489d285eb2ca43e26196e122cc5a912bfc1bc04..c23d276369164a8912d235a5ebe24f6e5af81a7e 100644 (file)
@@ -130,8 +130,6 @@ struct vout_thread_sys_t
 
     uint16_t            i_changes;          /**< changes made to the thread.
                                                       \see \ref vout_changes */
-    unsigned            b_fullscreen:1;       /**< toogle fullscreen display */
-    unsigned            b_on_top:1; /**< stay always on top of other windows */
 };
 
 /** \defgroup vout_changes Flags for changes
@@ -139,20 +137,17 @@ struct vout_thread_sys_t
  * thread changed a variable
  * @{
  */
-/** b_autoscale changed */
-#define VOUT_SCALE_CHANGE       0x0008
-/** b_on_top changed */
-#define VOUT_ON_TOP_CHANGE      0x0010
-/** b_fullscreen changed */
-#define VOUT_FULLSCREEN_CHANGE  0x0040
-/** i_zoom changed */
-#define VOUT_ZOOM_CHANGE        0x0080
 /** cropping parameters changed */
 #define VOUT_CROP_CHANGE        0x1000
 /** aspect ratio changed */
 #define VOUT_ASPECT_CHANGE      0x2000
 /**@}*/
 
+/* TODO to move them to vlc_vout.h */
+void vout_ControlChangeFullscreen(vout_thread_t *, bool fullscreen);
+void vout_ControlChangeOnTop(vout_thread_t *, bool is_on_top);
+void vout_ControlChangeDisplayFilled(vout_thread_t *, bool is_filled);
+void vout_ControlChangeZoom(vout_thread_t *, int num, int den);
 
 /* */
 void vout_IntfInit( vout_thread_t * );
index 643c30573a45e1c76ea72f4e66c559fa28102092..53bf47ff306777f643a9208d8b71e3aae831beab 100644 (file)
@@ -334,16 +334,14 @@ void vout_IntfInit( vout_thread_t *p_vout )
     text.psz_string = _("Always on top");
     var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL );
     var_AddCallback( p_vout, "video-on-top", OnTopCallback, NULL );
+    var_TriggerCallback( p_vout, "video-on-top" );
 
     /* Add a variable to indicate whether we want window decoration or not */
     var_Create( p_vout, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
 
     /* Add a fullscreen variable */
-    if( var_CreateGetBoolCommand( p_vout, "fullscreen" ) )
-    {
-        /* user requested fullscreen */
-        p_vout->p->i_changes |= VOUT_FULLSCREEN_CHANGE;
-    }
+    var_Create( p_vout, "fullscreen",
+                VLC_VAR_BOOL | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
     text.psz_string = _("Fullscreen");
     var_Change( p_vout, "fullscreen", VLC_VAR_SETTEXT, &text, NULL );
     var_AddCallback( p_vout, "fullscreen", FullscreenCallback, NULL );
@@ -855,18 +853,10 @@ static int ScalingCallback( vlc_object_t *p_this, char const *psz_cmd,
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
     (void)oldval; (void)newval; (void)p_data;
 
-    vlc_mutex_lock( &p_vout->p->change_lock );
-
     if( !strcmp( psz_cmd, "autoscale" ) )
-    {
-        p_vout->p->i_changes |= VOUT_SCALE_CHANGE;
-    }
+        vout_ControlChangeDisplayFilled( p_vout, newval.b_bool );
     else if( !strcmp( psz_cmd, "scale" ) )
-    {
-        p_vout->p->i_changes |= VOUT_ZOOM_CHANGE;
-    }
-
-    vlc_mutex_unlock( &p_vout->p->change_lock );
+        vout_ControlChangeZoom( p_vout, 1000 * newval.f_float, 1000 );
 
     return VLC_SUCCESS;
 }
@@ -875,13 +865,9 @@ static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
-
-    vlc_mutex_lock( &p_vout->p->change_lock );
-    p_vout->p->i_changes |= VOUT_ON_TOP_CHANGE;
-    p_vout->p->b_on_top = newval.b_bool;
-    vlc_mutex_unlock( &p_vout->p->change_lock );
-
     (void)psz_cmd; (void)oldval; (void)p_data;
+
+    vout_ControlChangeOnTop( p_vout, newval.b_bool );
     return VLC_SUCCESS;
 }
 
@@ -889,13 +875,10 @@ static int FullscreenCallback( vlc_object_t *p_this, char const *psz_cmd,
                        vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
-    vlc_value_t val;
     (void)psz_cmd; (void)p_data;
 
-    if( oldval.b_bool == newval.b_bool )
-        return VLC_SUCCESS; /* no-op */
-    p_vout->p->i_changes |= VOUT_FULLSCREEN_CHANGE;
-
+    if( oldval.b_bool != newval.b_bool )
+        vout_ControlChangeFullscreen( p_vout, newval.b_bool );
     return VLC_SUCCESS;
 }
 
index 419844a824afb7777a1c63c63e543516320b0f4d..82774b7d44ebf653021549f8f705b3fffd9e8ea1 100644 (file)
@@ -162,10 +162,6 @@ int vout_InitWrapper(vout_thread_t *vout)
         vout->fmt_in.i_y_offset       != source.i_y_offset )
         sys->i_changes |= VOUT_CROP_CHANGE;
 
-#warning "vout_InitWrapper: vout_SetWindowState should NOT be called there"
-    if (sys->b_on_top)
-        vout_SetWindowState(vd, VOUT_WINDOW_STATE_ABOVE);
-
     /* XXX For non dr case, the current vout implementation force us to
      * create at most 1 direct picture (otherwise the buffers will be kept
      * referenced even through the Init/End.
@@ -217,20 +213,9 @@ int vout_ManageWrapper(vout_thread_t *vout)
     vout_thread_sys_t *sys = vout->p;
     vout_display_t *vd = sys->display.vd;
 
-    while (sys->i_changes & (VOUT_FULLSCREEN_CHANGE |
-                              VOUT_ASPECT_CHANGE |
-                              VOUT_ZOOM_CHANGE |
-                              VOUT_SCALE_CHANGE |
-                              VOUT_ON_TOP_CHANGE |
+    while (sys->i_changes & (VOUT_ASPECT_CHANGE |
                               VOUT_CROP_CHANGE)) {
         /* */
-        if (sys->i_changes & VOUT_FULLSCREEN_CHANGE) {
-            sys->b_fullscreen = !sys->b_fullscreen;
-
-            var_SetBool(vout, "fullscreen", sys->b_fullscreen);
-            vout_SetDisplayFullscreen(vd, sys->b_fullscreen);
-            sys->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
-        }
         if (sys->i_changes & VOUT_ASPECT_CHANGE) {
             vout->fmt_out.i_sar_num = vout->fmt_in.i_sar_num;
             vout->fmt_out.i_sar_den = vout->fmt_in.i_sar_den;
@@ -239,34 +224,6 @@ int vout_ManageWrapper(vout_thread_t *vout)
 
             sys->i_changes &= ~VOUT_ASPECT_CHANGE;
         }
-        if (sys->i_changes & VOUT_ZOOM_CHANGE) {
-            const float zoom = var_GetFloat(vout, "scale");
-
-            unsigned den = ZOOM_FP_FACTOR;
-            unsigned num = den * zoom;
-            if (num < (ZOOM_FP_FACTOR+9) / 10)
-                num = (ZOOM_FP_FACTOR+9) / 10;
-            else if (num > ZOOM_FP_FACTOR * 10)
-                num = ZOOM_FP_FACTOR * 10;
-
-            vout_SetDisplayZoom(vd, num, den);
-
-            sys->i_changes &= ~VOUT_ZOOM_CHANGE;
-        }
-        if (sys->i_changes & VOUT_SCALE_CHANGE) {
-            const bool is_display_filled = var_GetBool(vout, "autoscale");
-
-            vout_SetDisplayFilled(vd, is_display_filled);
-
-            sys->i_changes &= ~VOUT_SCALE_CHANGE;
-        }
-        if (sys->i_changes & VOUT_ON_TOP_CHANGE) {
-            vout_SetWindowState(vd, sys->b_on_top
-                ? VOUT_WINDOW_STATE_ABOVE
-                : VOUT_WINDOW_STATE_NORMAL);
-
-            sys->i_changes &= ~VOUT_ON_TOP_CHANGE;
-        }
         if (sys->i_changes & VOUT_CROP_CHANGE) {
             const video_format_t crop = vout->fmt_in;
             const video_format_t org = vout->fmt_render;