[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