[vlc-devel] [PATCH 1/4] core: add viewpoint variables to change the yaw/pitch/roll view during playback
Rémi Denis-Courmont
remi at remlab.net
Thu Sep 8 10:45:21 CEST 2016
Le mercredi 7 septembre 2016, 16:17:04 Steve Lhomme a écrit :
> ---
> include/vlc_vout_display.h | 4 ++++
> include/vlc_vout_wrapper.h | 2 ++
> src/video_output/control.h | 6 +++++
> src/video_output/display.c | 40 +++++++++++++++++++++++++++++++-
> src/video_output/video_output.c | 22 ++++++++++++++++++
> src/video_output/vout_internal.h | 1 +
> src/video_output/vout_intf.c | 49
> ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 123
> insertions(+), 1 deletion(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index 817f770..7f6037c 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -175,6 +175,10 @@ enum {
> * The cropping requested is stored by video_format_t::i_x/y_offset and
> * video_format_t::i_visible_width/height */
> VOUT_DISPLAY_CHANGE_SOURCE_CROP, /* const video_format_t *p_source */
> +
> + /* Ask the module to acknowledge/refuse VR/360� viewing direction after
> + * being requested externally */
> + VOUT_DISPLAY_CHANGE_VIEWPOINT, /* const video_format_t *p_source */
> };
>
> /**
> diff --git a/include/vlc_vout_wrapper.h b/include/vlc_vout_wrapper.h
> index 419bfc8..006bb51 100644
> --- a/include/vlc_vout_wrapper.h
> +++ b/include/vlc_vout_wrapper.h
> @@ -93,6 +93,8 @@ void vout_SetDisplayZoom(vout_display_t *, unsigned num,
> unsigned den); void vout_SetDisplayAspect(vout_display_t *, unsigned num,
> unsigned den); void vout_SetDisplayCrop(vout_display_t *, unsigned num,
> unsigned den, unsigned left, unsigned top, int right, int bottom); +void
> vout_SetDisplayViewpoint(vout_display_t *,
> + float yaw, float pitch, float roll);
>
> #endif /* VLC_VOUT_WRAPPER_H */
>
> diff --git a/src/video_output/control.h b/src/video_output/control.h
> index eff9aa1..dae850f 100644
> --- a/src/video_output/control.h
> +++ b/src/video_output/control.h
> @@ -58,6 +58,7 @@ enum {
> VOUT_CONTROL_CROP_BORDER, /* border */
> VOUT_CONTROL_CROP_RATIO, /* pair */
> VOUT_CONTROL_CROP_WINDOW, /* window */
> + VOUT_CONTROL_VIEWPOINT, /* viewpoint */
> };
>
> typedef struct {
> @@ -93,6 +94,11 @@ typedef struct {
> unsigned width;
> unsigned height;
> } window;
> + struct {
> + float yaw;
> + float pitch;
> + float roll;
> + } viewpoint;
> const vout_configuration_t *cfg;
> subpicture_t *subpicture;
> } u;
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index ecf661a..08a78a5 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -373,6 +373,13 @@ struct vout_display_owner_sys_t {
> unsigned den;
> } crop;
>
> + bool ch_viewpoint;
> + struct {
> + float yaw;
> + float pitch;
> + float roll;
> + } viewpoint;
> +
> /* */
> video_format_t source;
> filter_chain_t *filters;
> @@ -850,7 +857,8 @@ bool vout_ManageDisplay(vout_display_t *vd, bool
> allow_reset_pictures) !ch_wm_state &&
> #endif
> !osys->ch_sar &&
> - !osys->ch_crop) {
> + !osys->ch_crop &&
> + !osys->ch_viewpoint) {
>
> if (!osys->cfg.is_fullscreen && osys->fit_window != 0) {
> VoutDisplayFitWindow(vd, osys->fit_window == -1);
> @@ -1034,6 +1042,20 @@ bool vout_ManageDisplay(vout_display_t *vd, bool
> allow_reset_pictures) osys->crop.den = crop_den;
> osys->ch_crop = false;
> }
> + if (osys->ch_viewpoint) {
> + video_format_t source = vd->source;
> +
> + source.f_pose_yaw_degrees = osys->viewpoint.yaw;
> + source.f_pose_pitch_degrees = osys->viewpoint.pitch;
> + source.f_pose_roll_degrees = osys->viewpoint.roll;
> +
> + if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_VIEWPOINT,
> &source)) { + msg_Err(vd, "Failed to change VR position");
> + source = vd->source;
> + }
> + vd->source = source;
> + osys->ch_viewpoint = false;
> + }
>
> /* */
> if (reset_pictures) {
> @@ -1193,6 +1215,22 @@ void vout_SetDisplayCrop(vout_display_t *vd,
> }
> }
>
> +void vout_SetDisplayViewpoint(vout_display_t *vd,
> + float yaw, float pitch, float roll)
> +{
> + vout_display_owner_sys_t *osys = vd->owner.sys;
> +
> + if (osys->viewpoint.yaw != yaw || osys->viewpoint.pitch != pitch ||
> + osys->viewpoint.roll != roll) {
> +
> + osys->viewpoint.yaw = yaw;
> + osys->viewpoint.pitch = pitch;
> + osys->viewpoint.roll = roll;
> +
> + osys->ch_viewpoint = 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 7994bec..203b871 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -539,6 +539,17 @@ void vout_ControlChangeSubMargin(vout_thread_t *vout,
> int margin) vout_control_PushInteger(&vout->p->control,
> VOUT_CONTROL_CHANGE_SUB_MARGIN, margin);
> }
> +void vout_ControlChangeViewpoint(vout_thread_t *vout,
> + float yaw, float pitch, float roll)
> +{
> + vout_control_cmd_t cmd;
> + vout_control_cmd_Init(&cmd, VOUT_CONTROL_VIEWPOINT);
> + cmd.u.viewpoint.yaw = yaw;
> + cmd.u.viewpoint.pitch = pitch;
> + cmd.u.viewpoint.roll = roll;
> +
> + vout_control_Push(&vout->p->control, &cmd);
> +}
>
> /* */
> static void VoutGetDisplayCfg(vout_thread_t *vout, vout_display_cfg_t *cfg,
> const char *title) @@ -1289,6 +1300,13 @@ static void
> ThreadExecuteCropRatio(vout_thread_t *vout, 0, 0, 0, 0);
> }
>
> +static void ThreadExecuteViewpoint(vout_thread_t *vout,
> + float yaw, float pitch, float roll)
> +{
> + msg_Dbg(vout, "ThreadExecuteViewpoint %f %f %f", yaw, pitch, roll);
> + vout_SetDisplayViewpoint(vout->p->display.vd, yaw, pitch, roll);
> +}
> +
> static int ThreadStart(vout_thread_t *vout, vout_display_state_t *state)
> {
> vlc_mouse_Init(&vout->p->mouse);
> @@ -1548,6 +1566,10 @@ static int ThreadControl(vout_thread_t *vout,
> vout_control_cmd_t cmd) cmd.u.border.left, cmd.u.border.top,
> cmd.u.border.right, cmd.u.border.bottom);
> break;
> + case VOUT_CONTROL_VIEWPOINT:
> + ThreadExecuteViewpoint(vout,
> + cmd.u.viewpoint.yaw, cmd.u.viewpoint.pitch,
> cmd.u.viewpoint.roll); + break;
> default:
> break;
> }
> diff --git a/src/video_output/vout_internal.h
> b/src/video_output/vout_internal.h index 4d63fbf..473d2dd 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_ControlChangeViewpoint(vout_thread_t *vout,float yaw, float pitch,
> float roll); 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 11240c8..debdb2b 100644
> --- a/src/video_output/vout_intf.c
> +++ b/src/video_output/vout_intf.c
> @@ -57,6 +57,10 @@ static int AutoScaleCallback( vlc_object_t *, char const
> *, vlc_value_t, vlc_value_t, void * ); static int ZoomCallback(
> vlc_object_t *, char const *,
> vlc_value_t, vlc_value_t, void * );
> +static int ViewpointCallback( vlc_object_t *, char const *,
> + vlc_value_t, vlc_value_t, void * );
> +static int ViewpointValCallback( vlc_object_t *, char const *,
> + vlc_value_t, vlc_value_t, void * );
> static int AboveCallback( vlc_object_t *, char const *,
> vlc_value_t, vlc_value_t, void * );
> static int WallPaperCallback( vlc_object_t *, char const *,
> @@ -252,6 +256,21 @@ void vout_IntfInit( vout_thread_t *p_vout )
> var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL );
> var_AddCallback( p_vout, "video-on-top", AboveCallback, NULL );
>
> + /* Add a variable to indicate if the viewpoint to use to display the
> video */ + var_Create( p_vout, "viewpoint-yaw", VLC_VAR_FLOAT |
> VLC_VAR_ISCOMMAND ); + var_Create( p_vout, "viewpoint-pitch",
> VLC_VAR_FLOAT | VLC_VAR_ISCOMMAND ); + var_Create( p_vout,
> "viewpoint-roll", VLC_VAR_FLOAT | VLC_VAR_ISCOMMAND ); +
> + var_AddCallback( p_vout, "viewpoint-yaw", ViewpointValCallback, NULL );
> + var_AddCallback( p_vout, "viewpoint-pitch", ViewpointValCallback, NULL
> ); + var_AddCallback( p_vout, "viewpoint-roll", ViewpointValCallback,
> NULL ); +
> + var_Create( p_vout, "viewpoint", VLC_VAR_STRING | VLC_VAR_DOINHERIT
> + | VLC_VAR_ISCOMMAND );
> + text.psz_string = _("Viewpoint");
> + var_Change( p_vout, "viewpoint", VLC_VAR_SETTEXT, &text, NULL );
> + var_AddCallback( p_vout, "viewpoint", ViewpointCallback, 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, @@ -309,6
> +328,7 @@ void vout_IntfReinit( vout_thread_t *p_vout )
> var_TriggerCallback( p_vout, "zoom" );
> var_TriggerCallback( p_vout, "crop" );
> var_TriggerCallback( p_vout, "aspect-ratio" );
> + var_TriggerCallback( p_vout, "viewpoint" );
>
> var_TriggerCallback( p_vout, "video-on-top" );
> var_TriggerCallback( p_vout, "video-wallpaper" );
> @@ -602,6 +622,35 @@ static int ZoomCallback( vlc_object_t *obj, char const
> *name, return VLC_SUCCESS;
> }
>
> +static int ViewpointCallback(vlc_object_t *obj, char const *cmd,
> + vlc_value_t oldval, vlc_value_t newval, void
> *data) +{
> + float f_yaw, f_pitch, f_roll;
> + if (sscanf(newval.psz_string, "%f:%f:%f", &f_yaw, &f_pitch, &f_roll) ==
> 3) { + vout_ControlChangeViewpoint((vout_thread_t *)obj, f_yaw,
> f_pitch, f_roll); + } else {
> + msg_Err(obj, "Unknown viewport format (%s)", newval.psz_string);
Nit: viewpoint
> + }
> +
> + VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(data);
> + return VLC_SUCCESS;
> +}
> +
> +static int ViewpointValCallback(vlc_object_t *object, char const *cmd,
> + vlc_value_t oldval, vlc_value_t newval,
> void *data) +{
> + char buf[3 * 13];
> +
> + snprintf(buf, sizeof (buf), "%.7f:%.7f:%.7f",
> + var_GetFloat(object, "viewpoint-yaw"),
> + var_GetFloat(object, "viewpoint-pitch"),
> + var_GetFloat(object, "viewpoint-roll"));
> + var_SetString(object, "viewpoint", buf);
> +
> + VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(data);
> VLC_UNUSED(newval); + return VLC_SUCCESS;
> +}
> +
> static int AboveCallback( vlc_object_t *obj, char const *name,
> vlc_value_t prev, vlc_value_t cur, void *data )
> {
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list