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.
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.
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
19 #ifndef __PLUGINFCLIENT_H__
20 #define __PLUGINFCLIENT_H__
22 #include "arraylist.h"
23 #include "bclistbox.h"
24 #include "bclistboxitem.h"
26 #include "bcpopupmenu.h"
27 #include "bcmenuitem.h"
28 #include "bctextbox.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"
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"
51 class PluginFClient_OptName : public BC_ListBoxItem {
53 PluginFClient_Opt *opt;
55 PluginFClient_OptName(PluginFClient_Opt *opt);
58 class PluginFClient_OptValue : public BC_ListBoxItem {
60 PluginFClient_Opt *opt;
63 PluginFClient_OptValue(PluginFClient_Opt *opt);
66 class PluginFClient_Opt {
68 PluginFClientConfig *conf;
70 PluginFClient_OptName *item_name;
71 PluginFClient_OptValue *item_value;
73 char *get(char *vp, int sz=-1);
74 void set(const char *val);
76 int scalar(double d, char *rp);
78 int units(ArrayList<const AVOption *> &opts);
80 int get_range(float &fmn, float &fmx);
82 void set_float(float v);
85 void *filter_config();
86 const AVClass *filter_class();
88 PluginFClient_Opt(PluginFClientConfig *conf, const AVOption *opt);
93 PluginFFilter(PluginFFilter &that) {} //disable assign/copy
95 const AVFilter *filter;
97 AVFilterContext *fctx;
99 void *filter_config() { return fctx->priv; }
100 const AVClass *filter_class() { return filter->priv_class; }
101 const char *description() { return filter->description; }
103 int init(const char *name, PluginFClientConfig *conf);
105 static PluginFFilter *new_ffilter(const char *name, PluginFClientConfig *conf=0);
107 PluginClient* new_plugin(PluginServer*);
108 const char *filter_name() { return filter->name; }
116 class PluginFClientConfig : public ArrayList<PluginFClient_Opt *>
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); }
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);
132 void dump(FILE *fp=stdout);
134 PluginFClientConfig();
135 ~PluginFClientConfig();
139 class PluginFClient_OptPanel : public BC_ListBox {
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();
146 PluginFClientWindow *fwin;
147 ArrayList<BC_ListBoxItem*> items[2];
148 ArrayList<BC_ListBoxItem*> &opts;
149 ArrayList<BC_ListBoxItem*> &vals;
151 int selection_changed();
155 class PluginFClientReset : public BC_GenericButton {
157 PluginFClientWindow *fwin;
159 PluginFClientReset(PluginFClientWindow *fwin, int x, int y);
160 ~PluginFClientReset();
164 class PluginFClientUnits : public BC_PopupMenu {
166 PluginFClientWindow *fwin;
168 PluginFClientUnits(PluginFClientWindow *fwin, int x, int y, int w);
169 ~PluginFClientUnits();
173 class PluginFClientText : public BC_TextBox {
175 PluginFClientWindow *fwin;
177 PluginFClientText(PluginFClientWindow *fwin, int x, int y, int w);
178 ~PluginFClientText();
182 class PluginFClientApply : public BC_GenericButton {
184 PluginFClientWindow *fwin;
186 PluginFClientApply(PluginFClientWindow *fwin, int x, int y);
187 ~PluginFClientApply();
191 class PluginFClientPot : public BC_FPot
194 PluginFClientPot(PluginFClientWindow *fwin, int x, int y);
196 PluginFClientWindow *fwin;
199 class PluginFClientSlider : public BC_FSlider
202 PluginFClientSlider(PluginFClientWindow *fwin, int x, int y);
204 PluginFClientWindow *fwin;
207 class PluginFClientWindow : public PluginClientWindow
210 PluginFClientWindow(PluginFClient *ffmpeg);
211 ~PluginFClientWindow();
213 void create_objects();
214 void update(PluginFClient_Opt *oip);
216 void update_selected();
218 int resize_event(int w, int h);
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;
226 PluginFClientReset *reset;
227 PluginFClientUnits *units;
228 PluginFClientText *text;
229 PluginFClientApply *apply;
230 PluginFClientPot *pot;
231 PluginFClientSlider *slider;
234 class PluginFLogLevel {
237 PluginFLogLevel(int lvl) {
238 level = av_log_get_level();
239 if( level > lvl ) av_log_set_level(lvl);
241 ~PluginFLogLevel() { av_log_set_level(level); }
244 class PluginFClient {
247 PluginClient *plugin;
248 PluginFFilter *ffilt;
249 AVFilterContext *fsrc, *fsink;
250 int64_t plugin_position, filter_position;
252 char title[BCSTRLEN];
254 PluginFClient(PluginClient *plugin, const char *name);
256 static bool is_audio(const AVFilter *fp);
257 static bool is_video(const AVFilter *fp);
259 int64_t get_source_position() {
260 return plugin->get_source_position();
262 KeyFrame* get_prev_keyframe(int64_t position, int is_local=1) {
263 return plugin->get_prev_keyframe(position, is_local);
265 KeyFrame* get_next_keyframe(int64_t position, int is_local=1) {
266 return plugin->get_next_keyframe(position, is_local);
268 int64_t edl_to_local(int64_t position) {
269 return plugin->edl_to_local(position);
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);
280 PluginFClientConfig curr_config;
281 PLUGIN_CLASS_MEMBERS(PluginFClientConfig)
284 class PluginFAClient : public PluginAClient, public PluginFClient
287 PluginFAClient(PluginServer *server, const char *name);
289 const char *plugin_title() { return PluginFClient::plugin_title(); }
290 PluginClientWindow *new_window() { return PluginFClient::new_window(); }
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); }
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);
308 class PluginFVClient : public PluginVClient, public PluginFClient, public FFVideoConvert
311 PluginFVClient(PluginServer *server, const char *name);
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);
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); }
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);