⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ifo.c

📁 VLC媒体播放程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -