X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fvout_intf.c;h=23a727e45b0d93f913fd939e5b376cf070ef89cb;hb=5a7b2f11a8fa75967ab64e55bc07163a3e92e847;hp=c0fca4ed713a85e82a23d98608751c22032a1fae;hpb=dd50e81c8969905671c66dfe7a927ca41aa2ded7;p=vlc diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c index c0fca4ed71..23a727e45b 100644 --- a/src/video_output/vout_intf.c +++ b/src/video_output/vout_intf.c @@ -69,7 +69,14 @@ 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 SubMarginCallback( 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 * ); static int TitleTimeoutCallback( vlc_object_t *, char const *, @@ -236,9 +243,6 @@ void vout_IntfInit( vout_thread_t *p_vout ) var_Change( p_vout, "crop", VLC_VAR_ADDCHOICE, &val, &text ); } - /* update triggered every time the vout's crop parameters are changed */ - var_Create( p_vout, "crop-update", VLC_VAR_VOID ); - /* Add custom crop ratios */ psz_buf = var_CreateGetNonEmptyString( p_vout, "custom-crop-ratios" ); if( psz_buf ) @@ -354,6 +358,32 @@ 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" ); + + /* Add sub-margin variable */ + var_Create( p_vout, "sub-margin", + VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND ); + var_AddCallback( p_vout, "sub-margin", SubMarginCallback, NULL ); + var_TriggerCallback( p_vout, "sub-margin" ); + /* Mouse coordinates */ var_Create( p_vout, "mouse-button-down", VLC_VAR_INTEGER ); var_Create( p_vout, "mouse-moved", VLC_VAR_COORDS ); @@ -387,7 +417,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; } @@ -556,10 +586,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(""); @@ -604,16 +631,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 ); } @@ -730,6 +751,62 @@ 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 SubMarginCallback( 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_ControlChangeSubMargin( p_vout, newval.i_int ); + 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 ) {