]> git.sesse.net Git - vlc/blobdiff - modules/video_output/msw/common.c
MSW: fix DisableScreensaver and RestoreScreensaver definitions
[vlc] / modules / video_output / msw / common.c
index 58b9844cd97a1fd201106c517c847db99a2ac18e..414b93dd4c792f2d1b13c5faeb022a9badf0e6a8 100644 (file)
@@ -48,6 +48,9 @@
 #ifdef MODULE_NAME_IS_glwin32
 #include "../opengl.h"
 #endif
+#ifdef MODULE_NAME_IS_direct2d
+#include <d2d1.h>
+#endif
 
 #include "common.h"
 
 static void CommonChangeThumbnailClip(vout_display_t *, bool show);
 static int CommonControlSetFullscreen(vout_display_t *, bool is_fullscreen);
 
+#if !defined(UNDER_CE) && !defined(MODULE_NAME_IS_glwin32)
 static void DisableScreensaver(vout_display_t *);
 static void RestoreScreensaver(vout_display_t *);
+#endif
 
 /* */
 int CommonInit(vout_display_t *vd)
@@ -214,6 +219,55 @@ void CommonDisplay(vout_display_t *vd)
     sys->is_first_display = false;
 }
 
+/**
+ * It updates a picture data/pitches.
+ */
+int CommonUpdatePicture(picture_t *picture, picture_t **fallback,
+                        uint8_t *data, unsigned pitch)
+{
+    if (fallback) {
+        if (*fallback == NULL) {
+            *fallback = picture_NewFromFormat(&picture->format);
+            if (*fallback == NULL)
+                return VLC_EGENERIC;
+        }
+        for (int n = 0; n < picture->i_planes; n++) {
+            const plane_t *src = &(*fallback)->p[n];
+            plane_t       *dst = &picture->p[n];
+            dst->p_pixels = src->p_pixels;
+            dst->i_pitch  = src->i_pitch;
+            dst->i_lines  = src->i_lines;
+        }
+        return VLC_SUCCESS;
+    }
+    /* fill in buffer info in first plane */
+    picture->p->p_pixels = data;
+    picture->p->i_pitch  = pitch;
+    picture->p->i_lines  = picture->format.i_height;
+
+    /*  Fill chroma planes for planar YUV */
+    if (picture->format.i_chroma == VLC_CODEC_I420 ||
+        picture->format.i_chroma == VLC_CODEC_J420 ||
+        picture->format.i_chroma == VLC_CODEC_YV12) {
+
+        for (int n = 1; n < picture->i_planes; n++) {
+            const plane_t *o = &picture->p[n-1];
+            plane_t *p = &picture->p[n];
+
+            p->p_pixels = o->p_pixels + o->i_lines * o->i_pitch;
+            p->i_pitch  = pitch / 2;
+            p->i_lines  = picture->format.i_height / 2;
+        }
+        /* The dx/d3d buffer is always allocated as YV12 */
+        if (vlc_fourcc_AreUVPlanesSwapped(picture->format.i_chroma, VLC_CODEC_YV12)) {
+            uint8_t *p_tmp = picture->p[1].p_pixels;
+            picture->p[1].p_pixels = picture->p[2].p_pixels;
+            picture->p[2].p_pixels = p_tmp;
+        }
+    }
+    return VLC_SUCCESS;
+}
+
 void AlignRect(RECT *r, int align_boundary, int align_size)
 {
     if (align_boundary)
@@ -330,7 +384,7 @@ void UpdateRects(vout_display_t *vd,
                      SWP_NOCOPYBITS|SWP_NOZORDER|SWP_ASYNCWINDOWPOS);
 
     /* Destination image position and dimensions */
-#if defined(MODULE_NAME_IS_direct3d)
+#if defined(MODULE_NAME_IS_direct3d) || defined(MODULE_NAME_IS_direct2d)
     rect_dest.left   = 0;
     rect_dest.right  = place.width;
     rect_dest.top    = 0;
@@ -349,7 +403,7 @@ void UpdateRects(vout_display_t *vd,
 
 #endif
 
-#if defined(MODULE_NAME_IS_directx) || defined(MODULE_NAME_IS_direct3d)
+#if defined(MODULE_NAME_IS_directx) || defined(MODULE_NAME_IS_direct3d) || defined(MODULE_NAME_IS_direct2d)
     /* UpdateOverlay directdraw function doesn't automatically clip to the
      * display size so we need to do it otherwise it will fail
      * It is also needed for d3d to avoid exceding our surface size */
@@ -408,7 +462,7 @@ void UpdateRects(vout_display_t *vd,
     /* Apply overlay hardware constraints */
     if (sys->use_overlay)
         AlignRect(&rect_src_clipped, sys->i_align_src_boundary, sys->i_align_src_size);
-#elif defined(MODULE_NAME_IS_direct3d)
+#elif defined(MODULE_NAME_IS_direct3d) || defined(MODULE_NAME_IS_direct2d)
     /* Needed at least with YUV content */
     rect_src_clipped.left &= ~1;
     rect_src_clipped.right &= ~1;
@@ -618,7 +672,10 @@ int CommonControl(vout_display_t *vd, int query, va_list args)
     }
     case VOUT_DISPLAY_CHANGE_FULLSCREEN: {   /* const vout_display_cfg_t *p_cfg */
         const vout_display_cfg_t *cfg = va_arg(args, const vout_display_cfg_t *);
-        return CommonControlSetFullscreen(vd, cfg->is_fullscreen);
+        if (CommonControlSetFullscreen(vd, cfg->is_fullscreen))
+            return VLC_EGENERIC;
+        UpdateRects(vd, NULL, NULL, false);
+        return VLC_SUCCESS;
     }
 
     case VOUT_DISPLAY_HIDE_MOUSE:
@@ -631,7 +688,7 @@ int CommonControl(vout_display_t *vd, int query, va_list args)
     }
 }
 
-#ifndef UNDER_CE
+#if !defined(UNDER_CE) && !defined(MODULE_NAME_IS_glwin32)
 static void DisableScreensaver(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;