[vlc-devel] [PATCH 2/2] lib/media_player: add "auto" deinterlace mode

Rémi Denis-Courmont remi at remlab.net
Tue Jan 24 17:34:51 CET 2017


This looks wrong on several levels. First the mode is supposed to be the 
"how", not the "when".

Second, there is a whole lot of code in setter, which seems contradictory for 
something automatic (though that might be a consequence of the first problem).

Le tiistaina 24. tammikuuta 2017, 13.32.15 EET Thomas Guillem a écrit :
> ---
>  include/vlc/libvlc_media_player.h |  5 +++--
>  lib/video.c                       | 40
> +++++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+),
> 16 deletions(-)
> 
> diff --git a/include/vlc/libvlc_media_player.h
> b/include/vlc/libvlc_media_player.h index 97069f795b..586e86db69 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -1420,10 +1420,11 @@ int libvlc_video_take_snapshot(
> libvlc_media_player_t *p_mi, unsigned num, * Enable or disable deinterlace
> filter
>   *
>   * \param p_mi libvlc media player
> - * \param psz_mode type of deinterlace filter, NULL to disable
> + * \param psz_mode type of deinterlace filter, NULL to disable, "auto" for
> + * automatic (default behavior)
>   */
>  LIBVLC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi,
> -                                                  const char *psz_mode );
> +                                              const char *psz_mode );
> 
>  /**
>   * Get an integer marquee option value
> diff --git a/lib/video.c b/lib/video.c
> index 46f9935025..f37dcff10f 100644
> --- a/lib/video.c
> +++ b/lib/video.c
> @@ -614,23 +614,38 @@ end:
>  void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi,
>                                     const char *psz_mode )
>  {
> -    if (psz_mode == NULL)
> -        psz_mode = "";
> -    if (*psz_mode
> +    if (psz_mode
>       && strcmp (psz_mode, "blend")    && strcmp (psz_mode, "bob")
>       && strcmp (psz_mode, "discard")  && strcmp (psz_mode, "linear")
>       && strcmp (psz_mode, "mean")     && strcmp (psz_mode, "x")
>       && strcmp (psz_mode, "yadif")    && strcmp (psz_mode, "yadif2x")
> -     && strcmp (psz_mode, "phosphor") && strcmp (psz_mode, "ivtc"))
> +     && strcmp (psz_mode, "phosphor") && strcmp (psz_mode, "ivtc")
> +     && strcmp (psz_mode, "auto"))
>          return;
> 
> -    if (*psz_mode)
> +    char *psz_parent_mode = NULL;
> +    int i_mode;
> +    if (psz_mode != NULL)
>      {
> -        var_SetString (p_mi, "deinterlace-mode", psz_mode);
> -        var_SetInteger (p_mi, "deinterlace", 1);
> +        if (strcmp (psz_mode, "auto") == 0)
> +        {
> +            /* Recover the initial "deinterlace-mode" value */
> +            psz_mode = psz_parent_mode =
> +                var_InheritString(p_mi->obj.parent, "deinterlace-mode");
> +            i_mode = psz_mode != NULL ? -1 /* auto */ : 0 /* disabled */;
> +        }
> +        else
> +            i_mode = 1;
>      }
>      else
> -        var_SetInteger (p_mi, "deinterlace", 0);
> +        i_mode = 0;
> +
> +    if (i_mode != 0)
> +    {
> +        assert (psz_mode);
> +        var_SetString (p_mi, "deinterlace-mode", psz_mode);
> +    }
> +    var_SetInteger (p_mi, "deinterlace", i_mode);
> 
>      size_t n;
>      vout_thread_t **pp_vouts = GetVouts (p_mi, &n);
> @@ -638,16 +653,13 @@ void libvlc_video_set_deinterlace(
> libvlc_media_player_t *p_mi, {
>          vout_thread_t *p_vout = pp_vouts[i];
> 
> -        if (*psz_mode)
> -        {
> +        if (i_mode != 0)
>              var_SetString (p_vout, "deinterlace-mode", psz_mode);
> -            var_SetInteger (p_vout, "deinterlace", 1);
> -        }
> -        else
> -            var_SetInteger (p_vout, "deinterlace", 0);
> +        var_SetInteger (p_vout, "deinterlace", i_mode);
>          vlc_object_release (p_vout);
>      }
>      free (pp_vouts);
> +    free (psz_parent_mode);
>  }
> 
>  /* ************** */


-- 
雷米‧德尼-库尔蒙
https://www.remlab.net/



More information about the vlc-devel mailing list