From 63dc2f08b9ec162234aa8d6688bf56ec71349acb Mon Sep 17 00:00:00 2001 From: ddennedy Date: Thu, 2 Mar 2006 07:25:57 +0000 Subject: [PATCH] added mono audio filter git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@896 d19143bc-622f-0410-bfdd-b5b2a6649095 --- docs/services.txt | 32 ++++++++++++ src/framework/mlt_manager.h | 47 ----------------- src/modules/core/Makefile | 1 + src/modules/core/configure | 1 + src/modules/core/factory.c | 3 ++ src/modules/core/filter_mono.c | 95 ++++++++++++++++++++++++++++++++++ src/modules/core/filter_mono.h | 28 ++++++++++ 7 files changed, 160 insertions(+), 47 deletions(-) delete mode 100644 src/framework/mlt_manager.h create mode 100644 src/modules/core/filter_mono.c create mode 100644 src/modules/core/filter_mono.h diff --git a/docs/services.txt b/docs/services.txt index acc6fab0..0848549c 100644 --- a/docs/services.txt +++ b/docs/services.txt @@ -891,6 +891,38 @@ Filters none + mono + + Description + + Mix all channels of audio into a mono signal and output it as + N channels. + + Constructor Argument + + channels - the number of output channels (default 2) + + Initialisation Properties + + none + + Read Only Properties + + none + + Mutable Properties + + none + + Dependencies + + none + + Known Bugs + + none + + obscure Description diff --git a/src/framework/mlt_manager.h b/src/framework/mlt_manager.h deleted file mode 100644 index a2534c1f..00000000 --- a/src/framework/mlt_manager.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * mlt_manager.h -- manager service class - * 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 _MLT_MANAGER_H_ -#define _MLT_MANAGER_H_ - -extern mlt_manager mlt_manager_init( ); -extern mlt_producer mlt_manager_producer( mlt_manager self ); -extern mlt_producer mlt_manager_properties( mlt_manager self ); -extern int mlt_manager_track_count( mlt_manager self ); -extern int mlt_manager_clip_count( mlt_manager self, int track ); -extern int mlt_manager_append_clip( mlt_manager self, int track, mlt_producer clip ); -extern int mlt_manager_append_clip_io( mlt_manager self, int track, mlt_producer clip, mlt_position in, mlt_position out ); -extern int mlt_manager_append_blank( mlt_manager self, int track, int length ); -extern int mlt_manager_insert_clip( mlt_manager self, int track, mlt_producer clip, mlt_position position ); -extern int mlt_manager_insert_clip_io( mlt_manager self, int track, mlt_position position, mlt_producer clip, mlt_position in, mlt_position out ); -extern int mlt_manager_insert_blank( mlt_manager self, int track, mlt_position position, int length ); -extern int mlt_manager_remove_clip( mlt_manager self, int track, int index ); -extern mlt_producer mlt_manager_get_clip( mlt_manager self, int track, int index, char *type, mlt_position *in, mlt_position *out ); -extern int mlt_manager_service_count( mlt_manager self ); -extern int mlt_manager_append_filter( mlt_manager self, mlt_filter that ); -extern int mlt_manager_append_transition( mlt_manager self, int index, mlt_transition that ); -extern int mlt_manager_insert_filter( mlt_manager self, int index, mlt_filter that ); -extern int mlt_manager_insert_transition( mlt_manager self, int index, mlt_transition that ); -extern int mlt_manager_remove_service( mlt_manager self, int index ); -extern mlt_service mlt_manager_get_service( mlt_manager self, int index, char *type ); -extern int mlt_manager_set_resource( mlt_manager self, char *resource ); -extern int mlt_manager_set_type( mlt_manager self, char *type ); - -#endif diff --git a/src/modules/core/Makefile b/src/modules/core/Makefile index 1842a828..86d0b44a 100644 --- a/src/modules/core/Makefile +++ b/src/modules/core/Makefile @@ -14,6 +14,7 @@ OBJS = factory.o \ filter_greyscale.o \ filter_luma.o \ filter_mirror.o \ + filter_mono.o \ filter_obscure.o \ filter_region.o \ filter_rescale.o \ diff --git a/src/modules/core/configure b/src/modules/core/configure index 338c2ea5..160844b9 100755 --- a/src/modules/core/configure +++ b/src/modules/core/configure @@ -19,6 +19,7 @@ gamma libmltcore$LIBSUF greyscale libmltcore$LIBSUF luma libmltcore$LIBSUF mirror libmltcore$LIBSUF +mono libmltcore$LIBSUF obscure libmltcore$LIBSUF region libmltcore$LIBSUF rescale libmltcore$LIBSUF diff --git a/src/modules/core/factory.c b/src/modules/core/factory.c index 860b64ae..bd3b3553 100644 --- a/src/modules/core/factory.c +++ b/src/modules/core/factory.c @@ -30,6 +30,7 @@ #include "filter_greyscale.h" #include "filter_luma.h" #include "filter_mirror.h" +#include "filter_mono.h" #include "filter_obscure.h" #include "filter_rescale.h" #include "filter_resize.h" @@ -73,6 +74,8 @@ void *mlt_create_filter( char *id, void *arg ) return filter_luma_init( arg ); if ( !strcmp( id, "mirror" ) ) return filter_mirror_init( arg ); + if ( !strcmp( id, "mono" ) ) + return filter_mono_init( arg ); if ( !strcmp( id, "obscure" ) ) return filter_obscure_init( arg ); if ( !strcmp( id, "region" ) ) diff --git a/src/modules/core/filter_mono.c b/src/modules/core/filter_mono.c new file mode 100644 index 00000000..b11fd1f6 --- /dev/null +++ b/src/modules/core/filter_mono.c @@ -0,0 +1,95 @@ +/* + * filter_mono.c -- mix all channels to a mono signal across n channels + * Copyright (C) 2003-2006 Ushodaya Enterprises Limited + * Author: Dan Dennedy + * + * 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_mono.h" + +#include + +#include +#include + +/** Get the audio. +*/ + +static int filter_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples ) +{ + // Get the properties of the a frame + mlt_properties properties = MLT_FRAME_PROPERTIES( frame ); + int channels_out = mlt_properties_get_int( properties, "mono.channels" ); + int i, j, size; + int16_t *new_buffer; + + // Get the producer's audio + mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples ); + + size = *samples * channels_out * sizeof( int16_t ); + new_buffer = mlt_pool_alloc( size ); + mlt_properties_set_data( properties, "audio", new_buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); + + // Mix + for ( i = 0; i < *samples; i++ ) + { + int16_t mixdown = 0; + for ( j = 0; j < *channels; j++ ) + mixdown += (*buffer)[ ( i * *channels ) + j ] / *channels; + for ( j = 0; j < channels_out; j++ ) + new_buffer[ ( i * channels_out ) + j ] = mixdown; + } + + // Apply results + *buffer = new_buffer; + *channels = channels_out; + + return 0; +} + +/** Filter processing. +*/ + +static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) +{ + mlt_properties properties = MLT_FILTER_PROPERTIES( this ); + mlt_properties frame_props = MLT_FRAME_PROPERTIES( frame ); + + // Propogate the parameters + mlt_properties_set_int( frame_props, "mono.channels", mlt_properties_get_int( properties, "channels" ) ); + + // Override the get_audio method + mlt_frame_push_audio( frame, filter_get_audio ); + + return frame; +} + +/** Constructor for the filter. +*/ + +mlt_filter filter_mono_init( char *arg ) +{ + mlt_filter this = mlt_filter_new( ); + if ( this != NULL ) + { + this->process = filter_process; + if ( arg != NULL ) + mlt_properties_set_int( MLT_FILTER_PROPERTIES( this ), "channels", atoi( arg ) ); + else + mlt_properties_set_int( MLT_FILTER_PROPERTIES( this ), "channels", 2 ); + } + return this; +} diff --git a/src/modules/core/filter_mono.h b/src/modules/core/filter_mono.h new file mode 100644 index 00000000..eac6e36a --- /dev/null +++ b/src/modules/core/filter_mono.h @@ -0,0 +1,28 @@ +/* + * filter_mono.h -- mix all channels to a mono signal across n channels + * Copyright (C) 2003-2006 Ushodaya Enterprises Limited + * Author: Dan Dennedy + * + * 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_MONO_H_ +#define _FILTER_MONO_H_ + +#include + +extern mlt_filter filter_mono_init( char *arg ); + +#endif -- 2.39.2