www.pudn.com > NETVIDEO.rar > ifo.h


#ifndef __IFO_H__ 
#define __IFO_H__ 
 
#ifndef DVD_VIDEO_LB_LEN 
#define DVD_VIDEO_LB_LEN 2048 
#endif 
 
#define OFFSET_IFO		0x0000 
#define OFFSET_VTS		0x0000 
#define OFFSET_LEN		0x00C0 
#define IFO_OFFSET_TAT		0x00C0 
#define OFFSET_VTSI_MAT		0x0080 
#define IFO_OFFSET_VIDEO	0x0100 
#define IFO_OFFSET_AUDIO	0x0200 
#define IFO_OFFSET_SUBPIC	0x0250 
 
 
// for debug and error output 
 
/** 
 * Video Info Table  
 */ 
 
typedef struct { 
#if BYTE_ORDER == BIG_ENDIAN 
	u_char compression      : 2; 
	u_char system           : 2; 
	u_char ratio            : 2; 
	u_char perm_displ       : 2; 
 
	u_char line21_1         : 1; 
	u_char line21_2         : 1; 
	u_char source_res       : 2; 
	u_char letterboxed      : 1; 
	u_char mode             : 1; 
#else 
	u_char perm_displ       : 2; 
	u_char ratio            : 2; 
	u_char system           : 2; 
	u_char compression      : 2; 
 
	u_char mode             : 1; 
	u_char letterboxed      : 1; 
	u_char source_res       : 2; 
	u_char line21_2         : 1; 
	u_char line21_1         : 1; 
#endif 
} ifo_video_info_t; 
 
/** 
 * Audio Table 
 */ 
 
typedef struct { 
#if MPEG3_LITTLE_ENDIAN 
	u_char num_channels	: 3;    // number of channels (n+1) 
	u_char sample_freq	: 2;    // sampling frequency 
	u_char quantization	: 2;    // quantization 
	u_char appl_mode2	: 1;    // audio application mode 
 
	u_char appl_mode1	: 1;    //  
	u_char type		: 2;    // audio type (language included?) 
	u_char multichannel_extension: 1; 
	u_char coding_mode	: 2; 
#else 
	u_char appl_mode2	: 1; 
	u_char quantization	: 2; 
	u_char sample_freq	: 2; 
	u_char num_channels	: 3; 
 
	u_char coding_mode	: 2; 
	u_char multichannel_extension: 1; 
	u_char type		: 2; 
	u_char appl_mode1	: 1; 
#endif 
	u_short lang_code	: 16;   //  description 
	u_int   foo		: 8;    // 0x00000000 ? 
	u_int   caption		: 8; 
	u_int   bar		: 8;    // 0x00000000 ? 
} ifo_audio_t; 
 
#define IFO_AUDIO_LEN 7 
 
/** 
 * Subpicture Table 
 */ 
 
typedef struct { 
	u_short prefix  : 16;           // 0x0100 ? 
	u_short lang_code : 16;         //  description 
	u_char foo      : 8;            // dont know 
	u_char caption  : 8;            // 0x00 ? 
} ifo_spu_t; 
 
 
/** 
 * Time Map Table header entry 
 */ 
 
#if 0 
typedef struct { 
	u_char  tu		: 16;    // time unit (in seconds) 
	u_int			: 16;   // don't know 
} ifo_tmt_hdr_t; 
#endif 
 
typedef struct { 
	u_int			: 24;   // don't know 
	u_char  tu		: 8;    // time unit (in seconds) 
} ifoq_tmt_hdr_t; 
 
//#define IFO_TMT_HDR_LEN 4 
#define IFOQ_TMT_HDR_LEN 1 
 
 
/** 
 * hmm 
 */ 
 
typedef struct { 
        u_short vob_id          : 16;   // Video Object Identifier 
        u_char  cell_id         : 8;    // Cell Identifier 
        u_char                  : 8;    // don't know 
        u_int   start           : 32;   // Cell start 
        u_int   end             : 32;   // Cell end 
} ifo_cell_addr_t; 
 
 
typedef struct { 
	u_short vob_id		: 16;	// Video Object Identifier 
	u_short cell_id		: 16;	// Cell Identifier 
} ifo_pgc_cell_pos_t; 
 
/** 
 * Part of Title AND Title set Cell Address 
 */ 
 
typedef struct { 
	u_short pgc;		// Program Chain (PTT) 
	u_short pg;		// Program (PTT) 
	u_long	start;		// Start of VOBU (VTS? CADDR) 
	u_long	end;		// End of VOBU (VTS? CADDR) 
} ifo_ptt_data_t; 
 
typedef struct { 
	u_int num;		// Number of Chapters 
	ifo_ptt_data_t *data;	// Data 
} ifo_ptt_sub_t; 
 
typedef struct { 
	u_int num;		// Number of Titles 
	ifo_ptt_sub_t *title;	// Titles 
} ifo_ptt_t; 
 
typedef struct { 
	u_char	chain_info	: 8; // 0x5e 0xde(2 angles, no overlay), 0x5f 0x9f 0x9f 0xdf(4 angles overlay), 0x2 0xa 0x8(1 angle) 
	u_char	foo		: 8; // parent control ?? 
	u_char	still_time	: 8; 
	u_char	cell_cmd	: 8; 
        //u_int   foo             : 32; 
        u_int   len_time        : 32; 
        u_int   vobu_start      : 32;   // 1st vobu start 
        u_int   ilvu_end        : 32; 
        u_int   vobu_last_start : 32; 
        u_int   vobu_last_end   : 32; 
} ifo_pgci_cell_addr_t; 
 
#define PGCI_CELL_ADDR_LEN 24 
 
#define ID_NUM_MENU_VOBS 0 
#define ID_NUM_TITLE_VOBS 1 
 
#define ID_MAT			0 
#define ID_PTT			1 
#define ID_TSP			1 
#define ID_TITLE_PGCI		2 
#define ID_MENU_PGCI		3 
#define ID_TMT			4 
#define ID_MENU_CELL_ADDR	5 
#define ID_MENU_VOBU_ADDR_MAP	6 
#define ID_TITLE_CELL_ADDR	7 
#define ID_TITLE_VOBU_ADDR_MAP 	8 
 
 
/** 
 * Information Table - for internal use only 
 */ 
  
typedef struct { 
	u_int num_menu_vobs; 
	u_int vob_start; 
 
	u_char *data[10]; 
	 
	int fd;		// file descriptor 
	int64_t pos;	// offset of ifo file on device  
} ifo_t; 
 
 
/** 
 * Generic header 
 */ 
 
#define IFO_HDR_LEN 8 
#define IFOQ_HDR_LEN 2 
 
typedef struct { 
        u_short num     : 16;   // number of entries 
        u_short         : 16;   // don't known (reserved?) 
        u_int   len     : 32;   // length of table 
} ifo_hdr_t; 
 
typedef struct { 
        u_short         : 16;   // don't known (reserved?) 
        u_short num     : 16;   // number of entries 
        u_int   len     : 32;   // length of table 
} ifoq_hdr_t; 
 
 
/** 
 * Prototypes 
 */ 
 
ifo_t *ifoOpen (int fd, int64_t pos); 
int ifoClose (ifo_t *ifo); 
 
u_int ifoGetVOBStart	(ifo_t *ifo); 
int ifoGetNumberOfTitles (ifo_t *ifo); 
int ifoGetNumberOfParts (ifo_t *ifo); 
 
int ifoGetVMGPTT	(ifo_hdr_t *hdr, char **ptr); 
int ifoGetPGCI		(ifo_hdr_t *hdr, int title, char **ptr); 
int ifoGetCLUT		(char *pgc, char **ptr); 
u_int ifoGetCellPlayInfo	(u_char *pgc, u_char **ptr); 
u_int ifoGetCellPos	(u_char *pgc, u_char **ptr); 
int ifoGetProgramMap	(char *pgc, char **ptr); 
int ifoGetCellAddr	(char *cell_addr, char **ptr); 
int ifoGetCellAddrNum	(char *hdr); 
 
int ifoGetAudio		(char *hdr, char **ptr); 
int ifoGetSPU		(char *hdr, char **ptr); 
 
ifo_ptt_t *ifo_get_ptt (ifo_t *ifo); 
int ifo_get_num_title_pgci (ifo_t *ifo); 
u_char *ifo_get_ptr_title_pgci (ifo_t *ifo, int index); 
 
char *ifoDecodeLang (u_short descr); 
 
int ifoIsVTS (ifo_t *ifo); 
int ifoIsVMG (ifo_t *ifo); 
 
void ifoPrintVideo		(u_char *ptr); 
 
void ifoPrintCellPlayInfo	(u_char *ptr, u_int num); 
void ifoPrintCellInfo		(u_char *ptr, u_int num); 
void ifoPrintCellPos		(u_char *ptr, u_int num); 
void ifoPrintCLUT		(u_char *ptr);  
void ifoPrintProgramMap		(u_char *ptr, u_int num); 
 
#ifdef PARSER 
void ifoPrintAudio		(ifo_audio_t *ptr, u_int num); 
void ifoPrintSPU		(ifo_spu_t *ptr, u_int num); 
void ifoPrintTMT		(ifo_t *ifo); 
 
void ifoPrintVMOP		(u_char *opcode); 
 
void ifoPrint_ptt (ifo_ptt_t *ptt); 
void ifoPrint_vts_vobu_addr_map (ifo_t *ifo); 
void ifoPrint_vtsm_vobu_addr_map (ifo_t *ifo); 
void ifoPrint_vts_cell_addr (ifo_t *ifo); 
void ifoPrint_vtsm_cell_addr (ifo_t *ifo); 
void ifoPrint_title_pgci (ifo_t *ifo); 
void ifoPrint_pgc_cmd (u_char *pgc_ptr); 
void ifoPrintTSP (u_char *toast); 
void ifoPrint_pgc (u_char *ptr); 
#endif 
#endif