1 /* $Id: common.h,v 1.51 2005/11/04 13:09:40 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.m0k.org/>.
5 It may be used under the terms of the GNU General Public License. */
17 #include <sys/types.h>
22 #define MIN( a, b ) ( (a) > (b) ? (b) : (a) )
25 #define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
28 #define EVEN( a ) ( (a) + ( (a) & 1 ) )
29 #define MULTIPLE_16( a ) ( 16 * ( ( (a) + 8 ) / 16 ) )
31 typedef struct hb_handle_s hb_handle_t;
32 typedef struct hb_list_s hb_list_t;
33 typedef struct hb_rate_s hb_rate_t;
34 typedef struct hb_mixdown_s hb_mixdown_t;
35 typedef struct hb_job_s hb_job_t;
36 typedef struct hb_title_s hb_title_t;
37 typedef struct hb_chapter_s hb_chapter_t;
38 typedef struct hb_audio_s hb_audio_t;
39 typedef struct hb_subtitle_s hb_subtitle_t;
40 typedef struct hb_state_s hb_state_t;
41 typedef union hb_esconfig_u hb_esconfig_t;
42 typedef struct hb_work_private_s hb_work_private_t;
43 typedef struct hb_work_object_s hb_work_object_t;
44 typedef struct hb_buffer_s hb_buffer_t;
45 typedef struct hb_fifo_s hb_fifo_t;
46 typedef struct hb_lock_s hb_lock_t;
53 hb_list_t * hb_list_init();
54 int hb_list_count( hb_list_t * );
55 void hb_list_add( hb_list_t *, void * );
56 void hb_list_rem( hb_list_t *, void * );
57 void * hb_list_item( hb_list_t *, int );
58 void hb_list_close( hb_list_t ** );
60 void hb_reduce( int *x, int *y, int num, int den );
62 #define HB_KEEP_WIDTH 0
63 #define HB_KEEP_HEIGHT 1
64 void hb_fix_aspect( hb_job_t * job, int keep );
66 int hb_calc_bitrate( hb_job_t *, int size );
76 char * human_readable_name;
82 #define HB_ASPECT_BASE 9
83 #define HB_VIDEO_RATE_BASE 27000000
85 extern hb_rate_t hb_video_rates[];
86 extern int hb_video_rates_count;
87 extern hb_rate_t hb_audio_rates[];
88 extern int hb_audio_rates_count;
89 extern int hb_audio_rates_default;
90 extern hb_rate_t hb_audio_bitrates[];
91 extern int hb_audio_bitrates_count;
92 extern int hb_audio_bitrates_default;
93 extern hb_mixdown_t hb_audio_mixdowns[];
94 extern int hb_audio_mixdowns_count;
95 int hb_mixdown_get_mixdown_from_short_name( const char * short_name );
96 const char * hb_mixdown_get_short_name_from_mixdown( int amixdown );
98 /******************************************************************************
99 * hb_job_t: settings to be filled by the UI
100 *****************************************************************************/
103 /* Pointer to the title to be ripped */
106 /* Chapter selection */
110 /* Include chapter marker track in mp4? */
114 crop: must be multiples of 2 (top/bottom/left/right)
116 width: must be a multiple of 16
117 height: must be a multiple of 16
118 keep_ratio: used by UIs
119 pixel_ratio: store pixel aspect ratio in the video
120 pixel_aspect_width: numerator for pixel aspect ratio
121 pixel_aspect_height: denominator for pixel aspect ratio
122 maxWidth: keep width below this
123 maxHeight: keep height below this */
132 int pixel_aspect_width;
133 int pixel_aspect_height;
140 vquality: output quality (0.0..1.0)
141 if < 0.0 or > 1.0, bitrate is used instead
142 vbitrate: output bitrate (kbps)
144 vrate, vrate_base: output framerate is vrate / vrate_base
145 h264_level: boolean for whether or not we're encoding for iPod
146 crf: boolean for whether to use constant rate factor with x264
147 x264opts: string of extra x264 options
148 areBframes: boolean to note if b-frames are included in x264opts */
149 #define HB_VCODEC_MASK 0x0000FF
150 #define HB_VCODEC_FFMPEG 0x000001
151 #define HB_VCODEC_XVID 0x000002
152 #define HB_VCODEC_X264 0x000004
163 const char *x264opts;
167 audios: Indexes in hb_title_t's audios list, starting from 0.
168 -1 indicates the end of the list
169 audio_mixdowns: The mixdown to be used for each audio track in audios[] */
171 /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */
172 #define HB_AMIXDOWN_A52_FORMAT_MASK 0x00FF0000
173 #define HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK 0x0000F000
174 #define HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK 0x00000F00
175 #define HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK 0x000000F0
176 #define HB_AMIXDOWN_LFE_CHANNEL_COUNT_MASK 0x0000000F
177 /* define the HB_AMIXDOWN_XXXX values */
178 #define HB_AMIXDOWN_MONO 0x01011100 // A52_FORMAT of A52_MONO = 1 = 0x01
179 #define HB_AMIXDOWN_STEREO 0x02022200 // A52_FORMAT of A52_STEREO = 2 = 0x02
180 #define HB_AMIXDOWN_DOLBY 0x040A2310 // A52_FORMAT of A52_DOLBY = 10 = 0x0A
181 #define HB_AMIXDOWN_DOLBYPLII 0x084A2320 // A52_FORMAT of A52_DOLBY | A52_USE_DPLII = 74 = 0x4A
182 #define HB_AMIXDOWN_6CH 0x10176321 // A52_FORMAT of A52_3F2R | A52_LFE = 23 = 0x17
183 /* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */
184 #define HB_AMIXDOWN_GET_A52_FORMAT( a ) ( ( a & HB_AMIXDOWN_A52_FORMAT_MASK ) >> 16 )
185 #define HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK ) >> 12 )
186 #define HB_AMIXDOWN_GET_FRONT_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK ) >> 8 )
187 #define HB_AMIXDOWN_GET_REAR_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK ) >> 4 )
188 #define HB_AMIXDOWN_GET_LFE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_LFE_CHANNEL_COUNT_MASK ) )
189 #define HB_AMIXDOWN_GET_NORMAL_CHANNEL_COUNT( a ) ( (( a & HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK ) >> 8) + (( a & HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK ) >> 4) )
191 int audio_mixdowns[8];
193 /* this "surround" property will be removed shortly,
194 as soon as the AMIXDOWN code has been integrated into the Mac GUI
195 it's still included here to avoid breaking the Mac GUI short-term
196 however, it won't be applied in deca52.c etc. any more */
201 abitrate: output bitrate (kbps)
202 arate: output samplerate (Hz)
203 HB_ACODEC_AC3 means pass-through, then abitrate and arate are
205 #define HB_ACODEC_MASK 0x00FF00
206 #define HB_ACODEC_FAAC 0x000100
207 #define HB_ACODEC_LAME 0x000200
208 #define HB_ACODEC_VORBIS 0x000400
209 #define HB_ACODEC_AC3 0x000800
210 #define HB_ACODEC_MPGA 0x001000
211 #define HB_ACODEC_LPCM 0x002000
216 /* Subtitle settings:
217 subtitle: index in hb_title_t's subtitles list, starting
218 from 0. -1 means no subtitle */
222 mux: output file format
224 #define HB_MUX_MASK 0xFF0000
225 #define HB_MUX_MP4 0x010000
226 #define HB_MUX_PSP 0x020000
227 #define HB_MUX_AVI 0x040000
228 #define HB_MUX_OGM 0x080000
229 #define HB_MUX_IPOD 0x100000
241 hb_fifo_t * fifo_mpeg2; /* MPEG-2 video ES */
242 hb_fifo_t * fifo_raw; /* Raw pictures */
243 hb_fifo_t * fifo_sync; /* Raw pictures, framerate corrected */
244 hb_fifo_t * fifo_render; /* Raw pictures, scaled */
245 hb_fifo_t * fifo_mpeg4; /* MPEG-4 video ES */
247 hb_thread_t * reader;
250 hb_list_t * list_work;
252 hb_esconfig_t config;
254 hb_mux_data_t * mux_data;
262 char lang_simple[1024];
267 /* src_discrete_front_channels: The # of discrete front channels in the source audio
268 src_discrete_rear_channels: The # of discrete rear channels in the source audio
269 src_discrete_lfe_channels: The # of discrete lfe channels in the source audio
270 src_encoded_front_channels: The # of front channels encoded into the source audio
271 src_encoded_rear_channels: The # of rear channels encoded into the source audio */
272 int src_discrete_front_channels;
273 int src_discrete_rear_channels;
274 int src_discrete_lfe_channels;
275 int src_encoded_front_channels;
276 int src_encoded_rear_channels;
278 /* ac3flags is only set when the source audio format is HB_ACODEC_AC3 */
283 hb_fifo_t * fifo_in; /* AC3/MPEG/LPCM ES */
284 hb_fifo_t * fifo_raw; /* Raw audio */
285 hb_fifo_t * fifo_sync; /* Resampled, synced raw audio */
286 hb_fifo_t * fifo_out; /* MP3/AAC/Vorbis ES */
288 hb_esconfig_t config;
289 hb_mux_data_t * mux_data;
291 /* amixdown is the mixdown format to be used for this audio track */
306 /* Visual-friendly duration */
311 /* Exact duration (in 1/90000s) */
323 hb_fifo_t * fifo_in; /* SPU ES */
324 hb_fifo_t * fifo_raw; /* Decodec SPU */
341 /* Visual-friendly duration */
346 /* Exact duration (in 1/90000s) */
356 uint32_t palette[16];
358 hb_list_t * list_chapter;
359 hb_list_t * list_audio;
360 hb_list_t * list_subtitle;
362 /* Job template for this title */
369 #define HB_STATE_IDLE 1
370 #define HB_STATE_SCANNING 2
371 #define HB_STATE_SCANDONE 4
372 #define HB_STATE_WORKING 8
373 #define HB_STATE_PAUSED 16
374 #define HB_STATE_WORKDONE 32
375 #define HB_STATE_MUXING 64
382 /* HB_STATE_SCANNING */
389 /* HB_STATE_WORKING */
402 /* HB_STATE_WORKDONE */
403 #define HB_ERROR_NONE 0
404 #define HB_ERROR_CANCELED 1
405 #define HB_ERROR_UNKNOWN 2
411 /* HB_STATE_MUXING */
417 struct hb_work_object_s
423 int (* init) ( hb_work_object_t *, hb_job_t * );
424 int (* work) ( hb_work_object_t *, hb_buffer_t **,
426 void (* close) ( hb_work_object_t * );
429 hb_fifo_t * fifo_out;
430 hb_esconfig_t * config;
432 /* amixdown is the mixdown format to be used if the work object is an audio track */
435 hb_work_private_t * private_data;
437 hb_thread_t * thread;
440 hb_work_object_t * next;
441 int thread_sleep_interval;
445 extern hb_work_object_t hb_sync;
446 extern hb_work_object_t hb_decmpeg2;
447 extern hb_work_object_t hb_decsub;
448 extern hb_work_object_t hb_render;
449 extern hb_work_object_t hb_encavcodec;
450 extern hb_work_object_t hb_encxvid;
451 extern hb_work_object_t hb_encx264;
452 extern hb_work_object_t hb_deca52;
453 extern hb_work_object_t hb_decavcodec;
454 extern hb_work_object_t hb_declpcm;
455 extern hb_work_object_t hb_encfaac;
456 extern hb_work_object_t hb_enclame;
457 extern hb_work_object_t hb_encvorbis;