[vlc-devel] [PATCH 2/2] lib/media_player: add "auto" deinterlace mode
Thomas Guillem
thomas at gllm.fr
Tue Jan 24 13:32:15 CET 2017
---
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);
}
/* ************** */
--
2.11.0
More information about the vlc-devel
mailing list