]> git.sesse.net Git - mlt/commitdiff
Gamma filter
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Dec 2003 19:01:17 +0000 (19:01 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Dec 2003 19:01:17 +0000 (19:01 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@25 d19143bc-622f-0410-bfdd-b5b2a6649095

14 files changed:
mlt/src/modules/core/Makefile
mlt/src/modules/core/configure
mlt/src/modules/core/factory.c
mlt/src/modules/core/filter_gamma.c [new file with mode: 0644]
mlt/src/modules/core/filter_gamma.h [new file with mode: 0644]
mlt/src/modules/core/filter_resize.h
mlt/src/tests/io.c
src/modules/core/Makefile
src/modules/core/configure
src/modules/core/factory.c
src/modules/core/filter_gamma.c [new file with mode: 0644]
src/modules/core/filter_gamma.h [new file with mode: 0644]
src/modules/core/filter_resize.h
src/tests/io.c

index fe4a0bbb965103799eea42bb9dbb3420a0e0e830..8c505ee1b1e6d0e1829b50aa207f80eeb4e351df 100644 (file)
@@ -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
 
index 2f3457e631d1d594cd541c5c0e90bdab8c3157bd..336d89e1ddfd5d9487eeb76f79d226fe4a2c3fd8 100755 (executable)
@@ -9,6 +9,7 @@ EOF
 
 cat << EOF >> ../filters.dat
 deinterlace            libmltcore.so
+gamma                  libmltcore.so
 greyscale              libmltcore.so
 resize                 libmltcore.so
 EOF
index eb190494cd1511b90392776665a5f1dc163731b8..b85d8d715d49d6cfc1d3c3fe566d013023d772fd 100644 (file)
@@ -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 (file)
index 0000000..3387561
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * filter_gamma.c -- gamma filter
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * 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 <framework/mlt_frame.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+/** 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 (file)
index 0000000..a969b8a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * filter_gamma.h -- gamma filter
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * 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 <framework/mlt_filter.h>
+
+extern mlt_filter filter_gamma_init( char *arg );
+
+#endif
index cdac48b45180557bffd84e7ca6b4086beae25887..0d175292d1d4a0207fabb875917e382eed47fbdb 100644 (file)
@@ -23,6 +23,6 @@
 
 #include <framework/mlt_filter.h>
 
-extern mlt_filter filter_deinterlace_init( void *arg );
+extern mlt_filter filter_resize_init( void *arg );
 
 #endif
index 1662204bb163510eaf1ac2a22871aebfc1c8403e..431003d3291c47af23058428bd5bb2a96ac46ff9 100644 (file)
@@ -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) 
        {
index fe4a0bbb965103799eea42bb9dbb3420a0e0e830..8c505ee1b1e6d0e1829b50aa207f80eeb4e351df 100644 (file)
@@ -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
 
index 2f3457e631d1d594cd541c5c0e90bdab8c3157bd..336d89e1ddfd5d9487eeb76f79d226fe4a2c3fd8 100755 (executable)
@@ -9,6 +9,7 @@ EOF
 
 cat << EOF >> ../filters.dat
 deinterlace            libmltcore.so
+gamma                  libmltcore.so
 greyscale              libmltcore.so
 resize                 libmltcore.so
 EOF
index eb190494cd1511b90392776665a5f1dc163731b8..b85d8d715d49d6cfc1d3c3fe566d013023d772fd 100644 (file)
@@ -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 (file)
index 0000000..3387561
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * filter_gamma.c -- gamma filter
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * 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 <framework/mlt_frame.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+/** 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 (file)
index 0000000..a969b8a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * filter_gamma.h -- gamma filter
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * 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 <framework/mlt_filter.h>
+
+extern mlt_filter filter_gamma_init( char *arg );
+
+#endif
index cdac48b45180557bffd84e7ca6b4086beae25887..0d175292d1d4a0207fabb875917e382eed47fbdb 100644 (file)
@@ -23,6 +23,6 @@
 
 #include <framework/mlt_filter.h>
 
-extern mlt_filter filter_deinterlace_init( void *arg );
+extern mlt_filter filter_resize_init( void *arg );
 
 #endif
index 1662204bb163510eaf1ac2a22871aebfc1c8403e..431003d3291c47af23058428bd5bb2a96ac46ff9 100644 (file)
@@ -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) 
        {