[vlc-devel] [PATCH 2/2] libvlc: provide sane interfaces for video crop
Steve Lhomme
robux4 at ycbcr.xyz
Fri May 31 08:52:48 CEST 2019
Both patches seem fine to me.
> On May 31, 2019 at 8:45 AM Thomas Guillem <thomas at gllm.fr> wrote:
>
>
> OK for me, but I never used this API. Maybe Steve can review it.
>
> On Thu, May 30, 2019, at 12:11, RĂ©mi Denis-Courmont wrote:
> > This provides one setter for each crop mode, matching the internal video
> > output functionality.
> > ---
> > include/vlc/libvlc_media_player.h | 77 +++++++++++++++++++++++++++++--
> > lib/libvlc.sym | 4 +-
> > lib/video.c | 53 ++++++++++++++++-----
> > 3 files changed, 117 insertions(+), 17 deletions(-)
> >
> > diff --git a/include/vlc/libvlc_media_player.h
> > b/include/vlc/libvlc_media_player.h
> > index 7445e985b3..c1b0e3db4c 100644
> > --- a/include/vlc/libvlc_media_player.h
> > +++ b/include/vlc/libvlc_media_player.h
> > @@ -1649,13 +1649,82 @@ void libvlc_chapter_descriptions_release(
> > libvlc_chapter_description_t **p_chapt
> > unsigned i_count );
> >
> > /**
> > - * Set new crop filter geometry.
> > + * Set/unset the video crop ratio.
> > *
> > - * \param p_mi the media player
> > - * \param psz_geometry new crop filter geometry (NULL to unset)
> > + * This function forces a crop ratio on any and all video tracks
> > rendered by
> > + * the media player. If the display aspect ratio of a video does not
> > match the
> > + * crop ratio, either the top and bottom, or the left and right of the
> > video
> > + * will be cut out to fit the crop ratio.
> > + *
> > + * For instance, a ratio of 1:1 will force the video to a square shape.
> > + *
> > + * To disable video crop, set a crop ratio with zero as denominator.
> > + *
> > + * A call to this function overrides any previous call to any of
> > + * libvlc_video_set_crop_ratio(), libvlc_video_set_crop_border() and/or
> > + * libvlc_video_set_crop_window().
> > + *
> > + * \see libvlc_video_set_aspect_ratio()
> > + *
> > + * \param mp the media player
> > + * \param num crop ratio numerator (ignored if denominator is 0)
> > + * \param den crop ratio denominator (or 0 to unset the crop ratio)
> > + *
> > + * \version LibVLC 4.0.0 and later
> > + */
> > +LIBVLC_API
> > +void libvlc_video_set_crop_ratio(libvlc_media_player_t *mp,
> > + unsigned num, unsigned den);
> > +
> > +/**
> > + * Set the video crop window.
> > + *
> > + * This function selects a sub-rectangle of video to show. Any pixels
> > outside
> > + * the rectangle will not be shown.
> > + *
> > + * To unset the video crop window, use libvlc_video_set_crop_ratio() or
> > + * libvlc_video_set_crop_border().
> > + *
> > + * A call to this function overrides any previous call to any of
> > + * libvlc_video_set_crop_ratio(), libvlc_video_set_crop_border() and/or
> > + * libvlc_video_set_crop_window().
> > + *
> > + * \param mp the media player
> > + * \param x abscissa (i.e. leftmost sample column offset) of the crop
> > window
> > + * \param y ordinate (i.e. topmost sample row offset) of the crop
> > window
> > + * \param width sample width of the crop window (cannot be zero)
> > + * \param height sample height of the crop window (cannot be zero)
> > + *
> > + * \version LibVLC 4.0.0 and later
> > + */
> > +LIBVLC_API
> > +void libvlc_video_set_crop_window(libvlc_media_player_t *mp,
> > + unsigned x, unsigned y,
> > + unsigned width, unsigned height);
> > +
> > +/**
> > + * Set the video crop borders.
> > + *
> > + * This function selects the size of video edges to be cropped out.
> > + *
> > + * To unset the video crop borders, set all borders to zero.
> > + *
> > + * A call to this function overrides any previous call to any of
> > + * libvlc_video_set_crop_ratio(), libvlc_video_set_crop_border() and/or
> > + * libvlc_video_set_crop_window().
> > + *
> > + * \param mp the media player
> > + * \param left number of sample columns to crop on the left
> > + * \param right number of sample columns to crop on the right
> > + * \param top number of sample rows to crop on the top
> > + * \param bottom number of sample rows to corp on the bottom
> > + *
> > + * \version LibVLC 4.0.0 and later
> > */
> > LIBVLC_API
> > -void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi,
> > const char *psz_geometry );
> > +void libvlc_video_set_crop_border(libvlc_media_player_t *mp,
> > + unsigned left, unsigned right,
> > + unsigned top, unsigned bottom);
> >
> > /**
> > * Get current teletext page requested or 0 if it's disabled.
> > diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> > index 9c109b8272..438cd54485 100644
> > --- a/lib/libvlc.sym
> > +++ b/lib/libvlc.sym
> > @@ -236,7 +236,9 @@ libvlc_video_set_adjust_float
> > libvlc_video_set_adjust_int
> > libvlc_video_set_aspect_ratio
> > libvlc_video_set_callbacks
> > -libvlc_video_set_crop_geometry
> > +libvlc_video_set_crop_ratio
> > +libvlc_video_set_crop_window
> > +libvlc_video_set_crop_border
> > libvlc_video_set_deinterlace
> > libvlc_video_set_format
> > libvlc_video_set_format_callbacks
> > diff --git a/lib/video.c b/lib/video.c
> > index e62f2a7ae2..d671e7b4fe 100644
> > --- a/lib/video.c
> > +++ b/lib/video.c
> > @@ -363,25 +363,54 @@ int libvlc_video_set_spu_delay(
> > libvlc_media_player_t *p_mi,
> > return 0;
> > }
> >
> > -void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi,
> > - const char *psz_geometry )
> > +static void libvlc_video_set_crop(libvlc_media_player_t *mp,
> > + const char *geometry)
> > {
> > - if (psz_geometry == NULL)
> > - psz_geometry = "";
> > -
> > - var_SetString (p_mi, "crop", psz_geometry);
> > + var_SetString(mp, "crop", geometry);
> >
> > size_t n;
> > - vout_thread_t **pp_vouts = GetVouts (p_mi, &n);
> > + vout_thread_t **vouts = GetVouts(mp, &n);
> >
> > for (size_t i = 0; i < n; i++)
> > {
> > - vout_thread_t *p_vout = pp_vouts[i];
> > -
> > - var_SetString (p_vout, "crop", psz_geometry);
> > - vout_Release(p_vout);
> > + var_SetString(vouts[i], "crop", geometry);
> > + vout_Release(vouts[i]);
> > }
> > - free (pp_vouts);
> > + free(vouts);
> > +}
> > +
> > +void libvlc_video_set_crop_ratio(libvlc_media_player_t *mp,
> > + unsigned num, unsigned den)
> > +{
> > + char geometry[2 * (sizeof (unsigned) + 1)];
> > +
> > + if (den == 0)
> > + geometry[0] = '\0';
> > + else
> > + sprintf(geometry, "%u:%u", num, den);
> > +
> > + libvlc_video_set_crop(mp, geometry);
> > +}
> > +
> > +void libvlc_video_set_crop_window(libvlc_media_player_t *mp,
> > + unsigned x, unsigned y,
> > + unsigned width, unsigned height)
> > +{
> > + char geometry[4 * (sizeof (unsigned) + 1)];
> > +
> > + assert(width != 0 && height != 0);
> > + sprintf(geometry, "%ux%u+%u+%u", x, y, width, height);
> > + libvlc_video_set_crop(mp, geometry);
> > +}
> > +
> > +void libvlc_video_set_crop_border(libvlc_media_player_t *mp,
> > + unsigned left, unsigned right,
> > + unsigned top, unsigned bottom)
> > +{
> > + char geometry[4 * (sizeof (unsigned) + 1)];
> > +
> > + sprintf(geometry, "%u+%u+%u+%u", left, top, right, bottom);
> > + libvlc_video_set_crop(mp, geometry);
> > }
> >
> > int libvlc_video_get_teletext( libvlc_media_player_t *p_mi )
> > --
> > 2.20.1
> >
> > _______________________________________________
> > 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
More information about the vlc-devel
mailing list