X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fdcoffset%2Fdcoffset.C;fp=cinelerra-5.1%2Fplugins%2Fdcoffset%2Fdcoffset.C;h=8702ba5fb080ea5c43cff0a566cd602f62caa98c;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/dcoffset/dcoffset.C b/cinelerra-5.1/plugins/dcoffset/dcoffset.C new file mode 100644 index 00000000..8702ba5f --- /dev/null +++ b/cinelerra-5.1/plugins/dcoffset/dcoffset.C @@ -0,0 +1,111 @@ + +/* + * CINELERRA + * Copyright (C) 2009 Adam Williams + * + * 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 "clip.h" +#include "bchash.h" +#include "dcoffset.h" +#include "filexml.h" +#include "language.h" +#include "samples.h" +#include "transportque.h" + +#include "vframe.h" + +#include + + +#define WINDOW_SIZE 65536 + +REGISTER_PLUGIN(DCOffset) + + + + + + + + + +DCOffset::DCOffset(PluginServer *server) + : PluginAClient(server) +{ + need_collection = 1; + reference = 0; +} + +DCOffset::~DCOffset() +{ + delete reference; +} + +const char* DCOffset::plugin_title() { return _("DC Offset"); } +int DCOffset::is_realtime() { return 1; } + + + +int DCOffset::process_buffer(int64_t size, + Samples *buffer, + int64_t start_position, + int sample_rate) +{ + load_configuration(); + double *buffer_samples = buffer->get_data(); + double *reference_samples = !reference ? 0 : reference->get_data(); + + if(need_collection) + { + if(!reference) { + reference = new Samples(WINDOW_SIZE); + reference_samples = reference->get_data(); + } + int64_t collection_start = 0; + if(get_direction() == PLAY_REVERSE) + collection_start += WINDOW_SIZE; + read_samples(reference, + 0, + sample_rate, + collection_start, + WINDOW_SIZE); + offset = 0; + for(int i = 0; i < WINDOW_SIZE; i++) + { + offset += reference_samples[i]; + } + offset /= WINDOW_SIZE; + need_collection = 0; + } + + read_samples(buffer, + 0, + sample_rate, + start_position, + size); + + for(int i = 0; i < size; i++) + { + buffer_samples[i] -= offset; + } + + return 0; +} + + +