From dc6eb42c57d2f1111d87d8b9544e158b86a441f8 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Thu, 29 Jul 2004 17:41:58 +0000 Subject: [PATCH] Affine filter git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@345 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/modules/plus/Makefile | 1 + src/modules/plus/configure | 1 + src/modules/plus/factory.c | 3 + src/modules/plus/filter_affine.c | 109 +++++++++++++++++++++++++++++++ src/modules/plus/filter_affine.h | 28 ++++++++ 5 files changed, 142 insertions(+) create mode 100644 src/modules/plus/filter_affine.c create mode 100644 src/modules/plus/filter_affine.h diff --git a/src/modules/plus/Makefile b/src/modules/plus/Makefile index f628102b..54d5ea9f 100644 --- a/src/modules/plus/Makefile +++ b/src/modules/plus/Makefile @@ -3,6 +3,7 @@ include ../../../config.mak TARGET = ../libmltplus.so OBJS = factory.o \ + filter_affine.o \ filter_charcoal.o \ filter_invert.o \ filter_sepia.o \ diff --git a/src/modules/plus/configure b/src/modules/plus/configure index cd026690..25ecd022 100755 --- a/src/modules/plus/configure +++ b/src/modules/plus/configure @@ -7,6 +7,7 @@ cat << EOF >> ../producers.dat EOF cat << EOF >> ../filters.dat +affine libmltplus.so charcoal libmltplus.so invert libmltplus.so sepia libmltplus.so diff --git a/src/modules/plus/factory.c b/src/modules/plus/factory.c index 39fba3a6..f993b914 100644 --- a/src/modules/plus/factory.c +++ b/src/modules/plus/factory.c @@ -20,6 +20,7 @@ #include +#include "filter_affine.h" #include "filter_charcoal.h" #include "filter_invert.h" #include "filter_sepia.h" @@ -32,6 +33,8 @@ void *mlt_create_producer( char *id, void *arg ) void *mlt_create_filter( char *id, void *arg ) { + if ( !strcmp( id, "affine" ) ) + return filter_affine_init( arg ); if ( !strcmp( id, "charcoal" ) ) return filter_charcoal_init( arg ); if ( !strcmp( id, "invert" ) ) diff --git a/src/modules/plus/filter_affine.c b/src/modules/plus/filter_affine.c new file mode 100644 index 00000000..a37b0661 --- /dev/null +++ b/src/modules/plus/filter_affine.c @@ -0,0 +1,109 @@ +/* + * filter_affine.c -- affine filter + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "filter_affine.h" + +#include + +#include +#include +#include + +/** Do it :-). +*/ + +static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable ) +{ + // Get the filter + mlt_filter filter = mlt_frame_pop_service( this ); + + // Get the properties + mlt_properties properties = mlt_filter_properties( filter ); + + // Get the image + int error = mlt_frame_get_image( this, image, format, width, height, 0 ); + + // Only process if we have no error and a valid colour space + if ( error == 0 && *format == mlt_image_yuv422 ) + { + mlt_producer producer = mlt_properties_get_data( properties, "producer", NULL ); + mlt_transition transition = mlt_properties_get_data( properties, "transition", NULL ); + mlt_frame a_frame = NULL; + + if ( producer == NULL ) + { + char *background = mlt_properties_get( properties, "background" ); + producer = mlt_factory_producer( "fezzik", background ); + mlt_properties_set_data( properties, "producer", producer, 0, (mlt_destructor)mlt_producer_close, NULL ); + } + + if ( transition == NULL ) + { + transition = mlt_factory_transition( "affine", NULL ); + mlt_properties_set_data( properties, "transition", transition, 0, (mlt_destructor)mlt_transition_close, NULL ); + } + + if ( producer != NULL && transition != NULL ) + { + mlt_properties frame_properties = mlt_frame_properties( this ); + mlt_properties_pass( mlt_producer_properties( producer ), properties, "producer." ); + mlt_properties_pass( mlt_transition_properties( transition ), properties, "transition." ); + mlt_service_get_frame( mlt_producer_service( producer ), &a_frame, 0 ); + mlt_properties_set( mlt_frame_properties( a_frame ), "rescale_interp", "nearest" ); + mlt_properties_set( mlt_frame_properties( a_frame ), "distort", "true" ); + mlt_properties_set_double( mlt_frame_properties( a_frame ), "consumer_aspect_ratio", + mlt_properties_get_double( frame_properties, "consumer_aspect_ratio" ) ); + mlt_transition_process( transition, a_frame, this ); + mlt_frame_get_image( a_frame, image, format, width, height, writable ); + mlt_properties_set_data( frame_properties, "affine_frame", a_frame, 0, (mlt_destructor)mlt_frame_close, NULL ); + mlt_properties_set_data( frame_properties, "image", *image, *width * *height * 2, NULL, NULL ); + } + } + + return error; +} + +/** Filter processing. +*/ + +static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) +{ + // Push the frame filter + mlt_frame_push_service( frame, this ); + mlt_frame_push_get_image( frame, filter_get_image ); + return frame; +} + +/** Constructor for the filter. +*/ + +mlt_filter filter_affine_init( char *arg ) +{ + mlt_filter this = mlt_filter_new( ); + if ( this != NULL ) + { + this->process = filter_process; + mlt_properties_set( mlt_filter_properties( this ), "background", "colour:black" ); + mlt_properties_set( mlt_filter_properties( this ), "transition.rotate", "10" ); + } + return this; +} + + diff --git a/src/modules/plus/filter_affine.h b/src/modules/plus/filter_affine.h new file mode 100644 index 00000000..575e2c30 --- /dev/null +++ b/src/modules/plus/filter_affine.h @@ -0,0 +1,28 @@ +/* + * filter_affine.h -- affine filter + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _FILTER_AFFINEH_ +#define _FILTER_AFFINEH_ + +#include + +extern mlt_filter filter_affine_init( char *arg ); + +#endif -- 2.39.2