00001 #ifndef FILEMOV_H
00002 #define FILEMOV_H
00003
00004 #include "bitspopup.inc"
00005 #include "condition.inc"
00006 #include "filebase.h"
00007 #include "file.inc"
00008
00009 #ifdef HAVE_STDLIB_H
00010 #undef HAVE_STDLIB_H
00011 #endif
00012
00013 #include "libmjpeg.h"
00014 #include "mutex.inc"
00015 #include "quicktime.h"
00016 #include "thread.h"
00017
00018 class FileMOVThread;
00019
00020 class ThreadStruct
00021 {
00022 public:
00023 ThreadStruct();
00024 ~ThreadStruct();
00025
00026 void load_output(mjpeg_t *mjpeg);
00027
00028 VFrame *input;
00029 unsigned char *output;
00030 int64_t output_size;
00031 int64_t output_allocated;
00032 Condition *completion_lock;
00033 };
00034
00035 class FileMOV : public FileBase
00036 {
00037 public:
00038 FileMOV(Asset *asset, File *file);
00039 ~FileMOV();
00040
00041 friend class FileMOVThread;
00042
00043 static void get_parameters(BC_WindowBase *parent_window,
00044 Asset *asset,
00045 BC_WindowBase* &format_window,
00046 int audio_options,
00047 int video_options,
00048 char *locked_compressor);
00049 static int check_sig(Asset *asset);
00050
00051 int open_file(int rd, int wr);
00052 int close_file();
00053 void asset_to_format();
00054 void format_to_asset();
00055 int64_t get_video_length();
00056 int64_t get_audio_length();
00057 int set_video_position(int64_t x);
00058 int set_audio_position(int64_t x);
00059 int write_samples(double **buffer,
00060 int64_t len);
00061 int write_frames(VFrame ***frames, int len);
00062 int64_t compressed_frame_size();
00063 int read_compressed_frame(VFrame *buffer);
00064 int write_compressed_frame(VFrame *buffer);
00065
00066 int read_frame(VFrame *frame);
00067 int read_samples(double *buffer, int64_t len);
00068
00069
00070 static int get_best_colormodel(Asset *asset, int driver);
00071 int64_t get_memory_usage();
00072 int colormodel_supported(int colormodel);
00073 int can_copy_from(Edit *edit, int64_t position);
00074 static char *strtocompression(char *string);
00075 static char *compressiontostr(char *string);
00076
00077
00078 static void fix_codecs(Asset *asset);
00079
00080 int check_codec_params(Asset *asset);
00081
00082
00083 void set_frame_start(int64_t offset);
00084
00085 private:
00086 void new_audio_temp(int64_t len);
00087
00088 int read_raw(char *buffer, int64_t samples, int track);
00089
00090 int read_raw(VFrame *frame,
00091 float in_x1, float in_y1, float in_x2, float in_y2,
00092 float out_x1, float out_y1, float out_x2, float out_y2,
00093 int use_float, int interpolate);
00094 int reset_parameters_derived();
00095 int quicktime_atracks;
00096 int quicktime_vtracks;
00097
00098 quicktime_t *fd;
00099 int depth;
00100 int64_t frames_correction;
00101 int64_t samples_correction;
00102
00103
00104 ArrayList<ThreadStruct*> threadframes;
00105
00106 int total_threadframes;
00107 int current_threadframe;
00108 Mutex *threadframe_lock;
00109
00110 FileMOVThread **threads;
00111 char prefix_path[1024];
00112 int suffix_number;
00113
00114
00115 float **temp_float;
00116 int64_t temp_allocated;
00117 };
00118
00119
00120
00121
00122
00123 class FileMOVThread : public Thread
00124 {
00125 public:
00126 FileMOVThread(FileMOV *filemov, int fields);
00127 ~FileMOVThread();
00128
00129 int start_encoding();
00130 int stop_encoding();
00131 int encode_buffer();
00132 void run();
00133
00134 ThreadStruct *threadframe;
00135 int done;
00136 FileMOV *filemov;
00137 Condition *input_lock;
00138 mjpeg_t *mjpeg;
00139 int fields;
00140 };
00141
00142
00143 class MOVConfigAudioNum;
00144 class MOVConfigAudioPopup;
00145 class MOVConfigAudioToggle;
00146
00147 class MOVConfigAudio : public BC_Window
00148 {
00149 public:
00150 MOVConfigAudio(BC_WindowBase *parent_window, Asset *asset);
00151 ~MOVConfigAudio();
00152
00153 int create_objects();
00154 int close_event();
00155 void update_parameters();
00156 void reset();
00157
00158 MOVConfigAudioPopup *compression_popup;
00159 ArrayList<BC_ListBoxItem*> compression_items;
00160 BC_WindowBase *parent_window;
00161 BitsPopup *bits_popup;
00162 BC_Title *bits_title;
00163 BC_CheckBox *dither;
00164 Asset *asset;
00165 MOVConfigAudioNum *vorbis_min_bitrate;
00166 MOVConfigAudioNum *vorbis_bitrate;
00167 MOVConfigAudioNum *vorbis_max_bitrate;
00168 MOVConfigAudioToggle *vorbis_vbr;
00169
00170 MOVConfigAudioNum *mp3_bitrate;
00171 MOVConfigAudioNum *mp4a_bitrate;
00172 MOVConfigAudioNum *mp4a_quantqual;
00173 };
00174
00175
00176 class MOVConfigAudioPopup : public BC_PopupTextBox
00177 {
00178 public:
00179 MOVConfigAudioPopup(MOVConfigAudio *popup, int x, int y);
00180 int handle_event();
00181 MOVConfigAudio *popup;
00182 };
00183
00184
00185 class MOVConfigAudioToggle : public BC_CheckBox
00186 {
00187 public:
00188 MOVConfigAudioToggle(MOVConfigAudio *popup,
00189 char *title_text,
00190 int x,
00191 int y,
00192 int *output);
00193 int handle_event();
00194 int *output;
00195 MOVConfigAudio *popup;
00196 };
00197
00198
00199 class MOVConfigAudioNum : public BC_TumbleTextBox
00200 {
00201 public:
00202 MOVConfigAudioNum(MOVConfigAudio *popup,
00203 char *title_text,
00204 int x,
00205 int y,
00206 int *output);
00207 ~MOVConfigAudioNum();
00208
00209 void create_objects();
00210 int handle_event();
00211 int *output;
00212 MOVConfigAudio *popup;
00213 BC_Title *title;
00214 char *title_text;
00215 int x, y;
00216 };
00217
00218
00219 class MOVConfigVideoPopup;
00220 class MOVConfigVideoNum;
00221 class MOVConfigVideoFix;
00222 class MOVConfigVideoFixBitrate;
00223 class MOVConfigVideoFixQuant;
00224 class MOVConfigVideoCheckBox;
00225
00226
00227 class MOVConfigVideo : public BC_Window
00228 {
00229 public:
00230 MOVConfigVideo(BC_WindowBase *parent_window,
00231 Asset *asset,
00232 char *locked_compressor);
00233 ~MOVConfigVideo();
00234
00235 int create_objects();
00236 int close_event();
00237 void reset();
00238
00239 void update_parameters();
00240
00241 ArrayList<BC_ListBoxItem*> compression_items;
00242 MOVConfigVideoPopup *compression_popup;
00243 BC_WindowBase *parent_window;
00244 Asset *asset;
00245 int param_x, param_y;
00246 char *locked_compressor;
00247
00248 BC_ISlider *jpeg_quality;
00249 BC_Title *jpeg_quality_title;
00250
00251 MOVConfigVideoNum *ms_bitrate;
00252 MOVConfigVideoNum *ms_bitrate_tolerance;
00253 MOVConfigVideoNum *ms_quantization;
00254 MOVConfigVideoNum *ms_gop_size;
00255 MOVConfigVideoCheckBox *ms_interlaced;
00256 MOVConfigVideoFixBitrate *ms_fix_bitrate;
00257 MOVConfigVideoFixQuant *ms_fix_quant;
00258
00259 MOVConfigVideoNum *divx_bitrate;
00260 MOVConfigVideoNum *divx_quantizer;
00261 MOVConfigVideoNum *divx_rc_period;
00262 MOVConfigVideoNum *divx_rc_reaction_ratio;
00263 MOVConfigVideoNum *divx_rc_reaction_period;
00264 MOVConfigVideoNum *divx_max_key_interval;
00265 MOVConfigVideoNum *divx_max_quantizer;
00266 MOVConfigVideoNum *divx_min_quantizer;
00267 MOVConfigVideoNum *divx_quality;
00268 MOVConfigVideoFixBitrate *divx_fix_bitrate;
00269 MOVConfigVideoFixQuant *divx_fix_quant;
00270
00271 MOVConfigVideoNum *h264_bitrate;
00272 MOVConfigVideoNum *h264_quantizer;
00273 MOVConfigVideoFixBitrate *h264_fix_bitrate;
00274 MOVConfigVideoFixQuant *h264_fix_quant;
00275 };
00276
00277 class MOVConfigVideoPopup : public BC_PopupTextBox
00278 {
00279 public:
00280 MOVConfigVideoPopup(MOVConfigVideo *popup, int x, int y);
00281 int handle_event();
00282 MOVConfigVideo *popup;
00283 };
00284
00285 class MOVConfigVideoFixBitrate : public BC_Radial
00286 {
00287 public:
00288 MOVConfigVideoFixBitrate(int x,
00289 int y,
00290 int *output,
00291 int value);
00292 int handle_event();
00293 BC_Radial *opposite;
00294 int *output;
00295 int value;
00296 };
00297
00298 class MOVConfigVideoFixQuant : public BC_Radial
00299 {
00300 public:
00301 MOVConfigVideoFixQuant(int x,
00302 int y,
00303 int *output,
00304 int value);
00305 int handle_event();
00306 BC_Radial *opposite;
00307 int *output;
00308 int value;
00309 };
00310
00311 class MOVConfigVideoCheckBox : public BC_CheckBox
00312 {
00313 public:
00314 MOVConfigVideoCheckBox(char *title_text,
00315 int x,
00316 int y,
00317 int *output);
00318 int handle_event();
00319 int *output;
00320 };
00321
00322 class MOVConfigVideoNum : public BC_TumbleTextBox
00323 {
00324 public:
00325 MOVConfigVideoNum(MOVConfigVideo *popup,
00326 char *title_text,
00327 int x,
00328 int y,
00329 int *output);
00330 MOVConfigVideoNum(MOVConfigVideo *popup,
00331 char *title_text,
00332 int x,
00333 int y,
00334 int min,
00335 int max,
00336 int *output);
00337 ~MOVConfigVideoNum();
00338
00339 void create_objects();
00340 int handle_event();
00341 int *output;
00342 MOVConfigVideo *popup;
00343 BC_Title *title;
00344 char *title_text;
00345 int x, y;
00346 };
00347
00348 #endif