Credit ffmpeg team with upgrade to 6.1
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / recordgui.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #ifndef RECORDGUI_H
23 #define RECORDGUI_H
24
25
26 class RecordGUIBatches;
27 class RecordBatch;
28 class RecordStartType;
29 class RecordStart;
30 class RecordPath;
31 class BrowseButton;
32 class RecordDuration;
33 class RecordSource;
34 class RecordNews;
35 class RecordGUISave;
36 class RecordGUIStartOver;
37 class RecordGUICancel;
38 class RecordGUIMonitorVideo;
39 class RecordGUIMonitorAudio;
40 class RecordGUIAudioMeters;
41 class RecordGUINewBatch;
42 class RecordGUIDeleteBatch;
43 class RecordGUIStartBatches;
44 class RecordGUIStopBatches;
45 class RecordGUIActivateBatch;
46 class RecordStatusThread;
47 class RecordGUIFlash;
48
49 class RecordGUIDCOffset;
50 class RecordGUIDropFrames;
51 class RecordGUIFillFrames;
52 class RecordGUIPowerOff;
53 class RecordGUICommCheck;
54 class RecordGUIDelaceItem;
55 class RecordGUIDeinterlace;
56 class RecordGUILabel;
57 class RecordGUIClearLabels;
58 class RecordGUILoop;
59 class RecordGUILoopHr;
60 class RecordGUILoopMin;
61 class RecordGUILoopSec;
62 class RecordGUIModeMenu;
63 class RecordGUIMode;
64 class RecordGUIOK;
65 class RecordGUIReset;
66 class RecordStartoverThread;
67 class EndRecordThread;
68
69 #include "browsebutton.inc"
70 #include "condition.inc"
71 #include "guicast.h"
72 #include "loadmode.inc"
73 #include "maxchannels.h"
74 #include "mutex.inc"
75 #include "mwindow.inc"
76 #include "question.inc"
77 #include "recordgui.inc"
78 #include "record.inc"
79 #include "recordbatches.h"
80 #include "recordmonitor.inc"
81 #include "recordtransport.inc"
82 #include "timeentry.h"
83
84 class RecordGUIBatches : public RecordBatchesGUI
85 {
86 public:
87         RecordGUI *gui;
88
89         int handle_event();
90         int selection_changed();
91
92         RecordGUIBatches(RecordGUI *gui, int x, int y, int w, int h);
93 };
94
95 class RecordGUI : public BC_Window
96 {
97         static int max(int a,int b) { return a>b ? a : b; }
98 public:
99         RecordGUI(MWindow *mwindow, Record *record);
100         ~RecordGUI();
101
102         void create_objects();
103         int resize_event(int w, int h);
104         int translation_event();
105
106         BC_Title *current_operation;
107         BC_Title *position_title;
108         BC_Title *prev_label_title;
109         BC_Title *frames_behind;
110         BC_Title *frames_dropped;
111         BC_Title *framerate;
112         BC_Title *samples_clipped;
113         BC_Title *cron_status;
114         MWindow *mwindow;
115         Record *record;
116         RecordGUIBatches *batch_bay;
117         RecordPath *batch_path;
118         RecordStatusThread *status_thread;
119         TimeEntry *batch_start;
120         TimeEntry *batch_duration;
121         RecordStartType *start_type;
122         RecordTransport *record_transport;
123         BrowseButton *batch_browse;
124         RecordSource *batch_source;
125         RecordGUIModeMenu *batch_mode;
126         RecordGUINewBatch *new_batch;
127         RecordGUIDeleteBatch *delete_batch;
128         RecordGUIStartBatches *start_batches;
129         RecordGUIStopBatches *stop_batches;
130         RecordGUIActivateBatch *activate_batch;
131         RecordGUILabel *label_button;
132         RecordGUIClearLabels *clrlbls_button;
133         RecordGUIDropFrames *drop_frames;
134         RecordGUIFillFrames *fill_frames;
135         RecordGUIPowerOff *power_off;
136         RecordGUICommCheck *commercial_check;
137         RecordGUIDeinterlace *deinterlace;
138         RecordGUIMonitorVideo *monitor_video;
139         RecordGUIMonitorAudio *monitor_audio;
140         RecordGUIAudioMeters *meter_audio;
141         RecordGUIFlash *batch_flash;
142         RecordStartoverThread *startover_thread;
143         EndRecordThread *interrupt_thread;
144         LoadMode *load_mode;
145         int flash_color;
146
147         RecordGUILoopHr *loop_hr;
148         RecordGUILoopMin *loop_min;
149         RecordGUILoopSec *loop_sec;
150         RecordGUIReset *reset;
151         RecordGUIDCOffset *dc_offset_button;
152         RecordGUIDCOffsetText *dc_offset_text[MAXCHANNELS];
153         RecordMonitor *monitor_video_window;
154         BC_Meter *meter[MAXCHANNELS];
155         int total_dropped_frames;
156         int total_clipped_samples;
157
158         int set_loop_status(int value);
159         int keypress_event();
160         int set_translation(int x, int y, float z);
161
162         void update_batches();
163         Batch *get_current_batch();
164         Batch *get_editing_batch();
165         void start_flash_batch();
166         void stop_flash_batch();
167         void flash_batch();
168 // Update the batch channel table when edited
169         void update_batch_sources();
170 // Update the batch editing tools
171         void update_batch_tools();
172         void enable_batch_buttons();
173         void disable_batch_buttons();
174
175         void reset_audio();
176         void reset_video();
177         void update_frames_behind(long value);
178         void update_dropped_frames(long value);
179         void update_position(double value);
180         void update_clipped_samples(long value);
181         void update_framerate(double value);
182         void update_video(int dropped, int behind);
183         void update_audio(int channels, double *max, int *over);
184         void update_cron_status(const char *status);
185         void update_power_off(int value);
186         void update_labels(double new_position);
187         int update_prev_label(long new_position);
188         int update_title(BC_Title *title, double position);
189 };
190
191 class RecordGUISave : public BC_Button
192 {
193 public:
194         RecordGUISave(RecordGUI *gui);
195         int handle_event();
196         int keypress_event();
197         RecordGUI *gui;
198 };
199
200
201 class RecordGUICancel : public BC_CancelButton
202 {
203 public:
204         RecordGUICancel(RecordGUI *record_gui);
205         int handle_event();
206         int keypress_event();
207         RecordGUI *gui;
208         Record *record;
209 };
210
211 class RecordGUIOK : public BC_OKButton
212 {
213 public:
214         RecordGUIOK(RecordGUI *record_gui);
215         int handle_event();
216         RecordGUI *gui;
217 };
218
219 class RecordGUIStartBatches : public RecordBatchesGUI::StartBatches
220 {
221 public:
222         RecordGUI *gui;
223         int handle_event();
224         RecordGUIStartBatches(RecordGUI *gui, int x, int y);
225 };
226
227
228 class RecordGUIStopBatches : public RecordBatchesGUI::StopBatches
229 {
230 public:
231         RecordGUI *gui;
232         int handle_event();
233         RecordGUIStopBatches(RecordGUI *gui, int x, int y);
234 };
235
236 class RecordGUIActivateBatch : public RecordBatchesGUI::ActivateBatch
237 {
238 public:
239         RecordGUIActivateBatch(RecordGUI *gui, int x, int y);
240         int handle_event();
241         RecordGUI *gui;
242 };
243
244
245 class RecordGUIStartOver : public BC_GenericButton
246 {
247 public:
248         RecordGUIStartOver(RecordGUI *gui, int x, int y);
249         ~RecordGUIStartOver();
250
251         int handle_event();
252
253         RecordGUI *gui;
254 };
255
256 class EndRecordThread : public Thread
257 {
258 public:
259         EndRecordThread(RecordGUI *record_gui);
260         ~EndRecordThread();
261
262         void start(int is_ok);
263         void run();
264
265         RecordGUI *gui;
266         QuestionWindow *window;
267 // OK Button was pressed
268         int is_ok;
269 };
270
271 class RecordStartoverThread : public Thread
272 {
273 public:
274         RecordStartoverThread(RecordGUI *record_gui);
275         ~RecordStartoverThread();
276         void run();
277
278         RecordGUI *gui;
279         QuestionWindow *window;
280 };
281
282 class RecordBatch : public BC_PopupTextBox
283 {
284 public:
285         RecordBatch(RecordGUI *gui, int x, int y);
286         int handle_event();
287         RecordGUI *gui;
288 };
289
290 class RecordPath : public RecordBatchesGUI::Path
291 {
292 public:
293         RecordGUI *gui;
294         int handle_event();
295         RecordPath(RecordGUI *gui, int x, int y);
296 };
297
298 class RecordStart : public RecordBatchesGUI::StartTime
299 {
300 public:
301         RecordGUI *gui;
302         int handle_event();
303         RecordStart(RecordGUI *gui, int x, int y);
304 };
305
306 class RecordDuration : public RecordBatchesGUI::Duration
307 {
308 public:
309         RecordGUI *gui;
310         int handle_event();
311         RecordDuration(RecordGUI *gui, int x, int y);
312 };
313
314 class RecordSource : public RecordBatchesGUI::Source
315 {
316 public:
317         RecordGUI *gui;
318         int handle_event();
319         RecordSource(RecordGUI *gui, int x, int y);
320 };
321
322 class RecordNews : public RecordBatchesGUI::News
323 {
324 public:
325         RecordNews(RecordGUI *gui, int x, int y);
326         int handle_event();
327         RecordGUI *gui;
328 };
329
330 class RecordGUIDropFrames : public BC_CheckBox
331 {
332 public:
333         RecordGUIDropFrames(RecordGUI *gui, int x, int y);
334         int handle_event();
335         int keypress_event();
336         RecordGUI *gui;
337 };
338
339 class RecordGUIFillFrames : public BC_CheckBox
340 {
341 public:
342         RecordGUIFillFrames(RecordGUI *gui, int x, int y);
343         int handle_event();
344         int keypress_event();
345         RecordGUI *gui;
346 };
347
348 class RecordGUIPowerOff : public BC_CheckBox
349 {
350 public:
351         RecordGUIPowerOff(RecordGUI *gui, int x, int y);
352         int handle_event();
353         int keypress_event();
354         RecordGUI *gui;
355 };
356
357 class RecordGUICommCheck : public BC_CheckBox
358 {
359 public:
360         RecordGUICommCheck(RecordGUI *gui, int x, int y);
361         int handle_event();
362         int keypress_event();
363         RecordGUI *gui;
364 };
365
366 class RecordGUIDelaceItem : public BC_MenuItem
367 {
368 public:
369         RecordGUIDelaceItem(RecordGUIDeinterlace *popup, const char *text, int id);
370         int handle_event();
371
372         RecordGUIDeinterlace *popup;
373         int id;
374 };
375
376 class RecordGUIDeinterlace : public BC_PopupMenu
377 {
378 public:
379         RecordGUIDeinterlace(RecordGUI *gui, int x, int y);
380         void create_objects();
381         void update();
382
383         RecordGUI *gui;
384 };
385
386 class RecordGUIMonitorVideo : public BC_CheckBox
387 {
388 public:
389         RecordGUIMonitorVideo(RecordGUI *gui, int x, int y);
390         int handle_event();
391         int keypress_event();
392         RecordGUI *gui;
393 };
394
395 class RecordGUIMonitorAudio : public BC_CheckBox
396 {
397 public:
398         RecordGUIMonitorAudio(RecordGUI *gui, int x, int y);
399         int handle_event();
400         int keypress_event();
401         RecordGUI *gui;
402 };
403
404 class RecordGUIAudioMeters : public BC_CheckBox
405 {
406 public:
407         RecordGUIAudioMeters(RecordGUI *gui, int x, int y);
408         int handle_event();
409         int keypress_event();
410         RecordGUI *gui;
411 };
412
413 class RecordGUINewBatch : public RecordBatchesGUI::NewBatch
414 {
415 public:
416         RecordGUI *gui;
417         int handle_event();
418         RecordGUINewBatch(RecordGUI *gui, int x, int y);
419 };
420
421
422 class RecordGUIDeleteBatch : public RecordBatchesGUI::DeleteBatch
423 {
424 public:
425         RecordGUI *gui;
426         int handle_event();
427         RecordGUIDeleteBatch(RecordGUI *gui, int x, int y);
428 };
429
430 class RecordGUILabel : public BC_GenericButton
431 {
432 public:
433         RecordGUILabel(RecordGUI *gui, int x, int y);
434         ~RecordGUILabel();
435
436         int handle_event();
437         int keypress_event();
438         RecordGUI *gui;
439 };
440
441 class RecordGUIClearLabels : public BC_GenericButton
442 {
443 public:
444         RecordGUIClearLabels(RecordGUI *gui, int x, int y);
445         ~RecordGUIClearLabels();
446
447         int handle_event();
448         RecordGUI *gui;
449 };
450
451 // Stop GUI blocking the recording when X11 is busy
452 class RecordStatusThread : public Thread
453 {
454 public:
455         RecordStatusThread(MWindow *mwindow, RecordGUI *gui);
456         ~RecordStatusThread();
457
458         void reset_video();
459         void reset_audio();
460         void update_frames_behind(long value);
461         void update_dropped_frames(long value);
462         void update_position(double value);
463         void update_clipped_samples(long value);
464         void update_framerate(double value);
465         void get_window_lock();
466         template<class T>
467         void update_status_string(const char *fmt,T &new_value,T &displayed_value,BC_Title *widgit);
468         void run();
469
470         MWindow *mwindow;
471         RecordGUI *gui;
472         long new_dropped_frames, displayed_dropped_frames;
473         long new_frames_behind, displayed_frames_behind;
474         double new_framerate, displayed_framerate;
475         long new_clipped_samples, displayed_clipped_samples;
476         double new_position;
477         int window_locked;
478         int done;
479         Condition *input_lock;
480 };
481
482 class RecordGUIFlash : public Thread
483 {
484 public:
485         RecordGUI *record_gui;
486         Condition *flash_lock;
487         int done;
488
489         void run();
490         RecordGUIFlash(RecordGUI *gui);
491         ~RecordGUIFlash();
492 };
493
494 class RecordGUIModeMenu;
495
496 class RecordGUIModeTextBox : public BC_TextBox
497 {
498 public:
499         RecordGUIModeTextBox(RecordGUIModeMenu *mode_menu,
500                 int x, int y, int w,const char *text);
501         ~RecordGUIModeTextBox();
502         RecordGUI *record_gui;
503         RecordGUIModeMenu *mode_menu;
504         int handle_event();
505 };
506
507 class RecordGUIModeListBox : public BC_ListBox
508 {
509 public:
510         RecordGUIModeListBox(RecordGUIModeMenu *mode_menu);
511         ~RecordGUIModeListBox();
512         RecordGUI *record_gui;
513         RecordGUIModeMenu *mode_menu;
514         int handle_event();
515 };
516
517 class RecordGUIModeMenu
518 {
519 public:
520         RecordGUIModeMenu(RecordGUI *record_gui,int x, int y, int w, const char *text);
521         ~RecordGUIModeMenu();
522
523         int handle_event();
524         void create_objects();
525         void update(int value);
526         int get_w();
527         int get_h();
528
529         RecordGUI *record_gui;
530         RecordGUIModeTextBox *textbox;
531         RecordGUIModeListBox *listbox;
532         ArrayList<BC_ListBoxItem*> modes;
533         int value;
534 };
535
536
537 class RecordGUIDCOffset : public BC_Button
538 {
539 public:
540         RecordGUIDCOffset(MWindow *mwindow, int y);
541         ~RecordGUIDCOffset();
542
543         int handle_event();
544         int keypress_event();
545 };
546
547 class RecordGUIDCOffsetText : public BC_TextBox
548 {
549 public:
550         RecordGUIDCOffsetText(char *text, int y, int number);
551         ~RecordGUIDCOffsetText();
552
553         int handle_event();
554         int number;
555 };
556
557 class RecordGUIReset : public BC_Button
558 {
559 public:
560         RecordGUIReset(MWindow *mwindow, RecordGUI *gui, int y);
561         ~RecordGUIReset();
562
563         int handle_event();
564         RecordGUI *gui;
565 };
566
567 class RecordGUIResetTranslation : public BC_Button
568 {
569 public:
570         RecordGUIResetTranslation(MWindow *mwindow, RecordGUI *gui, int y);
571         ~RecordGUIResetTranslation();
572
573         int handle_event();
574         RecordGUI *gui;
575 };
576
577 #endif