ffmpeg param visibility, high422 x264 profile, bd/dvd enhancements
[goodguy/history.git] / cinelerra-5.1 / cinelerra / fileffmpeg.h
1 #ifndef __FILEFFMPEG_H__
2 #define __FILEFFMPEG_H__
3
4 #include "asset.inc" 
5 #include "bcdialog.h"
6 #include "bcwindowbase.inc"
7 #include "bitspopup.inc" 
8 #include "ffmpeg.h"
9 #include "filebase.h"
10 #include "fileffmpeg.inc"
11 #include "indexfile.inc"
12 #include "mainprogress.inc"
13 #include "mutex.h"
14 #include "thread.h"
15 #include "vframe.inc"
16
17 #include <stdio.h>
18 #include <stdint.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21 #include <string.h>
22
23
24 class FileFFMPEG : public FileBase
25 {
26 public:
27         FFMPEG *ff;
28
29         FileFFMPEG(Asset *asset, File *file);
30         ~FileFFMPEG();
31         static void ff_lock(const char *cp=0);
32         static void ff_unlock();
33
34         static void get_parameters(BC_WindowBase *parent_window,Asset *asset,
35            BC_WindowBase *&format_window,int audio_options,int video_options);
36         static int check_sig(Asset *asset);
37         int get_video_info(int track, int &pid, double &framerate,
38                 int &width, int &height, char *title=0);
39         int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
40         static void get_info(char *path,char *text,int len);
41         int open_file(int rd,int wr);
42         int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
43         int close_file(void);
44         int write_samples(double **buffer,int64_t len);
45         int write_frames(VFrame ***frames,int len);
46         int read_samples(double *buffer,int64_t len);
47         int read_frame(VFrame *frame);
48         int64_t get_memory_usage(void);
49         int colormodel_supported(int colormodel);
50         static int get_best_colormodel(Asset *asset, int driver);
51         int select_video_stream(Asset *asset, int vstream);
52         int select_audio_stream(Asset *asset, int astream);
53 };
54
55 class FFMpegConfigNum : public BC_TumbleTextBox
56 {
57 public:
58         FFMpegConfigNum(BC_Window *window, int x, int y,
59                 char *title_text, int *output);
60         ~FFMpegConfigNum();
61
62         void create_objects();
63         int handle_event();
64         int *output;
65         BC_Window *window;
66         BC_Title *title;
67         char *title_text;
68         int x, y;
69 };
70
71 class FFMpegAudioNum : public FFMpegConfigNum
72 {
73 public:
74         FFMpegAudioNum(BC_Window *window, int x, int y, char *title_text, int *output);
75         ~FFMpegAudioNum() {}
76
77         FFMPEGConfigAudio *window() { return (FFMPEGConfigAudio *)FFMpegConfigNum::window; }
78 };
79
80 class FFMpegAudioBitrate : public FFMpegAudioNum
81 {
82 public:
83         FFMpegAudioBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
84           : FFMpegAudioNum(window, x, y, title_text, output) {}
85         int handle_event();
86 };
87
88 class FFMpegVideoNum : public FFMpegConfigNum
89 {
90 public:
91         FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
92         ~FFMpegVideoNum() {}
93
94         FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
95 };
96
97 class FFMpegVideoBitrate : public FFMpegVideoNum
98 {
99 public:
100         FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
101           : FFMpegVideoNum(window, x, y, title_text, output) {}
102         int handle_event();
103 };
104
105 class FFMpegVideoQuality : public FFMpegVideoNum
106 {
107 public:
108         FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
109           : FFMpegVideoNum(window, x, y, title_text, output) {}
110         int handle_event();
111 };
112
113 class FFMPEGConfigAudio : public BC_Window
114 {
115 public:
116         FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
117         ~FFMPEGConfigAudio();
118
119         void create_objects();
120         void update_options();
121         int close_event();
122
123         ArrayList<BC_ListBoxItem*> presets;
124         FFMPEGConfigAudioPopup *preset_popup;
125         FFMpegAudioBitrate *bitrate;
126         FFAudioOptions *audio_options;
127         BC_WindowBase *parent_window;
128         Asset *asset;
129         FFOptionsDialog *ff_options_dialog;
130 };
131
132 class FFAudioOptions : public BC_ScrollTextBox
133 {
134 public:
135         FFAudioOptions(FFMPEGConfigAudio *audio_popup,
136                 int x, int y, int w, int rows, int size, char *text);
137         int handle_event();
138
139         FFMPEGConfigAudio *audio_popup;
140 };
141
142
143 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
144 {
145 public:
146         FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
147         int handle_event();
148         FFMPEGConfigAudio *popup;
149 };
150
151
152 class FFMPEGConfigAudioToggle : public BC_CheckBox
153 {
154 public:
155         FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
156                 char *title_text, int x, int y, int *output);
157         int handle_event();
158         int *output;
159         FFMPEGConfigAudio *popup;
160 };
161
162 class FFMPEGConfigVideo : public BC_Window
163 {
164 public:
165         FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
166         ~FFMPEGConfigVideo();
167
168         void create_objects();
169         void update_options();
170         int close_event();
171
172         ArrayList<BC_ListBoxItem*> presets;
173         FFMPEGConfigVideoPopup *preset_popup;
174         BC_WindowBase *parent_window;
175         FFMpegVideoBitrate *bitrate;
176         FFMpegVideoQuality *quality;
177         FFVideoOptions *video_options;
178         Asset *asset;
179         FFOptionsDialog *ff_options_dialog;
180 };
181
182 class FFVideoOptions : public BC_ScrollTextBox
183 {
184 public:
185         FFVideoOptions(FFMPEGConfigVideo *video_popup,
186                 int x, int y, int w, int rows, int size, char *text);
187         int handle_event();
188
189         FFMPEGConfigVideo *video_popup;
190 };
191
192 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
193 {
194 public:
195         FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
196         int handle_event();
197         FFMPEGConfigVideo *popup;
198 };
199
200 class FFMPEGConfigVideoToggle : public BC_CheckBox
201 {
202 public:
203         FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
204                 char *title_text, int x, int y, int *output);
205         int handle_event();
206         int *output;
207         FFMPEGConfigVideo *popup;
208 };
209
210 class FFMPEGScanProgress : public Thread
211 {
212 public:
213         IndexFile *index_file;
214         MainProgressBar *progress_bar;
215         char progress_title[BCTEXTLEN];
216         int64_t length, *position;
217         int done, *canceled;
218
219         FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
220                 const char *title, int64_t length, int64_t *position, int *canceled);
221         ~FFMPEGScanProgress();
222         void run();
223 };
224
225
226 class FFOptions_OptName : public BC_ListBoxItem {
227 public:
228         FFOptions_Opt *opt;
229
230         FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
231         ~FFOptions_OptName();
232
233 };
234
235 class FFOptions_OptValue : public BC_ListBoxItem {
236 public:
237         FFOptions_Opt *opt;
238
239         void update();
240         void update(const char *v);
241         FFOptions_OptValue(FFOptions_Opt *opt);
242 };
243
244 class FFOptions_Opt {
245 public:
246         FFOptions *options;
247         const AVOption *opt;
248         FFOptions_OptName *item_name;
249         FFOptions_OptValue *item_value;
250
251         char *get(char *vp, int sz=-1);
252         void set(const char *val);
253         int types(char *rp);
254         int scalar(double d, char *rp);
255         int ranges(char *rp);
256         int units(ArrayList<const char *> &opts);
257         const char *unit_name(int id);
258         int units(char *rp);
259         const char *tip();
260
261         FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
262         ~FFOptions_Opt();
263 };
264
265 class FFOptions : public ArrayList<FFOptions_Opt *>
266 {
267 public:
268         FFOptions();
269         ~FFOptions();
270         FFOptionsWindow *win;
271         AVCodecContext *avctx;
272         const void *obj;
273
274         void initialize(FFOptionsWindow *win, int k);
275         static int cmpr(const void *a, const void *b);
276         int update();
277         void dump(FILE *fp);
278 };
279
280 class FFOptions_OptPanel : public BC_ListBox {
281 public:
282         FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
283         ~FFOptions_OptPanel();
284         void create_objects();
285         int cursor_leave_event();
286
287         FFOptionsWindow *fwin;
288         ArrayList<BC_ListBoxItem*> items[2];
289         ArrayList<BC_ListBoxItem*> &opts;
290         ArrayList<BC_ListBoxItem*> &vals;
291
292         int selection_changed();
293         int update();
294 };
295
296 class FFOptionsKindItem : public BC_MenuItem
297 {
298 public:
299         FFOptionsKind *kind;
300         int idx;
301         int handle_event();
302         void show_label();
303
304         FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
305         ~FFOptionsKindItem();
306 };
307
308 class FFOptionsKind : public BC_PopupMenu
309 {
310         static const char *kinds[];
311 public:
312         FFOptionsWindow *fwin;
313         int kind;
314
315         void create_objects();
316         int handle_event();
317         void set(int k);
318
319         FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
320         ~FFOptionsKind();
321 };
322
323 class FFOptionsUnits : public BC_PopupMenu {
324 public:
325         FFOptionsWindow *fwin;
326
327         FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
328         ~FFOptionsUnits();
329         int handle_event();
330 };
331
332 class FFOptionsText : public BC_TextBox {
333 public:
334         FFOptionsWindow *fwin;
335
336         FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
337         ~FFOptionsText();
338         int handle_event();
339 };
340
341 class FFOptionsApply : public BC_GenericButton {
342 public:
343         FFOptionsWindow *fwin;
344
345         FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
346         ~FFOptionsApply();
347         int handle_event();
348 };
349
350 class FFOptionsWindow : public BC_Window
351 {
352 public:
353         FFOptionsWindow(FFOptionsDialog *dialog);
354         ~FFOptionsWindow();
355
356         void create_objects();
357         void update(FFOptions_Opt *oip);
358         void draw();
359         int resize_event(int w, int h);
360
361         FFOptionsDialog *dialog;
362         FFOptions options;
363
364         FFOptions_OptPanel *panel;
365         int panel_x, panel_y, panel_w, panel_h;
366         BC_Title *type, *range, *kind_title;
367         FFOptions_Opt *selected;
368
369         FFOptionsKind *kind;
370         FFOptionsUnits *units;
371         FFOptionsText *text;
372         FFOptionsApply *apply;
373 };
374
375 class FFOptionsDialog : public BC_DialogThread
376 {
377 public:
378         FFOptionsDialog();
379         ~FFOptionsDialog();
380         virtual void update_options() = 0;
381
382         void load_options();
383         void store_options();
384         void start(const char *codec_name, AVCodec *codec, char *ff_options, int ff_len);
385         BC_Window* new_gui();
386         void handle_done_event(int result);
387
388         FFOptionsWindow *options_window;
389         const char *codec_name;
390         AVCodec *codec;
391         char *ff_options;
392         int ff_len;
393         AVDictionary *ff_opts;
394 };
395
396 class FFOptionsAudioDialog : public FFOptionsDialog
397 {
398 public:
399         FFMPEGConfigAudio *aud_config;
400         void update_options();
401
402         FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
403         ~FFOptionsAudioDialog();
404 };
405
406 class FFOptionsVideoDialog : public FFOptionsDialog
407 {
408 public:
409         FFMPEGConfigVideo *vid_config;
410         void update_options();
411
412         FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
413         ~FFOptionsVideoDialog();
414 };
415
416 class FFOptionsViewAudio: public BC_GenericButton
417 {
418 public:
419         FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
420         ~FFOptionsViewAudio();
421
422         int handle_event();
423         FFMPEGConfigAudio *aud_config;
424 };
425
426 class FFOptionsViewVideo : public BC_GenericButton
427 {
428 public:
429         FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
430         ~FFOptionsViewVideo();
431
432         int handle_event();
433         FFMPEGConfigVideo *vid_config;
434 };
435
436 #endif