[vlc-devel] [PATCH 3/8] libvlc: add the API needed to set/get the viewpoint in 360° videos
Rémi Denis-Courmont
remi at remlab.net
Thu Sep 15 09:55:31 CEST 2016
Le torstaina 15. syyskuuta 2016, 9.44.11 EEST Steve Lhomme a écrit :
> --
> replaces https://patches.videolan.org/patch/14420/
> * redo the API so that the structure is allocated and released via the API
> * add missing libvlc.sym changes
> * add API tests
> * media_player variables are not inherited
>
> replaces https://patches.videolan.org/patch/14457/
> * warn the user the structure must be allocated with get_viewpoint()
> * get_viewpoint() returns the allocated structure directly
> * use libvlc_free instead of a release function
> * move the structure so it's in a libvlc video doc
> ---
> include/vlc/libvlc_media_player.h | 35 +++++++++++++++++++++++++++++++++
> lib/libvlc.sym | 2 ++
> lib/media_player.c | 3 +++
> lib/video.c | 41
> +++++++++++++++++++++++++++++++++++++++ test/libvlc/media_player.c |
> 36 ++++++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+)
>
> diff --git a/include/vlc/libvlc_media_player.h
> b/include/vlc/libvlc_media_player.h index 2718a33..4681497 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -1127,6 +1127,41 @@ LIBVLC_API char *libvlc_video_get_aspect_ratio(
> libvlc_media_player_t *p_mi ); LIBVLC_API void
> libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi, const char
> *psz_aspect );
>
> /**
> + * Viewpoint for video outputs
> + *
> + * \warning allocate using libvlc_video_get_viewpoint()
> + */
> +typedef struct libvlc_video_viewpoint_t
> +{
> + float f_yaw; /**< view point yaw in degrees ]-180;180] */
> + float f_pitch; /**< view point pitch in degrees ]-180;180] */
> + float f_roll; /**< view point roll in degrees ]-180;180] */
> +} libvlc_video_viewpoint_t;
> +
> +/**
> + * Get current video viewpoint.
> + *
> + * \version LibVLC 3.0.0 and later
> + *
> + * \param p_mi the media player
> + * \return video viewpoint that will be filled or NULL
> + * (the result must be released with free() or libvlc_free()).
> + */
> +LIBVLC_API libvlc_video_viewpoint_t *libvlc_video_get_viewpoint(
> libvlc_media_player_t *p_mi ); +
> +/**
> + * Set new video viewpoint information.
> + *
> + * \version LibVLC 3.0.0 and later
> + *
> + * \param p_mi the media player
> + * \param p_viewpoint new video viewpoint allocated via
> libvlc_video_get_viewpoint() + * or NULL to reset to default
> + */
> +LIBVLC_API void libvlc_video_set_viewpoint( libvlc_media_player_t *p_mi,
> + const libvlc_video_viewpoint_t
> *p_viewpoint ); +
> +/**
> * Get current video subtitle.
> *
> * \param p_mi the media player
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 733a4dd..dbfad1e 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -271,6 +271,8 @@ libvlc_video_set_subtitle_file
> libvlc_video_set_teletext
> libvlc_video_set_track
> libvlc_video_take_snapshot
> +libvlc_video_get_viewpoint
> +libvlc_video_set_viewpoint
> libvlc_vlm_add_broadcast
> libvlc_vlm_add_vod
> libvlc_vlm_add_input
> diff --git a/lib/media_player.c b/lib/media_player.c
> index 69d3523..9f28fad 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -640,6 +640,9 @@ libvlc_media_player_new( libvlc_instance_t *instance )
> var_Create (mp, "zoom", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT);
> var_Create (mp, "aspect-ratio", VLC_VAR_STRING);
> var_Create (mp, "crop", VLC_VAR_STRING);
> + var_Create (mp, "viewpoint-yaw", VLC_VAR_FLOAT);
> + var_Create (mp, "viewpoint-pitch", VLC_VAR_FLOAT);
> + var_Create (mp, "viewpoint-roll", VLC_VAR_FLOAT);
> var_Create (mp, "deinterlace", VLC_VAR_INTEGER);
> var_Create (mp, "deinterlace-mode", VLC_VAR_STRING);
>
> diff --git a/lib/video.c b/lib/video.c
> index b2c9b34..dae9539 100644
> --- a/lib/video.c
> +++ b/lib/video.c
> @@ -281,6 +281,47 @@ void libvlc_video_set_aspect_ratio(
> libvlc_media_player_t *p_mi, free (pp_vouts);
> }
>
> +libvlc_video_viewpoint_t *libvlc_video_get_viewpoint( libvlc_media_player_t
> *p_mi )
How does this work with multiple vouts?
> +{
> + libvlc_video_viewpoint_t *p_viewpoint =
> malloc(sizeof(libvlc_video_viewpoint_t)); + if (p_viewpoint == NULL)
> + return NULL;
> +
> + p_viewpoint->f_yaw = var_GetFloat( p_mi, "viewpoint-yaw" );
> + p_viewpoint->f_pitch = var_GetFloat( p_mi, "viewpoint-pitch" );
> + p_viewpoint->f_roll = var_GetFloat( p_mi, "viewpoint-roll" );
> + return p_viewpoint;
> +}
> +
> +void libvlc_video_set_viewpoint( libvlc_media_player_t *p_mi,
> + const libvlc_video_viewpoint_t
> *p_viewpoint )
Ditto.
> +{
> + char psz_viewpoint[4 * 13];
> + if (p_viewpoint == NULL)
> + psz_viewpoint[0] = '\0';
> + else
> + {
> + var_SetFloat(p_mi, "viewpoint-yaw", p_viewpoint->f_yaw);
> + var_SetFloat(p_mi, "viewpoint-pitch", p_viewpoint->f_pitch);
> + var_SetFloat(p_mi, "viewpoint-roll", p_viewpoint->f_roll);
> +
> + sprintf( psz_viewpoint, "%.7f:%.7f:%.7f",
> + p_viewpoint->f_yaw, p_viewpoint->f_pitch,
> + p_viewpoint->f_roll );
I really dislike this. If you want to set/get multiple parameters atomically,
just don´t use object variables.
> + }
> +
> + size_t n;
> + vout_thread_t **pp_vouts = GetVouts (p_mi, &n);
> + for (size_t i = 0; i < n; i++)
> + {
> + vout_thread_t *p_vout = pp_vouts[i];
> +
> + var_SetString (p_vout, "viewpoint", psz_viewpoint);
> + vlc_object_release (p_vout);
> + }
> + free (pp_vouts);
> +}
> +
> int libvlc_video_get_spu( libvlc_media_player_t *p_mi )
> {
> input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi );
> diff --git a/test/libvlc/media_player.c b/test/libvlc/media_player.c
> index f3198b5..1fec83f 100644
> --- a/test/libvlc/media_player.c
> +++ b/test/libvlc/media_player.c
> @@ -190,6 +190,41 @@ static void test_media_player_pause_stop(const char**
> argv, int argc) libvlc_release (vlc);
> }
>
> +static void test_media_player_viewpoint(const char** argv, int argc)
> +{
> + libvlc_instance_t *vlc;
> + libvlc_media_t *md;
> + libvlc_media_player_t *mi;
> + const char * file = test_default_sample;
> +
> + log ("Testing viewpoint for %s\n", file);
> +
> + vlc = libvlc_new (argc, argv);
> + assert (vlc != NULL);
> +
> + md = libvlc_media_new_path (vlc, file);
> + assert (md != NULL);
> +
> + mi = libvlc_media_player_new_from_media (md);
> + assert (mi != NULL);
> +
> + libvlc_media_release (md);
> +
> + libvlc_video_viewpoint_t *p_viewpoint = libvlc_video_get_viewpoint(mi);
> + assert(p_viewpoint != NULL);
> +
> + p_viewpoint->f_yaw = 1.57f;
> + libvlc_video_set_viewpoint(mi, p_viewpoint);
> + libvlc_free(p_viewpoint);
> +
> + p_viewpoint = libvlc_video_get_viewpoint(mi);
> + assert(p_viewpoint != NULL);
> + assert(p_viewpoint->f_yaw == 1.57f);
> + libvlc_free(p_viewpoint);
> +
> + libvlc_media_player_release (mi);
> + libvlc_release (vlc);
> +}
>
> int main (void)
> {
> @@ -198,6 +233,7 @@ int main (void)
> test_media_player_set_media (test_defaults_args, test_defaults_nargs);
> test_media_player_play_stop (test_defaults_args, test_defaults_nargs);
> test_media_player_pause_stop (test_defaults_args, test_defaults_nargs);
> + test_media_player_viewpoint (test_defaults_args, test_defaults_nargs);
>
> return 0;
> }
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list