workaround for ub16 compiler problem
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / fileogg.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 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 FILEOGG_H
23 #define FILEOGG_H
24
25 #include "edl.inc"
26 #include "filebase.h"
27 #include "file.inc"
28 #include "packagingengine.h"
29
30 #include <theora/theora.h>
31 #include <vorbis/codec.h>
32 #include <vorbis/vorbisenc.h>
33
34
35 #include <libdv/dv.h>
36
37 /* This code was aspired by ffmpeg2theora */
38 /* Special thanks for help on this code goes out to j@v2v.cc */
39
40 typedef struct
41 {
42         ogg_sync_state sync;
43         off_t file_bufpos; // position of the start of the buffer inside the file
44         off_t file_pagepos; // position of the page that will be next read
45         off_t file_pagepos_found; // position of last page that was returned (in seeking operations)
46         int wlen;
47 } sync_window_t;
48
49 typedef struct
50 {
51     ogg_page audiopage;
52     ogg_page videopage;
53
54     double audiotime;
55     double videotime;
56     ogg_int64_t audio_bytesout;
57     ogg_int64_t video_bytesout;
58
59     ogg_page og;    /* one Ogg bitstream page.  Vorbis packets are inside */
60     ogg_packet op;  /* one raw packet of data for decode */
61
62     theora_info ti;
63     theora_comment tc;
64     theora_state td;
65
66     vorbis_info vi;       /* struct that stores all the static vorbis bitstream settings */
67     vorbis_comment vc;    /* struct that stores all the user comments */
68     vorbis_dsp_state vd; /* central working state for the packet<->PCM encoder/decoder */
69     vorbis_block vb;     /* local working space for packet<->PCM encode/decode */
70
71     /* used for muxing */
72     ogg_stream_state to;    /* take physical pages, weld into a logical
73                              * stream of packets */
74     ogg_stream_state vo;    /* take physical pages, weld into a logical
75                              * stream of packets */
76
77     int apage_valid;
78     int vpage_valid;
79     unsigned char *apage;
80     unsigned char *vpage;
81     int vpage_len;
82     int apage_len;
83     int vpage_buffer_length;
84     int apage_buffer_length;
85
86
87 // stuff needed for reading only
88         sync_window_t *audiosync;
89         sync_window_t *videosync;
90
91     //to do some manual page flusing
92     int v_pkg;
93     int a_pkg;
94
95 }
96 theoraframes_info_t;
97
98 class FileOGG : public FileBase
99 {
100 friend class PackagingEngineOGG;
101 public:
102         FileOGG(Asset *asset, File *file);
103         ~FileOGG();
104
105         static void get_parameters(BC_WindowBase *parent_window,
106                 Asset *asset, BC_WindowBase* &format_window,
107                 int audio_options, int video_options, EDL *edl);
108
109         int reset_parameters_derived();
110         int open_file(int rd, int wr);
111         static int check_sig(Asset *asset);
112         int close_file();
113         int close_file_derived();
114         int64_t get_video_position();
115         int64_t get_audio_position();
116         int set_video_position(int64_t x);
117         int set_audio_position(int64_t x);
118         int colormodel_supported(int colormodel);
119         int get_best_colormodel(Asset *asset, int driver);
120         int write_samples(double **buffer, int64_t len);
121         int write_frames(VFrame ***frames, int len);
122         int read_samples(double *buffer, int64_t len);
123         int read_frame(VFrame *frame);
124
125 private:
126         int write_samples_vorbis(double **buffer, int64_t len, int e_o_s);
127         int write_frames_theora(VFrame ***frames, int len, int e_o_s);
128         void flush_ogg(int e_o_s);
129         int write_audio_page();
130         int write_video_page();
131
132         FILE *stream;
133         off_t file_length;
134
135         theoraframes_info_t *tf;
136         VFrame *temp_frame;
137         Mutex *flush_lock;
138
139         off_t filedata_begin;
140
141         int ogg_get_last_page(sync_window_t *sw, long serialno, ogg_page *og);
142         int ogg_get_prev_page(sync_window_t *sw, long serialno, ogg_page *og);
143         int ogg_get_first_page(sync_window_t *sw, long serialno, ogg_page *og);
144         int ogg_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
145         int ogg_sync_and_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
146
147         int ogg_get_page_of_sample(sync_window_t *sw, long serialno, ogg_page *og, int64_t sample);
148         int ogg_seek_to_sample(sync_window_t *sw, long serialno, int64_t sample);
149         int ogg_decode_more_samples(sync_window_t *sw, long serialno);
150
151         int ogg_get_page_of_frame(sync_window_t *sw, long serialno, ogg_page *og, int64_t frame);
152         int ogg_seek_to_keyframe(sync_window_t *sw, long serialno, int64_t frame, int64_t *position);
153         int ogg_seek_to_databegin(sync_window_t *sw, long serialno);
154
155
156         int64_t start_sample; // first and last sample inside this file
157         int64_t last_sample;
158         int64_t start_frame; // first and last frame inside this file
159         int64_t last_frame;
160
161
162         int64_t ogg_sample_position;  // what will be the next sample taken from vorbis decoder
163         int64_t next_sample_position; // what is the next sample read_samples must deliver
164
165         int move_history(int from, int to, int len);
166
167         float **pcm_history;
168 #ifndef HISTORY_MAX
169 #define HISTORY_MAX 0x100000
170 #endif
171         int64_t history_start;
172         int64_t history_size;
173
174         int theora_cmodel;
175         int64_t ogg_frame_position;    // LAST decoded frame position
176         int64_t next_frame_position;   // what is the next sample read_frames must deliver
177         char theora_keyframe_granule_shift;
178         int final_write;
179 };
180
181 class OGGConfigAudio;
182 class OGGConfigVideo;
183
184 class OGGVorbisFixedBitrate : public BC_Radial
185 {
186 public:
187         OGGVorbisFixedBitrate(int x, int y, OGGConfigAudio *gui);
188         int handle_event();
189         OGGConfigAudio *gui;
190 };
191
192 class OGGVorbisVariableBitrate : public BC_Radial
193 {
194 public:
195         OGGVorbisVariableBitrate(int x, int y, OGGConfigAudio *gui);
196         int handle_event();
197         OGGConfigAudio *gui;
198 };
199
200 class OGGVorbisMinBitrate : public BC_TextBox
201 {
202 public:
203         OGGVorbisMinBitrate(int x,
204                 int y,
205                 OGGConfigAudio *gui,
206                 char *text);
207         int handle_event();
208         OGGConfigAudio *gui;
209 };
210
211 class OGGVorbisMaxBitrate : public BC_TextBox
212 {
213 public:
214         OGGVorbisMaxBitrate(int x,
215                 int y,
216                 OGGConfigAudio *gui,
217                 char *text);
218         int handle_event();
219         OGGConfigAudio *gui;
220 };
221
222 class OGGVorbisAvgBitrate : public BC_TextBox
223 {
224 public:
225         OGGVorbisAvgBitrate(int x,
226                 int y,
227                 OGGConfigAudio *gui,
228                 char *text);
229         int handle_event();
230         OGGConfigAudio *gui;
231 };
232
233
234 class OGGConfigAudio: public BC_Window
235 {
236 public:
237         OGGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
238         ~OGGConfigAudio();
239
240         void create_objects();
241         int close_event();
242
243         Asset *asset;
244         OGGVorbisFixedBitrate *fixed_bitrate;
245         OGGVorbisVariableBitrate *variable_bitrate;
246 private:
247         BC_WindowBase *parent_window;
248         char string[BCTEXTLEN];
249 };
250
251
252 class OGGTheoraBitrate : public BC_TextBox
253 {
254 public:
255         OGGTheoraBitrate(int x, int y, OGGConfigVideo *gui);
256         int handle_event();
257         OGGConfigVideo *gui;
258 };
259
260 class OGGTheoraKeyframeFrequency : public BC_TumbleTextBox
261 {
262 public:
263         OGGTheoraKeyframeFrequency(int x, int y, OGGConfigVideo *gui);
264         int handle_event();
265         OGGConfigVideo *gui;
266 };
267
268 class OGGTheoraKeyframeForceFrequency : public BC_TumbleTextBox
269 {
270 public:
271         OGGTheoraKeyframeForceFrequency(int x, int y, OGGConfigVideo *gui);
272         int handle_event();
273         OGGConfigVideo *gui;
274 };
275
276 class OGGTheoraSharpness : public BC_TumbleTextBox
277 {
278 public:
279         OGGTheoraSharpness(int x, int y, OGGConfigVideo *gui);
280         int handle_event();
281         OGGConfigVideo *gui;
282 };
283
284 class OGGTheoraFixedBitrate : public BC_Radial
285 {
286 public:
287         OGGTheoraFixedBitrate(int x, int y, OGGConfigVideo *gui);
288         int handle_event();
289         OGGConfigVideo *gui;
290 };
291
292 class OGGTheoraFixedQuality : public BC_Radial
293 {
294 public:
295         OGGTheoraFixedQuality(int x, int y, OGGConfigVideo *gui);
296         int handle_event();
297         OGGConfigVideo *gui;
298 };
299
300
301
302 class OGGConfigVideo: public BC_Window
303 {
304 public:
305         OGGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
306         ~OGGConfigVideo();
307
308         void create_objects();
309         int close_event();
310
311         OGGTheoraFixedBitrate *fixed_bitrate;
312         OGGTheoraFixedQuality *fixed_quality;
313         Asset *asset;
314 private:
315         BC_WindowBase *parent_window;
316 };
317
318 class PackagingEngineOGG : public PackagingEngine
319 {
320 public:
321         PackagingEngineOGG();
322         ~PackagingEngineOGG();
323         int create_packages_single_farm(
324                 EDL *edl,
325                 Preferences *preferences,
326                 Asset *default_asset,
327                 double total_start,
328                 double total_end);
329         RenderPackage* get_package_single_farm(double frames_per_second,
330                 int client_number,
331                 int use_local_rate);
332         int64_t get_progress_max();
333         void get_package_paths(ArrayList<char*> *path_list);
334         int packages_are_done();
335
336 private:
337         EDL *edl;
338
339         RenderPackage **packages;
340         int total_packages;
341         double video_package_len;    // Target length of a single package
342
343         Asset *default_asset;
344         Preferences *preferences;
345         int current_package;
346         double total_start;
347         double total_end;
348         int64_t audio_position;
349         int64_t video_position;
350         int64_t audio_start;
351         int64_t video_start;
352         int64_t audio_end;
353         int64_t video_end;
354
355 };
356
357
358 #endif