[vlc-devel] [PATCH 04/14] core: add viewpoint to change the yaw/pitch/roll view during playback
Steve Lhomme
robux4 at videolabs.io
Mon Oct 3 11:42:42 CEST 2016
--
* move the playlist viewpoint in playlist_private_t
* less vlc_vout.h includes
* removed text on the "viewpoint" variable
---
include/vlc_common.h | 1 +
include/vlc_playlist.h | 7 ++++++
include/vlc_vout.h | 9 ++++++++
include/vlc_vout_display.h | 7 ++++++
include/vlc_vout_wrapper.h | 2 ++
src/libvlccore.sym | 4 ++++
src/playlist/engine.c | 43 +++++++++++++++++++++++++++++++++++
src/playlist/playlist_internal.h | 3 +++
src/video_output/control.h | 2 ++
src/video_output/display.c | 49 +++++++++++++++++++++++++++++++++++++++-
src/video_output/video_output.c | 26 +++++++++++++++++++++
src/video_output/vout_intf.c | 16 +++++++++++++
12 files changed, 168 insertions(+), 1 deletion(-)
diff --git a/include/vlc_common.h b/include/vlc_common.h
index 159d4ff..7a8de94 100644
--- a/include/vlc_common.h
+++ b/include/vlc_common.h
@@ -249,6 +249,7 @@ typedef audio_format_t audio_sample_format_t;
/* Video */
typedef struct vout_thread_t vout_thread_t;
+typedef struct vlc_viewpoint_t vlc_viewpoint_t;
typedef video_format_t video_frame_format_t;
typedef struct picture_t picture_t;
diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h
index 4363405..6074ac2 100644
--- a/include/vlc_playlist.h
+++ b/include/vlc_playlist.h
@@ -382,6 +382,13 @@ VLC_API playlist_item_t * playlist_GetPrevLeaf( playlist_t *p_playlist, playlist
VLC_API audio_output_t *playlist_GetAout( playlist_t * );
+/*************************
+ * Viewpoint management
+ *************************/
+VLC_API void playlist_GetViewpoint( playlist_t *, vlc_viewpoint_t *p_viewpoint );
+VLC_API void playlist_SetViewpoint( playlist_t *, const vlc_viewpoint_t *p_viewpoint );
+
+
#define AOUT_VOLUME_DEFAULT 256
#define AOUT_VOLUME_MAX 512
diff --git a/include/vlc_vout.h b/include/vlc_vout.h
index 600cb56..7e67661 100644
--- a/include/vlc_vout.h
+++ b/include/vlc_vout.h
@@ -82,6 +82,12 @@ struct vout_thread_t {
#define VOUT_ALIGN_BOTTOM 0x0008
#define VOUT_ALIGN_VMASK 0x000C
+struct vlc_viewpoint_t {
+ float f_yaw;
+ float f_pitch;
+ float f_roll;
+};
+
/*****************************************************************************
* Prototypes
*****************************************************************************/
@@ -156,6 +162,9 @@ VLC_API void vout_FlushSubpictureChannel( vout_thread_t *, int );
VLC_API void vout_EnableFilter( vout_thread_t *, const char *,bool , bool );
+VLC_API void vout_GetViewpoint( vout_thread_t *, vlc_viewpoint_t *p_viewpoint );
+VLC_API void vout_SetViewpoint( vout_thread_t *, const vlc_viewpoint_t *p_viewpoint );
+
/**@}*/
#endif /* _VLC_VIDEO_H */
diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index 817f770..b4da1e2 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -30,6 +30,7 @@
#include <vlc_subpicture.h>
#include <vlc_keys.h>
#include <vlc_mouse.h>
+#include <vlc_vout.h>
#include <vlc_vout_window.h>
/**
@@ -115,6 +116,8 @@ typedef struct {
int den;
} zoom;
+ vlc_viewpoint_t viewpoint;
+
} vout_display_cfg_t;
/**
@@ -175,6 +178,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 vout_display_cfg_t *p_cfg */
};
/**
diff --git a/include/vlc_vout_wrapper.h b/include/vlc_vout_wrapper.h
index 419bfc8..2ba4fc6 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_GetDisplayViewpoint(vout_display_t *, vlc_viewpoint_t *p_viewpoint);
+void vout_SetDisplayViewpoint(vout_display_t *, const vlc_viewpoint_t *p_viewpoint);
#endif /* VLC_VOUT_WRAPPER_H */
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 8bb2dac..2e7a60d 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -373,6 +373,8 @@ playlist_VolumeSet
playlist_VolumeUp
playlist_MuteSet
playlist_MuteGet
+playlist_GetViewpoint
+playlist_SetViewpoint
sdp_AddAttribute
sdp_AddMedia
secstotimestr
@@ -734,6 +736,8 @@ vout_window_Delete
vout_display_GetDefaultDisplaySize
vout_display_PlacePicture
vout_display_SendMouseMovedDisplayCoordinates
+vout_GetViewpoint
+vout_SetViewpoint
xml_Create
text_style_Copy
text_style_Create
diff --git a/src/playlist/engine.c b/src/playlist/engine.c
index 7c00a48..1309562 100644
--- a/src/playlist/engine.c
+++ b/src/playlist/engine.c
@@ -479,6 +479,18 @@ static void VariablesInit( playlist_t *p_playlist )
var_Create( p_playlist, "mute", VLC_VAR_BOOL );
var_Create( p_playlist, "volume", VLC_VAR_FLOAT );
var_SetFloat( p_playlist, "volume", -1.f );
+
+ char *psz_viewpoint = var_InheritString(p_playlist, "viewpoint" );
+ vlc_viewpoint_t *p_vp = &pl_priv(p_playlist)->viewpoint;
+ if ( psz_viewpoint == NULL ||
+ sscanf( psz_viewpoint, "%f:%f:%f:%f:%f",
+ &p_vp->f_yaw, &p_vp->f_pitch, &p_vp->f_roll) != 3) {
+ p_vp->f_yaw = p_vp->f_pitch = p_vp->f_roll = 0.0f;
+ }
+ free(psz_viewpoint);
+
+ var_Create( p_playlist, "viewpoint", VLC_VAR_ADDRESS );
+ var_SetAddress( p_playlist, "viewpoint", p_vp );
}
playlist_item_t * playlist_CurrentPlayingItem( playlist_t * p_playlist )
@@ -501,3 +513,34 @@ int playlist_Status( playlist_t * p_playlist )
return PLAYLIST_RUNNING;
}
+void playlist_GetViewpoint( playlist_t *p_playlist, vlc_viewpoint_t *p_viewpoint )
+{
+ input_thread_t *p_input = pl_priv(p_playlist)->p_input;
+ vout_thread_t *p_vout = !p_input ? NULL : input_GetVout( p_input );
+
+ PL_LOCK;
+ if( p_vout )
+ {
+ vout_GetViewpoint( p_vout, &pl_priv(p_playlist)->viewpoint );
+ vlc_object_release( (vlc_object_t *)p_vout );
+ }
+ *p_viewpoint = pl_priv(p_playlist)->viewpoint;
+ PL_UNLOCK;
+}
+
+void playlist_SetViewpoint(playlist_t *p_playlist, const vlc_viewpoint_t *p_viewpoint)
+{
+ input_thread_t *p_input = pl_priv(p_playlist)->p_input;
+ vout_thread_t *p_vout = !p_input ? NULL : input_GetVout( p_input );
+
+ PL_LOCK;
+ pl_priv(p_playlist)->viewpoint = *p_viewpoint;
+ if (p_vout)
+ {
+ vout_SetViewpoint( p_vout, &pl_priv(p_playlist)->viewpoint );
+ vlc_object_release( (vlc_object_t *)p_vout );
+ }
+ PL_UNLOCK;
+}
+
+
diff --git a/src/playlist/playlist_internal.h b/src/playlist/playlist_internal.h
index d655dc3..faa7a14 100644
--- a/src/playlist/playlist_internal.h
+++ b/src/playlist/playlist_internal.h
@@ -35,6 +35,7 @@
*/
#include "input/input_interface.h"
+#include "vlc_vout.h"
#include <assert.h>
#include "art.h"
@@ -87,6 +88,8 @@ typedef struct playlist_private_t
bool b_tree; /**< Display as a tree */
bool b_preparse; /**< Preparse items */
+
+ vlc_viewpoint_t viewpoint; /**< playback viewpoint */
} playlist_private_t;
#define pl_priv( pl ) ((playlist_private_t *)(pl))
diff --git a/src/video_output/control.h b/src/video_output/control.h
index eff9aa1..add2246 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,7 @@ typedef struct {
unsigned width;
unsigned height;
} window;
+ vlc_viewpoint_t 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..23dc545 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -373,6 +373,10 @@ struct vout_display_owner_sys_t {
unsigned den;
} crop;
+ bool ch_viewpoint;
+ vlc_viewpoint_t viewpoint;
+ vlc_mutex_t viewpoint_lock;
+
/* */
video_format_t source;
filter_chain_t *filters;
@@ -850,7 +854,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 +1039,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) {
+ vout_display_cfg_t cfg = osys->cfg;
+
+ vlc_mutex_lock(&osys->viewpoint_lock);
+ cfg.viewpoint = osys->viewpoint;
+
+ if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_VIEWPOINT, &cfg)) {
+ msg_Err(vd, "Failed to change Viewpoint");
+ osys->viewpoint = cfg.viewpoint;
+ }
+ osys->cfg.viewpoint = osys->viewpoint;
+ osys->ch_viewpoint = false;
+ vlc_mutex_unlock(&osys->viewpoint_lock);
+ }
/* */
if (reset_pictures) {
@@ -1193,6 +1212,30 @@ void vout_SetDisplayCrop(vout_display_t *vd,
}
}
+void vout_GetDisplayViewpoint(vout_display_t *vd, vlc_viewpoint_t *p_viewpoint)
+{
+ vout_display_owner_sys_t *osys = vd->owner.sys;
+
+ vlc_mutex_lock(&osys->viewpoint_lock);
+ *p_viewpoint = osys->viewpoint;
+ vlc_mutex_unlock(&osys->viewpoint_lock);
+}
+
+void vout_SetDisplayViewpoint(vout_display_t *vd, const vlc_viewpoint_t *p_viewpoint)
+{
+ vout_display_owner_sys_t *osys = vd->owner.sys;
+
+ vlc_mutex_lock(&osys->viewpoint_lock);
+ if (osys->viewpoint.f_yaw != p_viewpoint->f_yaw ||
+ osys->viewpoint.f_pitch != p_viewpoint->f_pitch ||
+ osys->viewpoint.f_roll != p_viewpoint->f_roll) {
+ osys->viewpoint = *p_viewpoint;
+
+ osys->ch_viewpoint = true;
+ }
+ vlc_mutex_unlock(&osys->viewpoint_lock);
+}
+
static vout_display_t *DisplayNew(vout_thread_t *vout,
const video_format_t *source,
const vout_display_state_t *state,
@@ -1218,6 +1261,8 @@ static vout_display_t *DisplayNew(vout_thread_t *vout,
vlc_mutex_init(&osys->lock);
+ vlc_mutex_init(&osys->viewpoint_lock);
+
vlc_mouse_Init(&osys->mouse.state);
osys->mouse.last_moved = mdate();
osys->mouse.double_click_timeout = double_click_timeout;
@@ -1289,6 +1334,7 @@ static vout_display_t *DisplayNew(vout_thread_t *vout,
return p_display;
error:
+ vlc_mutex_destroy(&osys->viewpoint_lock);
vlc_mutex_destroy(&osys->lock);
free(osys);
return NULL;
@@ -1317,6 +1363,7 @@ void vout_DeleteDisplay(vout_display_t *vd, vout_display_state_t *state)
vlc_join(osys->event.thread, NULL);
block_FifoRelease(osys->event.fifo);
}
+ vlc_mutex_destroy(&osys->viewpoint_lock);
vlc_mutex_destroy(&osys->lock);
free(osys);
}
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 7994bec..a3f4908 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -540,12 +540,29 @@ void vout_ControlChangeSubMargin(vout_thread_t *vout, int margin)
margin);
}
+void vout_GetViewpoint( vout_thread_t *vout, vlc_viewpoint_t *p_viewpoint )
+{
+ vout_GetDisplayViewpoint(vout->p->display.vd, p_viewpoint);
+}
+
+void vout_SetViewpoint(vout_thread_t *vout, const vlc_viewpoint_t *p_viewpoint)
+{
+ vout_control_cmd_t cmd;
+ vout_control_cmd_Init(&cmd, VOUT_CONTROL_VIEWPOINT);
+ cmd.u.viewpoint = *p_viewpoint;
+
+ vout_control_Push(&vout->p->control, &cmd);
+}
+
/* */
static void VoutGetDisplayCfg(vout_thread_t *vout, vout_display_cfg_t *cfg, const char *title)
{
/* Load configuration */
cfg->is_fullscreen = var_CreateGetBool(vout, "fullscreen")
|| var_InheritBool(vout, "video-wallpaper");
+ cfg->viewpoint.f_yaw = 0.0f;
+ cfg->viewpoint.f_pitch = 0.0f;
+ cfg->viewpoint.f_roll = 0.0f;
cfg->display.title = title;
const int display_width = var_CreateGetInteger(vout, "width");
const int display_height = var_CreateGetInteger(vout, "height");
@@ -1289,6 +1306,12 @@ static void ThreadExecuteCropRatio(vout_thread_t *vout,
0, 0, 0, 0);
}
+static void ThreadExecuteViewpoint(vout_thread_t *vout, const vlc_viewpoint_t *p_viewpoint)
+{
+ msg_Dbg(vout, "ThreadExecuteViewpoint %f %f %f", p_viewpoint->f_yaw, p_viewpoint->f_pitch, p_viewpoint->f_roll);
+ vout_SetDisplayViewpoint(vout->p->display.vd, p_viewpoint);
+}
+
static int ThreadStart(vout_thread_t *vout, vout_display_state_t *state)
{
vlc_mouse_Init(&vout->p->mouse);
@@ -1548,6 +1571,9 @@ 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);
+ break;
default:
break;
}
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index 11240c8..fe6c36b 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -57,6 +57,8 @@ 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 AboveCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
static int WallPaperCallback( vlc_object_t *, char const *,
@@ -252,6 +254,10 @@ 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", VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT );
+ 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 +315,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 +609,15 @@ 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)
+{
+ vout_SetViewpoint((vout_thread_t *)obj, newval.p_address);
+
+ VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(data);
+ return VLC_SUCCESS;
+}
+
static int AboveCallback( vlc_object_t *obj, char const *name,
vlc_value_t prev, vlc_value_t cur, void *data )
{
--
2.7.2.windows.1
More information about the vlc-devel
mailing list