X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Finvert.c;h=acf093ea0fa642ac2eebf2a1d65e5da000d2289b;hb=1071c1bc2829435ed5d42de68568fe05a108fe44;hp=fdd4eda5f0cff8549c9efc73713a74b97b713bb8;hpb=9bee423be4fa3fa21bd59d0d343bdc791edaab65;p=vlc diff --git a/modules/video_filter/invert.c b/modules/video_filter/invert.c index fdd4eda5f0..acf093ea0f 100644 --- a/modules/video_filter/invert.c +++ b/modules/video_filter/invert.c @@ -24,13 +24,17 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include #include "vlc_filter.h" +#include "filter_picture.h" /***************************************************************************** * Local prototypes @@ -44,10 +48,10 @@ static picture_t *Filter( filter_t *, picture_t * ); * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("Invert video filter") ); + set_description( N_("Invert video filter") ); set_shortname( N_("Color inversion" )); set_category( CAT_VIDEO ); - set_subcategory( SUBCAT_VIDEO_VFILTER2 ); + set_subcategory( SUBCAT_VIDEO_VFILTER ); set_capability( "video filter2", 0 ); add_shortcut( "invert" ); set_callbacks( Create, Destroy ); @@ -75,10 +79,7 @@ static int Create( vlc_object_t *p_this ) /* Allocate structure */ p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( p_filter->p_sys == NULL ) - { - msg_Err( p_filter, "out of memory" ); return VLC_ENOMEM; - } p_filter->pf_video_filter = Filter; @@ -108,6 +109,7 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic ) { picture_t *p_outpic; int i_index; + int i_planes; if( !p_pic ) return NULL; @@ -120,7 +122,20 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic ) return NULL; } - for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) + if( p_pic->format.i_chroma == VLC_FOURCC('Y','U','V','A') ) + { + /* We don't want to invert the alpha plane */ + i_planes = p_pic->i_planes - 1; + vlc_memcpy( + p_outpic->p[A_PLANE].p_pixels, p_pic->p[A_PLANE].p_pixels, + p_pic->p[A_PLANE].i_pitch * p_pic->p[A_PLANE].i_lines ); + } + else + { + i_planes = p_pic->i_planes; + } + + for( i_index = 0 ; i_index < i_planes ; i_index++ ) { uint8_t *p_in, *p_in_end, *p_line_end, *p_out; @@ -139,7 +154,7 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic ) p_in64 = (uint64_t*)p_in; p_out64 = (uint64_t*)p_out; - for( ; (ptrdiff_t)p_in64 < (ptrdiff_t)p_line_end ; ) + while( p_in64 < (uint64_t *)p_line_end ) { /* Do 64 pixels at a time */ *p_out64++ = ~*p_in64++; *p_out64++ = ~*p_in64++; @@ -164,14 +179,5 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic ) } } - p_outpic->date = p_pic->date; - p_outpic->b_force = p_pic->b_force; - p_outpic->i_nb_fields = p_pic->i_nb_fields; - p_outpic->b_progressive = p_pic->b_progressive; - p_outpic->b_top_field_first = p_pic->b_top_field_first; - - if( p_pic->pf_release ) - p_pic->pf_release( p_pic ); - - return p_outpic; + return CopyInfoAndRelease( p_outpic, p_pic ); }