4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
25 #include "../config.h"
29 #include "packagingengine.h"
31 #include <theora/theora.h>
32 #include <vorbis/codec.h>
33 #include <vorbis/vorbisenc.h>
38 /* This code was aspired by ffmpeg2theora */
39 /* Special thanks for help on this code goes out to j@v2v.cc */
44 off_t file_bufpos; // position of the start of the buffer inside the file
45 off_t file_pagepos; // position of the page that will be next read
46 off_t file_pagepos_found; // position of last page that was returned (in seeking operations)
57 ogg_int64_t audio_bytesout;
58 ogg_int64_t video_bytesout;
60 ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */
61 ogg_packet op; /* one raw packet of data for decode */
67 vorbis_info vi; /* struct that stores all the static vorbis bitstream settings */
68 vorbis_comment vc; /* struct that stores all the user comments */
69 vorbis_dsp_state vd; /* central working state for the packet<->PCM encoder/decoder */
70 vorbis_block vb; /* local working space for packet<->PCM encode/decode */
73 ogg_stream_state to; /* take physical pages, weld into a logical
74 * stream of packets */
75 ogg_stream_state vo; /* take physical pages, weld into a logical
76 * stream of packets */
84 int vpage_buffer_length;
85 int apage_buffer_length;
88 // stuff needed for reading only
89 sync_window_t *audiosync;
90 sync_window_t *videosync;
92 //to do some manual page flusing
99 class FileOGG : public FileBase
101 friend class PackagingEngineOGG;
103 FileOGG(Asset *asset, File *file);
106 static void get_parameters(BC_WindowBase *parent_window,
107 Asset *asset, BC_WindowBase* &format_window,
108 int audio_options, int video_options, EDL *edl);
110 int reset_parameters_derived();
111 int open_file(int rd, int wr);
112 static int check_sig(Asset *asset);
114 int close_file_derived();
115 int64_t get_video_position();
116 int64_t get_audio_position();
117 int set_video_position(int64_t x);
118 int set_audio_position(int64_t x);
119 int colormodel_supported(int colormodel);
120 int get_best_colormodel(Asset *asset, int driver);
121 int write_samples(double **buffer, int64_t len);
122 int write_frames(VFrame ***frames, int len);
123 int read_samples(double *buffer, int64_t len);
124 int read_frame(VFrame *frame);
127 int write_samples_vorbis(double **buffer, int64_t len, int e_o_s);
128 int write_frames_theora(VFrame ***frames, int len, int e_o_s);
129 void flush_ogg(int e_o_s);
130 int write_audio_page();
131 int write_video_page();
136 theoraframes_info_t *tf;
140 off_t filedata_begin;
142 int ogg_get_last_page(sync_window_t *sw, long serialno, ogg_page *og);
143 int ogg_get_prev_page(sync_window_t *sw, long serialno, ogg_page *og);
144 int ogg_get_first_page(sync_window_t *sw, long serialno, ogg_page *og);
145 int ogg_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
146 int ogg_sync_and_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
148 int ogg_get_page_of_sample(sync_window_t *sw, long serialno, ogg_page *og, int64_t sample);
149 int ogg_seek_to_sample(sync_window_t *sw, long serialno, int64_t sample);
150 int ogg_decode_more_samples(sync_window_t *sw, long serialno);
152 int ogg_get_page_of_frame(sync_window_t *sw, long serialno, ogg_page *og, int64_t frame);
153 int ogg_seek_to_keyframe(sync_window_t *sw, long serialno, int64_t frame, int64_t *position);
154 int ogg_seek_to_databegin(sync_window_t *sw, long serialno);
157 int64_t start_sample; // first and last sample inside this file
159 int64_t start_frame; // first and last frame inside this file
163 int64_t ogg_sample_position; // what will be the next sample taken from vorbis decoder
164 int64_t next_sample_position; // what is the next sample read_samples must deliver
166 int move_history(int from, int to, int len);
170 #define HISTORY_MAX 0x100000
172 int64_t history_start;
173 int64_t history_size;
176 int64_t ogg_frame_position; // LAST decoded frame position
177 int64_t next_frame_position; // what is the next sample read_frames must deliver
178 char theora_keyframe_granule_shift;
182 class OGGConfigAudio;
183 class OGGConfigVideo;
185 class OGGVorbisFixedBitrate : public BC_Radial
188 OGGVorbisFixedBitrate(int x, int y, OGGConfigAudio *gui);
193 class OGGVorbisVariableBitrate : public BC_Radial
196 OGGVorbisVariableBitrate(int x, int y, OGGConfigAudio *gui);
201 class OGGVorbisMinBitrate : public BC_TextBox
204 OGGVorbisMinBitrate(int x,
212 class OGGVorbisMaxBitrate : public BC_TextBox
215 OGGVorbisMaxBitrate(int x,
223 class OGGVorbisAvgBitrate : public BC_TextBox
226 OGGVorbisAvgBitrate(int x,
235 class OGGConfigAudio: public BC_Window
238 OGGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
241 void create_objects();
245 OGGVorbisFixedBitrate *fixed_bitrate;
246 OGGVorbisVariableBitrate *variable_bitrate;
248 BC_WindowBase *parent_window;
249 char string[BCTEXTLEN];
253 class OGGTheoraBitrate : public BC_TextBox
256 OGGTheoraBitrate(int x, int y, OGGConfigVideo *gui);
261 class OGGTheoraKeyframeFrequency : public BC_TumbleTextBox
264 OGGTheoraKeyframeFrequency(int x, int y, OGGConfigVideo *gui);
269 class OGGTheoraKeyframeForceFrequency : public BC_TumbleTextBox
272 OGGTheoraKeyframeForceFrequency(int x, int y, OGGConfigVideo *gui);
277 class OGGTheoraSharpness : public BC_TumbleTextBox
280 OGGTheoraSharpness(int x, int y, OGGConfigVideo *gui);
285 class OGGTheoraFixedBitrate : public BC_Radial
288 OGGTheoraFixedBitrate(int x, int y, OGGConfigVideo *gui);
293 class OGGTheoraFixedQuality : public BC_Radial
296 OGGTheoraFixedQuality(int x, int y, OGGConfigVideo *gui);
303 class OGGConfigVideo: public BC_Window
306 OGGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
309 void create_objects();
312 OGGTheoraFixedBitrate *fixed_bitrate;
313 OGGTheoraFixedQuality *fixed_quality;
316 BC_WindowBase *parent_window;
319 class PackagingEngineOGG : public PackagingEngine
322 PackagingEngineOGG();
323 ~PackagingEngineOGG();
324 int create_packages_single_farm(
326 Preferences *preferences,
327 Asset *default_asset,
330 RenderPackage* get_package_single_farm(double frames_per_second,
333 int64_t get_progress_max();
334 void get_package_paths(ArrayList<char*> *path_list);
335 int packages_are_done();
340 RenderPackage **packages;
342 double video_package_len; // Target length of a single package
344 Asset *default_asset;
345 Preferences *preferences;
349 int64_t audio_position;
350 int64_t video_position;