<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta name="generator" content="pandoc" />
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<p>On 2016-11-04 18:08, Steve Lhomme wrote:</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> --
 fix older patch with proper value initialization

 opengl: reset the viewpoint values when changing the projection mode

 replaces https://patches.videolan.org/patch/14436/
 * reorder the ch_viewpoint so that the initial viewpoint is used properly
   on startup
 * remove unused projection modes
 * rename projection_mode to vout_projection_mode_t
 * rename PROJECTION_XXX to VOUT_PROJECTION_XXX
 ---
  include/vlc_vout.h               |  5 +++++
  include/vlc_vout_display.h       |  4 ++++
  include/vlc_vout_wrapper.h       |  1 +
  src/libvlc-module.c              |  9 +++++++++
  src/video_output/control.h       |  1 +
  src/video_output/display.c       | 28 +++++++++++++++++++++++++++-
  src/video_output/video_output.c  | 15 +++++++++++++++
  src/video_output/vout_internal.h |  1 +
  src/video_output/vout_intf.c     | 34 ++++++++++++++++++++++++++++++++++
  9 files changed, 97 insertions(+), 1 deletion(-)

 diff --git a/include/vlc_vout.h b/include/vlc_vout.h
 index 7e67661..c858cf6 100644
 --- a/include/vlc_vout.h
 +++ b/include/vlc_vout.h
 @@ -82,6 +82,11 @@ struct vout_thread_t {
  #define VOUT_ALIGN_BOTTOM       0x0008
  #define VOUT_ALIGN_VMASK        0x000C

 +typedef enum {
 +    VOUT_PROJECTION_AUTO, VOUT_PROJECTION_FLAT, VOUT_PROJECTION_SPHERE,
 +    VOUT_PROJECTION_CUBEMAP,
 +} vout_projection_mode_t;
 +</code></pre>
</blockquote>
<p>For future maintenance it is probably easier if all <em>enumerators</em> are on a line of their own.</p>
<p>A highly personal opinion is that <code>_t</code> implies that it is something other than an <em>enum</em>, but that could very well just be me.</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code>  struct vlc_viewpoint_t {
      float f_yaw;
      float f_pitch;
 diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
 index e1efe00..1a8a993 100644
 --- a/include/vlc_vout_display.h
 +++ b/include/vlc_vout_display.h
 @@ -118,6 +118,8 @@ typedef struct {

      vlc_viewpoint_t viewpoint;

 +    vout_projection_mode_t projection;
 +
  } vout_display_cfg_t;

  /**
 @@ -182,6 +184,8 @@ enum {
      /* Ask the module to acknowledge/refuse VR/360° viewing direction after
       * being requested externally */
      VOUT_DISPLAY_CHANGE_VIEWPOINT,   /* const vout_display_cfg_t *p_cfg */
 +
 +    VOUT_DISPLAY_CHANGE_PROJECTION, /* const vout_display_cfg_t *p_cfg */</code></pre>
</blockquote>
<p>Even though <code>VOUT_DISPLAY_CHANGE_PROJECTION</code> is a very descriptive name, it might not hurt to add a little bit of documentation regarding the control (especially given that all other controls have a descriptive comment associated with them).</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code>  };

  /**
 diff --git a/include/vlc_vout_wrapper.h b/include/vlc_vout_wrapper.h
 index 2ba4fc6..f6edb94 100644
 --- a/include/vlc_vout_wrapper.h
 +++ b/include/vlc_vout_wrapper.h
 @@ -95,6 +95,7 @@ void vout_SetDisplayCrop(vout_display_t *, unsigned num, unsigned den,
                           unsigned left, unsigned top, int right, int bottom);
  void vout_GetDisplayViewpoint(vout_display_t *, vlc_viewpoint_t *p_viewpoint);
  void vout_SetDisplayViewpoint(vout_display_t *, const vlc_viewpoint_t *p_viewpoint);
 +void vout_SetDisplayProjection(vout_display_t *, vout_projection_mode_t);

  #endif /* VLC_VOUT_WRAPPER_H */

 diff --git a/src/libvlc-module.c b/src/libvlc-module.c
 index c566566..bd7081f 100644
 --- a/src/libvlc-module.c
 +++ b/src/libvlc-module.c
 @@ -438,6 +438,13 @@ static const char *const ppsz_pos_descriptions[] =
      "This forces the viewpoint for the displayed video. " \
      "Accepted formats are yaw:pitch:roll expressing the user viewpoint.")

 +#define PROJECTION_TEXT N_("Projection")
 +#define PROJECTION_LONGTEXT N_( \
 +    "Change the way the video is displayed.")
 +static const int pi_projection_values[] = { 0, 1, 2, 3 };
 +static const char *const ppsz_projection_descriptions[] =
 +{ N_("Automatic"), N_("Flat/2D"), N_("360° Sphere"), N_("360° Cubemap") };</code></pre>
</blockquote>
<p>I am a little bit worried that including <em>UTF-8</em> directly in the <code>msgid</code> for translations are going to result in issues further down the road. I also could not find any current usage of <em>UTF-8</em> in those places.</p>
<ul>
<li>Perhaps it would be better to rephrase the identifiers so that only <em>ASCII</em> is used?</li>
</ul>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> +
  #define AUTOSCALE_TEXT N_("Video Auto Scaling")
  #define AUTOSCALE_LONGTEXT N_( \
      "Let the video scale to fit a given window or fullscreen.")
 @@ -1597,6 +1604,8 @@ vlc_module_begin ()
      add_string( "viewpoint", NULL,
                  VIEWPOINT_TEXT, VIEWPOINT_LONGTEXT, false )
          change_safe ()
 +    add_integer( "projection", 0, PROJECTION_TEXT, PROJECTION_LONGTEXT, false )
 +        change_integer_list( pi_projection_values, ppsz_projection_descriptions )
      add_bool( "autoscale", true, AUTOSCALE_TEXT, AUTOSCALE_LONGTEXT, false )
          change_safe ()
      add_obsolete_float( "scale" ) /* since 3.0.0 */
 diff --git a/src/video_output/control.h b/src/video_output/control.h
 index add2246..a020d22 100644
 --- a/src/video_output/control.h
 +++ b/src/video_output/control.h
 @@ -59,6 +59,7 @@ enum {
      VOUT_CONTROL_CROP_RATIO,            /* pair */
      VOUT_CONTROL_CROP_WINDOW,           /* window */
      VOUT_CONTROL_VIEWPOINT,             /* viewpoint */
 +    VOUT_CONTROL_PROJECTION,            /* integer */
  };

  typedef struct {
 diff --git a/src/video_output/display.c b/src/video_output/display.c
 index 23dc545..0e72e3f 100644
 --- a/src/video_output/display.c
 +++ b/src/video_output/display.c
 @@ -377,6 +377,9 @@ struct vout_display_owner_sys_t {
      vlc_viewpoint_t viewpoint;
      vlc_mutex_t viewpoint_lock;

 +    bool ch_projection;
 +    vout_projection_mode_t proj_mode;
 +
      /* */
      video_format_t source;
      filter_chain_t *filters;
 @@ -855,7 +858,8 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
  #endif
              !osys->ch_sar &&
              !osys->ch_crop &&
 -            !osys->ch_viewpoint) {
 +            !osys->ch_viewpoint &&
 +            !osys->ch_projection) {

              if (!osys->cfg.is_fullscreen && osys->fit_window != 0) {
                  VoutDisplayFitWindow(vd, osys->fit_window == -1);
 @@ -1039,6 +1043,18 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
              osys->crop.den    = crop_den;
              osys->ch_crop = false;
          }
 +        if (osys->ch_projection) {
 +            vout_display_cfg_t cfg = osys->cfg;
 +
 +            cfg.projection = osys->proj_mode;
 +
 +            if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_PROJECTION, &cfg)) {
 +                msg_Err(vd, "Failed to change Projection");
 +                osys->proj_mode = osys->cfg.projection;
 +            }
 +            osys->cfg.projection = osys->proj_mode;
 +            osys->ch_projection = false;
 +        }
          if (osys->ch_viewpoint) {
              vout_display_cfg_t cfg = osys->cfg;

 @@ -1236,6 +1252,16 @@ void vout_SetDisplayViewpoint(vout_display_t *vd, const vlc_viewpoint_t *p_viewp
      vlc_mutex_unlock(&osys->viewpoint_lock);
  }

 +void vout_SetDisplayProjection(vout_display_t *vd, vout_projection_mode_t proj)
 +{
 +    vout_display_owner_sys_t *osys = vd->owner.sys;
 +
 +    if (osys->proj_mode != proj) {
 +        osys->proj_mode = proj;
 +        osys->ch_projection = true;
 +    }
 +}
 +
  static vout_display_t *DisplayNew(vout_thread_t *vout,
                                    const video_format_t *source,
                                    const vout_display_state_t *state,
 diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
 index 87f8043..e426525 100644
 --- a/src/video_output/video_output.c
 +++ b/src/video_output/video_output.c
 @@ -553,6 +553,11 @@ void vout_SetViewpoint(vout_thread_t *vout, const vlc_viewpoint_t *p_viewpoint)

      vout_control_Push(&vout->p->control, &cmd);
  }
 +void vout_ControlChangeProjection(vout_thread_t *vout, vout_projection_mode_t proj)
 +{
 +    vout_control_PushInteger(&vout->p->control, VOUT_CONTROL_PROJECTION,
 +                             proj);
 +}

  /* */
  static void VoutGetDisplayCfg(vout_thread_t *vout, vout_display_cfg_t *cfg, const char *title)
 @@ -560,6 +565,7 @@ static void VoutGetDisplayCfg(vout_thread_t *vout, vout_display_cfg_t *cfg, cons
      /* Load configuration */
      cfg->is_fullscreen = var_CreateGetBool(vout, "fullscreen")
                           || var_InheritBool(vout, "video-wallpaper");
 +    cfg->projection = var_CreateGetInteger(vout, "projection");
      cfg->viewpoint.f_yaw   = 0.0f;
      cfg->viewpoint.f_pitch = 0.0f;
      cfg->viewpoint.f_roll  = 0.0f;
 @@ -1311,6 +1317,12 @@ static void ThreadExecuteViewpoint(vout_thread_t *vout, const vlc_viewpoint_t *p
      vout_SetDisplayViewpoint(vout->p->display.vd, p_viewpoint);
  }

 +static void ThreadExecuteProjection(vout_thread_t *vout, vout_projection_mode_t proj)
 +{
 +    msg_Dbg(vout, "ThreadExecuteProjection %d", proj);
 +    vout_SetDisplayProjection(vout->p->display.vd, proj);
 +}
 +
  static int ThreadStart(vout_thread_t *vout, vout_display_state_t *state)
  {
      vlc_mouse_Init(&vout->p->mouse);
 @@ -1573,6 +1585,9 @@ static int ThreadControl(vout_thread_t *vout, vout_control_cmd_t cmd)
      case VOUT_CONTROL_VIEWPOINT:
          ThreadExecuteViewpoint(vout, &cmd.u.viewpoint);
          break;
 +    case VOUT_CONTROL_PROJECTION:
 +        ThreadExecuteProjection(vout, (vout_projection_mode_t) cmd.u.integer);
 +        break;
      default:
          break;
      }
 diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
 index 4d63fbf..5ef1435 100644
 --- a/src/video_output/vout_internal.h
 +++ b/src/video_output/vout_internal.h
 @@ -141,6 +141,7 @@ void vout_ControlChangeSampleAspectRatio(vout_thread_t *, unsigned num, unsigned
  void vout_ControlChangeCropRatio(vout_thread_t *, unsigned num, unsigned den);
  void vout_ControlChangeCropWindow(vout_thread_t *, int x, int y, int width, int height);
  void vout_ControlChangeCropBorder(vout_thread_t *, int left, int top, int right, int bottom);
 +void vout_ControlChangeProjection(vout_thread_t *vout, vout_projection_mode_t projection);
  void vout_ControlChangeFilters(vout_thread_t *, const char *);
  void vout_ControlChangeSubSources(vout_thread_t *, const char *);
  void vout_ControlChangeSubFilters(vout_thread_t *, const char *);
 diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
 index fe6c36b..e18d3e6 100644
 --- a/src/video_output/vout_intf.c
 +++ b/src/video_output/vout_intf.c
 @@ -124,6 +124,17 @@ static const struct
      { "5:4", "5:4" },
  };

 +static const struct
 +{
 +    vout_projection_mode_t value;
 +    char psz_label[20];
 +} p_projection_values[] = {
 +    { VOUT_PROJECTION_AUTO, N_("Automatic Selection") },
 +    { VOUT_PROJECTION_FLAT, N_("Flat/2D") },
 +    { VOUT_PROJECTION_SPHERE, N_("360° Sphere") },
 +    { VOUT_PROJECTION_CUBEMAP, N_("360° Cubemap") },
 +};
 +
  static void AddCustomRatios( vout_thread_t *p_vout, const char *psz_var,
                               char *psz_list )
  {
 @@ -147,6 +158,14 @@ static void AddCustomRatios( vout_thread_t *p_vout, const char *psz_var,
      }
  }

 +static int ProjectionCallback(vlc_object_t *obj, char const *cmd,
 +                              vlc_value_t oldval, vlc_value_t newval, void *data)
 +{
 +    vout_ControlChangeProjection((vout_thread_t *)obj, (vout_projection_mode_t) newval.i_int);
 +    VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(data);
 +    return VLC_SUCCESS;
 +}
 +
  void vout_IntfInit( vout_thread_t *p_vout )
  {
      vlc_value_t val, text;
 @@ -258,6 +277,20 @@ void vout_IntfInit( vout_thread_t *p_vout )
      var_Create( p_vout, "viewpoint", VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT );
      var_AddCallback( p_vout, "viewpoint", ViewpointCallback, NULL );

 +    var_Create( p_vout, "projection", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT
 +                | VLC_VAR_ISCOMMAND );
 +    text.psz_string = _("Projection");
 +    var_Change( p_vout, "projection", VLC_VAR_SETTEXT, &text, NULL );
 +
 +    for( size_t i = 0; i < ARRAY_SIZE(p_projection_values); i++ )
 +    {
 +        val.i_int = p_projection_values[i].value;
 +        text.psz_string = _( p_projection_values[i].psz_label );
 +        var_Change( p_vout, "projection", VLC_VAR_ADDCHOICE, &val, &text );
 +    }
 +
 +    var_AddCallback( p_vout, "projection", ProjectionCallback, NULL );
 +
      /* Add a variable to indicate if the window should be below all others */
      var_Create( p_vout, "video-wallpaper", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
      var_AddCallback( p_vout, "video-wallpaper", WallPaperCallback,
 @@ -316,6 +349,7 @@ void vout_IntfReinit( vout_thread_t *p_vout )
      var_TriggerCallback( p_vout, "crop" );
      var_TriggerCallback( p_vout, "aspect-ratio" );
      var_TriggerCallback( p_vout, "viewpoint" );
 +    var_TriggerCallback( p_vout, "projection" );

      var_TriggerCallback( p_vout, "video-on-top" );
      var_TriggerCallback( p_vout, "video-wallpaper" );
 -- 
 2.10.1

 _______________________________________________
 vlc-devel mailing list
 To unsubscribe or modify your subscription options:
 https://mailman.videolan.org/listinfo/vlc-devel</code></pre>
</blockquote>
</body>
</html>