📄 libmp4.c
字号:
MP4_GET2BYTES( p_box->data.p_sample_text->i_foreground_color[0] ); MP4_GET2BYTES( p_box->data.p_sample_text->i_foreground_color[1] ); MP4_GET2BYTES( p_box->data.p_sample_text->i_foreground_color[2] ); MP4_GET1BYTE( i ); p_box->data.p_sample_text->psz_text_name = malloc( i + 1 ); memcpy( p_box->data.p_sample_text->psz_text_name, p_peek, i ); p_box->data.p_sample_text->psz_text_name[i] = '\0';#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"text\" in stsd text name=%s", p_box->data.p_sample_text->psz_text_name );#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 ){ FREE( 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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "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( 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, "read box: \"dcom\" compression algorithm : %4.4s", (char*)&p_box->data.p_dcom->i_algorithm );#endif MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_cmvd( stream_t *p_stream, MP4_Box_t *p_box )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -