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 FFMpegVideoNum : public FFMpegConfigNum
99 FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
102 FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
105 class FFMpegVideoBitrate : public FFMpegVideoNum
108 FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
109 : FFMpegVideoNum(window, x, y, title_text, output) {}
113 class FFMpegVideoQuality : public FFMpegVideoNum
116 FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
117 : FFMpegVideoNum(window, x, y, title_text, output) {}
121 class FFMPEGConfigAudio : public BC_Window
124 FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
125 ~FFMPEGConfigAudio();
127 void create_objects();
130 ArrayList<BC_ListBoxItem*> presets;
131 FFMPEGConfigAudioPopup *preset_popup;
132 FFMpegAudioBitrate *bitrate;
133 FFAudioOptions *audio_options;
134 BC_WindowBase *parent_window;
136 FFOptionsDialog *ff_options_dialog;
139 class FFAudioOptions : public BC_ScrollTextBox
142 FFAudioOptions(FFMPEGConfigAudio *audio_popup,
143 int x, int y, int w, int rows, int size, char *text);
145 FFMPEGConfigAudio *audio_popup;
149 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
152 FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
154 FFMPEGConfigAudio *popup;
158 class FFMPEGConfigAudioToggle : public BC_CheckBox
161 FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
162 char *title_text, int x, int y, int *output);
165 FFMPEGConfigAudio *popup;
168 class FFMPEGConfigVideo : public BC_Window
171 FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
172 ~FFMPEGConfigVideo();
174 void create_objects();
177 ArrayList<BC_ListBoxItem*> presets;
178 FFMPEGConfigVideoPopup *preset_popup;
179 BC_WindowBase *parent_window;
180 FFMpegVideoBitrate *bitrate;
181 FFMpegVideoQuality *quality;
182 FFVideoOptions *video_options;
184 FFOptionsDialog *ff_options_dialog;
187 class FFVideoOptions : public BC_ScrollTextBox
190 FFVideoOptions(FFMPEGConfigVideo *video_popup,
191 int x, int y, int w, int rows, int size, char *text);
193 FFMPEGConfigVideo *video_popup;
196 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
199 FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
201 FFMPEGConfigVideo *popup;
204 class FFMPEGConfigVideoToggle : public BC_CheckBox
207 FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
208 char *title_text, int x, int y, int *output);
211 FFMPEGConfigVideo *popup;
214 class FFMPEGScanProgress : public Thread
217 IndexFile *index_file;
218 MainProgressBar *progress_bar;
219 char progress_title[BCTEXTLEN];
220 int64_t length, *position;
223 FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
224 const char *title, int64_t length, int64_t *position, int *canceled);
225 ~FFMPEGScanProgress();
230 class FFOptions_OptName : public BC_ListBoxItem {
234 FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
235 ~FFOptions_OptName();
239 class FFOptions_OptValue : public BC_ListBoxItem {
244 void update(const char *v);
245 FFOptions_OptValue(FFOptions_Opt *opt);
248 class FFOptions_Opt {
252 FFOptions_OptName *item_name;
253 FFOptions_OptValue *item_value;
255 char *get(char *vp, int sz=-1);
256 void set(const char *val);
258 int scalar(double d, char *rp);
259 int ranges(char *rp);
260 int units(ArrayList<const char *> &opts);
261 const char *unit_name(int id);
265 FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
269 class FFOptions : public ArrayList<FFOptions_Opt *>
274 FFOptionsWindow *win;
275 AVCodecContext *avctx;
278 void initialize(FFOptionsWindow *win, int k);
279 static int cmpr(const void *a, const void *b);
284 class FFOptions_OptPanel : public BC_ListBox {
286 FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
287 ~FFOptions_OptPanel();
288 void create_objects();
289 int cursor_leave_event();
291 FFOptionsWindow *fwin;
292 ArrayList<BC_ListBoxItem*> items[2];
293 ArrayList<BC_ListBoxItem*> &opts;
294 ArrayList<BC_ListBoxItem*> &vals;
295 char tip_text[BCTEXTLEN];
297 int selection_changed();
299 void show_tip(const char *tip);
302 class FFOptionsKindItem : public BC_MenuItem
310 FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
311 ~FFOptionsKindItem();
314 class FFOptionsKind : public BC_PopupMenu
316 static const char *kinds[];
318 FFOptionsWindow *fwin;
321 void create_objects();
325 FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
329 class FFOptionsUnits : public BC_PopupMenu {
331 FFOptionsWindow *fwin;
333 FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
338 class FFOptionsText : public BC_TextBox {
340 FFOptionsWindow *fwin;
342 FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
347 class FFOptionsApply : public BC_GenericButton {
349 FFOptionsWindow *fwin;
351 FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
356 class FFOptionsWindow : public BC_Window
359 FFOptionsWindow(FFOptionsDialog *dialog);
362 void create_objects();
363 void update(FFOptions_Opt *oip);
365 int resize_event(int w, int h);
367 FFOptionsDialog *dialog;
370 FFOptions_OptPanel *panel;
371 int panel_x, panel_y, panel_w, panel_h;
372 BC_Title *type, *range, *kind_title;
373 FFOptions_Opt *selected;
376 FFOptionsUnits *units;
378 FFOptionsApply *apply;
381 class FFOptionsDialog : public BC_DialogThread
386 virtual void update_options(const char *options) = 0;
388 void load_options(const char *bp, int len);
389 void store_options(char *cp, int len);
390 void start(const char *format_name, const char *codec_name,
391 AVCodec *codec, const char *options, int len);
392 BC_Window* new_gui();
393 void handle_done_event(int result);
395 FFOptionsWindow *options_window;
396 const char *format_name, *codec_name;
398 AVDictionary *ff_opts;
402 class FFOptionsAudioDialog : public FFOptionsDialog
405 FFMPEGConfigAudio *aud_config;
406 void update_options(const char *options);
408 FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
409 ~FFOptionsAudioDialog();
412 class FFOptionsVideoDialog : public FFOptionsDialog
415 FFMPEGConfigVideo *vid_config;
416 void update_options(const char *options);
418 FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
419 ~FFOptionsVideoDialog();
422 class FFOptionsViewAudio: public BC_GenericButton
425 FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
426 ~FFOptionsViewAudio();
429 FFMPEGConfigAudio *aud_config;
432 class FFOptionsViewVideo : public BC_GenericButton
435 FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
436 ~FFOptionsViewVideo();
439 FFMPEGConfigVideo *vid_config;