X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fcommon.h;h=808714ee7b5a7e968eba5c26d996fe7108f922a8;hb=d6a4ae73b86cca10f2342c9e26c132855cad6356;hp=fc0001facd0e4b0038d2ff418da7090332beea48;hpb=e27fb1a19129ca0ec31571e0f6c9db8c79ce20e2;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/common.h b/libhb/common.h index fc0001fa..808714ee 100644 --- a/libhb/common.h +++ b/libhb/common.h @@ -18,6 +18,20 @@ #include #include +#if defined( SYS_MINGW ) +# define fseek fseeko64 +# define ftell ftello64 +# undef fseeko +# define fseeko fseeko64 +# undef ftello +# define ftello ftello64 +# define flockfile(...) +# define funlockfile(...) +# define getc_unlocked getc +# undef off_t +# define off_t off64_t +#endif + #ifndef MIN #define MIN( a, b ) ( (a) > (b) ? (b) : (a) ) #endif @@ -27,7 +41,7 @@ #define EVEN( a ) ( (a) + ( (a) & 1 ) ) #define MULTIPLE_16( a ) ( 16 * ( ( (a) + 8 ) / 16 ) ) -#define MULTIPLE_MOD( a, b ) ( b * ( ( (a) + (b / 2) ) / b ) ) +#define MULTIPLE_MOD( a, b ) ((b==1)?a:( b * ( ( (a) + (b / 2) - 1) / b ) )) #define HB_DVD_READ_BUFFER_SIZE 2048 @@ -41,6 +55,8 @@ 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_subtitle_config_s hb_subtitle_config_t; +typedef struct hb_metadata_s hb_metadata_t; typedef struct hb_state_s hb_state_t; typedef union hb_esconfig_u hb_esconfig_t; typedef struct hb_work_private_s hb_work_private_t; @@ -79,6 +95,11 @@ 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); +int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track); +int hb_srt_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, + const char *lang); + + struct hb_rate_s { char * string; @@ -93,7 +114,16 @@ struct hb_mixdown_s int amixdown; }; -#define HB_ASPECT_BASE 9 +struct hb_subtitle_config_s +{ + enum subdest { RENDERSUB, PASSTHRUSUB } dest; + int force; + int default_track; + char src_filename[128]; + char src_codeset[40]; + int64_t offset; +}; + #define HB_VIDEO_RATE_BASE 27000000 extern hb_rate_t hb_video_rates[]; @@ -133,12 +163,13 @@ struct hb_job_s width: must be a multiple of 16 height: must be a multiple of 16 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; @@ -146,52 +177,61 @@ struct hb_job_s int height; int keep_ratio; int grayscale; - int pixel_ratio; - int pixel_aspect_width; - int pixel_aspect_height; - int modulus; - int maxWidth; - int maxHeight; + struct + { + int mode; + int modulus; + int itu_par; + int par_width; + int par_height; + int dar_width; + int dar_height; + int keep_display_aspect; + } anamorphic; + + 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 + cfr: 0 (vfr), 1 (cfr), 2 (pfr) [see render.c] + 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 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 +#define HB_VCODEC_X264 0x000002 +#define HB_VCODEC_THEORA 0x000004 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; - int vfr; + int color_matrix; /* 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; + /* Subtitles + */ + hb_list_t * list_subtitle; /* Muxer settings mux: output file format @@ -212,10 +252,19 @@ struct hb_job_s int mp4_optimize; int ipod_atom; - int indepth_scan; - hb_subtitle_t ** select_subtitle; - int subtitle_force; - char * native_language; + int indepth_scan; + hb_subtitle_config_t select_subtitle_config; + + int angle; // dvd angle to encode + int frame_to_stop; // declare eof when we hit this frame + int64_t pts_to_stop; // declare eof when we pass this pts in + // the time-linearized input stream + int start_at_preview; // if non-zero, encoding will start + // at the position of preview n + int seek_points; // out of N previews + uint32_t frames_to_skip; // decode but discard this many frames + // initially (for frame accurate positioning + // to non-I frames). #ifdef __LIBHB__ /* Internal data */ @@ -251,6 +300,8 @@ struct hb_job_s #define HB_ACODEC_MPGA 0x001000 #define HB_ACODEC_LPCM 0x002000 #define HB_ACODEC_DCA 0x004000 +#define HB_ACODEC_FFMPEG 0x008000 +#define HB_ACODEC_CA_AAC 0x010000 /* Audio Mixdown */ /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */ @@ -324,13 +375,17 @@ struct hb_audio_config_s 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 */ + char * name; /* Output track name */ } out; /* Input */ struct { - int track; /* Input track number */ - PRIVATE uint32_t codec; /* Input audio codec */ + int track; /* Input track number */ + PRIVATE uint32_t codec; /* Input audio codec */ + PRIVATE uint32_t codec_param; /* per-codec config info */ + PRIVATE uint32_t version; /* Bitsream version */ + PRIVATE uint32_t mode; /* Bitstream mode, codec dependent encoding */ PRIVATE int samplerate; /* Input sample rate (Hz) */ PRIVATE int bitrate; /* Input bitrate (kbps) */ PRIVATE int channel_layout; @@ -345,12 +400,14 @@ struct hb_audio_config_s 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]; + PRIVATE uint8_t type; /* normal, visually impared, directors */ } lang; }; @@ -376,6 +433,8 @@ struct hb_audio_s struct hb_chapter_s { int index; + int pgcn; + int pgn; int cell_start; int cell_end; int block_start; @@ -397,8 +456,15 @@ struct hb_chapter_s struct hb_subtitle_s { int id; + int track; + + hb_subtitle_config_t config; + + enum subtype { PICTURESUB, TEXTSUB } format; + enum subsource { VOBSUB, SRTSUB, CC608SUB, CC708SUB } source; char lang[1024]; char iso639_2[4]; + uint8_t type; /* Closed Caption, Childrens, Directors etc */ int hits; /* How many hits/occurrences of this subtitle */ int forced_hits; /* How many forced hits in this subtitle */ @@ -406,10 +472,26 @@ struct hb_subtitle_s #ifdef __LIBHB__ /* Internal data */ hb_fifo_t * fifo_in; /* SPU ES */ - hb_fifo_t * fifo_raw; /* Decodec SPU */ + hb_fifo_t * fifo_raw; /* Decoded SPU */ + hb_fifo_t * fifo_sync;/* Synced */ + hb_fifo_t * fifo_out; /* Correct Timestamps, ready to be muxed */ + hb_mux_data_t * mux_data; #endif }; +struct hb_metadata_s +{ + char name[255]; + char artist[255]; + char composer[255]; + char release_date[255]; + char comment[1024]; + char album[255]; + char genre[255]; + uint32_t coverart_size; + uint8_t *coverart; +}; + struct hb_title_s { char dvd[1024]; @@ -422,6 +504,7 @@ struct hb_title_s int block_start; int block_end; int block_count; + int angle_count; /* Visual-friendly duration */ int hours; @@ -431,22 +514,39 @@ 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_PS_DEMUXER = 0, HB_MPEG2_TS_DEMUXER, 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 */ + const char *video_codec_name; + int video_bitrate; + const char *container_name; + int data_rate; uint32_t palette[16]; + hb_metadata_t *metadata; + hb_list_t * list_chapter; hb_list_t * list_audio; hb_list_t * list_subtitle; /* Job template for this title */ hb_job_t * job; + + uint32_t flags; + // set if video stream doesn't have IDR frames +#define HBTF_NO_IDR (1 << 0) }; @@ -501,6 +601,31 @@ 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; + int version; + int mode; + 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; @@ -511,40 +636,63 @@ 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; /* Pointer hb_audio_t so we have access to the info in the audio worker threads. */ - hb_audio_t *audio; + hb_audio_t * audio; + + /* Pointer hb_subtitle_t so we have access to the info in the subtitle worker threads. */ + hb_subtitle_t * subtitle; hb_work_private_t * private_data; hb_thread_t * thread; volatile int * done; int status; + int codec_param; + hb_title_t * title; hb_work_object_t * next; - int thread_sleep_interval; + int thread_sleep_interval; #endif }; extern hb_work_object_t hb_sync; extern hb_work_object_t hb_decmpeg2; -extern hb_work_object_t hb_decsub; +extern hb_work_object_t hb_decvobsub; +extern hb_work_object_t hb_encvobsub; +extern hb_work_object_t hb_deccc608; +extern hb_work_object_t hb_decsrtsub; 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; extern hb_work_object_t hb_encvorbis; +extern hb_work_object_t hb_encca_aac; #define FILTER_OK 0 #define FILTER_DELAY 1