[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
Tue Sep 13 16:57:44 CEST 2016


Le vendredi 9 septembre 2016, 09:37:28 Steve Lhomme a écrit :
> On Thu, Sep 8, 2016 at 5:50 PM, Rémi Denis-Courmont <remi at remlab.net> wrote:
> > Le jeudi 8 septembre 2016, 17:35:30 Steve Lhomme a écrit :
> >> ---
> >> 
> >>  include/vlc/libvlc_media_player.h | 28 ++++++++++++++++++++++++++++
> >>  lib/media_player.c                |  3 +++
> >>  lib/video.c                       | 37
> >> 
> >> +++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+)
> >> 
> >> diff --git a/include/vlc/libvlc_media_player.h
> >> b/include/vlc/libvlc_media_player.h index 2718a33..222b25a 100644
> >> --- a/include/vlc/libvlc_media_player.h
> >> +++ b/include/vlc/libvlc_media_player.h
> >> @@ -104,6 +104,16 @@ typedef struct libvlc_audio_output_device_t
> >> 
> >>  } libvlc_audio_output_device_t;
> >>  
> >>  /**
> >> 
> >> + * Viewpoint for video outputs
> >> + */
> >> +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;
> >> +
> >> +/**
> >> 
> >>   * Marq options definition
> >>   */
> >>  
> >>  typedef enum libvlc_video_marquee_option_t {
> >> 
> >> @@ -1127,6 +1137,24 @@ 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 );
> >> 
> >>  /**
> >> 
> >> + * Get current video viewpoint.
> >> + *
> >> + * \param p_mi the media player
> >> + * \return the video viewpoint or NULL if unspecified
> >> + * (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.
> >> + *
> >> + * \param p_mi the media player
> >> + * \param psz_aspect new video 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/media_player.c b/lib/media_player.c
> >> index 69d3523..197c9be 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 | VLC_VAR_DOINHERIT);
> >> +    var_Create (mp, "viewpoint-pitch", VLC_VAR_FLOAT |
> >> VLC_VAR_DOINHERIT);
> >> +    var_Create (mp, "viewpoint-roll", VLC_VAR_FLOAT |
> >> VLC_VAR_DOINHERIT);
> >> 
> >>      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..bee4e6d 100644
> >> --- a/lib/video.c
> >> +++ b/lib/video.c
> >> @@ -281,6 +281,43 @@ 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 )
> >> +{
> >> +    libvlc_video_viewpoint_t *p_viewpoint =
> >> malloc(sizeof(libvlc_video_viewpoint_t));
> >> +    if (p_viewpoint == NULL)
> >> +        return NULL;
> > 
> > If you want to be able to expand the structure later, this is not enough
> > due to libvlc_video_set_viewpoint. And if you don't care, then malloc()
> > seems overkill.
> 
> I don't understand the issue. You mean expand the structure and remain
> libvlc ABI backward compatible ? Is that something we're trying to
> achieve ? Also if you expand the structure more memory is allocated
> but it's still the same free() that has to be used and should know
> about it.

I don't understand what there is to not understand here.

Either we want the possibility to extend the structure later, and the patch is 
wrong. Or we don't and the patch is over-engineered/needlessly complicated.

> 
> Do you suggest using a get for each of the 3 values ? The viewpoint
> will still has to be set with all values at once otherwise you'll end
> up with weird transitions between states. And if it's not via a
> structure than adding a value will break backward compatibility
> anyway.
> 
> >> +
> >> +    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 ) +{
> >> +    if (p_viewpoint == NULL)
> >> +        return;
> >> +
> >> +    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);
> >> +
> >> +    char psz_viewpoint[3 * 13];
> >> +    sprintf( psz_viewpoint, "%.7f:%.7f:%.7f",
> >> +             p_viewpoint->f_yaw, p_viewpoint->f_pitch,
> >> p_viewpoint->f_roll
> >> ); +    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 );
> > 
> > --
> > Rémi Denis-Courmont
> > http://www.remlab.net/
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list