[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