OSDN Git Service

e78f71bd8e0a0db83b004e3053be9732d5d2a837
[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 int hb_mixdown_get_mixdown_from_short_name( const char * short_name );
96 const char * hb_mixdown_get_short_name_from_mixdown( int amixdown );
97
98 /******************************************************************************
99  * hb_job_t: settings to be filled by the UI
100  *****************************************************************************/
101 struct hb_job_s
102 {
103     /* Pointer to the title to be ripped */
104     hb_title_t    * title;
105     
106     /* Chapter selection */
107     int             chapter_start;
108     int             chapter_end;
109
110         /* Include chapter marker track in mp4? */
111     int             chapter_markers;
112
113     /* Picture settings:
114          crop:                must be multiples of 2 (top/bottom/left/right)
115          deinterlace:         0 or 1
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 */
124
125     int             crop[4];
126     int             deinterlace;
127     int             width;
128     int             height;
129     int             keep_ratio;
130     int             grayscale;
131     int             pixel_ratio;
132     int             pixel_aspect_width;
133     int             pixel_aspect_height;
134         int                             maxWidth;
135         int                             maxHeight;
136
137
138     /* Video settings:
139          vcodec:            output codec
140          vquality:          output quality (0.0..1.0)
141                             if < 0.0 or > 1.0, bitrate is used instead
142          vbitrate:          output bitrate (kbps)
143          pass:              0, 1 or 2
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
153
154     int             vcodec;
155     float           vquality;
156     int             vbitrate;
157     int             vrate;
158     int             vrate_base;
159     int             pass;
160     int             h264_13;
161         int                             h264_level;
162         int                             crf;
163         char                *x264opts;
164         int                             areBframes;
165         
166     /* Audio tracks:
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[] */
170
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) )
190     int             audios[8];
191         int             audio_mixdowns[8];
192
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 */
197         int             surround;
198
199     /* Audio settings:
200          acodec:   output codec
201          abitrate: output bitrate (kbps)
202          arate:    output samplerate (Hz)
203        HB_ACODEC_AC3 means pass-through, then abitrate and arate are
204        ignored */
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
212     int             acodec;
213     int             abitrate;
214     int             arate;
215
216     /* Subtitle settings:
217          subtitle: index in hb_title_t's subtitles list, starting
218          from 0. -1 means no subtitle */
219     int             subtitle;
220
221     /* Muxer settings
222          mux:  output file format
223          file: file path */
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
230         
231     int             mux;
232     const char          * file;
233
234 #ifdef __LIBHB__
235     /* Internal data */
236     hb_handle_t   * h;
237     hb_lock_t     * pause;
238     volatile int  * die;
239     volatile int    done;
240
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 */
246
247     hb_thread_t   * reader;
248     hb_thread_t   * muxer;
249
250     hb_list_t     * list_work;
251
252     hb_esconfig_t config;
253
254     hb_mux_data_t * mux_data;
255 #endif
256 };
257
258 struct hb_audio_s
259 {
260     int  id;
261     char lang[1024];
262     char lang_simple[1024];
263     char iso639_2[4];
264     int  codec;
265     int  rate;
266     int  bitrate;
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;
277     
278     /* ac3flags is only set when the source audio format is HB_ACODEC_AC3 */
279     int ac3flags;
280
281 #ifdef __LIBHB__
282     /* Internal data */
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 */
287
288     hb_esconfig_t config;
289     hb_mux_data_t * mux_data;
290
291         /* amixdown is the mixdown format to be used for this audio track */
292         int amixdown;
293
294 #endif
295 };
296
297 struct hb_chapter_s
298 {
299     int      index;
300     int      cell_start;
301     int      cell_end;
302     int      block_start;
303     int      block_end;
304     int      block_count;
305
306     /* Visual-friendly duration */
307     int      hours;
308     int      minutes;
309     int      seconds;
310
311     /* Exact duration (in 1/90000s) */
312     uint64_t duration;
313 };
314
315 struct hb_subtitle_s
316 {
317     int  id;
318     char lang[1024];
319     char iso639_2[4];
320
321 #ifdef __LIBHB__
322     /* Internal data */
323     hb_fifo_t * fifo_in;  /* SPU ES */
324     hb_fifo_t * fifo_raw; /* Decodec SPU */
325 #endif
326 };
327
328 struct hb_title_s
329 {
330     char        dvd[1024];
331     char        name[1024];
332     int         index;
333     int         vts;
334     int         ttn;
335     int         cell_start;
336     int         cell_end;
337     int         block_start;
338     int         block_end;
339     int         block_count;
340
341     /* Visual-friendly duration */
342     int         hours;
343     int         minutes;
344     int         seconds;
345
346     /* Exact duration (in 1/90000s) */
347     uint64_t    duration;
348
349     int         width;
350     int         height;
351     int         aspect;
352     int         rate;
353     int         rate_base;
354     int         crop[4];
355
356     uint32_t    palette[16];
357
358     hb_list_t * list_chapter;
359     hb_list_t * list_audio;
360     hb_list_t * list_subtitle;
361
362     /* Job template for this title */
363     hb_job_t  * job;
364 };
365
366
367 struct hb_state_s
368 {
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
376     int state;
377
378     union
379     {
380         struct
381         {
382             /* HB_STATE_SCANNING */
383             int title_cur;
384             int title_count;
385         } scanning;
386
387         struct
388         {
389             /* HB_STATE_WORKING */
390             float progress;
391             int   job_cur;
392             int   job_count;
393             float rate_cur;
394             float rate_avg;
395             int   hours;
396             int   minutes;
397             int   seconds;
398         } working;
399
400         struct
401         {
402             /* HB_STATE_WORKDONE */
403 #define HB_ERROR_NONE     0
404 #define HB_ERROR_CANCELED 1
405 #define HB_ERROR_UNKNOWN  2
406             int error;
407         } workdone;
408
409         struct
410         {
411             /* HB_STATE_MUXING */
412             float progress;
413         } muxing;
414     } param;
415 };
416
417 struct hb_work_object_s
418 {
419     int                 id;
420     char              * name;
421
422 #ifdef __LIBHB__
423     int              (* init)  ( hb_work_object_t *, hb_job_t * );
424     int              (* work)  ( hb_work_object_t *, hb_buffer_t **,
425                                  hb_buffer_t ** );
426     void             (* close) ( hb_work_object_t * );
427
428     hb_fifo_t         * fifo_in;
429     hb_fifo_t         * fifo_out;
430     hb_esconfig_t     * config;
431
432         /* amixdown is the mixdown format to be used if the work object is an audio track */
433         int               amixdown;
434
435     hb_work_private_t * private_data;
436
437     hb_thread_t       * thread;
438     volatile int      * done;
439
440     hb_work_object_t  * next;
441         int                               thread_sleep_interval;
442 #endif
443 };
444
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;
458
459 #endif