1 #ifndef __PLUGINFCLIENT_H__
2 #define __PLUGINFCLIENT_H__
6 #include "bclistboxitem.h"
8 #include "bcpopupmenu.h"
9 #include "bcmenuitem.h"
10 #include "bctextbox.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"
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"
33 class PluginFClient_OptName : public BC_ListBoxItem {
35 PluginFClient_Opt *opt;
37 PluginFClient_OptName(PluginFClient_Opt *opt);
40 class PluginFClient_OptValue : public BC_ListBoxItem {
42 PluginFClient_Opt *opt;
45 PluginFClient_OptValue(PluginFClient_Opt *opt);
48 class PluginFClient_Opt {
50 PluginFClientConfig *conf;
52 PluginFClient_OptName *item_name;
53 PluginFClient_OptValue *item_value;
55 char *get(char *vp, int sz=-1);
56 void set(const char *val);
58 int scalar(double d, char *rp);
60 int units(ArrayList<const AVOption *> &opts);
63 void *filter_config();
64 const AVClass *filter_class();
66 PluginFClient_Opt(PluginFClientConfig *conf, const AVOption *opt);
71 PluginFFilter(PluginFFilter &that) {} //disable assign/copy
75 AVFilterContext *fctx;
77 void *filter_config() { return fctx->priv; }
78 const AVClass *filter_class() { return filter->priv_class; }
79 const char *description() { return filter->description; }
81 int init(const char *name, PluginFClientConfig *conf);
83 static PluginFFilter *new_ffilter(const char *name, PluginFClientConfig *conf=0);
85 PluginClient* new_plugin(PluginServer*);
86 const char *filter_name() { return filter->name; }
94 class PluginFClientConfig : public ArrayList<PluginFClient_Opt *>
98 void *filter_config() { return ffilt->filter_config(); }
99 const AVClass *filter_class() { return ffilt->filter_class(); }
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);
107 void dump(FILE *fp=stdout);
109 PluginFClientConfig();
110 ~PluginFClientConfig();
114 class PluginFClient_OptPanel : public BC_ListBox {
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();
121 PluginFClientWindow *fwin;
122 ArrayList<BC_ListBoxItem*> items[2];
123 ArrayList<BC_ListBoxItem*> &opts;
124 ArrayList<BC_ListBoxItem*> &vals;
126 int selection_changed();
130 class PluginFClientReset : public BC_GenericButton {
132 PluginFClientWindow *fwin;
134 PluginFClientReset(PluginFClientWindow *fwin, int x, int y);
135 ~PluginFClientReset();
139 class PluginFClientUnits : public BC_PopupMenu {
141 PluginFClientWindow *fwin;
143 PluginFClientUnits(PluginFClientWindow *fwin, int x, int y, int w);
144 ~PluginFClientUnits();
148 class PluginFClientText : public BC_TextBox {
150 PluginFClientWindow *fwin;
152 PluginFClientText(PluginFClientWindow *fwin, int x, int y, int w);
153 ~PluginFClientText();
157 class PluginFClientApply : public BC_GenericButton {
159 PluginFClientWindow *fwin;
161 PluginFClientApply(PluginFClientWindow *fwin, int x, int y);
162 ~PluginFClientApply();
166 class PluginFClientWindow : public PluginClientWindow
169 PluginFClientWindow(PluginFClient *ffmpeg);
170 ~PluginFClientWindow();
172 void create_objects();
173 void update(PluginFClient_Opt *oip);
175 int resize_event(int w, int h);
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;
183 PluginFClientReset *reset;
184 PluginFClientUnits *units;
185 PluginFClientText *text;
186 PluginFClientApply *apply;
189 class PluginFLogLevel {
192 PluginFLogLevel(int lvl) {
193 level = av_log_get_level();
194 if( level > lvl ) av_log_set_level(lvl);
196 ~PluginFLogLevel() { av_log_set_level(level); }
199 class PluginFClient {
202 PluginClient *plugin;
203 PluginFFilter *ffilt;
204 AVFilterContext *fsrc, *fsink;
205 int64_t plugin_position, filter_position;
207 char title[BCSTRLEN];
209 PluginFClient(PluginClient *plugin, const char *name);
211 static bool is_audio(AVFilter *fp);
212 static bool is_video(AVFilter *fp);
214 int64_t get_source_position() {
215 return plugin->get_source_position();
217 KeyFrame* get_prev_keyframe(int64_t position, int is_local=1) {
218 return plugin->get_prev_keyframe(position, is_local);
220 KeyFrame* get_next_keyframe(int64_t position, int is_local=1) {
221 return plugin->get_next_keyframe(position, is_local);
223 int64_t edl_to_local(int64_t position) {
224 return plugin->edl_to_local(position);
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);
235 PluginFClientConfig curr_config, av_config;
236 PLUGIN_CLASS_MEMBERS(PluginFClientConfig)
239 class PluginFAClient : public PluginAClient, public PluginFClient
242 PluginFAClient(PluginServer *server, const char *name);
244 const char *plugin_title() { return PluginFClient::plugin_title(); }
245 PluginClientWindow *new_window() { return PluginFClient::new_window(); }
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); }
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);
263 class PluginFVClient : public PluginVClient, public PluginFClient, public FFVideoConvert
266 PluginFVClient(PluginServer *server, const char *name);
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);
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); }
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);