Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / pluginfclient.h
1 /*
2  * This program is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU General Public License as published
4  * by the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful, but
8  * WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  * General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public
13  * License along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
15  * USA
16  */
17
18
19 #ifndef __PLUGINFCLIENT_H__
20 #define __PLUGINFCLIENT_H__
21
22 #include "arraylist.h"
23 #include "bclistbox.h"
24 #include "bclistboxitem.h"
25 #include "bcbutton.h"
26 #include "bcpopupmenu.h"
27 #include "bcmenuitem.h"
28 #include "bctextbox.h"
29 #include "ffmpeg.h"
30 #include "pluginclient.h"
31 #include "pluginaclient.h"
32 #include "pluginvclient.h"
33 #include "pluginserver.h"
34 #include "pluginfclient.inc"
35 #include "preferences.inc"
36
37 extern "C" {
38 #include "libavfilter/buffersrc.h"
39 #include "libavfilter/buffersink.h"
40 #include "libavformat/avformat.h"
41 #include "libavformat/avio.h"
42 #include "libavcodec/avcodec.h"
43 #include "libavfilter/avfilter.h"
44 #include "libavutil/avutil.h"
45 #include "libavutil/opt.h"
46 #include "libavutil/pixdesc.h"
47 #include "libswresample/swresample.h"
48 #include "libswscale/swscale.h"
49 }
50
51 class PluginFClient_OptName : public BC_ListBoxItem {
52 public:
53         PluginFClient_Opt *opt;
54
55         PluginFClient_OptName(PluginFClient_Opt *opt);
56 };
57
58 class PluginFClient_OptValue : public BC_ListBoxItem {
59 public:
60         PluginFClient_Opt *opt;
61
62         void update();
63         PluginFClient_OptValue(PluginFClient_Opt *opt);
64 };
65
66 class PluginFClient_Opt {
67 public:
68         PluginFClientConfig *conf;
69         const AVOption *opt;
70         PluginFClient_OptName *item_name;
71         PluginFClient_OptValue *item_value;
72
73         char *get(char *vp, int sz=-1);
74         void set(const char *val);
75         int types(char *rp);
76         int scalar(double d, char *rp);
77         int ranges(char *rp);
78         int units(ArrayList<const AVOption *> &opts);
79         int units(char *rp);
80         int get_range(float &fmn, float &fmx);
81         float get_float();
82         void set_float(float v);
83
84         const char *tip();
85         void *filter_config();
86         const AVClass *filter_class();
87
88         PluginFClient_Opt(PluginFClientConfig *conf, const AVOption *opt);
89         ~PluginFClient_Opt();
90 };
91
92 class PluginFFilter {
93         PluginFFilter(PluginFFilter &that) {} //disable assign/copy
94 public:
95         const AVFilter *filter;
96         AVFilterGraph *graph;
97         AVFilterContext *fctx;
98
99         void *filter_config() { return fctx->priv; }
100         const AVClass *filter_class() { return filter->priv_class; }
101         const char *description() { return filter->description; }
102
103         int init(const char *name, PluginFClientConfig *conf);
104         void uninit();
105         static PluginFFilter *new_ffilter(const char *name, PluginFClientConfig *conf=0);
106
107         PluginClient* new_plugin(PluginServer*);
108         const char *filter_name() { return filter->name; }
109         bool is_audio();
110         bool is_video();
111
112         PluginFFilter();
113         ~PluginFFilter();
114 };
115
116 class PluginFClientConfig : public ArrayList<PluginFClient_Opt *>
117 {
118 public:
119         PluginFFilter *ffilt;
120         void *filter_config() { return ffilt->filter_config(); }
121         const AVClass *filter_class() { return ffilt->filter_class(); }
122         PluginFClient_Opt *get(int i) { return ArrayList<PluginFClient_Opt *>::get(i); }
123
124         const char *get(const char *name);
125         void set(const char *name, const char *val);
126         void copy_from(PluginFClientConfig &that);
127         int equivalent(PluginFClientConfig &that);
128         void interpolate(PluginFClientConfig &prev, PluginFClientConfig &next,
129                 int64_t prev_frame, int64_t next_frame, int64_t current_frame);
130         void initialize(const char *name);
131         int update();
132         void dump(FILE *fp=stdout);
133
134         PluginFClientConfig();
135         ~PluginFClientConfig();
136 };
137
138
139 class PluginFClient_OptPanel : public BC_ListBox {
140 public:
141         PluginFClient_OptPanel(PluginFClientWindow *fwin, int x, int y, int w, int h);
142         ~PluginFClient_OptPanel();
143         void create_objects();
144         int cursor_leave_event();
145
146         PluginFClientWindow *fwin;
147         ArrayList<BC_ListBoxItem*> items[2];
148         ArrayList<BC_ListBoxItem*> &opts;
149         ArrayList<BC_ListBoxItem*> &vals;
150
151         int selection_changed();
152         int update();
153 };
154
155 class PluginFClientReset : public BC_GenericButton {
156 public:
157         PluginFClientWindow *fwin;
158
159         PluginFClientReset(PluginFClientWindow *fwin, int x, int y);
160         ~PluginFClientReset();
161         int handle_event();
162 };
163
164 class PluginFClientUnits : public BC_PopupMenu {
165 public:
166         PluginFClientWindow *fwin;
167
168         PluginFClientUnits(PluginFClientWindow *fwin, int x, int y, int w);
169         ~PluginFClientUnits();
170         int handle_event();
171 };
172
173 class PluginFClientText : public BC_TextBox {
174 public:
175         PluginFClientWindow *fwin;
176
177         PluginFClientText(PluginFClientWindow *fwin, int x, int y, int w);
178         ~PluginFClientText();
179         int handle_event();
180 };
181
182 class PluginFClientApply : public BC_GenericButton {
183 public:
184         PluginFClientWindow *fwin;
185
186         PluginFClientApply(PluginFClientWindow *fwin, int x, int y);
187         ~PluginFClientApply();
188         int handle_event();
189 };
190
191 class PluginFClientPot : public BC_FPot
192 {
193 public:
194         PluginFClientPot(PluginFClientWindow *fwin, int x, int y);
195         int handle_event();
196         PluginFClientWindow *fwin;
197 };
198
199 class PluginFClientSlider : public BC_FSlider
200 {
201 public:
202         PluginFClientSlider(PluginFClientWindow *fwin, int x, int y);
203         int handle_event();
204         PluginFClientWindow *fwin;
205 };
206
207 class PluginFClientWindow : public PluginClientWindow
208 {
209 public:
210         PluginFClientWindow(PluginFClient *ffmpeg);
211         ~PluginFClientWindow();
212
213         void create_objects();
214         void update(PluginFClient_Opt *oip);
215         int update();
216         void update_selected();
217         void draw();
218         int resize_event(int w, int h);
219
220         PluginFClient *ffmpeg;
221         PluginFClient_OptPanel *panel;
222         int panel_x, panel_y, panel_w, panel_h;
223         BC_Title *type, *range;
224         PluginFClient_Opt *selected;
225
226         PluginFClientReset *reset;
227         PluginFClientUnits *units;
228         PluginFClientText *text;
229         PluginFClientApply *apply;
230         PluginFClientPot *pot;
231         PluginFClientSlider *slider;
232 };
233
234 class PluginFLogLevel {
235         int level;
236 public:
237         PluginFLogLevel(int lvl) {
238                 level = av_log_get_level();
239                 if( level > lvl ) av_log_set_level(lvl);
240         }
241         ~PluginFLogLevel() { av_log_set_level(level); }
242 };
243
244 class PluginFClient {
245 public:
246         const char *name;
247         PluginClient *plugin;
248         PluginFFilter *ffilt;
249         AVFilterContext *fsrc, *fsink;
250         int64_t plugin_position, filter_position;
251         int activated;
252         char title[BCSTRLEN];
253
254         PluginFClient(PluginClient *plugin, const char *name);
255         ~PluginFClient();
256         static bool is_audio(const AVFilter *fp);
257         static bool is_video(const AVFilter *fp);
258
259         int64_t get_source_position() {
260                 return plugin->get_source_position();
261         }
262         KeyFrame* get_prev_keyframe(int64_t position, int is_local=1) {
263                 return plugin->get_prev_keyframe(position, is_local);
264         }
265         KeyFrame* get_next_keyframe(int64_t position, int is_local=1) {
266                 return plugin->get_next_keyframe(position, is_local);
267         }
268         int64_t edl_to_local(int64_t position) {
269                 return plugin->edl_to_local(position);
270         }
271
272         void update_gui();
273         char *to_upper(char *bp, const char *sp);
274         void save_data(KeyFrame *keyframe);
275         void read_data(KeyFrame *keyframe);
276         void render_gui(void *data, int size);
277         int activate();
278         void reactivate();
279
280         PluginFClientConfig curr_config;
281         PLUGIN_CLASS_MEMBERS(PluginFClientConfig)
282 };
283
284 class PluginFAClient : public PluginAClient, public PluginFClient
285 {
286 public:
287         PluginFAClient(PluginServer *server, const char *name);
288         ~PluginFAClient();
289         const char *plugin_title() { return PluginFClient::plugin_title(); }
290         PluginClientWindow *new_window() { return PluginFClient::new_window(); }
291         int activate();
292
293         int load_configuration() { return PluginFClient::load_configuration(); }
294         void save_data(KeyFrame *keyframe) { PluginFClient::save_data(keyframe); }
295         void read_data(KeyFrame *keyframe) { PluginFClient::read_data(keyframe); }
296         void update_gui() { PluginFClient::update_gui(); }
297         void render_gui(void *data, int size) { PluginFClient::render_gui(data, size); }
298
299         int is_realtime() { return 1; }
300         int is_multichannel() { return 1; }
301         int uses_gui() { return 1; }
302         int is_synthesis() { return 1; }
303         int get_inchannels();
304         int get_outchannels();
305         int process_buffer(int64_t size, Samples **buffer, int64_t start_position, int sample_rate);
306 };
307
308 class PluginFVClient : public PluginVClient, public PluginFClient, public FFVideoConvert
309 {
310 public:
311         PluginFVClient(PluginServer *server, const char *name);
312         ~PluginFVClient();
313         const char *plugin_title() { return PluginFClient::plugin_title(); }
314         PluginClientWindow *new_window() { return PluginFClient::new_window(); }
315         int activate(int width, int height, int color_model);
316
317         int load_configuration() { return PluginFClient::load_configuration(); }
318         void save_data(KeyFrame *keyframe) { PluginFClient::save_data(keyframe); }
319         void read_data(KeyFrame *keyframe) { PluginFClient::read_data(keyframe); }
320         void update_gui() { PluginFClient::update_gui(); }
321         void render_gui(void *data, int size) { PluginFClient::render_gui(data, size); }
322
323         int is_realtime() { return 1; }
324         int is_multichannel() { return 1; }
325         int uses_gui() { return 1; }
326         int is_synthesis() { return 1; }
327         int process_buffer(VFrame **frames, int64_t start_position, double frame_rate);
328 };
329
330 #endif