📄 libmp4.c
字号:
{ 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 ){ 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_elst_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, p_box->data.p_elst->i_entry_count );#endif MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_elst( MP4_Box_t *p_box )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -