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

📄 libmp4.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
    p_box->data.p_padb->i_reserved2 = calloc( count, sizeof(uint16_t) );    p_box->data.p_padb->i_pad1 = calloc( count, sizeof(uint16_t) );    if( p_box->data.p_padb->i_reserved1 == NULL     || p_box->data.p_padb->i_pad2 == NULL     || p_box->data.p_padb->i_reserved2 == NULL     || p_box->data.p_padb->i_pad1 == NULL )    {        MP4_READBOX_EXIT( 0 );    }    for( i = 0; i < i_read / 2 ; i++ )    {        if( i >= count )        {            MP4_READBOX_EXIT( 0 );        }        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 %"PRId64,                      i_read / 2 );#endif    MP4_READBOX_EXIT( 1 );}static void MP4_FreeBox_elst( MP4_Box_t *p_box ){    FREENULL( p_box->data.p_elst->i_segment_duration );    FREENULL( p_box->data.p_elst->i_media_time );    FREENULL( p_box->data.p_elst->i_media_rate_integer );    FREENULL( p_box->data.p_elst->i_media_rate_fraction );}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( p_box->data.p_elst->i_entry_count, sizeof(uint64_t) );    p_box->data.p_elst->i_media_time =        calloc( p_box->data.p_elst->i_entry_count, sizeof(uint64_t) );    p_box->data.p_elst->i_media_rate_integer =        calloc( p_box->data.p_elst->i_entry_count, sizeof(uint16_t) );    p_box->data.p_elst->i_media_rate_fraction =        calloc( p_box->data.p_elst->i_entry_count, sizeof(uint16_t) );    if( p_box->data.p_elst->i_segment_duration == NULL     || p_box->data.p_elst->i_media_time == NULL     || p_box->data.p_elst->i_media_rate_integer == NULL     || p_box->data.p_elst->i_media_rate_fraction == NULL )    {        MP4_READBOX_EXIT( 0 );    }    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 %lu",             (unsigned long)p_box->data.p_elst->i_entry_count );#endif    MP4_READBOX_EXIT( 1 );}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 ){    FREENULL( 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 ){    FREENULL( 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, 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 );    i_len++;    if( i_len > 0 )    {        uint32_t i;        p_box->data.p_rdrf->psz_ref = malloc( i_len );        if( p_box->data.p_rdrf->psz_ref == NULL )            MP4_READBOX_EXIT( 0 );        i_len--;        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 ){    FREENULL( 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 )        {            const 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;         

⌨️ 快捷键说明

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