From 885cb897cfb90465e61c39c1c266891b7e499055 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Fri, 26 Dec 2003 19:01:17 +0000 Subject: [PATCH] Gamma filter git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@25 d19143bc-622f-0410-bfdd-b5b2a6649095 --- mlt/src/modules/core/Makefile | 1 + mlt/src/modules/core/configure | 1 + mlt/src/modules/core/factory.c | 3 + mlt/src/modules/core/filter_gamma.c | 85 ++++++++++++++++++++++++++++++++++ mlt/src/modules/core/filter_gamma.h | 28 +++++++++++ mlt/src/modules/core/filter_resize.h | 2 +- mlt/src/tests/io.c | 4 +- src/modules/core/Makefile | 1 + src/modules/core/configure | 1 + src/modules/core/factory.c | 3 + src/modules/core/filter_gamma.c | 85 ++++++++++++++++++++++++++++++++++ src/modules/core/filter_gamma.h | 28 +++++++++++ src/modules/core/filter_resize.h | 2 +- src/tests/io.c | 4 +- 14 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 mlt/src/modules/core/filter_gamma.c create mode 100644 mlt/src/modules/core/filter_gamma.h create mode 100644 src/modules/core/filter_gamma.c create mode 100644 src/modules/core/filter_gamma.h diff --git a/mlt/src/modules/core/Makefile b/mlt/src/modules/core/Makefile index fe4a0bb..8c505ee 100644 --- a/mlt/src/modules/core/Makefile +++ b/mlt/src/modules/core/Makefile @@ -5,6 +5,7 @@ OBJS = factory.o \ producer_ppm.o \ filter_deinterlace.o \ filter_greyscale.o \ + filter_gamma.o \ filter_resize.o \ transition_composite.o diff --git a/mlt/src/modules/core/configure b/mlt/src/modules/core/configure index 2f3457e..336d89e 100755 --- a/mlt/src/modules/core/configure +++ b/mlt/src/modules/core/configure @@ -9,6 +9,7 @@ EOF cat << EOF >> ../filters.dat deinterlace libmltcore.so +gamma libmltcore.so greyscale libmltcore.so resize libmltcore.so EOF diff --git a/mlt/src/modules/core/factory.c b/mlt/src/modules/core/factory.c index eb19049..b85d8d7 100644 --- a/mlt/src/modules/core/factory.c +++ b/mlt/src/modules/core/factory.c @@ -23,6 +23,7 @@ #include "filter_deinterlace.h" #include "filter_greyscale.h" #include "filter_resize.h" +#include "filter_gamma.h" #include "producer_ppm.h" #include "transition_composite.h" @@ -37,6 +38,8 @@ void *mlt_create_filter( char *id, void *arg ) { if ( !strcmp( id, "deinterlace" ) ) return filter_deinterlace_init( arg ); + if ( !strcmp( id, "gamma" ) ) + return filter_gamma_init( arg ); if ( !strcmp( id, "greyscale" ) ) return filter_greyscale_init( arg ); if ( !strcmp( id, "resize" ) ) diff --git a/mlt/src/modules/core/filter_gamma.c b/mlt/src/modules/core/filter_gamma.c new file mode 100644 index 0000000..3387561 --- /dev/null +++ b/mlt/src/modules/core/filter_gamma.c @@ -0,0 +1,85 @@ +/* + * filter_gamma.c -- gamma 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_gamma.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 ) +{ + mlt_frame_get_image( this, image, format, width, height, 1 ); + uint8_t *p = *image; + uint8_t *q = *image + *width * *height * 2; + + // Get the gamma value + double gamma = mlt_properties_get_double( mlt_frame_properties( this ), "gamma" ); + + // Calculate the look up table + double exp = 1 / gamma; + uint8_t lookup[ 256 ]; + int i; + + for( i = 0; i < 256; i ++ ) + lookup[ i ] = ( uint8_t )( pow( ( double )i / 255.0, exp ) * 255 ); + + while ( p != q ) + { + *p = lookup[ *p ]; + p += 2; + } + + return 0; +} + +/** Filter processing. +*/ + +static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) +{ + double gamma = mlt_properties_get_double( mlt_filter_properties( this ), "gamma" ); + gamma = gamma <= 0 ? 2 : gamma; + mlt_frame_push_get_image( frame, filter_get_image ); + mlt_properties_set_double( mlt_frame_properties( frame ), "gamma", gamma ); + return frame; +} + +/** Constructor for the filter. +*/ + +mlt_filter filter_gamma_init( char *arg ) +{ + mlt_filter this = calloc( sizeof( struct mlt_filter_s ), 1 ); + if ( this != NULL ) + { + mlt_filter_init( this, NULL ); + this->process = filter_process; + if ( arg != NULL ) + mlt_properties_set_double( mlt_filter_properties( this ), "gamma", atof( arg ) ); + } + return this; +} + diff --git a/mlt/src/modules/core/filter_gamma.h b/mlt/src/modules/core/filter_gamma.h new file mode 100644 index 0000000..a969b8a --- /dev/null +++ b/mlt/src/modules/core/filter_gamma.h @@ -0,0 +1,28 @@ +/* + * filter_gamma.h -- gamma 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_GAMMA_H_ +#define _FILTER_GAMMA_H_ + +#include + +extern mlt_filter filter_gamma_init( char *arg ); + +#endif diff --git a/mlt/src/modules/core/filter_resize.h b/mlt/src/modules/core/filter_resize.h index cdac48b..0d17529 100644 --- a/mlt/src/modules/core/filter_resize.h +++ b/mlt/src/modules/core/filter_resize.h @@ -23,6 +23,6 @@ #include -extern mlt_filter filter_deinterlace_init( void *arg ); +extern mlt_filter filter_resize_init( void *arg ); #endif diff --git a/mlt/src/tests/io.c b/mlt/src/tests/io.c index 1662204..431003d 100644 --- a/mlt/src/tests/io.c +++ b/mlt/src/tests/io.c @@ -159,8 +159,8 @@ int term_read( ) FD_ZERO( &rfds ); FD_SET( 0, &rfds ); - tv.tv_sec = 1; - tv.tv_usec = 0; + tv.tv_sec = 0; + tv.tv_usec = 250; n = select( 1, &rfds, NULL, NULL, &tv ); if (n > 0) { diff --git a/src/modules/core/Makefile b/src/modules/core/Makefile index fe4a0bb..8c505ee 100644 --- a/src/modules/core/Makefile +++ b/src/modules/core/Makefile @@ -5,6 +5,7 @@ OBJS = factory.o \ producer_ppm.o \ filter_deinterlace.o \ filter_greyscale.o \ + filter_gamma.o \ filter_resize.o \ transition_composite.o diff --git a/src/modules/core/configure b/src/modules/core/configure index 2f3457e..336d89e 100755 --- a/src/modules/core/configure +++ b/src/modules/core/configure @@ -9,6 +9,7 @@ EOF cat << EOF >> ../filters.dat deinterlace libmltcore.so +gamma libmltcore.so greyscale libmltcore.so resize libmltcore.so EOF diff --git a/src/modules/core/factory.c b/src/modules/core/factory.c index eb19049..b85d8d7 100644 --- a/src/modules/core/factory.c +++ b/src/modules/core/factory.c @@ -23,6 +23,7 @@ #include "filter_deinterlace.h" #include "filter_greyscale.h" #include "filter_resize.h" +#include "filter_gamma.h" #include "producer_ppm.h" #include "transition_composite.h" @@ -37,6 +38,8 @@ void *mlt_create_filter( char *id, void *arg ) { if ( !strcmp( id, "deinterlace" ) ) return filter_deinterlace_init( arg ); + if ( !strcmp( id, "gamma" ) ) + return filter_gamma_init( arg ); if ( !strcmp( id, "greyscale" ) ) return filter_greyscale_init( arg ); if ( !strcmp( id, "resize" ) ) diff --git a/src/modules/core/filter_gamma.c b/src/modules/core/filter_gamma.c new file mode 100644 index 0000000..3387561 --- /dev/null +++ b/src/modules/core/filter_gamma.c @@ -0,0 +1,85 @@ +/* + * filter_gamma.c -- gamma 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_gamma.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 ) +{ + mlt_frame_get_image( this, image, format, width, height, 1 ); + uint8_t *p = *image; + uint8_t *q = *image + *width * *height * 2; + + // Get the gamma value + double gamma = mlt_properties_get_double( mlt_frame_properties( this ), "gamma" ); + + // Calculate the look up table + double exp = 1 / gamma; + uint8_t lookup[ 256 ]; + int i; + + for( i = 0; i < 256; i ++ ) + lookup[ i ] = ( uint8_t )( pow( ( double )i / 255.0, exp ) * 255 ); + + while ( p != q ) + { + *p = lookup[ *p ]; + p += 2; + } + + return 0; +} + +/** Filter processing. +*/ + +static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) +{ + double gamma = mlt_properties_get_double( mlt_filter_properties( this ), "gamma" ); + gamma = gamma <= 0 ? 2 : gamma; + mlt_frame_push_get_image( frame, filter_get_image ); + mlt_properties_set_double( mlt_frame_properties( frame ), "gamma", gamma ); + return frame; +} + +/** Constructor for the filter. +*/ + +mlt_filter filter_gamma_init( char *arg ) +{ + mlt_filter this = calloc( sizeof( struct mlt_filter_s ), 1 ); + if ( this != NULL ) + { + mlt_filter_init( this, NULL ); + this->process = filter_process; + if ( arg != NULL ) + mlt_properties_set_double( mlt_filter_properties( this ), "gamma", atof( arg ) ); + } + return this; +} + diff --git a/src/modules/core/filter_gamma.h b/src/modules/core/filter_gamma.h new file mode 100644 index 0000000..a969b8a --- /dev/null +++ b/src/modules/core/filter_gamma.h @@ -0,0 +1,28 @@ +/* + * filter_gamma.h -- gamma 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_GAMMA_H_ +#define _FILTER_GAMMA_H_ + +#include + +extern mlt_filter filter_gamma_init( char *arg ); + +#endif diff --git a/src/modules/core/filter_resize.h b/src/modules/core/filter_resize.h index cdac48b..0d17529 100644 --- a/src/modules/core/filter_resize.h +++ b/src/modules/core/filter_resize.h @@ -23,6 +23,6 @@ #include -extern mlt_filter filter_deinterlace_init( void *arg ); +extern mlt_filter filter_resize_init( void *arg ); #endif diff --git a/src/tests/io.c b/src/tests/io.c index 1662204..431003d 100644 --- a/src/tests/io.c +++ b/src/tests/io.c @@ -159,8 +159,8 @@ int term_read( ) FD_ZERO( &rfds ); FD_SET( 0, &rfds ); - tv.tv_sec = 1; - tv.tv_usec = 0; + tv.tv_sec = 0; + tv.tv_usec = 250; n = select( 1, &rfds, NULL, NULL, &tv ); if (n > 0) { -- 1.7.4.4