X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Finvert.c;h=64fa0a2f681cbff05c0851d599aa381b7ad85f68;hb=0e949ba4cd31aa3e444e37c80b9777b63f79cfb1;hp=79c623997e4d074ae4e56f4f674e52179d9930a8;hpb=a1e813777408263806ec177c14eedcfe871d6160;p=vlc diff --git a/modules/video_filter/invert.c b/modules/video_filter/invert.c index 79c623997e..64fa0a2f68 100644 --- a/modules/video_filter/invert.c +++ b/modules/video_filter/invert.c @@ -2,7 +2,7 @@ * invert.c : Invert video plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: invert.c,v 1.7 2003/03/30 18:14:38 gbazin Exp $ + * $Id$ * * Authors: Samuel Hocevar * @@ -49,7 +49,7 @@ static int SendEvents( vlc_object_t *, char const *, * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("invert video filter") ); + set_description( _("Invert video filter") ); set_capability( "video filter", 0 ); add_shortcut( "invert" ); set_callbacks( Create, Destroy ); @@ -66,6 +66,14 @@ struct vout_sys_t vout_thread_t *p_vout; }; +/***************************************************************************** + * Control: control facility for the vout (forwards to child vout) + *****************************************************************************/ +static int Control( vout_thread_t *p_vout, int i_query, va_list args ) +{ + return vout_vaControl( p_vout->p_sys->p_vout, i_query, args ); +} + /***************************************************************************** * Create: allocates Invert video thread output method ***************************************************************************** @@ -88,6 +96,7 @@ static int Create( vlc_object_t *p_this ) p_vout->pf_manage = NULL; p_vout->pf_render = Render; p_vout->pf_display = NULL; + p_vout->pf_control = Control; return VLC_SUCCESS; } @@ -127,6 +136,8 @@ static int Init( vout_thread_t *p_vout ) ADD_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + ADD_PARENT_CALLBACKS( SendEventsToChild ); + return VLC_SUCCESS; } @@ -154,9 +165,14 @@ static void Destroy( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; - DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); - vlc_object_detach( p_vout->p_sys->p_vout ); - vout_Destroy( p_vout->p_sys->p_vout ); + if( p_vout->p_sys->p_vout ) + { + DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); + vout_Destroy( p_vout->p_sys->p_vout ); + } + + DEL_PARENT_CALLBACKS( SendEventsToChild ); free( p_vout->p_sys ); } @@ -199,21 +215,24 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) for( ; p_in < p_in_end ; ) { + uint64_t *p_in64, *p_out64; + p_line_end = p_in + p_pic->p[i_index].i_visible_pitch - 64; - for( ; p_in < p_line_end ; ) + p_in64 = (uint64_t*)p_in; + p_out64 = (uint64_t*)p_out; + + for( ; (ptrdiff_t)p_in64 < (ptrdiff_t)p_line_end ; ) { /* Do 64 pixels at a time */ - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); - *((uint64_t*)p_out)++ = ~( *((uint64_t*)p_in)++ ); + *p_out64++ = ~*p_in64++; *p_out64++ = ~*p_in64++; + *p_out64++ = ~*p_in64++; *p_out64++ = ~*p_in64++; + *p_out64++ = ~*p_in64++; *p_out64++ = ~*p_in64++; + *p_out64++ = ~*p_in64++; *p_out64++ = ~*p_in64++; } + p_in = (uint8_t*)p_in64; + p_out = (uint8_t*)p_out64; p_line_end += 64; for( ; p_in < p_line_end ; ) @@ -244,3 +263,13 @@ static int SendEvents( vlc_object_t *p_this, char const *psz_var, return VLC_SUCCESS; } +/***************************************************************************** + * SendEventsToChild: forward events to the child/children vout + *****************************************************************************/ +static int SendEventsToChild( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, void *p_data ) +{ + vout_thread_t *p_vout = (vout_thread_t *)p_this; + var_Set( p_vout->p_sys->p_vout, psz_var, newval ); + return VLC_SUCCESS; +}