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_video_info(int track, int &pid, double &framerate,
39 int &width, int &height, char *title=0);
40 int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
41 static void get_info(char *path,char *text,int len);
42 static int get_ff_option(const char *nm, const char *options, char *value);
43 int open_file(int rd,int wr);
44 int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
46 int write_samples(double **buffer,int64_t len);
47 int write_frames(VFrame ***frames,int len);
48 int read_samples(double *buffer,int64_t len);
49 int read_frame(VFrame *frame);
50 int64_t get_memory_usage(void);
51 int colormodel_supported(int colormodel);
52 static int get_best_colormodel(Asset *asset, int driver);
53 int select_video_stream(Asset *asset, int vstream);
54 int select_audio_stream(Asset *asset, int astream);
57 class FFMpegConfigNum : public BC_TumbleTextBox
60 FFMpegConfigNum(BC_Window *window, int x, int y,
61 char *title_text, int *output);
64 void create_objects();
65 int update_param(const char *param, const char *opts);
74 class FFMpegAudioNum : public FFMpegConfigNum
77 FFMpegAudioNum(BC_Window *window, int x, int y, char *title_text, int *output);
80 FFMPEGConfigAudio *window() { return (FFMPEGConfigAudio *)FFMpegConfigNum::window; }
83 class FFMpegAudioBitrate : public FFMpegAudioNum
86 FFMpegAudioBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
87 : FFMpegAudioNum(window, x, y, title_text, output) {}
91 class FFMpegVideoNum : public FFMpegConfigNum
94 FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
97 FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
100 class FFMpegVideoBitrate : public FFMpegVideoNum
103 FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
104 : FFMpegVideoNum(window, x, y, title_text, output) {}
108 class FFMpegVideoQuality : public FFMpegVideoNum
111 FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
112 : FFMpegVideoNum(window, x, y, title_text, output) {}
116 class FFMPEGConfigAudio : public BC_Window
119 FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
120 ~FFMPEGConfigAudio();
122 void create_objects();
125 ArrayList<BC_ListBoxItem*> presets;
126 FFMPEGConfigAudioPopup *preset_popup;
127 FFMpegAudioBitrate *bitrate;
128 FFAudioOptions *audio_options;
129 BC_WindowBase *parent_window;
131 FFOptionsDialog *ff_options_dialog;
134 class FFAudioOptions : public BC_ScrollTextBox
137 FFAudioOptions(FFMPEGConfigAudio *audio_popup,
138 int x, int y, int w, int rows, int size, char *text);
140 FFMPEGConfigAudio *audio_popup;
144 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
147 FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
149 FFMPEGConfigAudio *popup;
153 class FFMPEGConfigAudioToggle : public BC_CheckBox
156 FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
157 char *title_text, int x, int y, int *output);
160 FFMPEGConfigAudio *popup;
163 class FFMPEGConfigVideo : public BC_Window
166 FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
167 ~FFMPEGConfigVideo();
169 void create_objects();
172 ArrayList<BC_ListBoxItem*> presets;
173 FFMPEGConfigVideoPopup *preset_popup;
174 BC_WindowBase *parent_window;
175 FFMpegVideoBitrate *bitrate;
176 FFMpegVideoQuality *quality;
177 FFVideoOptions *video_options;
179 FFOptionsDialog *ff_options_dialog;
182 class FFVideoOptions : public BC_ScrollTextBox
185 FFVideoOptions(FFMPEGConfigVideo *video_popup,
186 int x, int y, int w, int rows, int size, char *text);
188 FFMPEGConfigVideo *video_popup;
191 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
194 FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
196 FFMPEGConfigVideo *popup;
199 class FFMPEGConfigVideoToggle : public BC_CheckBox
202 FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
203 char *title_text, int x, int y, int *output);
206 FFMPEGConfigVideo *popup;
209 class FFMPEGScanProgress : public Thread
212 IndexFile *index_file;
213 MainProgressBar *progress_bar;
214 char progress_title[BCTEXTLEN];
215 int64_t length, *position;
218 FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
219 const char *title, int64_t length, int64_t *position, int *canceled);
220 ~FFMPEGScanProgress();
225 class FFOptions_OptName : public BC_ListBoxItem {
229 FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
230 ~FFOptions_OptName();
234 class FFOptions_OptValue : public BC_ListBoxItem {
239 void update(const char *v);
240 FFOptions_OptValue(FFOptions_Opt *opt);
243 class FFOptions_Opt {
247 FFOptions_OptName *item_name;
248 FFOptions_OptValue *item_value;
250 char *get(char *vp, int sz=-1);
251 void set(const char *val);
253 int scalar(double d, char *rp);
254 int ranges(char *rp);
255 int units(ArrayList<const char *> &opts);
256 const char *unit_name(int id);
260 FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
264 class FFOptions : public ArrayList<FFOptions_Opt *>
269 FFOptionsWindow *win;
270 AVCodecContext *avctx;
273 void initialize(FFOptionsWindow *win, int k);
274 static int cmpr(const void *a, const void *b);
279 class FFOptions_OptPanel : public BC_ListBox {
281 FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
282 ~FFOptions_OptPanel();
283 void create_objects();
284 int cursor_leave_event();
286 FFOptionsWindow *fwin;
287 ArrayList<BC_ListBoxItem*> items[2];
288 ArrayList<BC_ListBoxItem*> &opts;
289 ArrayList<BC_ListBoxItem*> &vals;
290 char tip_text[BCTEXTLEN];
292 int selection_changed();
294 void show_tip(const char *tip);
297 class FFOptionsKindItem : public BC_MenuItem
305 FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
306 ~FFOptionsKindItem();
309 class FFOptionsKind : public BC_PopupMenu
311 static const char *kinds[];
313 FFOptionsWindow *fwin;
316 void create_objects();
320 FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
324 class FFOptionsUnits : public BC_PopupMenu {
326 FFOptionsWindow *fwin;
328 FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
333 class FFOptionsText : public BC_TextBox {
335 FFOptionsWindow *fwin;
337 FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
342 class FFOptionsApply : public BC_GenericButton {
344 FFOptionsWindow *fwin;
346 FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
351 class FFOptionsWindow : public BC_Window
354 FFOptionsWindow(FFOptionsDialog *dialog);
357 void create_objects();
358 void update(FFOptions_Opt *oip);
360 int resize_event(int w, int h);
362 FFOptionsDialog *dialog;
365 FFOptions_OptPanel *panel;
366 int panel_x, panel_y, panel_w, panel_h;
367 BC_Title *type, *range, *kind_title;
368 FFOptions_Opt *selected;
371 FFOptionsUnits *units;
373 FFOptionsApply *apply;
376 class FFOptionsDialog : public BC_DialogThread
381 virtual void update_options(const char *options) = 0;
383 void load_options(const char *bp, int len);
384 void store_options(char *cp, int len);
385 void start(const char *format_name, const char *codec_name,
386 AVCodec *codec, const char *options, int len);
387 BC_Window* new_gui();
388 void handle_done_event(int result);
390 FFOptionsWindow *options_window;
391 const char *format_name, *codec_name;
393 AVDictionary *ff_opts;
397 class FFOptionsAudioDialog : public FFOptionsDialog
400 FFMPEGConfigAudio *aud_config;
401 void update_options(const char *options);
403 FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
404 ~FFOptionsAudioDialog();
407 class FFOptionsVideoDialog : public FFOptionsDialog
410 FFMPEGConfigVideo *vid_config;
411 void update_options(const char *options);
413 FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
414 ~FFOptionsVideoDialog();
417 class FFOptionsViewAudio: public BC_GenericButton
420 FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
421 ~FFOptionsViewAudio();
424 FFMPEGConfigAudio *aud_config;
427 class FFOptionsViewVideo : public BC_GenericButton
430 FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
431 ~FFOptionsViewVideo();
434 FFMPEGConfigVideo *vid_config;