📄 ifo.c
字号:
return 0;}/***************************************************************************** * IfoTitleSet: Parse vts*.ifo files to fill the Video Title Set structure. *****************************************************************************/int IfoTitleSet( ifo_t * p_ifo, int i_title ){ uint8_t p_buf[DVD_LB_SIZE]; uint8_t * p_tmp; int i_off; int i_start; uint64_t i_temp; uint16_t i_short; int i, j; if( p_ifo->vts.b_initialized ) { FreeTitleSet( &p_ifo->vts ); } i_off = p_ifo->vmg.title_inf.p_attr[i_title-1].i_start_sector + p_ifo->i_start; /*fprintf(stderr, "offset: %d\n" , i_off ); */ p_tmp = FillBuffer( p_ifo, p_buf, i_off ); /*i_start = p_ifo->i_pos; */ p_ifo->vts.i_pos = p_ifo->i_pos;#define MGINF p_ifo->vts.manager_inf /* * read manager information */ /*fprintf( stderr, "VTSI\n" ); */ ReadBytes( p_ifo, p_buf, &p_tmp, MGINF.psz_id , 12 ); MGINF.psz_id[12] = '\0'; MGINF.i_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 12 ); MGINF.i_inf_last_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); MGINF.i_spec_ver = ReadByte( p_ifo, p_buf, &p_tmp ); MGINF.i_cat = ReadDouble( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 90 ); MGINF.i_inf_end_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 60 ); MGINF.i_menu_vob_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_title_vob_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_title_inf_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_title_unit_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_menu_unit_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_time_inf_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_menu_cell_inf_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_menu_vobu_map_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_cell_inf_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); MGINF.i_vobu_map_start_sector = ReadDouble( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 24 ); DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); MGINF.i_menu_audio_nb = ReadByte( p_ifo, p_buf, &p_tmp ); for( i = 0 ; i < 8 ; i++ ) { i_temp = ReadQuad( p_ifo, p_buf, &p_tmp ); } DumpBytes( p_ifo, p_buf, &p_tmp, 17 ); MGINF.i_menu_spu_nb = ReadByte( p_ifo, p_buf, &p_tmp ); for( i = 0 ; i < 28 ; i++ ) { /* FIXME : take care of endianness */ ReadBytes( p_ifo, p_buf, &p_tmp, (uint8_t*)(&i_temp), 6 ); } DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); i_short = ReadWord( p_ifo, p_buf, &p_tmp ); i_short >>= 2; MGINF.video_attr.i_mode = i_short & 0x1; i_short >>= 1; MGINF.video_attr.i_letterboxed = i_short & 0x1; i_short >>= 1; MGINF.video_attr.i_source_res = i_short & 0x3; i_short >>= 2; MGINF.video_attr.i_line21_2 = i_short & 0x1; i_short >>= 1; MGINF.video_attr.i_line21_1 = i_short & 0x1; i_short >>= 1; MGINF.video_attr.i_perm_displ = i_short & 0x3; i_short >>= 2; MGINF.video_attr.i_ratio = i_short & 0x3; i_short >>= 2; MGINF.video_attr.i_system = i_short & 0x3; i_short >>= 2; MGINF.video_attr.i_compression = i_short & 0x3; DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); MGINF.i_audio_nb = ReadByte( p_ifo, p_buf, &p_tmp ); /*fprintf( stderr, "vtsi audio nb : %d\n", MGINF.i_audio_nb ); */ for( i = 0 ; i < 8 ; i++ ) { i_temp = ReadQuad( p_ifo, p_buf, &p_tmp ); /*fprintf( stderr, "Audio %d: "I64Fx"\n", i, i_temp ); */ i_temp >>= 8; MGINF.p_audio_attr[i].i_bar = i_temp & 0xff; i_temp >>= 8; MGINF.p_audio_attr[i].i_caption = i_temp & 0xff; i_temp >>= 8; MGINF.p_audio_attr[i].i_foo = i_temp & 0xff; i_temp >>= 8; MGINF.p_audio_attr[i].i_lang_code = i_temp & 0xffff; i_temp >>= 16; MGINF.p_audio_attr[i].i_num_channels = i_temp & 0x7; i_temp >>= 3; MGINF.p_audio_attr[i].i_test = i_temp & 0x1; i_temp >>= 1; MGINF.p_audio_attr[i].i_sample_freq = i_temp & 0x3; i_temp >>= 2; MGINF.p_audio_attr[i].i_quantization = i_temp & 0x3; i_temp >>= 2; MGINF.p_audio_attr[i].i_appl_mode = i_temp & 0x3; i_temp >>= 2; MGINF.p_audio_attr[i].i_type = i_temp & 0x3; i_temp >>= 2; MGINF.p_audio_attr[i].i_multichannel_extension = i_temp & 0x1; i_temp >>= 1; MGINF.p_audio_attr[i].i_coding_mode = i_temp & 0x7; } DumpBytes( p_ifo, p_buf, &p_tmp, 17 ); MGINF.i_spu_nb = ReadByte( p_ifo, p_buf, &p_tmp ); /*fprintf( stderr, "vtsi subpic nb : %d\n", MGINF.i_spu_nb ); */ for( i=0 ; i<MGINF.i_spu_nb ; i++ ) { ReadBytes( p_ifo, p_buf, &p_tmp, (uint8_t*)(&i_temp), 6 ); i_temp = hton64( i_temp ) >> 16; /*fprintf( stderr, "Subpic %d: "I64Fx"\n", i, i_temp ); */ MGINF.p_spu_attr[i].i_caption = i_temp & 0xff; i_temp >>= 8; MGINF.p_spu_attr[i].i_foo = i_temp & 0xff; i_temp >>= 8; MGINF.p_spu_attr[i].i_lang_code = i_temp & 0xffff; i_temp >>= 16; MGINF.p_spu_attr[i].i_prefix = i_temp & 0xffff; } /* * read title information: set of pointers to title */#define TITINF p_ifo->vts.title_inf if( MGINF.i_title_inf_start_sector ) { p_tmp = FillBuffer( p_ifo, p_buf, p_ifo->vts.i_pos + MGINF.i_title_inf_start_sector ); i_start = p_ifo->i_pos; /*fprintf( stderr, "VTS PTR\n" ); */ TITINF.i_title_nb = ReadWord( p_ifo, p_buf, &p_tmp ); /*fprintf( stderr, "VTS title_inf nb: %d\n", TITINF.i_title_nb ); */ DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); TITINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); TITINF.pi_start_byte = malloc( TITINF.i_title_nb * sizeof(uint32_t) ); if( TITINF.pi_start_byte == NULL ) { return -1; } for( i = 0 ; i < TITINF.i_title_nb ; i++ ) { TITINF.pi_start_byte[i] = ReadDouble( p_ifo, p_buf, &p_tmp ); } /* Parsing of tts */ TITINF.p_title_start = malloc( TITINF.i_title_nb * sizeof(title_start_t) ); if( TITINF.p_title_start == NULL ) { return -1; } for( i = 0 ; i < TITINF.i_title_nb ; i++ ) { p_tmp = FillBuffer( p_ifo, p_buf, i_start + OFF2LB( TITINF.pi_start_byte[i] ) ) + (TITINF.pi_start_byte[i] & 0x7ff); TITINF.p_title_start[i].i_title_id = ReadWord( p_ifo, p_buf, &p_tmp ); TITINF.p_title_start[i].i_chapter = ReadWord( p_ifo, p_buf, &p_tmp ); } }#undef TITINF /* * menu unit information */ if( MGINF.i_menu_unit_start_sector ) { if( ReadTitleUnit( p_ifo, &p_ifo->vts.menu_unit, p_ifo->vts.i_pos + MGINF.i_menu_unit_start_sector ) < 0 ) { return -1; } } /* * title unit information */ if( MGINF.i_title_unit_start_sector ) { if( ReadUnitInf( p_ifo, &p_ifo->vts.title_unit, p_ifo->vts.i_pos + MGINF.i_title_unit_start_sector, 0 ) < 0 ) { return -1; } } /* * time map information */#define TIMINF p_ifo->vts.time_inf if( MGINF.i_time_inf_start_sector ) { uint8_t p_buf[DVD_LB_SIZE]; p_tmp = FillBuffer( p_ifo, p_buf, p_ifo->vts.i_pos + MGINF.i_time_inf_start_sector ); /*fprintf( stderr, "TMAP\n" ); */ TIMINF.i_nb = ReadWord( p_ifo, p_buf, &p_tmp );; DumpBytes( p_ifo, p_buf, &p_tmp, 2 ); TIMINF.i_last_byte = ReadDouble( p_ifo, p_buf, &p_tmp ); TIMINF.pi_start_byte = malloc( TIMINF.i_nb * sizeof(uint32_t) ); if( TIMINF.pi_start_byte == NULL ) { return -1; } for( i = 0 ; i < TIMINF.i_nb ; i++ ) { TIMINF.pi_start_byte[i] = ReadDouble( p_ifo, p_buf, &p_tmp ); } TIMINF.p_time_map = malloc( TIMINF.i_nb * sizeof(time_map_t) ); if( TIMINF.p_time_map == NULL ) { return -1; } for( i = 0 ; i < TIMINF.i_nb ; i++ ) { TIMINF.p_time_map[i].i_time_unit = ReadByte( p_ifo, p_buf, &p_tmp ); DumpBytes( p_ifo, p_buf, &p_tmp, 1 ); TIMINF.p_time_map[i].i_entry_nb = ReadWord( p_ifo, p_buf, &p_tmp ); if( TIMINF.p_time_map[i].i_entry_nb ) { TIMINF.p_time_map[i].pi_sector = malloc( TIMINF.p_time_map[i].i_entry_nb * sizeof(uint32_t) ); if( TIMINF.p_time_map[i].pi_sector == NULL ) { return -1; } for( j = 0 ; j < TIMINF.p_time_map[i].i_entry_nb ; j++ ) { TIMINF.p_time_map[i].pi_sector[j] = ReadDouble( p_ifo, p_buf, &p_tmp ); } } } }#undef TIMINF if( MGINF.i_menu_cell_inf_start_sector && ReadCellInf( p_ifo, &p_ifo->vts.menu_cell_inf, p_ifo->vts.i_pos + MGINF.i_menu_cell_inf_start_sector ) < 0 ) { return -1; } if( MGINF.i_menu_vobu_map_start_sector && ReadVobuMap( p_ifo, &p_ifo->vts.menu_vobu_map, p_ifo->vts.i_pos + MGINF.i_menu_vobu_map_start_sector ) < 0 ) { return -1; } if( MGINF.i_cell_inf_start_sector && ReadCellInf( p_ifo, &p_ifo->vts.cell_inf, p_ifo->vts.i_pos + MGINF.i_cell_inf_start_sector ) ) { return -1; } if( MGINF.i_vobu_map_start_sector && ReadVobuMap( p_ifo, &p_ifo->vts.vobu_map, p_ifo->vts.i_pos + MGINF.i_vobu_map_start_sector ) ) { return -1; }#undef MGINF#if 0 intf_Warn( p_input, 4, "vts %d initialized", p_ifo->vmg.title_inf.p_attr[i_title-1].i_title_set_num );#endif p_ifo->vts.b_initialized = 1; return 0;}/***************************************************************************** * FreeTitleSet : free all structures allocated by IfoTitleSet *****************************************************************************/static int FreeTitleSet( vts_t * p_vts ){ int i; if( p_vts->manager_inf.i_vobu_map_start_sector ) { FreeVobuMap( &p_vts->vobu_map ); } if( p_vts->manager_inf.i_cell_inf_start_sector ) { FreeCellInf( &p_vts->cell_inf ); } if( p_vts->manager_inf.i_menu_vobu_map_start_sector ) { FreeVobuMap( &p_vts->menu_vobu_map ); } if( p_vts->manager_inf.i_menu_cell_inf_start_sector ) { FreeCellInf( &p_vts->menu_cell_inf ); } if( p_vts->manager_inf.i_time_inf_start_sector ) { for( i = 0 ; i < p_vts->time_inf.i_nb ; i++ ) { if( p_vts->time_inf.p_time_map[i].i_entry_nb ) { free( p_vts->time_inf.p_time_map[i].pi_sector ); } } free( p_vts->time_inf.p_time_map ); free( p_vts->time_inf.pi_start_byte ); } if( p_vts->manager_inf.i_title_unit_start_sector ) { FreeUnitInf( &p_vts->title_unit ); } if( p_vts->manager_inf.i_menu_unit_start_sector ) { FreeTitleUnit( &p_vts->menu_unit ); } if( p_vts->manager_inf.i_title_inf_start_sector ) { free( p_vts->title_inf.pi_start_byte ); free( p_vts->title_inf.p_title_start ); } p_vts->b_initialized = 0; return 0;}/***************************************************************************** * IfoDestroy : Frees all the memory allocated to ifo structures *****************************************************************************/void IfoDestroy( ifo_t * p_ifo ){ int i, j; FreeTitleSet( &p_ifo->vts ); if( p_ifo->vmg.manager_inf.i_vobu_map_start_sector ) { FreeVobuMap( &p_ifo->vmg.vobu_map ); } if( p_ifo->vmg.manager_inf.i_cell_inf_start_sector ) { FreeCellInf( &p_ifo->vmg.cell_inf ); } if( p_ifo->vmg.manager_inf.i_vts_inf_start_sector ) { free( p_ifo->vmg.vts_inf.p_vts_attr ); free( p_ifo->vmg.vts_inf.pi_vts_attr_start_byte ); } /* free parental information structures */ if( p_ifo->vmg.manager_inf.i_parental_inf_start_sector ) { for( i = 0 ; i < p_ifo->vmg.parental_inf.i_country_nb ; i++ ) { for( j = 0 ; j < 8 ; j++ ) { if ( p_ifo->vmg.parental_inf.p_parental_mask[i].ppi_mask[j] != NULL ) free( p_ifo->vmg.parental_inf.p_parental_mask[i].ppi_mask[j] ); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -