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

📄 libmp4.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
{    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 )    {        if( drms_init( p_drms_box->data.p_sample_soun->p_drms,                       p_box->i_type, p_peek, i_read ) )        {            msg_Err( p_stream, "drms_init( %4.4s ) failed",                     (char *)&p_box->i_type );            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 );            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_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_trak,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_mdia,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_moof,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_minf,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_stbl,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_dinf,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_edts,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_udta,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_nmhd,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_hnti,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_rmra,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_rmda,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_tref,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_gmhd,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    { FOURCC_wave,  MP4_ReadBoxContainer,   MP4_FreeBox_Common },    /* specific box */    { FOURCC_ftyp,  MP4_ReadBox_ftyp,       MP4_FreeBox_ftyp },    { FOURCC_cmov,  MP4_ReadBox_cmov,       MP4_FreeBox_Common },    { FOURCC_mvhd,  MP4_ReadBox_mvhd,       MP4_FreeBox_Common },    { FOURCC_tkhd,  MP4_ReadBox_tkhd,       MP4_FreeBox_Common },    { FOURCC_mdhd,  MP4_ReadBox_mdhd,       MP4_FreeBox_Common },    { FOURCC_hdlr,  MP4_ReadBox_hdlr,       MP4_FreeBox_hdlr },    { FOURCC_vmhd,  MP4_ReadBox_vmhd,       MP4_FreeBox_Common },    { FOURCC_smhd,  MP4_ReadBox_smhd,       MP4_FreeBox_Common },    { FOURCC_hmhd,  MP4_ReadBox_hmhd,       MP4_FreeBox_Common },    { FOURCC_url,   MP4_ReadBox_url,        MP4_FreeBox_url },    { FOURCC_urn,   MP4_ReadBox_urn,        MP4_FreeBox_urn },    { FOURCC_dref,  MP4_ReadBox_dref,       MP4_FreeBox_Common },    { FOURCC_stts,  MP4_ReadBox_stts,       MP4_FreeBox_stts },    { FOURCC_ctts,  MP4_ReadBox_ctts,       MP4_FreeBox_ctts },    { FOURCC_stsd,  MP4_ReadBox_stsd,       MP4_FreeBox_Common },    { FOURCC_stsz,  MP4_ReadBox_stsz,       MP4_FreeBox_stsz },    { FOURCC_stsc,  MP4_ReadBox_stsc,       MP4_FreeBox_stsc },    { FOURCC_stco,  MP4_ReadBox_stco_co64,  MP4_FreeBox_stco_co64 },    { FOURCC_co64,  MP4_ReadBox_stco_co64,  MP4_FreeBox_stco_co64 },    { FOURCC_stss,  MP4_ReadBox_stss,       MP4_FreeBox_stss },    { FOURCC_stsh,  MP4_ReadBox_stsh,       MP4_FreeBox_stsh },    { FOURCC_stdp,  MP4_ReadBox_stdp,       MP4_FreeBox_stdp },    { FOURCC_padb,  MP4_ReadBox_padb,       MP4_FreeBox_padb },    { FOURCC_elst,  MP4_ReadBox_elst,       MP4_FreeBox_elst },    { FOURCC_cprt,  MP4_ReadBox_cprt,       MP4_FreeBox_cprt },    { FOURCC_esds,  MP4_ReadBox_esds,       MP4_FreeBox_esds },    { FOURCC_dcom,  MP4_ReadBox_dcom,       MP4_FreeBox_Common },    { FOURCC_cmvd,  MP4_ReadBox_cmvd,       MP4_FreeBox_cmvd },    { FOURCC_avcC,  MP4_ReadBox_avcC,       MP4_FreeBox_avcC },    /* Nothing to do with this box */    { FOURCC_mdat,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },    { FOURCC_skip,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },    { FOURCC_free,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },    { FOURCC_wide,  MP4_ReadBoxSkip,        MP4_FreeBox_Common },    /* for codecs */    { FOURCC_soun,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC_ms02,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC_ms11,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC_ms55,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC__mp3,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC_mp4a,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_soun },    { FOURCC_twos,  MP4_ReadBox_sample_soun,    MP4_FreeBox_sample_sou

⌨️ 快捷键说明

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