[vlc-devel] [PATCH 15/17] opengl: use the projection mode from the display configuration

Steve Lhomme robux4 at videolabs.io
Mon Nov 14 15:16:24 CET 2016


only auto, flat, sphere, cubemap are currently supported

--
replaces https://patches.videolan.org/patch/14435/ only using values for sphere/cubemap
replaces https://patches.videolan.org/patch/14462/
* rename vlc_viewpoint to vlc_viewpoint_t
* rename projection_mode to vout_projection_mode_t
* rename PROJECTION_XXX to VOUT_PROJECTION_XXX
* vout_display_opengl_SetProjection() returns the mode in use or AUTO

replaces https://patches.videolan.org/patch/14957/
* factorize some code

replaces https://patches.videolan.org/patch/14920/
* use vlc_viewpoint_init()
---
 modules/video_output/caopengllayer.m |  7 +++++
 modules/video_output/gl.c            |  9 ++++++
 modules/video_output/ios2.m          |  7 +++++
 modules/video_output/macosx.m        |  7 +++++
 modules/video_output/opengl.c        | 54 ++++++++++++++++++++++++++++++++----
 modules/video_output/opengl.h        |  4 +++
 modules/video_output/win32/glwin32.c |  7 +++++
 modules/video_output/xcb/glx.c       |  8 ++++++
 8 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
index 81a6e92..a6f8421 100644
--- a/modules/video_output/caopengllayer.m
+++ b/modules/video_output/caopengllayer.m
@@ -184,6 +184,9 @@ static int Open (vlc_object_t *p_this)
             goto bailout;
         }
 
+        if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+            goto bailout;
+
         /* setup vout display */
         vout_display_info_t info = vd->info;
         info.subpicture_chromas = subpicture_chromas;
@@ -406,6 +409,10 @@ static int Control (vout_display_t *vd, int query, va_list ap)
             return vout_display_opengl_SetViewpoint(sys->vgl,
                 &va_arg (ap, const vout_display_cfg_t* )->viewpoint);
 
+        case VOUT_DISPLAY_CHANGE_PROJECTION:
+            return vout_display_opengl_SetProjection(vd, sys->vgl,
+                va_arg (ap, const vout_display_cfg_t* )->projection);
+
         case VOUT_DISPLAY_RESET_PICTURES:
             vlc_assert_unreachable ();
         default:
diff --git a/modules/video_output/gl.c b/modules/video_output/gl.c
index 3d5afa8..681cc01 100644
--- a/modules/video_output/gl.c
+++ b/modules/video_output/gl.c
@@ -131,6 +131,9 @@ static int Open (vlc_object_t *obj)
     if (sys->vgl == NULL)
         goto error;
 
+    if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+        goto error;
+
     vd->sys = sys;
     vd->info.has_pictures_invalid = false;
     vd->info.has_event_thread = false;
@@ -143,6 +146,8 @@ static int Open (vlc_object_t *obj)
     return VLC_SUCCESS;
 
 error:
+    if (sys->vgl != NULL)
+        vout_display_opengl_Delete (sys->vgl);
     if (sys->gl != NULL)
         vlc_gl_Destroy (sys->gl);
     if (surface != NULL)
@@ -252,6 +257,10 @@ static int Control (vout_display_t *vd, int query, va_list ap)
       case VOUT_DISPLAY_CHANGE_VIEWPOINT:
         return vout_display_opengl_SetViewpoint (sys->vgl,
             &va_arg (ap, const vout_display_cfg_t* )->viewpoint);
+      case VOUT_DISPLAY_CHANGE_PROJECTION:
+        return vout_display_opengl_SetProjection (vd, sys->vgl,
+            va_arg( ap, const vout_display_cfg_t* )->projection);
+
       default:
         msg_Err (vd, "Unknown request %d", query);
     }
diff --git a/modules/video_output/ios2.m b/modules/video_output/ios2.m
index 7c77b1b..7a1898a 100644
--- a/modules/video_output/ios2.m
+++ b/modules/video_output/ios2.m
@@ -267,6 +267,9 @@ static int Open(vlc_object_t *this)
                 sys->gl.sys = NULL;
                 goto bailout;
             }
+
+            if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+                goto bailout;
         } else {
             subpicture_chromas = gl_subpicture_chromas;
         }
@@ -429,6 +432,10 @@ static int Control(vout_display_t *vd, int query, va_list ap)
             return vout_display_opengl_SetViewpoint(sys->vgl,
                 &va_arg (ap, const vout_display_cfg_t* )->viewpoint);
 
+        case VOUT_DISPLAY_CHANGE_PROJECTION:
+            return vout_display_opengl_SetProjection(vd, sys->vgl,
+                va_arg (ap, const vout_display_cfg_t* )->projection);
+
         case VOUT_DISPLAY_RESET_PICTURES:
             vlc_assert_unreachable ();
         default:
diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
index c6d1d07..11c98a7 100644
--- a/modules/video_output/macosx.m
+++ b/modules/video_output/macosx.m
@@ -265,6 +265,9 @@ static int Open (vlc_object_t *this)
             goto error;
         }
 
+        if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+            goto error;
+
         /* */
         vout_display_info_t info = vd->info;
         info.has_pictures_invalid = false;
@@ -437,6 +440,10 @@ static int Control (vout_display_t *vd, int query, va_list ap)
                 return vout_display_opengl_SetViewpoint (sys->vgl,
                     &va_arg (ap, const vout_display_cfg_t* )->viewpoint);
 
+            case VOUT_DISPLAY_CHANGE_PROJECTION:
+                return vout_display_opengl_SetProjection (vd, sys->vgl,
+                    va_arg( ap, const vout_display_cfg_t* )->projection);
+
             case VOUT_DISPLAY_RESET_PICTURES:
                 vlc_assert_unreachable ();
             default:
diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
index 348a52c..7bfeaef 100644
--- a/modules/video_output/opengl.c
+++ b/modules/video_output/opengl.c
@@ -120,6 +120,7 @@ struct vout_display_opengl_t {
 
     video_format_t fmt;
     const vlc_chroma_description_t *chroma;
+    vout_projection_mode_t projection;
 
     int        tex_target;
     int        tex_format;
@@ -812,6 +813,47 @@ int vout_display_opengl_SetViewpoint(vout_display_opengl_t *vgl,
                              FROM_MILLI_INT(p_viewpoint->zoom));
 }
 
+int vout_display_opengl_SetProjection( vout_display_t *vd,
+                                       vout_display_opengl_t *vgl,
+                                       vout_projection_mode_t proj_mode )
+{
+    switch (proj_mode)
+    {
+    case VOUT_PROJECTION_AUTO:
+    case VOUT_PROJECTION_FLAT:
+    case VOUT_PROJECTION_SPHERE:
+    case VOUT_PROJECTION_CUBEMAP:
+        if (proj_mode != VOUT_PROJECTION_AUTO)
+            vgl->projection = proj_mode;
+        else
+        {
+            switch (vgl->fmt.projection_mode)
+            {
+            case PROJECTION_MODE_RECTANGULAR:
+                vgl->projection = VOUT_PROJECTION_FLAT;
+                break;
+            case PROJECTION_MODE_EQUIRECTANGULAR:
+                vgl->projection = VOUT_PROJECTION_SPHERE;
+                break;
+            case PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD:
+                vgl->projection = VOUT_PROJECTION_CUBEMAP;
+                break;
+            default:
+                vgl->projection = VOUT_PROJECTION_FLAT;
+                break;
+            }
+        }
+        vlc_viewpoint_t viewpoint;
+        vlc_viewpoint_init( &viewpoint );
+        vout_display_opengl_SetViewpoint( vgl, &viewpoint );
+        vd->projection = vgl->projection;
+        return VLC_SUCCESS;
+    default:
+        msg_Warn(vd, "Failed to set the projection type %d", proj_mode);
+        return VLC_EBADVAR;
+    }
+}
+
 picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl, unsigned requested_count)
 {
     if (vgl->pool)
@@ -1550,21 +1592,21 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
     unsigned nbVertices, nbIndices;
 
     int i_ret;
-    switch (vgl->fmt.projection_mode)
+    switch (vgl->projection)
     {
-    case PROJECTION_MODE_RECTANGULAR:
+    case VOUT_PROJECTION_FLAT:
         i_ret = BuildRectangle(vgl->chroma->plane_count,
                                &vertexCoord, &textureCoord, &nbVertices,
                                &indices, &nbIndices,
                                left, top, right, bottom);
         break;
-    case PROJECTION_MODE_EQUIRECTANGULAR:
+    case VOUT_PROJECTION_SPHERE:
         i_ret = BuildSphere(vgl->chroma->plane_count,
                             &vertexCoord, &textureCoord, &nbVertices,
                             &indices, &nbIndices,
                             left, top, right, bottom);
         break;
-    case PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD:
+    case VOUT_PROJECTION_CUBEMAP:
         i_ret = BuildCube(vgl->chroma->plane_count,
                           (float)vgl->fmt.i_cubemap_padding / vgl->fmt.i_width,
                           (float)vgl->fmt.i_cubemap_padding / vgl->fmt.i_height,
@@ -1586,8 +1628,8 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
 
     orientationTransformMatrix(orientationMatrix, vgl->fmt.orientation);
 
-    if (vgl->fmt.projection_mode == PROJECTION_MODE_EQUIRECTANGULAR
-        || vgl->fmt.projection_mode == PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD)
+    if ( vgl->projection == VOUT_PROJECTION_SPHERE ||
+         vgl->projection == VOUT_PROJECTION_CUBEMAP )
     {
         float sar = (float) vgl->fmt.i_visible_width / vgl->fmt.i_visible_height;
         getProjectionMatrix(sar, vgl->f_fov, projectionMatrix);
diff --git a/modules/video_output/opengl.h b/modules/video_output/opengl.h
index ff76902..168274b 100644
--- a/modules/video_output/opengl.h
+++ b/modules/video_output/opengl.h
@@ -33,6 +33,7 @@
 #include <vlc_picture_pool.h>
 #include <vlc_opengl.h>
 #include <vlc_vout.h>
+#include <vlc_vout_display.h>
 
 /* Change USE_OPENGL_ES value to set the OpenGL ES version (1, 2) you want to use
  * A value of 0 will activate normal OpenGL */
@@ -98,6 +99,9 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl);
 picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl, unsigned);
 
 int vout_display_opengl_SetViewpoint(vout_display_opengl_t *vgl, const vlc_viewpoint_t*);
+int vout_display_opengl_SetProjection(vout_display_t *vd,
+                                      vout_display_opengl_t *vgl,
+                                      vout_projection_mode_t);
 
 int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
                                 picture_t *picture, subpicture_t *subpicture);
diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
index cd7339b..e0e6510 100644
--- a/modules/video_output/win32/glwin32.c
+++ b/modules/video_output/win32/glwin32.c
@@ -155,6 +155,10 @@ static int Control(vout_display_t *vd, int query, va_list args)
         return vout_display_opengl_SetViewpoint(sys->vgl,
             &va_arg (args, const vout_display_cfg_t* )->viewpoint);
 
+    if (query == VOUT_DISPLAY_CHANGE_PROJECTION)
+        return vout_display_opengl_SetProjection(vd, sys->vgl,
+            va_arg (args, const vout_display_cfg_t* )->projection);
+
     return CommonControl(vd, query, args);
 }
 
@@ -225,6 +229,9 @@ static int Open(vlc_object_t *object)
     if (!sys->vgl)
         goto error;
 
+    if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+        goto error;
+
     vout_display_info_t info = vd->info;
     info.has_double_click = true;
     info.has_hide_mouse = false;
diff --git a/modules/video_output/xcb/glx.c b/modules/video_output/xcb/glx.c
index e87704a..e876b35 100644
--- a/modules/video_output/xcb/glx.c
+++ b/modules/video_output/xcb/glx.c
@@ -114,6 +114,10 @@ static int Open (vlc_object_t *obj)
     if (sys->vgl == NULL)
         goto error;
 
+    if (vout_display_opengl_SetProjection(vd, sys->vgl, vd->cfg->projection))
+        goto error;
+
+
     sys->cursor = vlc_xcb_cursor_Create(conn, scr);
     sys->visible = false;
 
@@ -251,6 +255,10 @@ static int Control (vout_display_t *vd, int query, va_list ap)
         return vout_display_opengl_SetViewpoint (sys->vgl,
             &va_arg (ap, const vout_display_cfg_t* )->viewpoint);
 
+    case VOUT_DISPLAY_CHANGE_PROJECTION:
+        return vout_display_opengl_SetProjection (vd, sys->vgl,
+            va_arg (ap, const vout_display_cfg_t* )->projection);
+
     case VOUT_DISPLAY_RESET_PICTURES:
         vlc_assert_unreachable ();
     default:
-- 
2.10.1



More information about the vlc-devel mailing list