00001 #ifndef DENOISE_H
00002 #define DENOISE_H
00003
00004
00005
00006 #include "bchash.inc"
00007 #include "guicast.h"
00008 #include "mutex.h"
00009 #include "pluginaclient.h"
00010 #include "vframe.inc"
00011
00012 class DenoiseEffect;
00013 typedef enum { DECOMP, RECON } wavetype;
00014
00015 class DenoiseLevel : public BC_FPot
00016 {
00017 public:
00018 DenoiseLevel(DenoiseEffect *plugin, int x, int y);
00019 int handle_event();
00020 DenoiseEffect *plugin;
00021 };
00022
00023 class DenoiseWindow : public BC_Window
00024 {
00025 public:
00026 DenoiseWindow(DenoiseEffect *plugin, int x, int y);
00027 void create_objects();
00028 void update();
00029 int close_event();
00030 DenoiseLevel *scale;
00031 DenoiseEffect *plugin;
00032 };
00033
00034 PLUGIN_THREAD_HEADER(DenoiseEffect, DenoiseThread, DenoiseWindow)
00035
00036 class DenoiseConfig
00037 {
00038 public:
00039 DenoiseConfig();
00040 void copy_from(DenoiseConfig &that);
00041 int equivalent(DenoiseConfig &that);
00042 void interpolate(DenoiseConfig &prev,
00043 DenoiseConfig &next,
00044 int64_t prev_frame,
00045 int64_t next_frame,
00046 int64_t current_frame);
00047 double level;
00048 };
00049
00050 class Tree
00051 {
00052 public:
00053 Tree(int input_length, int levels);
00054 ~Tree();
00055
00056 int input_length;
00057 int levels;
00058 double **values;
00059 };
00060
00061 class WaveletCoeffs
00062 {
00063 public:
00064 WaveletCoeffs(double alpha, double beta);
00065 ~WaveletCoeffs();
00066
00067 double values[6];
00068 int length;
00069 };
00070
00071 class WaveletFilters
00072 {
00073 public:
00074 WaveletFilters(WaveletCoeffs *wave_coeffs, wavetype transform);
00075 ~WaveletFilters();
00076
00077 double g[6], h[6];
00078 int length;
00079 };
00080
00081 class DenoiseEffect : public PluginAClient
00082 {
00083 public:
00084 DenoiseEffect(PluginServer *server);
00085 ~DenoiseEffect();
00086
00087 int is_realtime();
00088 void read_data(KeyFrame *keyframe);
00089 void save_data(KeyFrame *keyframe);
00090 int process_realtime(int64_t size, double *input_ptr, double *output_ptr);
00091
00092
00093
00094
00095 int load_defaults();
00096 int save_defaults();
00097 void reset();
00098 void update_gui();
00099 void delete_dsp();
00100
00101 void process_window();
00102 double dot_product(double *data, double *filter, char filtlen);
00103 int convolve_dec_2(double *input_sequence,
00104 int64_t length,
00105 double *filter,
00106 int filtlen,
00107 double *output_sequence);
00108 int64_t decompose_branches(double *in_data,
00109 int64_t length,
00110 WaveletFilters *decomp_filter,
00111 double *out_low,
00112 double *out_high);
00113 int wavelet_decomposition(double *in_data,
00114 int64_t in_length,
00115 double **out_data);
00116 int tree_copy(double **output,
00117 double **input,
00118 int length,
00119 int levels);
00120 int threshold(int window_size, double gammas, int levels);
00121 double dot_product_even(double *data, double *filter, int filtlen);
00122 double dot_product_odd(double *data, double *filter, int filtlen);
00123 int convolve_int_2(double *input_sequence,
00124 int64_t length,
00125 double *filter,
00126 int filtlen,
00127 int sum_output,
00128 double *output_sequence);
00129 int64_t reconstruct_branches(double *in_low,
00130 double *in_high,
00131 int64_t in_length,
00132 WaveletFilters *recon_filter,
00133 double *output);
00134 int wavelet_reconstruction(double **in_data,
00135 int64_t in_length,
00136 double *out_data);
00137
00138
00139 PLUGIN_CLASS_MEMBERS(DenoiseConfig, DenoiseThread)
00140
00141
00142 double *input_buffer;
00143 int64_t input_size;
00144 int64_t input_allocation;
00145
00146 double *output_buffer;
00147 int64_t output_size;
00148 int64_t output_allocation;
00149 double *dsp_in;
00150 double *dsp_out;
00151
00152 double *dsp_iteration;
00153 Tree *ex_coeff_d, *ex_coeff_r, *ex_coeff_rn;
00154 WaveletCoeffs *wave_coeff_d, *wave_coeff_r;
00155 WaveletFilters *decomp_filter, *recon_filter;
00156
00157 double in_scale;
00158
00159 double out_scale;
00160
00161
00162 int64_t levels;
00163
00164
00165 int64_t iterations;
00166
00167 double alpha;
00168 double beta;
00169
00170 float output_level;
00171
00172 float noise_level;
00173 int64_t window_size;
00174 int first_window;
00175 int initialized;
00176 };
00177
00178
00179 #endif