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 can_render(const char *fformat, const char *type);
43 static int renders_audio(const char *fformat) { return can_render(fformat, "audio"); }
44 static int renders_video(const char *fformat) { return can_render(fformat, "video"); }
45 static int get_ff_option(const char *nm, const char *options, char *value);
46 int open_file(int rd,int wr);
47 int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
49 int write_samples(double **buffer,int64_t len);
50 int write_frames(VFrame ***frames,int len);
51 int read_samples(double *buffer,int64_t len);
52 int read_frame(VFrame *frame);
53 int64_t get_memory_usage(void);
54 int colormodel_supported(int colormodel);
55 static int get_best_colormodel(Asset *asset, int driver);
56 int select_video_stream(Asset *asset, int vstream);
57 int select_audio_stream(Asset *asset, int astream);
60 class FFMpegConfigNum : public BC_TumbleTextBox
63 FFMpegConfigNum(BC_Window *window, int x, int y,
64 char *title_text, int *output);
67 void create_objects();
68 int update_param(const char *param, const char *opts);
77 class FFMpegAudioNum : public FFMpegConfigNum
80 FFMpegAudioNum(BC_Window *window, int x, int y, char *title_text, int *output);
83 FFMPEGConfigAudio *window() { return (FFMPEGConfigAudio *)FFMpegConfigNum::window; }
86 class FFMpegAudioBitrate : public FFMpegAudioNum
89 FFMpegAudioBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
90 : FFMpegAudioNum(window, x, y, title_text, output) {}
94 class FFMpegVideoNum : public FFMpegConfigNum
97 FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
100 FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
103 class FFMpegVideoBitrate : public FFMpegVideoNum
106 FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
107 : FFMpegVideoNum(window, x, y, title_text, output) {}
111 class FFMpegVideoQuality : public FFMpegVideoNum
114 FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
115 : FFMpegVideoNum(window, x, y, title_text, output) {}
119 class FFMPEGConfigAudio : public BC_Window
122 FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
123 ~FFMPEGConfigAudio();
125 void create_objects();
128 ArrayList<BC_ListBoxItem*> presets;
129 FFMPEGConfigAudioPopup *preset_popup;
130 FFMpegAudioBitrate *bitrate;
131 FFAudioOptions *audio_options;
132 BC_WindowBase *parent_window;
134 FFOptionsDialog *ff_options_dialog;
137 class FFAudioOptions : public BC_ScrollTextBox
140 FFAudioOptions(FFMPEGConfigAudio *audio_popup,
141 int x, int y, int w, int rows, int size, char *text);
143 FFMPEGConfigAudio *audio_popup;
147 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
150 FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
152 FFMPEGConfigAudio *popup;
156 class FFMPEGConfigAudioToggle : public BC_CheckBox
159 FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
160 char *title_text, int x, int y, int *output);
163 FFMPEGConfigAudio *popup;
166 class FFMPEGConfigVideo : public BC_Window
169 FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
170 ~FFMPEGConfigVideo();
172 void create_objects();
175 ArrayList<BC_ListBoxItem*> presets;
176 FFMPEGConfigVideoPopup *preset_popup;
177 BC_WindowBase *parent_window;
178 FFMpegVideoBitrate *bitrate;
179 FFMpegVideoQuality *quality;
180 FFVideoOptions *video_options;
182 FFOptionsDialog *ff_options_dialog;
185 class FFVideoOptions : public BC_ScrollTextBox
188 FFVideoOptions(FFMPEGConfigVideo *video_popup,
189 int x, int y, int w, int rows, int size, char *text);
191 FFMPEGConfigVideo *video_popup;
194 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
197 FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
199 FFMPEGConfigVideo *popup;
202 class FFMPEGConfigVideoToggle : public BC_CheckBox
205 FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
206 char *title_text, int x, int y, int *output);
209 FFMPEGConfigVideo *popup;
212 class FFMPEGScanProgress : public Thread
215 IndexFile *index_file;
216 MainProgressBar *progress_bar;
217 char progress_title[BCTEXTLEN];
218 int64_t length, *position;
221 FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
222 const char *title, int64_t length, int64_t *position, int *canceled);
223 ~FFMPEGScanProgress();
228 class FFOptions_OptName : public BC_ListBoxItem {
232 FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
233 ~FFOptions_OptName();
237 class FFOptions_OptValue : public BC_ListBoxItem {
242 void update(const char *v);
243 FFOptions_OptValue(FFOptions_Opt *opt);
246 class FFOptions_Opt {
250 FFOptions_OptName *item_name;
251 FFOptions_OptValue *item_value;
253 char *get(char *vp, int sz=-1);
254 void set(const char *val);
256 int scalar(double d, char *rp);
257 int ranges(char *rp);
258 int units(ArrayList<const char *> &opts);
259 const char *unit_name(int id);
263 FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
267 class FFOptions : public ArrayList<FFOptions_Opt *>
272 FFOptionsWindow *win;
273 AVCodecContext *avctx;
276 void initialize(FFOptionsWindow *win, int k);
277 static int cmpr(const void *a, const void *b);
282 class FFOptions_OptPanel : public BC_ListBox {
284 FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
285 ~FFOptions_OptPanel();
286 void create_objects();
287 int cursor_leave_event();
289 FFOptionsWindow *fwin;
290 ArrayList<BC_ListBoxItem*> items[2];
291 ArrayList<BC_ListBoxItem*> &opts;
292 ArrayList<BC_ListBoxItem*> &vals;
293 char tip_text[BCTEXTLEN];
295 int selection_changed();
297 void show_tip(const char *tip);
300 class FFOptionsKindItem : public BC_MenuItem
308 FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
309 ~FFOptionsKindItem();
312 class FFOptionsKind : public BC_PopupMenu
314 static const char *kinds[];
316 FFOptionsWindow *fwin;
319 void create_objects();
323 FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
327 class FFOptionsUnits : public BC_PopupMenu {
329 FFOptionsWindow *fwin;
331 FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
336 class FFOptionsText : public BC_TextBox {
338 FFOptionsWindow *fwin;
340 FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
345 class FFOptionsApply : public BC_GenericButton {
347 FFOptionsWindow *fwin;
349 FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
354 class FFOptionsWindow : public BC_Window
357 FFOptionsWindow(FFOptionsDialog *dialog);
360 void create_objects();
361 void update(FFOptions_Opt *oip);
363 int resize_event(int w, int h);
365 FFOptionsDialog *dialog;
368 FFOptions_OptPanel *panel;
369 int panel_x, panel_y, panel_w, panel_h;
370 BC_Title *type, *range, *kind_title;
371 FFOptions_Opt *selected;
374 FFOptionsUnits *units;
376 FFOptionsApply *apply;
379 class FFOptionsDialog : public BC_DialogThread
384 virtual void update_options(const char *options) = 0;
386 void load_options(const char *bp, int len);
387 void store_options(char *cp, int len);
388 void start(const char *format_name, const char *codec_name,
389 AVCodec *codec, const char *options, int len);
390 BC_Window* new_gui();
391 void handle_done_event(int result);
393 FFOptionsWindow *options_window;
394 const char *format_name, *codec_name;
396 AVDictionary *ff_opts;
400 class FFOptionsAudioDialog : public FFOptionsDialog
403 FFMPEGConfigAudio *aud_config;
404 void update_options(const char *options);
406 FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
407 ~FFOptionsAudioDialog();
410 class FFOptionsVideoDialog : public FFOptionsDialog
413 FFMPEGConfigVideo *vid_config;
414 void update_options(const char *options);
416 FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
417 ~FFOptionsVideoDialog();
420 class FFOptionsViewAudio: public BC_GenericButton
423 FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
424 ~FFOptionsViewAudio();
427 FFMPEGConfigAudio *aud_config;
430 class FFOptionsViewVideo : public BC_GenericButton
433 FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
434 ~FFOptionsViewVideo();
437 FFMPEGConfigVideo *vid_config;