[vlc-devel] [PATCH] video_filter: add epileptic filter
Alexandre Janniaux
ajanni at videolabs.io
Sat Oct 17 14:38:34 CEST 2020
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?
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
More information about the vlc-devel
mailing list