1 #ifndef __FILEFFMPEG_H__
2 #define __FILEFFMPEG_H__
6 #include "bcwindowbase.inc"
7 #include "bitspopup.inc"
10 #include "fileffmpeg.inc"
11 #include "indexfile.inc"
12 #include "mainprogress.inc"
24 class FileFFMPEG : public FileBase
29 FileFFMPEG(Asset *asset, File *file);
31 static void ff_lock(const char *cp=0);
32 static void ff_unlock();
34 static void set_parameters(char *cp, int len, const char *bp);
35 static void get_parameters(BC_WindowBase *parent_window,Asset *asset,
36 BC_WindowBase *&format_window,int audio_options,int video_options);
37 static int check_sig(Asset *asset);
38 int get_best_colormodel(int driver, int vstream);
39 int get_video_info(int track, int &pid, double &framerate,
40 int &width, int &height, char *title=0);
41 int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
42 static void get_info(char *path,char *text,int len);
43 static int can_render(const char *fformat, const char *type);
44 static int renders_audio(const char *fformat) { return can_render(fformat, "audio"); }
45 static int renders_video(const char *fformat) { return can_render(fformat, "video"); }
46 static int get_ff_option(const char *nm, const char *options, char *value);
47 int open_file(int rd,int wr);
48 int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
50 int write_samples(double **buffer,int64_t len);
51 int write_frames(VFrame ***frames,int len);
52 int read_samples(double *buffer,int64_t len);
53 int read_frame(VFrame *frame);
54 int can_scale_input() { return 1; }
55 int64_t get_memory_usage(void);
56 int colormodel_supported(int colormodel);
57 static int get_best_colormodel(Asset *asset, int driver);
58 int select_video_stream(Asset *asset, int vstream);
59 int select_audio_stream(Asset *asset, int astream);
62 class FFMpegConfigNum : public BC_TumbleTextBox
65 FFMpegConfigNum(BC_Window *window, int x, int y,
66 char *title_text, int *output);
69 void create_objects();
70 int update_param(const char *param, const char *opts);
79 class FFMpegAudioNum : public FFMpegConfigNum
82 FFMpegAudioNum(BC_Window *window, int x, int y, char *title_text, int *output);
85 FFMPEGConfigAudio *window() { return (FFMPEGConfigAudio *)FFMpegConfigNum::window; }
88 class FFMpegAudioBitrate : public FFMpegAudioNum
91 FFMpegAudioBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
92 : FFMpegAudioNum(window, x, y, title_text, output) {}
96 class FFMpegAudioQuality : public FFMpegAudioNum
99 FFMpegAudioQuality(BC_Window *window, int x, int y, char *title_text, int *output)
100 : FFMpegAudioNum(window, x, y, title_text, output) {}
104 class FFMpegVideoNum : public FFMpegConfigNum
107 FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
110 FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
113 class FFMpegVideoBitrate : public FFMpegVideoNum
116 FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
117 : FFMpegVideoNum(window, x, y, title_text, output) {}
121 class FFMpegVideoQuality : public FFMpegVideoNum
124 FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
125 : FFMpegVideoNum(window, x, y, title_text, output) {}
129 class FFMPEGConfigAudio : public BC_Window
132 FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
133 ~FFMPEGConfigAudio();
135 void create_objects();
138 ArrayList<BC_ListBoxItem*> presets;
139 FFMPEGConfigAudioPopup *preset_popup;
140 FFMpegAudioBitrate *bitrate;
141 FFMpegAudioQuality *quality;
142 FFAudioOptions *audio_options;
143 BC_WindowBase *parent_window;
145 FFOptionsDialog *ff_options_dialog;
148 class FFAudioOptions : public BC_ScrollTextBox
151 FFAudioOptions(FFMPEGConfigAudio *audio_popup,
152 int x, int y, int w, int rows, int size, char *text);
154 FFMPEGConfigAudio *audio_popup;
158 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
161 FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
163 FFMPEGConfigAudio *popup;
167 class FFMPEGConfigAudioToggle : public BC_CheckBox
170 FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
171 char *title_text, int x, int y, int *output);
174 FFMPEGConfigAudio *popup;
177 class FFMPEGConfigVideo : public BC_Window
180 FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
181 ~FFMPEGConfigVideo();
183 void create_objects();
186 ArrayList<BC_ListBoxItem*> presets;
187 FFMPEGConfigVideoPopup *preset_popup;
188 BC_WindowBase *parent_window;
189 FFMpegVideoBitrate *bitrate;
190 FFMpegVideoQuality *quality;
191 FFVideoOptions *video_options;
193 FFOptionsDialog *ff_options_dialog;
196 class FFVideoOptions : public BC_ScrollTextBox
199 FFVideoOptions(FFMPEGConfigVideo *video_popup,
200 int x, int y, int w, int rows, int size, char *text);
202 FFMPEGConfigVideo *video_popup;
205 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
208 FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
210 FFMPEGConfigVideo *popup;
213 class FFMPEGConfigVideoToggle : public BC_CheckBox
216 FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
217 char *title_text, int x, int y, int *output);
220 FFMPEGConfigVideo *popup;
223 class FFMPEGScanProgress : public Thread
226 IndexFile *index_file;
227 MainProgressBar *progress_bar;
228 char progress_title[BCTEXTLEN];
229 int64_t length, *position;
232 FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
233 const char *title, int64_t length, int64_t *position, int *canceled);
234 ~FFMPEGScanProgress();
239 class FFOptions_OptName : public BC_ListBoxItem {
243 FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
244 ~FFOptions_OptName();
248 class FFOptions_OptValue : public BC_ListBoxItem {
253 void update(const char *v);
254 FFOptions_OptValue(FFOptions_Opt *opt);
257 class FFOptions_Opt {
261 FFOptions_OptName *item_name;
262 FFOptions_OptValue *item_value;
264 char *get(char *vp, int sz=-1);
265 void set(const char *val);
267 int scalar(double d, char *rp);
268 int ranges(char *rp);
269 int units(ArrayList<const char *> &opts);
270 const char *unit_name(int id);
274 FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
278 class FFOptions : public ArrayList<FFOptions_Opt *>
283 FFOptionsWindow *win;
284 AVCodecContext *avctx;
287 void initialize(FFOptionsWindow *win, int k);
288 static int cmpr(const void *a, const void *b);
293 class FFOptions_OptPanel : public BC_ListBox {
295 FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
296 ~FFOptions_OptPanel();
297 void create_objects();
298 int cursor_leave_event();
300 FFOptionsWindow *fwin;
301 ArrayList<BC_ListBoxItem*> items[2];
302 ArrayList<BC_ListBoxItem*> &opts;
303 ArrayList<BC_ListBoxItem*> &vals;
304 char tip_text[BCTEXTLEN];
306 int selection_changed();
308 void show_tip(const char *tip);
311 class FFOptionsKindItem : public BC_MenuItem
319 FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
320 ~FFOptionsKindItem();
323 class FFOptionsKind : public BC_PopupMenu
325 static const char *kinds[];
327 FFOptionsWindow *fwin;
330 void create_objects();
334 FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
338 class FFOptionsUnits : public BC_PopupMenu {
340 FFOptionsWindow *fwin;
342 FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
347 class FFOptionsText : public BC_TextBox {
349 FFOptionsWindow *fwin;
351 FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
356 class FFOptionsApply : public BC_GenericButton {
358 FFOptionsWindow *fwin;
360 FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
365 class FFOptionsWindow : public BC_Window
368 FFOptionsWindow(FFOptionsDialog *dialog);
371 void create_objects();
372 void update(FFOptions_Opt *oip);
374 int resize_event(int w, int h);
376 FFOptionsDialog *dialog;
379 FFOptions_OptPanel *panel;
380 int panel_x, panel_y, panel_w, panel_h;
381 BC_Title *type, *range, *kind_title;
382 FFOptions_Opt *selected;
385 FFOptionsUnits *units;
387 FFOptionsApply *apply;
390 class FFOptionsDialog : public BC_DialogThread
395 virtual void update_options(const char *options) = 0;
397 void load_options(const char *bp, int len);
398 void store_options(char *cp, int len);
399 void start(const char *format_name, const char *codec_name,
400 AVCodec *codec, const char *options, int len);
401 BC_Window* new_gui();
402 void handle_done_event(int result);
404 FFOptionsWindow *options_window;
405 const char *format_name, *codec_name;
407 AVDictionary *ff_opts;
411 class FFOptionsAudioDialog : public FFOptionsDialog
414 FFMPEGConfigAudio *aud_config;
415 void update_options(const char *options);
417 FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
418 ~FFOptionsAudioDialog();
421 class FFOptionsVideoDialog : public FFOptionsDialog
424 FFMPEGConfigVideo *vid_config;
425 void update_options(const char *options);
427 FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
428 ~FFOptionsVideoDialog();
431 class FFOptionsViewAudio: public BC_GenericButton
434 FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
435 ~FFOptionsViewAudio();
438 FFMPEGConfigAudio *aud_config;
441 class FFOptionsViewVideo : public BC_GenericButton
444 FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
445 ~FFOptionsViewVideo();
448 FFMPEGConfigVideo *vid_config;