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

📄 libmp4.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef MP4_VERBOSE    MP4_ConvertDate2Str( s_creation_time, p_box->data.p_mvhd->i_creation_time );    MP4_ConvertDate2Str( s_modification_time,                         p_box->data.p_mvhd->i_modification_time );    if( p_box->data.p_mvhd->i_rate )    {        MP4_ConvertDate2Str( s_duration,                 p_box->data.p_mvhd->i_duration / p_box->data.p_mvhd->i_rate );    }    else    {        s_duration[0] = 0;    }    msg_Dbg( p_stream, "read box: \"mvhd\" creation %s modification %s time scale %d duration %s rate %f volume %f next track id %d",                  s_creation_time,                  s_modification_time,                  (uint32_t)p_box->data.p_mvhd->i_timescale,                  s_duration,                  (float)p_box->data.p_mvhd->i_rate / (1<<16 ),                  (float)p_box->data.p_mvhd->i_volume / 256 ,                  (uint32_t)p_box->data.p_mvhd->i_next_track_id );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_tkhd(  stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;#ifdef MP4_VERBOSE    char s_creation_time[128];    char s_modification_time[128];    char s_duration[128];#endif    MP4_READBOX_ENTER( MP4_Box_data_tkhd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_tkhd );    if( p_box->data.p_tkhd->i_version )    {        MP4_GET8BYTES( p_box->data.p_tkhd->i_creation_time );        MP4_GET8BYTES( p_box->data.p_tkhd->i_modification_time );        MP4_GET4BYTES( p_box->data.p_tkhd->i_track_ID );        MP4_GET4BYTES( p_box->data.p_tkhd->i_reserved );        MP4_GET8BYTES( p_box->data.p_tkhd->i_duration );    }    else    {        MP4_GET4BYTES( p_box->data.p_tkhd->i_creation_time );        MP4_GET4BYTES( p_box->data.p_tkhd->i_modification_time );        MP4_GET4BYTES( p_box->data.p_tkhd->i_track_ID );        MP4_GET4BYTES( p_box->data.p_tkhd->i_reserved );        MP4_GET4BYTES( p_box->data.p_tkhd->i_duration );    }    for( i = 0; i < 2; i++ )    {        MP4_GET4BYTES( p_box->data.p_tkhd->i_reserved2[i] );    }    MP4_GET2BYTES( p_box->data.p_tkhd->i_layer );    MP4_GET2BYTES( p_box->data.p_tkhd->i_predefined );    MP4_GET2BYTES( p_box->data.p_tkhd->i_volume );    MP4_GET2BYTES( p_box->data.p_tkhd->i_reserved3 );    for( i = 0; i < 9; i++ )    {        MP4_GET4BYTES( p_box->data.p_tkhd->i_matrix[i] );    }    MP4_GET4BYTES( p_box->data.p_tkhd->i_width );    MP4_GET4BYTES( p_box->data.p_tkhd->i_height );#ifdef MP4_VERBOSE    MP4_ConvertDate2Str( s_creation_time, p_box->data.p_mvhd->i_creation_time );    MP4_ConvertDate2Str( s_modification_time, p_box->data.p_mvhd->i_modification_time );    MP4_ConvertDate2Str( s_duration, p_box->data.p_mvhd->i_duration );    msg_Dbg( p_stream, "read box: \"tkhd\" creation %s modification %s duration %s track ID %d layer %d volume %f width %f height %f",                  s_creation_time,                  s_modification_time,                  s_duration,                  p_box->data.p_tkhd->i_track_ID,                  p_box->data.p_tkhd->i_layer,                  (float)p_box->data.p_tkhd->i_volume / 256 ,                  (float)p_box->data.p_tkhd->i_width / 65536,                  (float)p_box->data.p_tkhd->i_height / 65536 );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_mdhd( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    uint16_t i_language;#ifdef MP4_VERBOSE    char s_creation_time[128];    char s_modification_time[128];    char s_duration[128];#endif    MP4_READBOX_ENTER( MP4_Box_data_mdhd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_mdhd );    if( p_box->data.p_mdhd->i_version )    {        MP4_GET8BYTES( p_box->data.p_mdhd->i_creation_time );        MP4_GET8BYTES( p_box->data.p_mdhd->i_modification_time );        MP4_GET4BYTES( p_box->data.p_mdhd->i_timescale );        MP4_GET8BYTES( p_box->data.p_mdhd->i_duration );    }    else    {        MP4_GET4BYTES( p_box->data.p_mdhd->i_creation_time );        MP4_GET4BYTES( p_box->data.p_mdhd->i_modification_time );        MP4_GET4BYTES( p_box->data.p_mdhd->i_timescale );        MP4_GET4BYTES( p_box->data.p_mdhd->i_duration );    }    i_language = GetWBE( p_peek );    for( i = 0; i < 3; i++ )    {        p_box->data.p_mdhd->i_language[i] =                    ( ( i_language >> ( (2-i)*5 ) )&0x1f ) + 0x60;    }    MP4_GET2BYTES( p_box->data.p_mdhd->i_predefined );#ifdef MP4_VERBOSE    MP4_ConvertDate2Str( s_creation_time, p_box->data.p_mdhd->i_creation_time );    MP4_ConvertDate2Str( s_modification_time, p_box->data.p_mdhd->i_modification_time );    MP4_ConvertDate2Str( s_duration, p_box->data.p_mdhd->i_duration );    msg_Dbg( p_stream, "read box: \"mdhd\" creation %s modification %s time scale %d duration %s language %c%c%c",                  s_creation_time,                  s_modification_time,                  (uint32_t)p_box->data.p_mdhd->i_timescale,                  s_duration,                  p_box->data.p_mdhd->i_language[0],                  p_box->data.p_mdhd->i_language[1],                  p_box->data.p_mdhd->i_language[2] );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_hdlr( stream_t *p_stream, MP4_Box_t *p_box ){    int32_t i_reserved;    MP4_READBOX_ENTER( MP4_Box_data_hdlr_t );    MP4_GETVERSIONFLAGS( p_box->data.p_hdlr );    MP4_GETFOURCC( p_box->data.p_hdlr->i_predefined );    MP4_GETFOURCC( p_box->data.p_hdlr->i_handler_type );    MP4_GET4BYTES( i_reserved );    MP4_GET4BYTES( i_reserved );    MP4_GET4BYTES( i_reserved );    p_box->data.p_hdlr->psz_name = calloc( sizeof( char ), i_read + 1 );    /* Yes, I love .mp4 :( */    if( p_box->data.p_hdlr->i_predefined == VLC_FOURCC( 'm', 'h', 'l', 'r' ) )    {        uint8_t i_len;        int i_copy;        MP4_GET1BYTE( i_len );        i_copy = __MIN( i_read, i_len );        memcpy( p_box->data.p_hdlr->psz_name, p_peek, i_copy );        p_box->data.p_hdlr->psz_name[i_copy] = '\0';    }    else    {        memcpy( p_box->data.p_hdlr->psz_name, p_peek, i_read );        p_box->data.p_hdlr->psz_name[i_read] = '\0';    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"hdlr\" hanler type %4.4s name %s",                       (char*)&p_box->data.p_hdlr->i_handler_type,                       p_box->data.p_hdlr->psz_name );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_hdlr( MP4_Box_t *p_box ){    FREE( p_box->data.p_hdlr->psz_name );}static int MP4_ReadBox_vmhd( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_vmhd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_vmhd );    MP4_GET2BYTES( p_box->data.p_vmhd->i_graphics_mode );    for( i = 0; i < 3; i++ )    {        MP4_GET2BYTES( p_box->data.p_vmhd->i_opcolor[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"vmhd\" graphics-mode %d opcolor (%d, %d, %d)",                      p_box->data.p_vmhd->i_graphics_mode,                      p_box->data.p_vmhd->i_opcolor[0],                      p_box->data.p_vmhd->i_opcolor[1],                      p_box->data.p_vmhd->i_opcolor[2] );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_smhd( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_smhd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_smhd );    MP4_GET2BYTES( p_box->data.p_smhd->i_balance );    MP4_GET2BYTES( p_box->data.p_smhd->i_reserved );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"smhd\" balance %f",                      (float)p_box->data.p_smhd->i_balance / 256 );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_hmhd( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_hmhd_t );    MP4_GETVERSIONFLAGS( p_box->data.p_hmhd );    MP4_GET2BYTES( p_box->data.p_hmhd->i_max_PDU_size );    MP4_GET2BYTES( p_box->data.p_hmhd->i_avg_PDU_size );    MP4_GET4BYTES( p_box->data.p_hmhd->i_max_bitrate );    MP4_GET4BYTES( p_box->data.p_hmhd->i_avg_bitrate );    MP4_GET4BYTES( p_box->data.p_hmhd->i_reserved );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"hmhd\" maxPDU-size %d avgPDU-size %d max-bitrate %d avg-bitrate %d",                      p_box->data.p_hmhd->i_max_PDU_size,                      p_box->data.p_hmhd->i_avg_PDU_size,                      p_box->data.p_hmhd->i_max_bitrate,                      p_box->data.p_hmhd->i_avg_bitrate );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_url( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_url_t );    MP4_GETVERSIONFLAGS( p_box->data.p_url );    MP4_GETSTRINGZ( p_box->data.p_url->psz_location );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"url\" url: %s",                       p_box->data.p_url->psz_location );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_url( MP4_Box_t *p_box ){    FREE( p_box->data.p_url->psz_location )}static int MP4_ReadBox_urn( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_urn_t );    MP4_GETVERSIONFLAGS( p_box->data.p_urn );    MP4_GETSTRINGZ( p_box->data.p_urn->psz_name );    MP4_GETSTRINGZ( p_box->data.p_urn->psz_location );#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"urn\" name %s location %s",                      p_box->data.p_urn->psz_name,                      p_box->data.p_urn->psz_location );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_urn( MP4_Box_t *p_box ){    FREE( p_box->data.p_urn->psz_name );    FREE( p_box->data.p_urn->psz_location );}static int MP4_ReadBox_dref( stream_t *p_stream, MP4_Box_t *p_box ){    MP4_READBOX_ENTER( MP4_Box_data_dref_t );    MP4_GETVERSIONFLAGS( p_box->data.p_dref );    MP4_GET4BYTES( p_box->data.p_dref->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: \"dref\" entry-count %d",                      p_box->data.p_dref->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_stts( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_stts_t );    MP4_GETVERSIONFLAGS( p_box->data.p_stts );    MP4_GET4BYTES( p_box->data.p_stts->i_entry_count );    p_box->data.p_stts->i_sample_count =        calloc( sizeof( uint32_t ), p_box->data.p_stts->i_entry_count );    p_box->data.p_stts->i_sample_delta =        calloc( sizeof( uint32_t ), p_box->data.p_stts->i_entry_count );    for( i = 0; (i < p_box->data.p_stts->i_entry_count )&&( i_read >=8 ); i++ )    {        MP4_GET4BYTES( p_box->data.p_stts->i_sample_count[i] );        MP4_GET4BYTES( p_box->data.p_stts->i_sample_delta[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"stts\" entry-count %d",                      p_box->data.p_stts->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_stts( MP4_Box_t *p_box ){    FREE( p_box->data.p_stts->i_sample_count );    FREE( p_box->data.p_stts->i_sample_delta );}static int MP4_ReadBox_ctts( stream_t *p_stream, MP4_Box_t *p_box ){    unsigned int i;    MP4_READBOX_ENTER( MP4_Box_data_ctts_t );    MP4_GETVERSIONFLAGS( p_box->data.p_ctts );    MP4_GET4BYTES( p_box->data.p_ctts->i_entry_count );    p_box->data.p_ctts->i_sample_count =        calloc( sizeof( uint32_t ), p_box->data.p_ctts->i_entry_count );    p_box->data.p_ctts->i_sample_offset =        calloc( sizeof( uint32_t ), p_box->data.p_ctts->i_entry_count );    for( i = 0; (i < p_box->data.p_ctts->i_entry_count )&&( i_read >=8 ); i++ )    {        MP4_GET4BYTES( p_box->data.p_ctts->i_sample_count[i] );        MP4_GET4BYTES( p_box->data.p_ctts->i_sample_offset[i] );    }#ifdef MP4_VERBOSE    msg_Dbg( p_stream, "read box: \"ctts\" entry-count %d",                      p_box->data.p_ctts->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_ctts( MP4_Box_t *p_box ){    FREE( p_box->data.p_ctts->i_sample_count );    FREE( p_box->data.p_ctts->i_sample_offset );}static int MP4_ReadLengthDescriptor( uint8_t **pp_peek, int64_t  *i_read ){    unsigned int i_b;    unsigned int i_len = 0;    do    {        i_b = **pp_peek;        (*pp_peek)++;        (*i_read)--;        i_len = ( i_len << 7 ) + ( i_b&0x7f );    } while( i_b&0x80 );    return( i_len );}static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box ){#define es_descriptor p_box->data.p_esds->es_descriptor    unsigned int i_len;    unsigned int i_flags;    unsigned int i_type;    MP4_READBOX_ENTER( MP4_Box_data_esds_t );    MP4_GETVERSIONFLAGS( p_box->data.p_esds );    MP4_GET1BYTE( i_type );    if( i_type == 0x03 ) /* MP4ESDescrTag */    {        i_len = MP4_ReadLengthDescriptor( &p_peek, &i_read );#ifdef MP4_VERBOSE        msg_Dbg( p_stream, "found esds MPEG4ESDescr (%dBytes)",                 i_len );#endif

⌨️ 快捷键说明

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