prevent popup deactivation while button_down
[goodguy/history.git] / cinelerra-5.0 / cinelerra / pluginfclient.h
1 #ifndef __PLUGINFCLIENT_H__
2 #define __PLUGINFCLIENT_H__
3
4 #include "arraylist.h"
5 #include "bclistbox.h"
6 #include "bclistboxitem.h"
7 #include "bcbutton.h"
8 #include "bcpopupmenu.h"
9 #include "bcmenuitem.h"
10 #include "bctextbox.h"
11 #include "ffmpeg.h"
12 #include "pluginclient.h"
13 #include "pluginaclient.h"
14 #include "pluginvclient.h"
15 #include "pluginserver.h"
16 #include "pluginfclient.inc"
17 #include "preferences.inc"
18
19 extern "C" {
20 #include "libavfilter/buffersrc.h"
21 #include "libavfilter/buffersink.h"
22 #include "libavformat/avformat.h"
23 #include "libavformat/avio.h"
24 #include "libavcodec/avcodec.h"
25 #include "libavfilter/avfilter.h"
26 #include "libavutil/avutil.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/pixdesc.h"
29 #include "libswresample/swresample.h"
30 #include "libswscale/swscale.h"
31 }
32
33 class PluginFClient_OptName : public BC_ListBoxItem {
34 public:
35         PluginFClient_Opt *opt;
36
37         PluginFClient_OptName(PluginFClient_Opt *opt);
38 };
39
40 class PluginFClient_OptValue : public BC_ListBoxItem {
41 public:
42         PluginFClient_Opt *opt;
43
44         void update();
45         PluginFClient_OptValue(PluginFClient_Opt *opt);
46 };
47
48 class PluginFClient_Opt {
49 public:
50         PluginFClientConfig *conf;
51         const AVOption *opt;
52         PluginFClient_OptName *item_name;
53         PluginFClient_OptValue *item_value;
54
55         char *get(char *vp, int sz=-1);
56         void set(const char *val);
57         int types(char *rp);
58         int scalar(double d, char *rp);
59         int ranges(char *rp);
60         int units(ArrayList<const AVOption *> &opts);
61         int units(char *rp);
62         const char *tip();
63         void *filter_config();
64         const AVClass *filter_class();
65
66         PluginFClient_Opt(PluginFClientConfig *conf, const AVOption *opt);
67         ~PluginFClient_Opt();
68 };
69
70 class PluginFFilter {
71         PluginFFilter(PluginFFilter &that) {} //disable assign/copy
72 public:
73         AVFilter *filter;
74         AVFilterGraph *graph;
75         AVFilterContext *fctx;
76
77         void *filter_config() { return fctx->priv; }
78         const AVClass *filter_class() { return filter->priv_class; }
79         const char *description() { return filter->description; }
80
81         int init(const char *name, PluginFClientConfig *conf);
82         void uninit();
83         static PluginFFilter *new_ffilter(const char *name, PluginFClientConfig *conf=0);
84
85         PluginClient* new_plugin(PluginServer*);
86         const char *filter_name() { return filter->name; }
87         bool is_audio();
88         bool is_video();
89
90         PluginFFilter();
91         ~PluginFFilter();
92 };
93
94 class PluginFClientConfig : public ArrayList<PluginFClient_Opt *>
95 {
96 public:
97         PluginFFilter *ffilt;
98         void *filter_config() { return ffilt->filter_config(); }
99         const AVClass *filter_class() { return ffilt->filter_class(); }
100
101         void copy_from(PluginFClientConfig &that);
102         int equivalent(PluginFClientConfig &that);
103         void interpolate(PluginFClientConfig &prev, PluginFClientConfig &next,
104                 int64_t prev_frame, int64_t next_frame, int64_t current_frame);
105         void initialize(const char *name);
106         int update();
107         void dump(FILE *fp=stdout);
108
109         PluginFClientConfig();
110         ~PluginFClientConfig();
111 };
112
113
114 class PluginFClient_OptPanel : public BC_ListBox {
115 public:
116         PluginFClient_OptPanel(PluginFClientWindow *fwin, int x, int y, int w, int h);
117         ~PluginFClient_OptPanel();
118         void create_objects();
119         int cursor_leave_event();
120
121         PluginFClientWindow *fwin;
122         ArrayList<BC_ListBoxItem*> items[2];
123         ArrayList<BC_ListBoxItem*> &opts;
124         ArrayList<BC_ListBoxItem*> &vals;
125
126         int selection_changed();
127         int update();
128 };
129
130 class PluginFClientReset : public BC_GenericButton {
131 public:
132         PluginFClientWindow *fwin;
133
134         PluginFClientReset(PluginFClientWindow *fwin, int x, int y);
135         ~PluginFClientReset();
136         int handle_event();
137 };
138
139 class PluginFClientUnits : public BC_PopupMenu {
140 public:
141         PluginFClientWindow *fwin;
142
143         PluginFClientUnits(PluginFClientWindow *fwin, int x, int y, int w);
144         ~PluginFClientUnits();
145         int handle_event();
146 };
147
148 class PluginFClientText : public BC_TextBox {
149 public:
150         PluginFClientWindow *fwin;
151
152         PluginFClientText(PluginFClientWindow *fwin, int x, int y, int w);
153         ~PluginFClientText();
154         int handle_event();
155 };
156
157 class PluginFClientApply : public BC_GenericButton {
158 public:
159         PluginFClientWindow *fwin;
160
161         PluginFClientApply(PluginFClientWindow *fwin, int x, int y);
162         ~PluginFClientApply();
163         int handle_event();
164 };
165
166 class PluginFClientWindow : public PluginClientWindow
167 {
168 public:
169         PluginFClientWindow(PluginFClient *ffmpeg);
170         ~PluginFClientWindow();
171
172         void create_objects();
173         void update(PluginFClient_Opt *oip);
174         void draw();
175         int resize_event(int w, int h);
176
177         PluginFClient *ffmpeg;
178         PluginFClient_OptPanel *panel;
179         int panel_x, panel_y, panel_w, panel_h;
180         BC_Title *type, *range;
181         PluginFClient_Opt *selected;
182
183         PluginFClientReset *reset;
184         PluginFClientUnits *units;
185         PluginFClientText *text;
186         PluginFClientApply *apply;
187 };
188
189 class PluginFLogLevel {
190         int level;
191 public:
192         PluginFLogLevel(int lvl) {
193                 level = av_log_get_level();
194                 if( level > lvl ) av_log_set_level(lvl);
195         }
196         ~PluginFLogLevel() { av_log_set_level(level); }
197 };
198
199 class PluginFClient {
200 public:
201         const char *name;
202         PluginClient *plugin;
203         PluginFFilter *ffilt;
204         AVFilterContext *fsrc, *fsink;
205         int64_t plugin_position, filter_position;
206         int activated;
207         char title[BCSTRLEN];
208
209         PluginFClient(PluginClient *plugin, const char *name);
210         ~PluginFClient();
211         static bool is_audio(AVFilter *fp);
212         static bool is_video(AVFilter *fp);
213
214         int64_t get_source_position() {
215                 return plugin->get_source_position();
216         }
217         KeyFrame* get_prev_keyframe(int64_t position, int is_local=1) {
218                 return plugin->get_prev_keyframe(position, is_local);
219         }
220         KeyFrame* get_next_keyframe(int64_t position, int is_local=1) {
221                 return plugin->get_next_keyframe(position, is_local);
222         }
223         int64_t edl_to_local(int64_t position) {
224                 return plugin->edl_to_local(position);
225         }
226
227         void update_gui();
228         char *to_upper(char *bp, const char *sp);
229         void save_data(KeyFrame *keyframe);
230         void read_data(KeyFrame *keyframe);
231         void render_gui(void *data, int size);
232         int activate();
233         void reactivate();
234
235         PluginFClientConfig curr_config, av_config;
236         PLUGIN_CLASS_MEMBERS(PluginFClientConfig)
237 };
238
239 class PluginFAClient : public PluginAClient, public PluginFClient
240 {
241 public:
242         PluginFAClient(PluginServer *server, const char *name);
243         ~PluginFAClient();
244         const char *plugin_title() { return PluginFClient::plugin_title(); }
245         PluginClientWindow *new_window() { return PluginFClient::new_window(); }
246         int activate();
247
248         int load_configuration() { return PluginFClient::load_configuration(); }
249         void save_data(KeyFrame *keyframe) { PluginFClient::save_data(keyframe); }
250         void read_data(KeyFrame *keyframe) { PluginFClient::read_data(keyframe); }
251         void update_gui() { PluginFClient::update_gui(); }
252         void render_gui(void *data, int size) { PluginFClient::render_gui(data, size); }
253
254         int is_realtime() { return 1; }
255         int is_multichannel() { return 1; }
256         int uses_gui() { return 1; }
257         int is_synthesis() { return 1; }
258         int get_inchannels();
259         int get_outchannels();
260         int process_buffer(int64_t size, Samples **buffer, int64_t start_position, int sample_rate);
261 };
262
263 class PluginFVClient : public PluginVClient, public PluginFClient, public FFVideoConvert
264 {
265 public:
266         PluginFVClient(PluginServer *server, const char *name);
267         ~PluginFVClient();
268         const char *plugin_title() { return PluginFClient::plugin_title(); }
269         PluginClientWindow *new_window() { return PluginFClient::new_window(); }
270         int activate(int width, int height, int color_model);
271
272         int load_configuration() { return PluginFClient::load_configuration(); }
273         void save_data(KeyFrame *keyframe) { PluginFClient::save_data(keyframe); }
274         void read_data(KeyFrame *keyframe) { PluginFClient::read_data(keyframe); }
275         void update_gui() { PluginFClient::update_gui(); }
276         void render_gui(void *data, int size) { PluginFClient::render_gui(data, size); }
277
278         int is_realtime() { return 1; }
279         int is_multichannel() { return 1; }
280         int uses_gui() { return 1; }
281         int is_synthesis() { return 1; }
282         int process_buffer(VFrame **frames, int64_t start_position, double frame_rate);
283 };
284
285 #endif