]> git.sesse.net Git - vlc/blobdiff - src/video_output/vout_intf.c
Allowed vout_display_DeleteWindow(vd, NULL) to destroy unused window.
[vlc] / src / video_output / vout_intf.c
index 7c2c8c5bd9ceeb7c0621af42c39f50b7af88c3b4..666fcc2b7ffd7daea2ccd4bf42dba08b905b19c6 100644 (file)
@@ -69,6 +69,12 @@ static int FullscreenCallback( vlc_object_t *, char const *,
                                vlc_value_t, vlc_value_t, void * );
 static int SnapshotCallback( vlc_object_t *, char const *,
                              vlc_value_t, vlc_value_t, void * );
+static int VideoFilterCallback( vlc_object_t *, char const *,
+                                vlc_value_t, vlc_value_t, void * );
+static int VideoSplitterCallback( vlc_object_t *, char const *,
+                                  vlc_value_t, vlc_value_t, void * );
+static int SubFilterCallback( vlc_object_t *, char const *,
+                              vlc_value_t, vlc_value_t, void * );
 
 static int TitleShowCallback( vlc_object_t *, char const *,
                               vlc_value_t, vlc_value_t, void * );
@@ -351,6 +357,26 @@ void vout_IntfInit( vout_thread_t *p_vout )
     var_Change( p_vout, "video-snapshot", VLC_VAR_SETTEXT, &text, NULL );
     var_AddCallback( p_vout, "video-snapshot", SnapshotCallback, NULL );
 
+    /* Add a video-filter variable */
+    var_Create( p_vout, "video-filter",
+                VLC_VAR_STRING | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
+    var_AddCallback( p_vout, "video-filter", VideoFilterCallback, NULL );
+    var_TriggerCallback( p_vout, "video-filter" );
+
+    /* Add a video-splitter variable
+     * TODO rename vout-filter into vout-splitter */
+    var_Create( p_vout, "vout-filter",
+                VLC_VAR_STRING | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
+    text.psz_string = _("Video splitter");
+    var_Change( p_vout, "vout-filter", VLC_VAR_SETTEXT, &text, NULL );
+    var_AddCallback( p_vout, "vout-filter", VideoSplitterCallback, NULL );
+
+    /* Add a sub-filter variable */
+    var_Create( p_vout, "sub-filter",
+                VLC_VAR_STRING | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
+    var_AddCallback( p_vout, "sub-filter", SubFilterCallback, NULL );
+    var_TriggerCallback( p_vout, "sub-filter" );
+
     /* Mouse coordinates */
     var_Create( p_vout, "mouse-button-down", VLC_VAR_INTEGER );
     var_Create( p_vout, "mouse-moved", VLC_VAR_COORDS );
@@ -384,7 +410,7 @@ static int VoutSnapshotPip( vout_thread_t *p_vout, picture_t *p_pic )
     p_subpic->i_original_picture_width  *= 4;
     p_subpic->i_original_picture_height *= 4;
 
-    spu_DisplaySubpicture( vout_GetSpu( p_vout ), p_subpic );
+    vout_PutSubpicture( p_vout, p_subpic );
     return VLC_SUCCESS;
 }
 
@@ -553,10 +579,7 @@ void vout_EnableFilter( vout_thread_t *p_vout, const char *psz_name,
     }
     module_release( p_obj );
 
-    if( !strcmp( psz_filter_type, "sub-filter") )
-        psz_string = var_GetString( vout_GetSpu( p_vout ), psz_filter_type );
-    else
-        psz_string = var_GetString( p_vout, psz_filter_type );
+    psz_string = var_GetString( p_vout, psz_filter_type );
 
     /* Todo : Use some generic chain manipulation functions */
     if( !psz_string ) psz_string = strdup("");
@@ -601,16 +624,10 @@ void vout_EnableFilter( vout_thread_t *p_vout, const char *psz_name,
 
     if( b_setconfig )
     {
-        if( !strcmp( psz_filter_type, "sub-filter") )
-            config_PutPsz( vout_GetSpu( p_vout ), psz_filter_type, psz_string );
-        else
-            config_PutPsz( p_vout, psz_filter_type, psz_string );
+        config_PutPsz( p_vout, psz_filter_type, psz_string );
     }
 
-    if( !strcmp( psz_filter_type, "sub-filter") )
-        var_SetString( vout_GetSpu( p_vout ), psz_filter_type, psz_string );
-    else
-        var_SetString( p_vout, psz_filter_type, psz_string );
+    var_SetString( p_vout, psz_filter_type, psz_string );
 
     free( psz_string );
 }
@@ -727,6 +744,52 @@ static int SnapshotCallback( vlc_object_t *p_this, char const *psz_cmd,
     return VLC_SUCCESS;
 }
 
+static int VideoFilterCallback( vlc_object_t *p_this, char const *psz_cmd,
+                                vlc_value_t oldval, vlc_value_t newval, void *p_data)
+{
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
+    VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
+
+    vout_ControlChangeFilters( p_vout, newval.psz_string );
+    return VLC_SUCCESS;
+}
+
+static int VideoSplitterCallback( vlc_object_t *p_this, char const *psz_cmd,
+                                  vlc_value_t oldval, vlc_value_t newval, void *p_data )
+{
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
+    input_thread_t *p_input;
+    (void)psz_cmd; (void)oldval; (void)p_data;
+
+    p_input = (input_thread_t *)vlc_object_find( p_this, VLC_OBJECT_INPUT,
+                                                 FIND_PARENT );
+    if (!p_input)
+    {
+        msg_Err( p_vout, "Input not found" );
+        return VLC_EGENERIC;
+    }
+
+    /* Modify input as well because the vout might have to be restarted */
+    var_Create( p_input, "vout-filter", VLC_VAR_STRING );
+    var_SetString( p_input, "vout-filter", newval.psz_string );
+
+    /* Now restart current video stream */
+    input_Control( p_input, INPUT_RESTART_ES, -VIDEO_ES );
+    vlc_object_release( p_input );
+
+    return VLC_SUCCESS;
+}
+
+static int SubFilterCallback( vlc_object_t *p_this, char const *psz_cmd,
+                              vlc_value_t oldval, vlc_value_t newval, void *p_data)
+{
+    vout_thread_t *p_vout = (vout_thread_t *)p_this;
+    VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
+
+    vout_ControlChangeSubFilters( p_vout, newval.psz_string );
+    return VLC_SUCCESS;
+}
+
 static int TitleShowCallback( vlc_object_t *p_this, char const *psz_cmd,
                        vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {