rework index builder, add pro ffmpeg format
[goodguy/history.git] / cinelerra-5.1 / cinelerra / fileffmpeg.h
1 #ifndef __FILEFFMPEG_H__
2 #define __FILEFFMPEG_H__
3
4 #include "asset.inc" 
5 #include "bcwindowbase.inc"
6 #include "bitspopup.inc" 
7 #include "filebase.h"
8 #include "fileffmpeg.inc"
9 #include "indexfile.inc"
10 #include "mainprogress.inc"
11 #include "mutex.h"
12 #include "thread.h"
13 #include "vframe.inc"
14
15 #include <stdio.h>
16 #include <stdint.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19 #include <string.h>
20
21 class FileFFMPEG;
22 class FFMpegConfigNum;
23 class FFMpegAudioNum;
24 class FFMpegVideoNum;
25 class FFOkButton;
26 class FFOptions;
27 class FFMPEGConfigAudio;
28 class FFAudioOptions;
29 class FFMPEGConfigAudioPopup;
30 class FFMPEGConfigAudioToggle;
31 class FFMPEGConfigVideo;
32 class FFVideoOptions;
33 class FFMPEGConfigVideoPopup;
34 class FFMPEGConfigVideoToggle;
35
36 class FileFFMPEG : public FileBase
37 {
38 public:
39         FFMPEG *ff;
40
41         FileFFMPEG(Asset *asset, File *file);
42         ~FileFFMPEG();
43         static void ff_lock(const char *cp=0);
44         static void ff_unlock();
45
46         static void get_parameters(BC_WindowBase *parent_window,Asset *asset,
47            BC_WindowBase *&format_window,int audio_options,int video_options);
48         static int check_sig(Asset *asset);
49         int get_video_info(int track, int &pid, double &framerate,
50                 int &width, int &height, char *title=0);
51         int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
52         static void get_info(char *path,char *text,int len);
53         int open_file(int rd,int wr);
54         int get_index(IndexFile *index_file, MainProgressBar *progress_bar);
55         int close_file(void);
56         int write_samples(double **buffer,int64_t len);
57         int write_frames(VFrame ***frames,int len);
58         int read_samples(double *buffer,int64_t len);
59         int read_frame(VFrame *frame);
60         int64_t get_memory_usage(void);
61         int colormodel_supported(int colormodel);
62         int get_best_colormodel(Asset *asset,int driver);
63         int select_video_stream(Asset *asset, int vstream);
64         int select_audio_stream(Asset *asset, int astream);
65 };
66
67 class FFMpegConfigNum : public BC_TumbleTextBox
68 {
69 public:
70         FFMpegConfigNum(BC_Window *window, int x, int y,
71                 char *title_text, int *output);
72         ~FFMpegConfigNum();
73
74         void create_objects();
75         int handle_event();
76         int *output;
77         BC_Window *window;
78         BC_Title *title;
79         char *title_text;
80         int x, y;
81 };
82
83 class FFMpegAudioNum : public FFMpegConfigNum
84 {
85 public:
86         FFMpegAudioNum(BC_Window *window, int x, int y, char *title_text, int *output);
87         ~FFMpegAudioNum() {}
88
89         FFMPEGConfigAudio *window() { return (FFMPEGConfigAudio *)FFMpegConfigNum::window; }
90 };
91
92 class FFMpegAudioBitrate : public FFMpegAudioNum
93 {
94 public:
95         FFMpegAudioBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
96           : FFMpegAudioNum(window, x, y, title_text, output) {}
97         int handle_event();
98 };
99
100 class FFMpegVideoNum : public FFMpegConfigNum
101 {
102 public:
103         FFMpegVideoNum(BC_Window *window, int x, int y, char *title_text, int *output);
104         ~FFMpegVideoNum() {}
105
106         FFMPEGConfigVideo *window() { return (FFMPEGConfigVideo *)FFMpegConfigNum::window; }
107 };
108
109 class FFMpegVideoBitrate : public FFMpegVideoNum
110 {
111 public:
112         FFMpegVideoBitrate(BC_Window *window, int x, int y, char *title_text, int *output)
113           : FFMpegVideoNum(window, x, y, title_text, output) {}
114         int handle_event();
115 };
116
117 class FFMpegVideoQuality : public FFMpegVideoNum
118 {
119 public:
120         FFMpegVideoQuality(BC_Window *window, int x, int y, char *title_text, int *output)
121           : FFMpegVideoNum(window, x, y, title_text, output) {}
122         int handle_event();
123 };
124
125 class FFMPEGConfigAudio : public BC_Window
126 {
127 public:
128         FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
129         ~FFMPEGConfigAudio();
130
131         void create_objects();
132         int close_event();
133
134         ArrayList<BC_ListBoxItem*> presets;
135         FFMPEGConfigAudioPopup *preset_popup;
136         FFMpegAudioBitrate *bitrate;
137         FFAudioOptions *audio_options;
138         BC_WindowBase *parent_window;
139         Asset *asset;
140 };
141
142 class FFAudioOptions : public BC_TextBox
143 {
144 public:
145         FFAudioOptions(FFMPEGConfigAudio *audio_popup,
146                 int x, int y, int w, int rows, int size, char *text);
147         int handle_event();
148
149         FFMPEGConfigAudio *audio_popup;
150 };
151
152
153 class FFMPEGConfigAudioPopup : public BC_PopupTextBox
154 {
155 public:
156         FFMPEGConfigAudioPopup(FFMPEGConfigAudio *popup, int x, int y);
157         int handle_event();
158         FFMPEGConfigAudio *popup;
159 };
160
161
162 class FFMPEGConfigAudioToggle : public BC_CheckBox
163 {
164 public:
165         FFMPEGConfigAudioToggle(FFMPEGConfigAudio *popup,
166                 char *title_text, int x, int y, int *output);
167         int handle_event();
168         int *output;
169         FFMPEGConfigAudio *popup;
170 };
171
172 class FFMPEGConfigVideo : public BC_Window
173 {
174 public:
175         FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
176         ~FFMPEGConfigVideo();
177
178         void create_objects();
179         int close_event();
180
181         ArrayList<BC_ListBoxItem*> presets;
182         FFMPEGConfigVideoPopup *preset_popup;
183         BC_WindowBase *parent_window;
184         FFMpegVideoBitrate *bitrate;
185         FFMpegVideoQuality *quality;
186         FFVideoOptions *video_options;
187         Asset *asset;
188 };
189
190 class FFVideoOptions : public BC_TextBox
191 {
192 public:
193         FFVideoOptions(FFMPEGConfigVideo *video_popup,
194                 int x, int y, int w, int rows, int size, char *text);
195         int handle_event();
196
197         FFMPEGConfigVideo *video_popup;
198 };
199
200 class FFMPEGConfigVideoPopup : public BC_PopupTextBox
201 {
202 public:
203         FFMPEGConfigVideoPopup(FFMPEGConfigVideo *popup, int x, int y);
204         int handle_event();
205         FFMPEGConfigVideo *popup;
206 };
207
208 class FFMPEGConfigVideoToggle : public BC_CheckBox
209 {
210 public:
211         FFMPEGConfigVideoToggle(FFMPEGConfigVideo *popup,
212                 char *title_text, int x, int y, int *output);
213         int handle_event();
214         int *output;
215         FFMPEGConfigVideo *popup;
216 };
217
218 class FFMPEGScanProgress : public Thread
219 {
220 public:
221         IndexFile *index_file;
222         MainProgressBar *progress_bar;
223         char progress_title[BCTEXTLEN];
224         int64_t length, *position;
225         int done, *canceled;
226
227         FFMPEGScanProgress(IndexFile *index_file, MainProgressBar *progress_bar,
228                 const char *title, int64_t length, int64_t *position, int *canceled);
229         ~FFMPEGScanProgress();
230         void run();
231 };
232
233 #endif