📄 libmp4.c
字号:
{ 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 ){ MP4_READBOX_ENTER( MP4_Box_data_cmvd_t ); MP4_GET4BYTES( p_box->data.p_cmvd->i_uncompressed_size ); p_box->data.p_cmvd->i_compressed_size = i_read; if( !( p_box->data.p_cmvd->p_data = malloc( i_read ) ) ) { msg_Dbg( p_stream, "read box: \"cmvd\" not enough memory to load data" ); return( 1 ); } /* now copy compressed data */ memcpy( p_box->data.p_cmvd->p_data, p_peek, i_read); p_box->data.p_cmvd->b_compressed = 1;#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"cmvd\" compressed data size %d", p_box->data.p_cmvd->i_compressed_size );#endif MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_cmvd( MP4_Box_t *p_box ){ FREE( p_box->data.p_cmvd->p_data );}static int MP4_ReadBox_cmov( stream_t *p_stream, MP4_Box_t *p_box ){ MP4_Box_t *p_dcom; MP4_Box_t *p_cmvd;#ifdef HAVE_ZLIB_H stream_t *p_stream_memory; z_stream z_data; uint8_t *p_data; int i_result;#endif if( !( p_box->data.p_cmov = malloc( sizeof( MP4_Box_data_cmov_t ) ) ) ) { msg_Err( p_stream, "out of memory" ); return 0; } memset( p_box->data.p_cmov, 0, sizeof( MP4_Box_data_cmov_t ) ); if( !p_box->p_father || ( p_box->p_father->i_type != FOURCC_moov && p_box->p_father->i_type != FOURCC_foov ) ) { msg_Warn( p_stream, "Read box: \"cmov\" box alone" ); return 1; } if( !MP4_ReadBoxContainer( p_stream, p_box ) ) { return 0; } if( ( p_dcom = MP4_BoxGet( p_box, "dcom" ) ) == NULL || ( p_cmvd = MP4_BoxGet( p_box, "cmvd" ) ) == NULL || p_cmvd->data.p_cmvd->p_data == NULL ) { msg_Warn( p_stream, "read box: \"cmov\" incomplete" ); return 1; } if( p_dcom->data.p_dcom->i_algorithm != FOURCC_zlib ) { msg_Dbg( p_stream, "read box: \"cmov\" compression algorithm : %4.4s " "not supported", (char*)&p_dcom->data.p_dcom->i_algorithm ); return 1; }#ifndef HAVE_ZLIB_H msg_Dbg( p_stream, "read box: \"cmov\" zlib unsupported" ); return 1;#else /* decompress data */ /* allocate a new buffer */ if( !( p_data = malloc( p_cmvd->data.p_cmvd->i_uncompressed_size ) ) ) { msg_Err( p_stream, "read box: \"cmov\" not enough memory to " "uncompress data" ); return 1; } /* init default structures */ z_data.next_in = p_cmvd->data.p_cmvd->p_data; z_data.avail_in = p_cmvd->data.p_cmvd->i_compressed_size; z_data.next_out = p_data; z_data.avail_out = p_cmvd->data.p_cmvd->i_uncompressed_size; z_data.zalloc = (alloc_func)Z_NULL; z_data.zfree = (free_func)Z_NULL; z_data.opaque = (voidpf)Z_NULL; /* init zlib */ if( inflateInit( &z_data ) != Z_OK ) { msg_Err( p_stream, "read box: \"cmov\" error while uncompressing" ); free( p_data ); return 1; } /* uncompress */ i_result = inflate( &z_data, Z_NO_FLUSH ); if( i_result != Z_OK && i_result != Z_STREAM_END ) { msg_Err( p_stream, "read box: \"cmov\" error while uncompressing" ); free( p_data ); return 1; } if( p_cmvd->data.p_cmvd->i_uncompressed_size != z_data.total_out ) { msg_Warn( p_stream, "read box: \"cmov\" uncompressing data size " "mismatch" ); } p_cmvd->data.p_cmvd->i_uncompressed_size = z_data.total_out; /* close zlib */ if( inflateEnd( &z_data ) != Z_OK ) { msg_Warn( p_stream, "read box: \"cmov\" error while uncompressing " "data (ignored)" ); } free( p_cmvd->data.p_cmvd->p_data ); p_cmvd->data.p_cmvd->p_data = p_data; p_cmvd->data.p_cmvd->b_compressed = 0; msg_Dbg( p_stream, "read box: \"cmov\" box succesfully uncompressed" ); /* now create a memory stream */ p_stream_memory = stream_MemoryNew( VLC_OBJECT(p_stream), p_cmvd->data.p_cmvd->p_data, p_cmvd->data.p_cmvd->i_uncompressed_size, VLC_TRUE ); /* and read uncompressd moov */ p_box->data.p_cmov->p_moov = MP4_ReadBox( p_stream_memory, NULL ); stream_Delete( p_stream_memory );#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"cmov\" compressed movie header completed");#endif return p_box->data.p_cmov->p_moov ? 1 : 0;#endif /* HAVE_ZLIB_H */}static int MP4_ReadBox_rdrf( stream_t *p_stream, MP4_Box_t *p_box ){ uint32_t i_len; MP4_READBOX_ENTER( MP4_Box_data_rdrf_t ); MP4_GETVERSIONFLAGS( p_box->data.p_rdrf ); MP4_GETFOURCC( p_box->data.p_rdrf->i_ref_type ); MP4_GET4BYTES( i_len ); if( i_len > 0 ) { uint32_t i; p_box->data.p_rdrf->psz_ref = malloc( i_len + 1); for( i = 0; i < i_len; i++ ) { MP4_GET1BYTE( p_box->data.p_rdrf->psz_ref[i] ); } p_box->data.p_rdrf->psz_ref[i_len] = '\0'; } else { p_box->data.p_rdrf->psz_ref = NULL; }#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"rdrf\" type:%4.4s ref %s", (char*)&p_box->data.p_rdrf->i_ref_type, p_box->data.p_rdrf->psz_ref );#endif MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_rdrf( MP4_Box_t *p_box ){ FREE( p_box->data.p_rdrf->psz_ref )}static int MP4_ReadBox_rmdr( stream_t *p_stream, MP4_Box_t *p_box ){ MP4_READBOX_ENTER( MP4_Box_data_rmdr_t ); MP4_GETVERSIONFLAGS( p_box->data.p_rmdr ); MP4_GET4BYTES( p_box->data.p_rmdr->i_rate );#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"rmdr\" rate:%d", p_box->data.p_rmdr->i_rate );#endif MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_rmqu( stream_t *p_stream, MP4_Box_t *p_box ){ MP4_READBOX_ENTER( MP4_Box_data_rmqu_t ); MP4_GET4BYTES( p_box->data.p_rmqu->i_quality );#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"rmqu\" quality:%d", p_box->data.p_rmqu->i_quality );#endif MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_rmvc( stream_t *p_stream, MP4_Box_t *p_box ){ MP4_READBOX_ENTER( MP4_Box_data_rmvc_t ); MP4_GETVERSIONFLAGS( p_box->data.p_rmvc ); MP4_GETFOURCC( p_box->data.p_rmvc->i_gestaltType ); MP4_GET4BYTES( p_box->data.p_rmvc->i_val1 ); MP4_GET4BYTES( p_box->data.p_rmvc->i_val2 ); MP4_GET2BYTES( p_box->data.p_rmvc->i_checkType );#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"rmvc\" gestaltType:%4.4s val1:0x%x val2:0x%x checkType:0x%x", (char*)&p_box->data.p_rmvc->i_gestaltType, p_box->data.p_rmvc->i_val1,p_box->data.p_rmvc->i_val2, p_box->data.p_rmvc->i_checkType );#endif MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_drms( stream_t *p_stream, MP4_Box_t *p_box ){ MP4_Box_t *p_drms_box = p_box; MP4_READBOX_ENTER( uint8_t ); do { p_drms_box = p_drms_box->p_father; } while( p_drms_box && p_drms_box->i_type != FOURCC_drms ); if( p_drms_box && p_drms_box->data.p_sample_soun->p_drms ) { int i_ret = drms_init( p_drms_box->data.p_sample_soun->p_drms, p_box->i_type, p_peek, i_read ); if( i_ret ) { char *psz_error; switch( i_ret ) { case -1: psz_error = "unimplemented"; break; case -2: psz_error = "invalid argument"; break; case -3: psz_error = "could not get system key"; break; case -4: psz_error = "could not get SCI data"; break; case -5: psz_error = "no user key found in SCI data"; break; case -6: psz_error = "invalid user key"; break; default: psz_error = "unknown error"; break; } msg_Err( p_stream, "drms_init(%4.4s) failed (%s)", (char *)&p_box->i_type, psz_error ); drms_free( p_drms_box->data.p_sample_soun->p_drms ); p_drms_box->data.p_sample_soun->p_drms = NULL; } } MP4_READBOX_EXIT( 1 );}static int MP4_ReadBox_0xa9xxx( stream_t *p_stream, MP4_Box_t *p_box ){ int16_t i_length, i_dummy; MP4_READBOX_ENTER( MP4_Box_data_0xa9xxx_t ); p_box->data.p_0xa9xxx->psz_text = NULL; MP4_GET2BYTES( i_length ); MP4_GET2BYTES( i_dummy ); if( i_length > 0 ) { if( i_length > i_read ) i_length = i_read; p_box->data.p_0xa9xxx->psz_text = malloc( i_length + 1 ); memcpy( p_box->data.p_0xa9xxx->psz_text, p_peek, i_length ); p_box->data.p_0xa9xxx->psz_text[i_length] = '\0';#ifdef MP4_VERBOSE msg_Dbg( p_stream, "read box: \"%4.4s\" text=`%s'", (char*)&p_box->i_type, p_box->data.p_0xa9xxx->psz_text );#endif } MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_0xa9xxx( MP4_Box_t *p_box ){ FREE( p_box->data.p_0xa9xxx->psz_text );}/* For generic */static int MP4_ReadBox_default( stream_t *p_stream, MP4_Box_t *p_box ){ if( !p_box->p_father ) { goto unknown; } if( p_box->p_father->i_type == FOURCC_stsd ) { MP4_Box_t *p_mdia = MP4_BoxGet( p_box, "../../../.." ); MP4_Box_t *p_hdlr; if( p_mdia == NULL || p_mdia->i_type != FOURCC_mdia || (p_hdlr = MP4_BoxGet( p_mdia, "hdlr" )) == NULL ) { goto unknown; } switch( p_hdlr->data.p_hdlr->i_handler_type ) { case FOURCC_soun: return MP4_ReadBox_sample_soun( p_stream, p_box ); case FOURCC_vide: return MP4_ReadBox_sample_vide( p_stream, p_box ); case FOURCC_text: return MP4_ReadBox_sample_text( p_stream, p_box ); case FOURCC_tx3g: return MP4_ReadBox_sample_tx3g( p_stream, p_box ); default: msg_Warn( p_stream, "unknown handler type in stsd (uncompletetly loaded)" ); return 1; } }unknown: msg_Warn( p_stream, "unknown box type %4.4s (uncompletetly loaded)", (char*)&p_box->i_type ); return 1;}/**** ------------------------------------------------------------------- ****//**** "Higher level" Functions ****//**** ------------------------------------------------------------------- ****/static struct{ uint32_t i_type; int (*MP4_ReadBox_function )( stream_t *p_stream, MP4_Box_t *p_box ); void (*MP4_FreeBox_function )( MP4_Box_t *p_box );} MP4_Box_Function [] ={ /* Containers */ { FOURCC_moov, MP4_ReadBoxContaine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -