+ var_AddCallback( p_vout, "deinterlace-mode", DeinterlaceCallback, NULL );
+ /* */
+ var_Create( p_vout, "deinterlace-needed", VLC_VAR_BOOL );
+ var_AddCallback( p_vout, "deinterlace-needed", DeinterlaceCallback, NULL );
+
+ /* Override the initial value from filters if present */
+ char *psz_filter_mode = NULL;
+ if( DeinterlaceIsPresent( p_vout, true ) )
+ psz_filter_mode = var_CreateGetNonEmptyString( p_vout, "filter-deinterlace-mode" );
+ else if( DeinterlaceIsPresent( p_vout, false ) )
+ psz_filter_mode = var_CreateGetNonEmptyString( p_vout, "sout-deinterlace-mode" );
+ if( psz_filter_mode )
+ {
+ free( psz_deinterlace );
+ if( i_deinterlace >= -1 )
+ i_deinterlace = 1;
+ psz_deinterlace = psz_filter_mode;
+ }
+
+ /* */
+ if( i_deinterlace == -2 )
+ p_vout->p->b_picture_interlaced = true;
+ else if( i_deinterlace == -3 )
+ p_vout->p->b_picture_interlaced = false;
+ if( i_deinterlace < 0 )
+ i_deinterlace = -1;
+
+ /* */
+ val.psz_string = psz_deinterlace ? psz_deinterlace : p_optm->orig.psz;
+ var_Change( p_vout, "deinterlace-mode", VLC_VAR_SETVALUE, &val, NULL );
+ val.b_bool = p_vout->p->b_picture_interlaced;
+ var_Change( p_vout, "deinterlace-needed", VLC_VAR_SETVALUE, &val, NULL );
+
+ var_SetInteger( p_vout, "deinterlace", i_deinterlace );
+ free( psz_deinterlace );
+}
+
+static void DeinterlaceNeeded( vout_thread_t *p_vout, bool is_interlaced )
+{
+ msg_Dbg( p_vout, "Detected %s video",
+ is_interlaced ? "interlaced" : "progressive" );
+ var_SetBool( p_vout, "deinterlace-needed", is_interlaced );