OSDN Git Service

Updated the Mac GUI to use the new audio mixdowns. This means that the Mac GUI now...
[handbrake-jp/handbrake-jp-git.git] / libhb / common.h
1 /* $Id: common.h,v 1.51 2005/11/04 13:09:40 titer Exp $
2
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. */
6
7 #ifndef HB_COMMON_H
8 #define HB_COMMON_H
9
10 #include <math.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdarg.h>
14 #include <string.h>
15 #include <unistd.h>
16 #include <inttypes.h>
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 #include <dirent.h>
20
21 #ifndef MIN
22 #define MIN( a, b ) ( (a) > (b) ? (b) : (a) )
23 #endif
24 #ifndef MAX
25 #define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
26 #endif
27
28 #define EVEN( a )        ( (a) + ( (a) & 1 ) )
29 #define MULTIPLE_16( a ) ( 16 * ( ( (a) + 8 ) / 16 ) )
30
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;
47
48 #include "ports.h"
49 #ifdef __LIBHB__
50 #include "internal.h"
51 #endif
52
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 ** );
59
60 void hb_reduce( int *x, int *y, int num, int den );
61
62 #define HB_KEEP_WIDTH  0
63 #define HB_KEEP_HEIGHT 1
64 void hb_fix_aspect( hb_job_t * job, int keep );
65
66 int hb_calc_bitrate( hb_job_t *, int size );
67
68 struct hb_rate_s
69 {
70     char * string;
71     int    rate;
72 };
73
74 struct hb_mixdown_s
75 {
76     char * human_readable_name;
77     char * internal_name;
78     char * short_name;
79     int    amixdown;
80 };
81
82 #define HB_ASPECT_BASE 9
83 #define HB_VIDEO_RATE_BASE   27000000
84
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
96 /******************************************************************************
97  * hb_job_t: settings to be filled by the UI
98  *****************************************************************************/
99 struct hb_job_s
100 {
101     /* Pointer to the title to be ripped */
102     hb_title_t    * title;
103     
104     /* Chapter selection */
105     int             chapter_start;
106     int             chapter_end;
107
108         /* Include chapter marker track in mp4? */
109     int             chapter_markers;
110
111     /* Picture settings:
112          crop:                must be multiples of 2 (top/bottom/left/right)
113          deinterlace:         0 or 1
114          width:               must be a multiple of 16
115          height:              must be a multiple of 16
116          keep_ratio:          used by UIs 
117          pixel_ratio:         store pixel aspect ratio in the video
118          pixel_aspect_width:  numerator for pixel aspect ratio
119          pixel_aspect_height: denominator for pixel aspect ratio
120                  maxWidth:                        keep width below this
121                  maxHeight:                       keep height below this */
122
123     int             crop[4];
124     int             deinterlace;
125     int             width;
126     int             height;
127     int             keep_ratio;
128     int             grayscale;
129     int             pixel_ratio;
130     int             pixel_aspect_width;
131     int             pixel_aspect_height;
132         int                             maxWidth;
133         int                             maxHeight;
134
135
136     /* Video settings:
137          vcodec:            output codec
138          vquality:          output quality (0.0..1.0)
139                             if < 0.0 or > 1.0, bitrate is used instead
140          vbitrate:          output bitrate (kbps)
141          pass:              0, 1 or 2
142          vrate, vrate_base: output framerate is vrate / vrate_base
143                  h264_level:            boolean for whether or not we're encoding for iPod
144                  crf:                           boolean for whether to use constant rate factor with x264
145                  x264opts:                      string of extra x264 options 
146                  areBframes:            boolean to note if b-frames are included in x264opts */
147 #define HB_VCODEC_MASK   0x0000FF
148 #define HB_VCODEC_FFMPEG 0x000001
149 #define HB_VCODEC_XVID   0x000002
150 #define HB_VCODEC_X264   0x000004
151
152     int             vcodec;
153     float           vquality;
154     int             vbitrate;
155     int             vrate;
156     int             vrate_base;
157     int             pass;
158     int             h264_13;
159         int                             h264_level;
160         int                             crf;
161         const char              *x264opts;
162         int                             areBframes;
163         
164     /* Audio tracks:
165          audios:          Indexes in hb_title_t's audios list, starting from 0.
166                           -1 indicates the end of the list
167              audio_mixdowns:  The mixdown to be used for each audio track in audios[] */
168
169 /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */
170 #define HB_AMIXDOWN_A52_FORMAT_MASK             0x00FF0000
171 #define HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK 0x0000F000
172 #define HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK    0x00000F00
173 #define HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK     0x000000F0
174 #define HB_AMIXDOWN_LFE_CHANNEL_COUNT_MASK      0x0000000F
175 /* define the HB_AMIXDOWN_XXXX values */
176 #define HB_AMIXDOWN_MONO                        0x01011100 // A52_FORMAT of A52_MONO                  = 1  = 0x01
177 #define HB_AMIXDOWN_STEREO                      0x02022200 // A52_FORMAT of A52_STEREO                = 2  = 0x02
178 #define HB_AMIXDOWN_DOLBY                       0x040A2310 // A52_FORMAT of A52_DOLBY                 = 10 = 0x0A
179 #define HB_AMIXDOWN_DOLBYPLII                   0x084A2320 // A52_FORMAT of A52_DOLBY | A52_USE_DPLII = 74 = 0x4A
180 #define HB_AMIXDOWN_6CH                         0x10176321 // A52_FORMAT of A52_3F2R | A52_LFE        = 23 = 0x17
181 /* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */
182 #define HB_AMIXDOWN_GET_A52_FORMAT( a ) ( ( a & HB_AMIXDOWN_A52_FORMAT_MASK ) >> 16 )
183 #define HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK ) >> 12 )
184 #define HB_AMIXDOWN_GET_FRONT_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK ) >> 8 )
185 #define HB_AMIXDOWN_GET_REAR_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK ) >> 4 )
186 #define HB_AMIXDOWN_GET_LFE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_LFE_CHANNEL_COUNT_MASK ) )
187 #define HB_AMIXDOWN_GET_NORMAL_CHANNEL_COUNT( a ) ( (( a & HB_AMIXDOWN_FRONT_CHANNEL_COUNT_MASK ) >> 8) + (( a & HB_AMIXDOWN_REAR_CHANNEL_COUNT_MASK ) >> 4) )
188     int             audios[8];
189         int             audio_mixdowns[8];
190
191         /* this "surround" property will be removed shortly,
192         as soon as the AMIXDOWN code has been integrated into the Mac GUI
193         it's still included here to avoid breaking the Mac GUI short-term
194         however, it won't be applied in deca52.c etc. any more */
195         int             surround;
196
197     /* Audio settings:
198          acodec:   output codec
199          abitrate: output bitrate (kbps)
200          arate:    output samplerate (Hz)
201        HB_ACODEC_AC3 means pass-through, then abitrate and arate are
202        ignored */
203 #define HB_ACODEC_MASK   0x00FF00
204 #define HB_ACODEC_FAAC   0x000100
205 #define HB_ACODEC_LAME   0x000200
206 #define HB_ACODEC_VORBIS 0x000400
207 #define HB_ACODEC_AC3    0x000800
208 #define HB_ACODEC_MPGA   0x001000
209 #define HB_ACODEC_LPCM   0x002000
210     int             acodec;
211     int             abitrate;
212     int             arate;
213
214     /* Subtitle settings:
215          subtitle: index in hb_title_t's subtitles list, starting
216          from 0. -1 means no subtitle */
217     int             subtitle;
218
219     /* Muxer settings
220          mux:  output file format
221          file: file path */
222 #define HB_MUX_MASK 0xFF0000
223 #define HB_MUX_MP4  0x010000
224 #define HB_MUX_PSP  0x020000
225 #define HB_MUX_AVI  0x040000
226 #define HB_MUX_OGM  0x080000
227 #define HB_MUX_IPOD 0x100000
228         
229     int             mux;
230     const char          * file;
231
232 #ifdef __LIBHB__
233     /* Internal data */
234     hb_handle_t   * h;
235     hb_lock_t     * pause;
236     volatile int  * die;
237     volatile int    done;
238
239     hb_fifo_t     * fifo_mpeg2;   /* MPEG-2 video ES */
240     hb_fifo_t     * fifo_raw;     /* Raw pictures */
241     hb_fifo_t     * fifo_sync;    /* Raw pictures, framerate corrected */
242     hb_fifo_t     * fifo_render;  /* Raw pictures, scaled */
243     hb_fifo_t     * fifo_mpeg4;   /* MPEG-4 video ES */
244
245     hb_thread_t   * reader;
246     hb_thread_t   * muxer;
247
248     hb_list_t     * list_work;
249
250     hb_esconfig_t config;
251
252     hb_mux_data_t * mux_data;
253 #endif
254 };
255
256 struct hb_audio_s
257 {
258     int  id;
259     char lang[1024];
260     char lang_simple[1024];
261     char iso639_2[4];
262     int  codec;
263     int  rate;
264     int  bitrate;
265         /* src_discrete_front_channels: The # of discrete front channels in the source audio
266            src_discrete_rear_channels:  The # of discrete rear channels in the source audio
267            src_discrete_lfe_channels:   The # of discrete lfe channels in the source audio
268            src_encoded_front_channels:  The # of front channels encoded into the source audio
269            src_encoded_rear_channels:   The # of rear channels encoded into the source audio */
270     int src_discrete_front_channels;
271     int src_discrete_rear_channels;
272         int src_discrete_lfe_channels;
273     int src_encoded_front_channels;
274     int src_encoded_rear_channels;
275     
276     /* ac3flags is only set when the source audio format is HB_ACODEC_AC3 */
277     int ac3flags;
278
279 #ifdef __LIBHB__
280     /* Internal data */
281     hb_fifo_t * fifo_in;   /* AC3/MPEG/LPCM ES */
282     hb_fifo_t * fifo_raw;  /* Raw audio */
283     hb_fifo_t * fifo_sync; /* Resampled, synced raw audio */
284     hb_fifo_t * fifo_out;  /* MP3/AAC/Vorbis ES */
285
286     hb_esconfig_t config;
287     hb_mux_data_t * mux_data;
288
289         /* amixdown is the mixdown format to be used for this audio track */
290         int amixdown;
291
292 #endif
293 };
294
295 struct hb_chapter_s
296 {
297     int      index;
298     int      cell_start;
299     int      cell_end;
300     int      block_start;
301     int      block_end;
302     int      block_count;
303
304     /* Visual-friendly duration */
305     int      hours;
306     int      minutes;
307     int      seconds;
308
309     /* Exact duration (in 1/90000s) */
310     uint64_t duration;
311 };
312
313 struct hb_subtitle_s
314 {
315     int  id;
316     char lang[1024];
317     char iso639_2[4];
318
319 #ifdef __LIBHB__
320     /* Internal data */
321     hb_fifo_t * fifo_in;  /* SPU ES */
322     hb_fifo_t * fifo_raw; /* Decodec SPU */
323 #endif
324 };
325
326 struct hb_title_s
327 {
328     char        dvd[1024];
329     char        name[1024];
330     int         index;
331     int         vts;
332     int         ttn;
333     int         cell_start;
334     int         cell_end;
335     int         block_start;
336     int         block_end;
337     int         block_count;
338
339     /* Visual-friendly duration */
340     int         hours;
341     int         minutes;
342     int         seconds;
343
344     /* Exact duration (in 1/90000s) */
345     uint64_t    duration;
346
347     int         width;
348     int         height;
349     int         aspect;
350     int         rate;
351     int         rate_base;
352     int         crop[4];
353
354     uint32_t    palette[16];
355
356     hb_list_t * list_chapter;
357     hb_list_t * list_audio;
358     hb_list_t * list_subtitle;
359
360     /* Job template for this title */
361     hb_job_t  * job;
362 };
363
364
365 struct hb_state_s
366 {
367 #define HB_STATE_IDLE     1
368 #define HB_STATE_SCANNING 2
369 #define HB_STATE_SCANDONE 4
370 #define HB_STATE_WORKING  8
371 #define HB_STATE_PAUSED   16
372 #define HB_STATE_WORKDONE 32
373 #define HB_STATE_MUXING   64
374     int state;
375
376     union
377     {
378         struct
379         {
380             /* HB_STATE_SCANNING */
381             int title_cur;
382             int title_count;
383         } scanning;
384
385         struct
386         {
387             /* HB_STATE_WORKING */
388             float progress;
389             int   job_cur;
390             int   job_count;
391             float rate_cur;
392             float rate_avg;
393             int   hours;
394             int   minutes;
395             int   seconds;
396         } working;
397
398         struct
399         {
400             /* HB_STATE_WORKDONE */
401 #define HB_ERROR_NONE     0
402 #define HB_ERROR_CANCELED 1
403 #define HB_ERROR_UNKNOWN  2
404             int error;
405         } workdone;
406
407         struct
408         {
409             /* HB_STATE_MUXING */
410             float progress;
411         } muxing;
412     } param;
413 };
414
415 struct hb_work_object_s
416 {
417     int                 id;
418     char              * name;
419
420 #ifdef __LIBHB__
421     int              (* init)  ( hb_work_object_t *, hb_job_t * );
422     int              (* work)  ( hb_work_object_t *, hb_buffer_t **,
423                                  hb_buffer_t ** );
424     void             (* close) ( hb_work_object_t * );
425
426     hb_fifo_t         * fifo_in;
427     hb_fifo_t         * fifo_out;
428     hb_esconfig_t     * config;
429
430         /* amixdown is the mixdown format to be used if the work object is an audio track */
431         int               amixdown;
432
433     hb_work_private_t * private_data;
434
435     hb_thread_t       * thread;
436     volatile int      * done;
437
438     hb_work_object_t  * next;
439         int                               thread_sleep_interval;
440 #endif
441 };
442
443 extern hb_work_object_t hb_sync;
444 extern hb_work_object_t hb_decmpeg2;
445 extern hb_work_object_t hb_decsub;
446 extern hb_work_object_t hb_render;
447 extern hb_work_object_t hb_encavcodec;
448 extern hb_work_object_t hb_encxvid;
449 extern hb_work_object_t hb_encx264;
450 extern hb_work_object_t hb_deca52;
451 extern hb_work_object_t hb_decavcodec;
452 extern hb_work_object_t hb_declpcm;
453 extern hb_work_object_t hb_encfaac;
454 extern hb_work_object_t hb_enclame;
455 extern hb_work_object_t hb_encvorbis;
456
457 #endif