📄 libmp4.c
字号:
#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 + -