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

📄 libmp4.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
    {        p_box->data.p_sample_vide->i_qt_image_description = 0;        p_box->data.p_sample_vide->p_qt_image_description = NULL;    }    MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_version );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_revision_level );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_vendor );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_temporal_quality );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_spatial_quality );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_width );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_height );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_horizresolution );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_vertresolution );    MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_data_size );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_frame_count );    memcpy( &p_box->data.p_sample_vide->i_compressorname, p_peek, 32 );    p_peek += 32; i_read -= 32;    MP4_GET2BYTES( p_box->data.p_sample_vide->i_depth );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_color_table );    stream_Seek( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 78);    MP4_ReadBoxContainerRaw( p_stream, p_box );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"vide\" in stsd %dx%d depth %d",                      p_box->data.p_sample_vide->i_width,                      p_box->data.p_sample_vide->i_height,                      p_box->data.p_sample_vide->i_depth );#endif    MP4_READBOX_EXIT( 1 );}void MP4_FreeBox_sample_vide( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_sample_vide->p_qt_image_description );}static int MP4_ReadBox_sample_mp4s( stream_t *p_stream, MP4_Box_t *p_box ){    stream_Seek( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 8 );    MP4_ReadBoxContainerRaw( p_stream, p_box );    return 1;}static int MP4_ReadBox_sample_text( stream_t *p_stream, MP4_Box_t *p_box ){    int32_t t;    MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );    MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );    MP4_GET2BYTES( p_box->data.p_sample_text->i_reserved2 );    MP4_GET2BYTES( p_box->data.p_sample_text->i_data_reference_index );    MP4_GET4BYTES( p_box->data.p_sample_text->i_display_flags );    MP4_GET4BYTES( t );    switch( t )    {        /* FIXME search right signification */        case 1: // Center            p_box->data.p_sample_text->i_justification_horizontal = 1;            p_box->data.p_sample_text->i_justification_vertical = 1;            break;        case -1:    // Flush Right            p_box->data.p_sample_text->i_justification_horizontal = -1;            p_box->data.p_sample_text->i_justification_vertical = -1;            break;        case -2:    // Flush Left            p_box->data.p_sample_text->i_justification_horizontal = 0;            p_box->data.p_sample_text->i_justification_vertical = 0;            break;        case 0: // Flush Default        default:            p_box->data.p_sample_text->i_justification_horizontal = 1;            p_box->data.p_sample_text->i_justification_vertical = -1;            break;    }    MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[0] );    MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[1] );    MP4_GET2BYTES( p_box->data.p_sample_text->i_background_color[2] );    p_box->data.p_sample_text->i_background_color[3] = 0;    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_top );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_left );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_bottom );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_right );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"text\" in stsd text" );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_sample_tx3g( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );    MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );    MP4_GET2BYTES( p_box->data.p_sample_text->i_reserved2 );    MP4_GET2BYTES( p_box->data.p_sample_text->i_data_reference_index );    MP4_GET4BYTES( p_box->data.p_sample_text->i_display_flags );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_justification_horizontal );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_justification_vertical );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[0] );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[1] );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[2] );    MP4_GET1BYTE ( p_box->data.p_sample_text->i_background_color[3] );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_top );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_left );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_bottom );    MP4_GET2BYTES( p_box->data.p_sample_text->i_text_box_right );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"text\" in stsd text" );#endif    MP4_READBOX_EXIT( 1 );}#if 0/* We can't easily call it, and anyway ~ 20 bytes lost isn't a real problem */static void MP4_FreeBox_sample_text( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_sample_text->psz_text_name );}#endifstatic int MP4_ReadBox_stsd( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_stsd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stsd );    MP4_GET4BYTES( p_box->data.p_stsd->i_entry_count );    stream_Seek( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 8 );    MP4_ReadBoxContainerRaw( p_stream, p_box );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stsd\" entry-count %d",                      p_box->data.p_stsd->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_stsz( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stsz_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stsz );    MP4_GET4BYTES( p_box->data.p_stsz->i_sample_size );    MP4_GET4BYTES( p_box->data.p_stsz->i_sample_count );    p_box->data.p_stsz->i_entry_size =        calloc( p_box->data.p_stsz->i_sample_count, sizeof(uint32_t) );    if( p_box->data.p_stsz->i_entry_size == NULL )        MP4_READBOX_EXIT( 0 );    if( !p_box->data.p_stsz->i_sample_size )    {        for( i=0; (i<p_box->data.p_stsz->i_sample_count)&&(i_read >= 4 ); i++ )        {            MP4_GET4BYTES( p_box->data.p_stsz->i_entry_size[i] );        }    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stsz\" sample-size %d sample-count %d",                      p_box->data.p_stsz->i_sample_size,                      p_box->data.p_stsz->i_sample_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stsz( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_stsz->i_entry_size );}static void MP4_FreeBox_stsc( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_stsc->i_first_chunk );    FREENULL( p_box->data.p_stsc->i_samples_per_chunk );    FREENULL( p_box->data.p_stsc->i_sample_description_index );}static int MP4_ReadBox_stsc( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stsc_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stsc );    MP4_GET4BYTES( p_box->data.p_stsc->i_entry_count );    p_box->data.p_stsc->i_first_chunk =        calloc( p_box->data.p_stsc->i_entry_count, sizeof(uint32_t) );    p_box->data.p_stsc->i_samples_per_chunk =        calloc( p_box->data.p_stsc->i_entry_count, sizeof(uint32_t) );    p_box->data.p_stsc->i_sample_description_index =        calloc( p_box->data.p_stsc->i_entry_count, sizeof(uint32_t) );    if( p_box->data.p_stsc->i_first_chunk == NULL     || p_box->data.p_stsc->i_samples_per_chunk == NULL     || p_box->data.p_stsc->i_sample_description_index == NULL )    {        MP4_READBOX_EXIT( 0 );    }    for( i = 0; (i < p_box->data.p_stsc->i_entry_count )&&( i_read >= 12 );i++ )    {        MP4_GET4BYTES( p_box->data.p_stsc->i_first_chunk[i] );        MP4_GET4BYTES( p_box->data.p_stsc->i_samples_per_chunk[i] );        MP4_GET4BYTES( p_box->data.p_stsc->i_sample_description_index[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stsc\" entry-count %d",                      p_box->data.p_stsc->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_stco_co64( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_co64_t );    MP4_GETVERSIONFLAGS( p_box->data.p_co64 );    MP4_GET4BYTES( p_box->data.p_co64->i_entry_count );    p_box->data.p_co64->i_chunk_offset =        calloc( p_box->data.p_co64->i_entry_count, sizeof(uint64_t) );    if( p_box->data.p_co64->i_chunk_offset == NULL )        MP4_READBOX_EXIT( 0 );    for( i = 0; i < p_box->data.p_co64->i_entry_count; i++ )    {        if( p_box->i_type == FOURCC_stco )        {            if( i_read < 4 )            {                break;            }            MP4_GET4BYTES( p_box->data.p_co64->i_chunk_offset[i] );        }        else        {            if( i_read < 8 )            {                break;            }            MP4_GET8BYTES( p_box->data.p_co64->i_chunk_offset[i] );        }    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"co64\" entry-count %d",                      p_box->data.p_co64->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stco_co64( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_co64->i_chunk_offset );}static int MP4_ReadBox_stss( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stss_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stss );    MP4_GET4BYTES( p_box->data.p_stss->i_entry_count );    p_box->data.p_stss->i_sample_number =        calloc( p_box->data.p_stss->i_entry_count, sizeof(uint32_t) );    if( p_box->data.p_stss->i_sample_number == NULL )        MP4_READBOX_EXIT( 0 );    for( i = 0; (i < p_box->data.p_stss->i_entry_count )&&( i_read >= 4 ); i++ )    {        MP4_GET4BYTES( p_box->data.p_stss->i_sample_number[i] );        /* XXX in libmp4 sample begin at 0 */        p_box->data.p_stss->i_sample_number[i]--;    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stss\" entry-count %d",                      p_box->data.p_stss->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stss( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_stss->i_sample_number );}static void MP4_FreeBox_stsh( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_stsh->i_shadowed_sample_number );    FREENULL( p_box->data.p_stsh->i_sync_sample_number );}static int MP4_ReadBox_stsh( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stsh_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stsh );    MP4_GET4BYTES( p_box->data.p_stsh->i_entry_count );    p_box->data.p_stsh->i_shadowed_sample_number =        calloc( p_box->data.p_stsh->i_entry_count, sizeof(uint32_t) );    p_box->data.p_stsh->i_sync_sample_number =        calloc( p_box->data.p_stsh->i_entry_count, sizeof(uint32_t) );    if( p_box->data.p_stsh->i_shadowed_sample_number == NULL     || p_box->data.p_stsh->i_sync_sample_number == NULL )    {        MP4_READBOX_EXIT( 0 );    }    for( i = 0; (i < p_box->data.p_stss->i_entry_count )&&( i_read >= 8 ); i++ )    {        MP4_GET4BYTES( p_box->data.p_stsh->i_shadowed_sample_number[i] );        MP4_GET4BYTES( p_box->data.p_stsh->i_sync_sample_number[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stsh\" entry-count %d",                      p_box->data.p_stsh->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_stdp( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stdp_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stdp );    p_box->data.p_stdp->i_priority =        calloc( i_read / 2, sizeof(uint16_t) );    for( i = 0; i < i_read / 2 ; i++ )    {        MP4_GET2BYTES( p_box->data.p_stdp->i_priority[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stdp\" entry-count %"PRId64,                      i_read / 2 );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stdp( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_stdp->i_priority );}static void MP4_FreeBox_padb( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_padb->i_reserved1 );    FREENULL( p_box->data.p_padb->i_pad2 );    FREENULL( p_box->data.p_padb->i_reserved2 );    FREENULL( p_box->data.p_padb->i_pad1 );}static int MP4_ReadBox_padb( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    uint32_t count;    MP4_READBOX_ENTER( MP4_Box_data_padb_t );    MP4_GETVERSIONFLAGS( p_box->data.p_padb );    MP4_GET4BYTES( p_box->data.p_padb->i_sample_count );    count = (p_box->data.p_padb->i_sample_count + 1) / 2;    p_box->data.p_padb->i_reserved1 = calloc( count, sizeof(uint16_t) );    p_box->data.p_padb->i_pad2 = calloc( count, sizeof(uint16_t) );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -