libmp4.c

来自「VLC媒体播放程序」· C语言 代码 · 共 2,060 行 · 第 1/5 页

C
2,060
字号
    MP4_GET2BYTES( p_box->data.p_sample_vide->i_depth );    MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_color_table );    MP4_SeekStream( 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->p_input, "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 );}static int MP4_ReadBox_stsd( MP4_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 );    MP4_SeekStream( 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->p_input, "read box: \"stsd\" entry-count %d",                      p_box->data.p_stsd->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_stsz( MP4_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( sizeof( uint32_t ), p_box->data.p_stsz->i_sample_count );    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->p_input, "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 ){    FREE( p_box->data.p_stsz->i_entry_size );}static int MP4_ReadBox_stsc( MP4_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( sizeof( uint32_t ), p_box->data.p_stsc->i_entry_count );    p_box->data.p_stsc->i_samples_per_chunk =        calloc( sizeof( uint32_t ), p_box->data.p_stsc->i_entry_count );    p_box->data.p_stsc->i_sample_description_index =        calloc( sizeof( uint32_t ), p_box->data.p_stsc->i_entry_count );    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->p_input, "read box: \"stsc\" entry-count %d",                      p_box->data.p_stsc->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stsc( MP4_Box_t *p_box ){    FREE( p_box->data.p_stsc->i_first_chunk );    FREE( p_box->data.p_stsc->i_samples_per_chunk );    FREE( p_box->data.p_stsc->i_sample_description_index );}static int MP4_ReadBox_stco_co64( MP4_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( sizeof( uint64_t ), p_box->data.p_co64->i_entry_count );    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->p_input, "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 ){    FREE( p_box->data.p_co64->i_chunk_offset );}static int MP4_ReadBox_stss( MP4_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( sizeof( uint32_t ), p_box->data.p_stss->i_entry_count );    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->p_input, "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 ){    FREE( p_box->data.p_stss->i_sample_number )}static int MP4_ReadBox_stsh( MP4_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( sizeof( uint32_t ), p_box->data.p_stsh->i_entry_count );    p_box->data.p_stsh->i_sync_sample_number =        calloc( sizeof( uint32_t ), p_box->data.p_stsh->i_entry_count );    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->p_input, "read box: \"stsh\" entry-count %d",                      p_box->data.p_stsh->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stsh( MP4_Box_t *p_box ){    FREE( p_box->data.p_stsh->i_shadowed_sample_number )    FREE( p_box->data.p_stsh->i_sync_sample_number )}static int MP4_ReadBox_stdp( MP4_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( sizeof( uint16_t ), i_read / 2 );    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->p_input, "read box: \"stdp\" entry-count "I64Fd,                      i_read / 2 );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stdp( MP4_Box_t *p_box ){    FREE( p_box->data.p_stdp->i_priority )}static int MP4_ReadBox_padb( MP4_Stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    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 );    p_box->data.p_padb->i_reserved1 =        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );    p_box->data.p_padb->i_pad2 =        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );    p_box->data.p_padb->i_reserved2 =        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );    p_box->data.p_padb->i_pad1 =        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );    for( i = 0; i < i_read / 2 ; i++ )    {        p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 7 )&0x01;        p_box->data.p_padb->i_pad2[i] = ( (*p_peek) >> 4 )&0x07;        p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 3 )&0x01;        p_box->data.p_padb->i_pad1[i] = ( (*p_peek) )&0x07;        p_peek += 1; i_read -= 1;    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream->p_input, "read box: \"stdp\" entry-count "I64Fd,                      i_read / 2 );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_padb( MP4_Box_t *p_box ){    FREE( p_box->data.p_padb->i_reserved1 );    FREE( p_box->data.p_padb->i_pad2 );    FREE( p_box->data.p_padb->i_reserved2 );    FREE( p_box->data.p_padb->i_pad1 );}static int MP4_ReadBox_elst( MP4_Stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_padb_t );    MP4_GETVERSIONFLAGS( p_box->data.p_elst );    MP4_GET4BYTES( p_box->data.p_elst->i_entry_count );    p_box->data.p_elst->i_segment_duration =        calloc( sizeof( uint64_t ), p_box->data.p_elst->i_entry_count );    p_box->data.p_elst->i_media_time =        calloc( sizeof( int64_t ),  p_box->data.p_elst->i_entry_count );    p_box->data.p_elst->i_media_rate_integer =        calloc( sizeof( uint16_t ), p_box->data.p_elst->i_entry_count );    p_box->data.p_elst->i_media_rate_fraction=        calloc( sizeof( uint16_t ), p_box->data.p_elst->i_entry_count );    for( i = 0; i < p_box->data.p_elst->i_entry_count; i++ )    {        if( p_box->data.p_elst->i_version == 1 )        {            MP4_GET8BYTES( p_box->data.p_elst->i_segment_duration[i] );            MP4_GET8BYTES( p_box->data.p_elst->i_media_time[i] );        }        else        {            MP4_GET4BYTES( p_box->data.p_elst->i_segment_duration[i] );            MP4_GET4BYTES( p_box->data.p_elst->i_media_time[i] );            p_box->data.p_elst->i_media_time[i] = (int32_t)p_box->data.p_elst->i_media_time[i];        }        MP4_GET2BYTES( p_box->data.p_elst->i_media_rate_integer[i] );        MP4_GET2BYTES( p_box->data.p_elst->i_media_rate_fraction[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream->p_input, "read box: \"elst\" entry-count "I64Fd,                      i_read / 2 );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_elst( MP4_Box_t *p_box ){    FREE( p_box->data.p_elst->i_segment_duration );    FREE( p_box->data.p_elst->i_media_time );    FREE( p_box->data.p_elst->i_media_rate_integer );    FREE( p_box->data.p_elst->i_media_rate_fraction );}static int MP4_ReadBox_cprt( MP4_Stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i_language;    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_cprt_t );    MP4_GETVERSIONFLAGS( p_box->data.p_cprt );    i_language = GetWBE( p_peek );    for( i = 0; i < 3; i++ )    {        p_box->data.p_cprt->i_language[i] =            ( ( i_language >> ( (2-i)*5 ) )&0x1f ) + 0x60;    }    p_peek += 2; i_read -= 2;    MP4_GETSTRINGZ( p_box->data.p_cprt->psz_notice );#ifdef MP4_VERBOSE    msg_Dbg( p_stream->p_input, "read box: \"cprt\" language %c%c%c notice %s",                      p_box->data.p_cprt->i_language[0],                      p_box->data.p_cprt->i_language[1],                      p_box->data.p_cprt->i_language[2],                      p_box->data.p_cprt->psz_notice );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_cprt( MP4_Box_t *p_box ){    FREE( p_box->data.p_cprt->psz_notice );}static int MP4_ReadBox_dcom( MP4_Stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_dcom_t );    MP4_GETFOURCC( p_box->data.p_dcom->i_algorithm );#ifdef MP4_VERBOSE    msg_Dbg( p_stream->p_input,

⌨️ 快捷键说明

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