]> git.sesse.net Git - mlt/commitdiff
Add audiowave filter.
authorDan Dennedy <dan@dennedy.org>
Thu, 19 Aug 2010 08:23:47 +0000 (01:23 -0700)
committerDan Dennedy <dan@dennedy.org>
Thu, 19 Aug 2010 08:23:47 +0000 (01:23 -0700)
This replaces the video with the audio waveform. Currently, it only
works on producers that also provide video.

src/modules/core/Makefile
src/modules/core/factory.c
src/modules/core/filter_audiowave.c [new file with mode: 0644]

index 05c6e903789b9b932396587c17285d3ec015cac6..a619286841ad714fcf7b312e40d89cb956957ef0 100644 (file)
@@ -14,6 +14,7 @@ OBJS = factory.o \
           producer_noise.o \
           producer_ppm.o \
           filter_audioconvert.o \
+          filter_audiowave.o \
           filter_brightness.o \
           filter_channelcopy.o \
           filter_crop.o \
index b9942856e3dfcf2df4a1eedcde77cf05f873ae52..51fe96357db3c0133b36ccaa5f25a6eeaaa7fb27 100644 (file)
@@ -23,6 +23,7 @@
 
 extern mlt_consumer consumer_null_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
 extern mlt_filter filter_audioconvert_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
+extern mlt_filter filter_audiowave_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
 extern mlt_filter filter_brightness_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
 extern mlt_filter filter_channelcopy_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
 extern mlt_filter filter_crop_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg );
@@ -56,6 +57,7 @@ MLT_REPOSITORY
 {
        MLT_REGISTER( consumer_type, "null", consumer_null_init );
        MLT_REGISTER( filter_type, "audioconvert", filter_audioconvert_init );
+       MLT_REGISTER( filter_type, "audiowave", filter_audiowave_init );
        MLT_REGISTER( filter_type, "brightness", filter_brightness_init );
        MLT_REGISTER( filter_type, "channelcopy", filter_channelcopy_init );
     MLT_REGISTER( filter_type, "channelswap", filter_channelcopy_init );
diff --git a/src/modules/core/filter_audiowave.c b/src/modules/core/filter_audiowave.c
new file mode 100644 (file)
index 0000000..08d848f
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * filter_audiowave.c -- display audio waveform
+ * Copyright (C) 2010 Ushodaya Enterprises Limited
+ * Author: Dan Dennedy <dan@dennedy.org>
+ *
+ * This library 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 library 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 library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <framework/mlt_filter.h>
+#include <framework/mlt_frame.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/** Do it :-).
+*/
+
+static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable )
+{
+       int size = *width * *height * 2;
+       *format = mlt_image_yuv422;
+       *image = mlt_pool_alloc( size );
+       mlt_properties_set_data( MLT_FRAME_PROPERTIES(this), "image", *image, size, mlt_pool_release, NULL );
+       uint8_t *wave = mlt_frame_get_waveform( this, *width, *height );
+       if ( wave )
+       {
+               uint8_t *p = *image;
+               uint8_t *q = *image + *width * *height * 2;
+               uint8_t *s = wave;
+
+               while ( p != q )
+               {
+                       *p ++ = *s ++;
+                       *p ++ = 128;
+               }
+       }
+       return ( wave == NULL );
+}
+
+/** Filter processing.
+*/
+
+static mlt_frame filter_process( mlt_filter this, mlt_frame frame )
+{
+       mlt_frame_push_get_image( frame, filter_get_image );
+       return frame;
+}
+
+/** Constructor for the filter.
+*/
+
+mlt_filter filter_audiowave_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg )
+{
+       mlt_filter this = mlt_filter_new( );
+       if ( this != NULL )
+               this->process = filter_process;
+       return this;
+}
+