]> git.sesse.net Git - vlc/commitdiff
XCB/X11: handle scaling, crop and A/R
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 7 May 2009 20:22:33 +0000 (23:22 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 7 May 2009 20:58:04 +0000 (23:58 +0300)
(Crop is currently dysfunctional, picture offset are missing)

modules/video_output/xcb/common.c
modules/video_output/xcb/x11.c
modules/video_output/xcb/xcb_vlc.h

index 6bfac3f28de67b9fdd2f3c4fa9750f27586a3e9c..7e5f4c350a2a38f992ddb38d930096c2d7c3d1f8 100644 (file)
@@ -226,3 +226,46 @@ void PictureFree (picture_t *pic, xcb_connection_t *conn)
     }
     shmdt (pic->p->p_pixels);
 }
+
+/**
+ * Video output thread management stuff.
+ * FIXME: Much of this should move to core
+ */
+void CommonManage (vout_thread_t *vout)
+{
+    if (vout->i_changes & VOUT_SCALE_CHANGE)
+    {
+        vout->b_autoscale = var_GetBool (vout, "autoscale");
+        vout->i_zoom = ZOOM_FP_FACTOR;
+        vout->i_changes &= ~VOUT_SCALE_CHANGE;
+        vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
+    if (vout->i_changes & VOUT_ZOOM_CHANGE)
+    {
+        vout->b_autoscale = false;
+        vout->i_zoom = var_GetFloat (vout, "scale") * ZOOM_FP_FACTOR;
+        vout->i_changes &= ~VOUT_ZOOM_CHANGE;
+        vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
+    if (vout->i_changes & VOUT_CROP_CHANGE)
+    {
+        vout->fmt_out.i_x_offset = vout->fmt_in.i_x_offset;
+        vout->fmt_out.i_y_offset = vout->fmt_in.i_y_offset;
+        vout->fmt_out.i_visible_width = vout->fmt_in.i_visible_width;
+        vout->fmt_out.i_visible_height = vout->fmt_in.i_visible_height;
+        vout->i_changes &= ~VOUT_CROP_CHANGE;
+        vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
+    if (vout->i_changes & VOUT_ASPECT_CHANGE)
+    {
+        vout->fmt_out.i_aspect = vout->fmt_in.i_aspect;
+        vout->fmt_out.i_sar_num = vout->fmt_in.i_sar_num;
+        vout->fmt_out.i_sar_den = vout->fmt_in.i_sar_den;
+        vout->output.i_aspect = vout->fmt_in.i_aspect;
+        vout->i_changes &= ~VOUT_ASPECT_CHANGE;
+        vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+}
index 6d1bea44440a68618cbe419df877ec66246a3d90..8e0988065006be3f6d81415704f6044bf6112829 100644 (file)
@@ -408,6 +408,8 @@ static int Manage (vout_thread_t *vout)
         msg_Err (vout, "X server failure");
         return VLC_EGENERIC;
     }
+
+    CommonManage (vout); /* FIXME: <-- move that to core */
     return VLC_SUCCESS;
 }
 
index eed941d5cf29d587047947c3c27e6fb3a3799094..aad0358e98fdab501f3370d81ab65155410279b2 100644 (file)
@@ -51,3 +51,4 @@ int GetWindowSize (struct vout_window_t *wnd, xcb_connection_t *conn,
                    unsigned *restrict width, unsigned *restrict height);
 int PictureAlloc (vout_thread_t *, picture_t *, size_t, xcb_connection_t *);
 void PictureFree (picture_t *pic, xcb_connection_t *conn);
+void CommonManage (vout_thread_t *);