[vlc-devel] [PATCH] video_filter: add epileptic filter

Steve Lhomme robux4 at ycbcr.xyz
Mon Oct 19 08:24:29 CEST 2020


On 2020-10-17 14:38, Alexandre Janniaux wrote:
> Hi,
> 
> Is the goal to merge this module? I guess it's only used
> to test output pictures but maybe a simpler inlined test
> can be written instead?

Yes. It's a "fun" plugin in the same line as the psychedelic filter (the 
name was already used). It can't be merged now because the core doesn't 
support such filters.

> Regards,
> --
> Alexandre Janniaux
> Videolabs
> 
> On Thu, Oct 15, 2020 at 11:15:14AM +0200, Steve Lhomme wrote:
>> An extra inverted picture is sent for every picture given.
>> ---
>>   modules/video_filter/Makefile.am |   2 +
>>   modules/video_filter/epileptic.c | 115 +++++++++++++++++++++++++++++++
>>   2 files changed, 117 insertions(+)
>>   create mode 100644 modules/video_filter/epileptic.c
>>
>> diff --git a/modules/video_filter/Makefile.am b/modules/video_filter/Makefile.am
>> index 7a51d960eb2..26bddf30cb3 100644
>> --- a/modules/video_filter/Makefile.am
>> +++ b/modules/video_filter/Makefile.am
>> @@ -18,6 +18,7 @@ libcanvas_plugin_la_SOURCES = video_filter/canvas.c
>>   libcolorthres_plugin_la_SOURCES = video_filter/colorthres.c
>>   libcolorthres_plugin_la_LIBADD = $(LIBM)
>>   libcroppadd_plugin_la_SOURCES = video_filter/croppadd.c
>> +libepileptic_plugin_la_SOURCES = video_filter/epileptic.c
>>   liberase_plugin_la_SOURCES = video_filter/erase.c
>>   libextract_plugin_la_SOURCES = video_filter/extract.c
>>   libextract_plugin_la_LIBADD = $(LIBM)
>> @@ -79,6 +80,7 @@ video_filter_LTLIBRARIES = \
>>   	libcolorthres_plugin.la \
>>   	libcroppadd_plugin.la \
>>   	libedgedetection_plugin.la \
>> +	libepileptic_plugin.la \
>>   	liberase_plugin.la \
>>   	libextract_plugin.la \
>>   	libgradient_plugin.la \
>> diff --git a/modules/video_filter/epileptic.c b/modules/video_filter/epileptic.c
>> new file mode 100644
>> index 00000000000..f51aff98097
>> --- /dev/null
>> +++ b/modules/video_filter/epileptic.c
>> @@ -0,0 +1,115 @@
>> +/*****************************************************************************
>> + * epileptic.c : Video filter inserting an inverting picture to every frame
>> + *****************************************************************************
>> + * Copyright © 2020 VLC authors, VideoLAN and VideoLabs
>> + *
>> + * Authors: Steve Lhomme <robux4 at ycbcr.xyz>
>> + *
>> + * This program is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU Lesser General Public License as published by
>> + * the Free Software Foundation; either version 2.1 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public License
>> + * along with this program; if not, write to the Free Software Foundation,
>> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
>> + *****************************************************************************/
>> +
>> +#ifdef HAVE_CONFIG_H
>> +# include "config.h"
>> +#endif
>> +
>> +#include <vlc_common.h>
>> +#include <vlc_plugin.h>
>> +#include <vlc_filter.h>
>> +#include <vlc_modules.h>
>> +
>> +static int Create(filter_t *);
>> +
>> +vlc_module_begin ()
>> +    set_description( N_("Epileptic effect video filter") )
>> +    set_shortname( N_("Epileptic effect" ))
>> +    set_category( CAT_VIDEO )
>> +    set_subcategory( SUBCAT_VIDEO_VFILTER )
>> +    add_shortcut( "epileptic" )
>> +    set_callback_video_filter( Create )
>> +vlc_module_end ()
>> +
>> +typedef struct {
>> +    filter_t *inverter;
>> +} filter_sys_t;
>> +
>> +static filter_t *CreateInverter(vlc_object_t *object, const video_format_t *fmt)
>> +{
>> +    filter_t *filter = vlc_object_create(object, sizeof(*filter));
>> +    if (!filter)
>> +        return NULL;
>> +
>> +    es_format_InitFromVideo(&filter->fmt_in,  fmt);
>> +    es_format_InitFromVideo(&filter->fmt_out, fmt);
>> +
>> +    filter->p_module = module_need(filter, "video filter", "invert", false);
>> +    if (!filter->p_module)
>> +    {
>> +        vlc_object_delete(filter);
>> +        return NULL;
>> +    }
>> +    assert( filter->ops != NULL );
>> +    return filter;
>> +}
>> +
>> +static picture_t *Filter(filter_t *p_filter, picture_t *p_pic)
>> +{
>> +    filter_sys_t *p_sys = p_filter->p_sys;
>> +    picture_Hold( p_pic ); // the inverter will release the source
>> +    picture_t *inverted = p_sys->inverter->ops->filter_video( p_sys->inverter, p_pic );
>> +    if ( inverted )
>> +    {
>> +        inverted->date = p_pic->date + vlc_tick_from_samples( p_filter->fmt_out.video.i_frame_rate_base,
>> +                                                              p_filter->fmt_out.video.i_frame_rate );
>> +        vlc_picture_chain_AppendChain( p_pic, inverted );
>> +    }
>> +    return p_pic;
>> +}
>> +
>> +static void Close(filter_t *p_filter)
>> +{
>> +    filter_sys_t *p_sys = p_filter->p_sys;
>> +    filter_Close( p_sys->inverter );
>> +    module_unneed( p_sys->inverter, p_sys->inverter->p_module );
>> +    vlc_object_delete( p_sys->inverter );
>> +}
>> +
>> +static struct vlc_filter_operations filter_ops = {
>> +    .filter_video = Filter, .close = Close,
>> +};
>> +
>> +static int Create(filter_t *p_filter)
>> +{
>> +    if (!p_filter->b_allow_fmt_out_change)
>> +        return VLC_EGENERIC;
>> +
>> +    filter_sys_t *p_sys = vlc_obj_malloc(VLC_OBJECT(p_filter), sizeof(*p_filter));
>> +    if (unlikely(p_sys == NULL))
>> +        return VLC_EGENERIC;
>> +
>> +    p_sys->inverter = CreateInverter(VLC_OBJECT(p_filter), &p_filter->fmt_in.video);
>> +    if (p_sys->inverter == NULL)
>> +    {
>> +        vlc_obj_free(VLC_OBJECT(p_filter), p_sys);
>> +        return VLC_ENOMOD;
>> +    }
>> +
>> +    if (p_filter->fmt_out.video.i_frame_rate)
>> +        p_filter->fmt_out.video.i_frame_rate *= 2;
>> +
>> +    p_filter->p_sys = p_sys;
>> +    p_filter->ops = &filter_ops;
>> +
>> +    return VLC_SUCCESS;
>> +}
>> --
>> 2.26.2
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list