1 #ifndef __FILEFFMPEG_H__
2 #define __FILEFFMPEG_H__
6 #include "bcwindowbase.inc"
7 #include "bitspopup.inc"
11 #include "fileffmpeg.inc"
12 #include "indexfile.inc"
13 #include "mainprogress.inc"
25 class FileFFMPEG : public FileBase
30 FileFFMPEG(Asset *asset, File *file);
32 static void ff_lock(const char *cp=0);
33 static void ff_unlock();
35 static void set_options(char *cp, int len, const char *bp);
36 static void get_parameters(BC_WindowBase *parent_window,
37 Asset *asset, BC_WindowBase *&format_window,
38 int audio_options,int video_options, EDL *edl);
39 static int check_sig(Asset *asset);
40 int get_best_colormodel(int driver, int vstream);
41 int get_video_info(int track, int &pid, double &framerate,
42 int &width, int &height, char *title=0);
43 int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
44 static void get_info(char *path,char *text,int len);
45 int open_file(int rd,int wr);
46 int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
48 int write_samples(double **buffer,int64_t len);
49 int write_frames(VFrame ***frames,int len);
50 int read_samples(double *buffer,int64_t len);
51 int read_frame(VFrame *frame);
52 int can_scale_input() { return 1; }
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 FFMpegAudioQuality : public FFMpegAudioNum
97 FFMpegAudioQuality(BC_Window *window, int x, int y, char *title_text, int *output)
98 : FFMpegAudioNum(window, x, y, title_text, output) {}
102 class FFMpegVideoNum : public FFMpegConfigNum
105 FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
108 FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
111 class FFMpegVideoBitrate : public FFMpegVideoNum
114 FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
115 : FFMpegVideoNum(window, x, y, title_text, output) {}
119 class FFMpegVideoQuality : public FFMpegVideoNum
122 FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
123 : FFMpegVideoNum(window, x, y, title_text, output) {}
127 class FFMpegPixelFormat : public BC_PopupTextBox
130 FFMpegPixelFormat(FFMPEGConfigVideo *vid_config, int x, int y, int w, int list_h);
132 FFMPEGConfigVideo *vid_config;
133 ArrayList<BC_ListBoxItem*> pixfmts;
136 void update_formats();
139 class FFMpegSampleFormat : public BC_PopupTextBox
142 FFMpegSampleFormat(FFMPEGConfigAudio *aud_config, int x, int y, int w, int list_h);
144 FFMPEGConfigAudio *aud_config;
145 ArrayList<BC_ListBoxItem*> samplefmts;
148 void update_formats();
151 class FFMPEGConfigAudio : public BC_Window
154 FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset, EDL *edl);
155 ~FFMPEGConfigAudio();
157 void create_objects();
161 FFMpegSampleFormat *sample_format;
162 ArrayList<BC_ListBoxItem*> presets;
163 FFMPEGConfigAudioPopup *preset_popup;
164 FFMpegAudioBitrate *bitrate;
165 FFMpegAudioQuality *quality;
166 FFAudioOptions *audio_options;
167 BC_WindowBase *parent_window;
170 FFOptionsDialog *ff_options_dialog;
173 class FFAudioOptions : public BC_ScrollTextBox
176 FFAudioOptions(FFMPEGConfigAudio *audio_popup,
177 int x, int y, int w, int rows, int size, char *text);
179 FFMPEGConfigAudio *audio_popup;
183 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
186 FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
188 FFMPEGConfigAudio *popup;
192 class FFMPEGConfigAudioToggle : public BC_CheckBox
195 FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
196 char *title_text, int x, int y, int *output);
199 FFMPEGConfigAudio *popup;
202 class FFMPEGConfigVideo : public BC_Window
205 FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset, EDL *edl);
206 ~FFMPEGConfigVideo();
208 void create_objects();
212 FFMpegPixelFormat *pixel_format;
213 ArrayList<BC_ListBoxItem*> presets;
214 FFMPEGConfigVideoPopup *preset_popup;
215 BC_WindowBase *parent_window;
216 FFMpegVideoBitrate *bitrate;
217 FFMpegVideoQuality *quality;
218 FFVideoOptions *video_options;
221 FFOptionsDialog *ff_options_dialog;
224 class FFVideoOptions : public BC_ScrollTextBox
227 FFVideoOptions(FFMPEGConfigVideo *video_popup,
228 int x, int y, int w, int rows, int size, char *text);
230 FFMPEGConfigVideo *video_popup;
233 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
236 FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
238 FFMPEGConfigVideo *popup;
241 class FFMPEGConfigVideoToggle : public BC_CheckBox
244 FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
245 char *title_text, int x, int y, int *output);
248 FFMPEGConfigVideo *popup;
251 class FFMPEGScanProgress : public Thread
254 IndexFile *index_file;
255 MainProgressBar *progress_bar;
256 char progress_title[BCTEXTLEN];
257 int64_t length, *position;
260 FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
261 const char *title, int64_t length, int64_t *position, int *canceled);
262 ~FFMPEGScanProgress();
267 class FFOptions_OptName : public BC_ListBoxItem {
271 FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
272 ~FFOptions_OptName();
276 class FFOptions_OptValue : public BC_ListBoxItem {
281 void update(const char *v);
282 FFOptions_OptValue(FFOptions_Opt *opt);
285 class FFOptions_Opt {
289 FFOptions_OptName *item_name;
290 FFOptions_OptValue *item_value;
292 char *get(char *vp, int sz=-1);
293 void set(const char *val);
295 int scalar(double d, char *rp);
296 int ranges(char *rp);
297 int units(ArrayList<const char *> &opts);
298 const char *unit_name(int id);
302 FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
306 class FFOptions : public ArrayList<FFOptions_Opt *>
311 FFOptionsWindow *win;
312 AVCodecContext *avctx;
315 void initialize(FFOptionsWindow *win, int k);
316 static int cmpr(const void *a, const void *b);
321 class FFOptions_OptPanel : public BC_ListBox {
323 FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
324 ~FFOptions_OptPanel();
325 void create_objects();
326 int cursor_leave_event();
328 FFOptionsWindow *fwin;
329 ArrayList<BC_ListBoxItem*> items[2];
330 ArrayList<BC_ListBoxItem*> &opts;
331 ArrayList<BC_ListBoxItem*> &vals;
332 char tip_text[BCTEXTLEN];
334 int selection_changed();
336 void show_tip(const char *tip);
339 class FFOptionsKindItem : public BC_MenuItem
347 FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
348 ~FFOptionsKindItem();
351 class FFOptionsKind : public BC_PopupMenu
353 static const char *kinds[];
355 FFOptionsWindow *fwin;
358 void create_objects();
362 FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
366 class FFOptionsUnits : public BC_PopupMenu {
368 FFOptionsWindow *fwin;
370 FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
375 class FFOptionsText : public BC_TextBox {
377 FFOptionsWindow *fwin;
379 FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
384 class FFOptionsApply : public BC_GenericButton {
386 FFOptionsWindow *fwin;
388 FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
393 class FFOptionsWindow : public BC_Window
396 FFOptionsWindow(FFOptionsDialog *dialog);
399 void create_objects();
400 void update(FFOptions_Opt *oip);
402 int resize_event(int w, int h);
404 FFOptionsDialog *dialog;
407 FFOptions_OptPanel *panel;
408 int panel_x, panel_y, panel_w, panel_h;
409 BC_Title *type, *range, *kind_title;
410 FFOptions_Opt *selected;
413 FFOptionsUnits *units;
415 FFOptionsApply *apply;
418 class FFOptionsDialog : public BC_DialogThread
423 virtual void update_options(const char *options) = 0;
425 void load_options(const char *bp, int len);
426 void store_options(char *cp, int len);
427 void start(const char *format_name, const char *codec_name,
428 AVCodec *codec, const char *options, int len);
429 BC_Window* new_gui();
430 void handle_done_event(int result);
432 FFOptionsWindow *options_window;
433 const char *format_name, *codec_name;
435 AVDictionary *ff_opts;
439 class FFOptionsAudioDialog : public FFOptionsDialog
442 FFMPEGConfigAudio *aud_config;
443 void update_options(const char *options);
445 FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
446 ~FFOptionsAudioDialog();
449 class FFOptionsVideoDialog : public FFOptionsDialog
452 FFMPEGConfigVideo *vid_config;
453 void update_options(const char *options);
455 FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
456 ~FFOptionsVideoDialog();
459 class FFOptionsViewAudio: public BC_GenericButton
462 FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
463 ~FFOptionsViewAudio();
466 FFMPEGConfigAudio *aud_config;
469 class FFOptionsViewVideo : public BC_GenericButton
472 FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
473 ~FFOptionsViewVideo();
476 FFMPEGConfigVideo *vid_config;