X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fcommon.h;h=a5cfcf4935d0dcb14aacaad0b3bb16ee5cbfd3ed;hb=533776bbad20db93fe964bc69975f108b2a30888;hp=1cf6cdb597ca20dd2116cb037b8c959762ad840f;hpb=03b72a290a53006601ecc4b4e287ec099478d6b6;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/common.h b/libhb/common.h index 1cf6cdb5..a5cfcf49 100644 --- a/libhb/common.h +++ b/libhb/common.h @@ -1,7 +1,7 @@ /* $Id: common.h,v 1.51 2005/11/04 13:09:40 titer Exp $ This file is part of the HandBrake source code. - Homepage: . + Homepage: . It may be used under the terms of the GNU General Public License. */ #ifndef HB_COMMON_H @@ -39,6 +39,7 @@ typedef struct hb_job_s hb_job_t; typedef struct hb_title_s hb_title_t; typedef struct hb_chapter_s hb_chapter_t; typedef struct hb_audio_s hb_audio_t; +typedef struct hb_audio_config_s hb_audio_config_t; typedef struct hb_subtitle_s hb_subtitle_t; typedef struct hb_state_s hb_state_t; typedef union hb_esconfig_u hb_esconfig_t; @@ -53,6 +54,9 @@ typedef struct hb_lock_s hb_lock_t; #include "ports.h" #ifdef __LIBHB__ #include "internal.h" +#define PRIVATE +#else +#define PRIVATE const #endif hb_list_t * hb_list_init(); @@ -70,6 +74,11 @@ void hb_fix_aspect( hb_job_t * job, int keep ); int hb_calc_bitrate( hb_job_t *, int size ); +hb_audio_t *hb_audio_copy(const hb_audio_t *src); +void hb_audio_config_init(hb_audio_config_t * audiocfg); +int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg); +hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i); + struct hb_rate_s { char * string; @@ -84,7 +93,6 @@ struct hb_mixdown_s int amixdown; }; -#define HB_ASPECT_BASE 9 #define HB_VIDEO_RATE_BASE 27000000 extern hb_rate_t hb_video_rates[]; @@ -107,10 +115,10 @@ struct hb_job_s { /* ID assigned by UI so it can groups job passes together */ int sequence_id; - + /* Pointer to the title to be ripped */ hb_title_t * title; - + /* Chapter selection */ int chapter_start; int chapter_end; @@ -123,13 +131,14 @@ struct hb_job_s deinterlace: 0 or 1 width: must be a multiple of 16 height: must be a multiple of 16 - keep_ratio: used by UIs + keep_ratio: used by UIs + grayscale: black and white encoding pixel_ratio: store pixel aspect ratio in the video pixel_aspect_width: numerator for pixel aspect ratio pixel_aspect_height: denominator for pixel aspect ratio - maxWidth: keep width below this - maxHeight: keep height below this */ - + modulus: set a number besides 16 for dimensions to be multiples of + maxWidth: keep width below this + maxHeight: keep height below this */ int crop[4]; int deinterlace; hb_list_t * filters; @@ -141,106 +150,52 @@ struct hb_job_s int pixel_aspect_width; int pixel_aspect_height; int modulus; - int maxWidth; - int maxHeight; - + int maxWidth; + int maxHeight; /* Video settings: vcodec: output codec vquality: output quality (0.0..1.0) - if < 0.0 or > 1.0, bitrate is used instead + if < 0.0 or > 1.0, bitrate is used instead, + except with x264, to use its real QP/RF scale vbitrate: output bitrate (kbps) - pass: 0, 1 or 2 (or -1 for scan) vrate, vrate_base: output framerate is vrate / vrate_base - h264_level: boolean for whether or not we're encoding for iPod + vfr: boolean for variable frame rate detelecine + cfr: boolean to use constant frame rates instead of + passing through the source's frame durations. + pass: 0, 1 or 2 (or -1 for scan) + h264_level: vestigial boolean to decide if we're encoding for iPod crf: boolean for whether to use constant rate factor with x264 - x264opts: string of extra x264 options + x264opts: string of extra x264 options areBframes: boolean to note if b-frames are included in x264opts */ #define HB_VCODEC_MASK 0x0000FF #define HB_VCODEC_FFMPEG 0x000001 #define HB_VCODEC_XVID 0x000002 #define HB_VCODEC_X264 0x000004 +#define HB_VCODEC_THEORA 0x000008 int vcodec; float vquality; int vbitrate; int vrate; int vrate_base; + int vfr; + int cfr; int pass; int h264_13; int h264_level; int crf; char *x264opts; int areBframes; - - /* Audio tracks: - audios: Indexes in hb_title_t's audios list, starting from 0. - -1 indicates the end of the list - audio_mixdowns: The mixdown to be used for each audio track in audios[] */ - -/* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */ -#define HB_AMIXDOWN_DCA_FORMAT_MASK 0x00FFF000 -#define HB_AMIXDOWN_A52_FORMAT_MASK 0x00000FF0 -#define HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK 0x0000000F - -/* define the HB_AMIXDOWN_XXXX values */ - -#define HB_AMIXDOWN_MONO 0x01000001 -// DCA_FORMAT of DCA_MONO = 0 = 0x000 -// A52_FORMAT of A52_MONO = 1 = 0x01 -// discrete channel count of 1 - -#define HB_AMIXDOWN_STEREO 0x02002022 -// DCA_FORMAT of DCA_STEREO = 2 = 0x002 -// A52_FORMAT of A52_STEREO = 2 = 0x02 -// discrete channel count of 2 - -#define HB_AMIXDOWN_DOLBY 0x042070A2 -// DCA_FORMAT of DCA_3F1R | DCA_OUT_DPLI = 519 = 0x207 -// A52_FORMAT of A52_DOLBY = 10 = 0x0A -// discrete channel count of 2 - -#define HB_AMIXDOWN_DOLBYPLII 0x084094A2 -// DCA_FORMAT of DCA_3F2R | DCA_OUT_DPLII = 1033 = 0x409 -// A52_FORMAT of A52_DOLBY | A52_USE_DPLII = 74 = 0x4A -// discrete channel count of 2 - -#define HB_AMIXDOWN_6CH 0x10089176 -// DCA_FORMAT of DCA_3F2R | DCA_LFE = 137 = 0x089 -// A52_FORMAT of A52_3F2R | A52_LFE = 23 = 0x17 -// discrete channel count of 6 - -/* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */ -#define HB_AMIXDOWN_GET_DCA_FORMAT( a ) ( ( a & HB_AMIXDOWN_DCA_FORMAT_MASK ) >> 12 ) -#define HB_AMIXDOWN_GET_A52_FORMAT( a ) ( ( a & HB_AMIXDOWN_A52_FORMAT_MASK ) >> 4 ) -#define HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK ) ) - - int audios[8]; - int audio_mixdowns[8]; - /* Audio settings: - acodec: output codec - abitrate: output bitrate (kbps) - arate: output samplerate (Hz) - HB_ACODEC_AC3 means pass-through, then abitrate and arate are - ignored */ -#define HB_ACODEC_MASK 0x00FF00 -#define HB_ACODEC_FAAC 0x000100 -#define HB_ACODEC_LAME 0x000200 -#define HB_ACODEC_VORBIS 0x000400 -#define HB_ACODEC_AC3 0x000800 -#define HB_ACODEC_MPGA 0x001000 -#define HB_ACODEC_LPCM 0x002000 -#define HB_ACODEC_DCA 0x004000 - int acodec; - int abitrate; - int arate; + /* List of audio settings. */ + hb_list_t * list_audio; /* Subtitle settings: subtitle: index in hb_title_t's subtitles list, starting from 0. -1 means no subtitle */ int subtitle; - int subtitleSmartAdjust; + int subtitleSmartAdjust; /* Muxer settings mux: output file format @@ -252,13 +207,14 @@ struct hb_job_s #define HB_MUX_OGM 0x080000 #define HB_MUX_IPOD 0x100000 #define HB_MUX_MKV 0x200000 - + int mux; const char * file; /* Allow MP4 files > 4 gigs */ int largeFileSize; - + int mp4_optimize; + int ipod_atom; int indepth_scan; hb_subtitle_t ** select_subtitle; @@ -289,22 +245,50 @@ struct hb_job_s #endif }; -struct hb_audio_s -{ - int id; - char lang[1024]; - char lang_simple[1024]; - char iso639_2[4]; - int codec; - int rate; - int bitrate; - - /* ac3flags is only set when the source audio format is HB_ACODEC_AC3 */ - int ac3flags; +/* Audio starts here */ +/* Audio Codecs */ +#define HB_ACODEC_MASK 0x00FF00 +#define HB_ACODEC_FAAC 0x000100 +#define HB_ACODEC_LAME 0x000200 +#define HB_ACODEC_VORBIS 0x000400 +#define HB_ACODEC_AC3 0x000800 +#define HB_ACODEC_MPGA 0x001000 +#define HB_ACODEC_LPCM 0x002000 +#define HB_ACODEC_DCA 0x004000 +#define HB_ACODEC_FFMPEG 0x008000 - /* dcaflags is only set when the source audio format is HB_ACODEC_DCA */ - int dcaflags; +/* Audio Mixdown */ +/* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */ +#define HB_AMIXDOWN_DCA_FORMAT_MASK 0x00FFF000 +#define HB_AMIXDOWN_A52_FORMAT_MASK 0x00000FF0 +#define HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK 0x0000000F +/* define the HB_AMIXDOWN_XXXX values */ +#define HB_AMIXDOWN_MONO 0x01000001 +// DCA_FORMAT of DCA_MONO = 0 = 0x000 +// A52_FORMAT of A52_MONO = 1 = 0x01 +// discrete channel count of 1 +#define HB_AMIXDOWN_STEREO 0x02002022 +// DCA_FORMAT of DCA_STEREO = 2 = 0x002 +// A52_FORMAT of A52_STEREO = 2 = 0x02 +// discrete channel count of 2 +#define HB_AMIXDOWN_DOLBY 0x042070A2 +// DCA_FORMAT of DCA_3F1R | DCA_OUT_DPLI = 519 = 0x207 +// A52_FORMAT of A52_DOLBY = 10 = 0x0A +// discrete channel count of 2 +#define HB_AMIXDOWN_DOLBYPLII 0x084094A2 +// DCA_FORMAT of DCA_3F2R | DCA_OUT_DPLII = 1033 = 0x409 +// A52_FORMAT of A52_DOLBY | A52_USE_DPLII = 74 = 0x4A +// discrete channel count of 2 +#define HB_AMIXDOWN_6CH 0x10089176 +// DCA_FORMAT of DCA_3F2R | DCA_LFE = 137 = 0x089 +// A52_FORMAT of A52_3F2R | A52_LFE = 23 = 0x17 +// discrete channel count of 6 +/* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */ +#define HB_AMIXDOWN_GET_DCA_FORMAT( a ) ( ( a & HB_AMIXDOWN_DCA_FORMAT_MASK ) >> 12 ) +#define HB_AMIXDOWN_GET_A52_FORMAT( a ) ( ( a & HB_AMIXDOWN_A52_FORMAT_MASK ) >> 4 ) +#define HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT( a ) ( ( a & HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK ) ) +/* Input Channel Layout */ /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */ #define HB_INPUT_CH_LAYOUT_DISCRETE_FRONT_MASK 0x00F0000 #define HB_INPUT_CH_LAYOUT_DISCRETE_REAR_MASK 0x000F000 @@ -312,7 +296,6 @@ struct hb_audio_s #define HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK 0xFFFF0FF #define HB_INPUT_CH_LAYOUT_ENCODED_FRONT_MASK 0x00000F0 #define HB_INPUT_CH_LAYOUT_ENCODED_REAR_MASK 0x000000F - /* define the input channel layouts used to describe the channel layout of this audio */ #define HB_INPUT_CH_LAYOUT_MONO 0x0110010 #define HB_INPUT_CH_LAYOUT_STEREO 0x0220020 @@ -324,7 +307,6 @@ struct hb_audio_s #define HB_INPUT_CH_LAYOUT_3F2R 0x0832032 #define HB_INPUT_CH_LAYOUT_4F2R 0x0942042 #define HB_INPUT_CH_LAYOUT_HAS_LFE 0x0000100 - /* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */ #define HB_INPUT_CH_LAYOUT_GET_DISCRETE_FRONT_COUNT( a ) ( ( a & HB_INPUT_CH_LAYOUT_DISCRETE_FRONT_MASK ) >> 16 ) #define HB_INPUT_CH_LAYOUT_GET_DISCRETE_REAR_COUNT( a ) ( ( a & HB_INPUT_CH_LAYOUT_DISCRETE_REAR_MASK ) >> 12 ) @@ -333,27 +315,70 @@ struct hb_audio_s #define HB_INPUT_CH_LAYOUT_GET_ENCODED_FRONT_COUNT( a ) ( ( a & HB_INPUT_CH_LAYOUT_ENCODED_FRONT_MASK ) >> 4 ) #define HB_INPUT_CH_LAYOUT_GET_ENCODED_REAR_COUNT( a ) ( ( a & HB_INPUT_CH_LAYOUT_ENCODED_REAR_MASK ) ) - /* input_channel_layout is the channel layout of this audio */ - /* this is used to provide a common way of describing the source audio */ - int input_channel_layout; +struct hb_audio_config_s +{ + /* Output */ + struct + { + int track; /* Output track number */ + uint32_t codec; /* Output audio codec. + * HB_ACODEC_AC3 means pass-through, then bitrate and samplerate + * are ignored. + */ + int samplerate; /* Output sample rate (Hz) */ + int bitrate; /* Output bitrate (kbps) */ + int mixdown; /* The mixdown format to be used for this audio track (see HB_AMIXDOWN_*) */ + double dynamic_range_compression; /* Amount of DRC that gets applied to this track */ + } out; + + /* Input */ + struct + { + int track; /* Input track number */ + PRIVATE uint32_t codec; /* Input audio codec */ + PRIVATE uint32_t codec_param; /* per-codec config info */ + PRIVATE int samplerate; /* Input sample rate (Hz) */ + PRIVATE int bitrate; /* Input bitrate (kbps) */ + PRIVATE int channel_layout; + /* channel_layout is the channel layout of this audio this is used to + * provide a common way of describing the source audio + */ + } in; + + /* Misc. */ + union + { + PRIVATE int ac3; /* flags.ac3 is only set when the source audio format is HB_ACODEC_AC3 */ + PRIVATE int dca; /* flags.dca is only set when the source audio format is HB_ACODEC_DCA */ + } flags; +#define AUDIO_F_DOLBY (1 << 31) /* set if source uses Dolby Surround */ + + struct + { + PRIVATE char description[1024]; + PRIVATE char simple[1024]; + PRIVATE char iso639_2[4]; + } lang; +}; #ifdef __LIBHB__ - /* Internal data */ - hb_fifo_t * fifo_in; /* AC3/MPEG/LPCM ES */ - hb_fifo_t * fifo_raw; /* Raw audio */ - hb_fifo_t * fifo_sync; /* Resampled, synced raw audio */ - hb_fifo_t * fifo_out; /* MP3/AAC/Vorbis ES */ +struct hb_audio_s +{ + int id; - hb_esconfig_t config; - hb_mux_data_t * mux_data; + hb_audio_config_t config; - /* amixdown is the mixdown format to be used for this audio track */ - int amixdown; + struct { + hb_fifo_t * fifo_in; /* AC3/MPEG/LPCM ES */ + hb_fifo_t * fifo_raw; /* Raw audio */ + hb_fifo_t * fifo_sync; /* Resampled, synced raw audio */ + hb_fifo_t * fifo_out; /* MP3/AAC/Vorbis ES */ - /* Source PID is only valid for MPEG Transport Streams */ - int source_pid; -#endif + hb_esconfig_t config; + hb_mux_data_t * mux_data; + } priv; }; +#endif struct hb_chapter_s { @@ -371,7 +396,7 @@ struct hb_chapter_s /* Exact duration (in 1/90000s) */ uint64_t duration; - + /* Optional chapter title */ char title[1024]; }; @@ -413,12 +438,26 @@ struct hb_title_s /* Exact duration (in 1/90000s) */ uint64_t duration; + double aspect; // aspect ratio for the title's video + double container_aspect; // aspect ratio from container (0 if none) int width; int height; - int aspect; + int pixel_aspect_width; + int pixel_aspect_height; int rate; int rate_base; int crop[4]; + enum { HB_MPEG2_DEMUXER = 0, HB_NULL_DEMUXER } demuxer; + int detected_interlacing; + int video_id; /* demuxer stream id for video */ + int video_codec; /* worker object id of video codec */ + int video_codec_param; /* codec specific config */ + int flaky_clock; /* can lose reference clock */ + /* (for over-the-air transport streams) */ + const char *video_codec_name; + int video_bitrate; + const char *container_name; + int data_rate; uint32_t palette[16]; @@ -462,6 +501,7 @@ struct hb_state_s int hours; int minutes; int seconds; + int sequence_id; } working; struct @@ -481,6 +521,29 @@ struct hb_state_s } param; }; +typedef struct hb_work_info_s +{ + const char *name; + int profile; + int level; + int bitrate; + int rate; + int rate_base; + int flags; + union { + struct { // info only valid for video decoders + int width; + int height; + int pixel_aspect_width; + int pixel_aspect_height; + double aspect; + }; + struct { // info only valid for audio decoders + int channel_layout; + }; + }; +} hb_work_info_t; + struct hb_work_object_s { int id; @@ -491,20 +554,32 @@ struct hb_work_object_s int (* work) ( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** ); void (* close) ( hb_work_object_t * ); + /* the info entry point is used by scan to get bitstream information + * during a decode (i.e., it should only be called after at least one + * call to the 'work' entry point). currently it's only called for + * video streams & can be null for other work objects. */ + int (* info) ( hb_work_object_t *, hb_work_info_t * ); + /* the bitstream info entry point is used by scan to get bitstream + * information from a buffer. it doesn't have to be called during a + * decode (it can be called even if init & work haven't been). + * currently it's only called for audio streams & can be null for + * other work objects. */ + int (* bsinfo) ( hb_work_object_t *, const hb_buffer_t *, + hb_work_info_t * ); hb_fifo_t * fifo_in; hb_fifo_t * fifo_out; hb_esconfig_t * config; - /* amixdown is the mixdown format to be used if the work object is an audio track */ - int amixdown; - /* source_acodec is the source audio codec if the work object is an audio track */ - int source_acodec; + /* Pointer hb_audio_t so we have access to the info in the audio worker threads. */ + hb_audio_t *audio; hb_work_private_t * private_data; hb_thread_t * thread; volatile int * done; + int status; + int codec_param; hb_work_object_t * next; int thread_sleep_interval; @@ -518,9 +593,13 @@ extern hb_work_object_t hb_render; extern hb_work_object_t hb_encavcodec; extern hb_work_object_t hb_encxvid; extern hb_work_object_t hb_encx264; +extern hb_work_object_t hb_enctheora; extern hb_work_object_t hb_deca52; extern hb_work_object_t hb_decdca; extern hb_work_object_t hb_decavcodec; +extern hb_work_object_t hb_decavcodecv; +extern hb_work_object_t hb_decavcodecvi; +extern hb_work_object_t hb_decavcodecai; extern hb_work_object_t hb_declpcm; extern hb_work_object_t hb_encfaac; extern hb_work_object_t hb_enclame; @@ -539,12 +618,12 @@ struct hb_filter_object_s #ifdef __LIBHB__ hb_filter_private_t* (* init) ( int, int, int, char * ); - + int (* work) ( const hb_buffer_t *, hb_buffer_t **, int, int, int, hb_filter_private_t * ); - + void (* close) ( hb_filter_private_t * ); - + hb_filter_private_t * private_data; //hb_buffer_t * buffer; #endif @@ -554,6 +633,7 @@ extern hb_filter_object_t hb_filter_detelecine; extern hb_filter_object_t hb_filter_deinterlace; extern hb_filter_object_t hb_filter_deblock; extern hb_filter_object_t hb_filter_denoise; +extern hb_filter_object_t hb_filter_decomb; typedef void hb_error_handler_t( const char *errmsg );