OSDN Git Service

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