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

📄 libavi.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    avi_chunk_t *p_strh;    AVI_READCHUNK_ENTER;    if( p_chk->common.p_father == NULL )    {        msg_Err( (vlc_object_t*)s, "malformed avi file" );        AVI_READCHUNK_EXIT( VLC_EGENERIC );    }    if( !( p_strh = AVI_ChunkFind( p_chk->common.p_father, AVIFOURCC_strh, 0 ) ) )    {        msg_Err( (vlc_object_t*)s, "malformed avi file" );        AVI_READCHUNK_EXIT( VLC_EGENERIC );    }    switch( p_strh->strh.i_type )    {        case( AVIFOURCC_auds ):            p_chk->strf.auds.i_cat = AUDIO_ES;            p_chk->strf.auds.p_wf = malloc( __MAX( p_chk->common.i_chunk_size, sizeof( WAVEFORMATEX ) ) );            AVI_READ2BYTES( p_chk->strf.auds.p_wf->wFormatTag );            AVI_READ2BYTES( p_chk->strf.auds.p_wf->nChannels );            AVI_READ4BYTES( p_chk->strf.auds.p_wf->nSamplesPerSec );            AVI_READ4BYTES( p_chk->strf.auds.p_wf->nAvgBytesPerSec );            AVI_READ2BYTES( p_chk->strf.auds.p_wf->nBlockAlign );            AVI_READ2BYTES( p_chk->strf.auds.p_wf->wBitsPerSample );            if( p_chk->strf.auds.p_wf->wFormatTag != WAVE_FORMAT_PCM                 && p_chk->common.i_chunk_size > sizeof( WAVEFORMATEX ) )            {                AVI_READ2BYTES( p_chk->strf.auds.p_wf->cbSize );                /* prevent segfault */                if( p_chk->strf.auds.p_wf->cbSize >                        p_chk->common.i_chunk_size - sizeof( WAVEFORMATEX ) )                {                    p_chk->strf.auds.p_wf->cbSize =                        p_chk->common.i_chunk_size - sizeof( WAVEFORMATEX );                }                if( p_chk->strf.auds.p_wf->wFormatTag == WAVE_FORMAT_EXTENSIBLE )                {                    /* Found an extensible header atm almost nothing uses that. */                    msg_Warn( (vlc_object_t*)s, "WAVE_FORMAT_EXTENSIBLE or "                              "vorbis audio dectected: not supported" );                }            }            else            {                p_chk->strf.auds.p_wf->cbSize = 0;            }            if( p_chk->strf.auds.p_wf->cbSize > 0 )            {                memcpy( &p_chk->strf.auds.p_wf[1] ,                        p_buff + 8 + sizeof( WAVEFORMATEX ),    /*  8=fourrc+size */                        p_chk->strf.auds.p_wf->cbSize );            }#ifdef AVI_DEBUG            msg_Dbg( (vlc_object_t*)s,                     "strf: audio:0x%4.4x channels:%d %dHz %dbits/sample %dkb/s",                     p_chk->strf.auds.p_wf->wFormatTag,                     p_chk->strf.auds.p_wf->nChannels,                     p_chk->strf.auds.p_wf->nSamplesPerSec,                     p_chk->strf.auds.p_wf->wBitsPerSample,                     p_chk->strf.auds.p_wf->nAvgBytesPerSec * 8 / 1024 );#endif            break;        case( AVIFOURCC_vids ):            p_strh->strh.i_samplesize = 0; /* XXX for ffmpeg avi file */            p_chk->strf.vids.i_cat = VIDEO_ES;            p_chk->strf.vids.p_bih = malloc( p_chk->common.i_chunk_size );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biSize );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biWidth );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biHeight );            AVI_READ2BYTES( p_chk->strf.vids.p_bih->biPlanes );            AVI_READ2BYTES( p_chk->strf.vids.p_bih->biBitCount );            AVI_READFOURCC( p_chk->strf.vids.p_bih->biCompression );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biSizeImage );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biXPelsPerMeter );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biYPelsPerMeter );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biClrUsed );            AVI_READ4BYTES( p_chk->strf.vids.p_bih->biClrImportant );            if( p_chk->strf.vids.p_bih->biSize > p_chk->common.i_chunk_size )            {                p_chk->strf.vids.p_bih->biSize = p_chk->common.i_chunk_size;            }            if( p_chk->strf.vids.p_bih->biSize - sizeof(BITMAPINFOHEADER) > 0 )            {                memcpy( &p_chk->strf.vids.p_bih[1],                        p_buff + 8 + sizeof(BITMAPINFOHEADER), /* 8=fourrc+size */                        p_chk->common.i_chunk_size -sizeof(BITMAPINFOHEADER) );            }#ifdef AVI_DEBUG            msg_Dbg( (vlc_object_t*)s,                     "strf: video:%4.4s %"PRIu32"x%"PRIu32" planes:%d %dbpp",                     (char*)&p_chk->strf.vids.p_bih->biCompression,                     (uint32_t)p_chk->strf.vids.p_bih->biWidth,                     (uint32_t)p_chk->strf.vids.p_bih->biHeight,                     p_chk->strf.vids.p_bih->biPlanes,                     p_chk->strf.vids.p_bih->biBitCount );#endif            break;        default:            msg_Warn( (vlc_object_t*)s, "unknown stream type" );            p_chk->strf.common.i_cat = UNKNOWN_ES;            break;    }    AVI_READCHUNK_EXIT( VLC_SUCCESS );}static void AVI_ChunkFree_strf( avi_chunk_t *p_chk ){    avi_chunk_strf_t *p_strf = (avi_chunk_strf_t*)p_chk;    if( p_strf->common.i_cat == AUDIO_ES )    {        FREENULL( p_strf->auds.p_wf );    }    else if( p_strf->common.i_cat == VIDEO_ES )    {        FREENULL( p_strf->vids.p_bih );    }}static int AVI_ChunkRead_strd( stream_t *s, avi_chunk_t *p_chk ){    AVI_READCHUNK_ENTER;    p_chk->strd.p_data = malloc( p_chk->common.i_chunk_size );    memcpy( p_chk->strd.p_data, p_buff + 8, p_chk->common.i_chunk_size );    AVI_READCHUNK_EXIT( VLC_SUCCESS );}static void AVI_ChunkFree_strd( avi_chunk_t *p_chk ){    free( p_chk->strd.p_data );}static int AVI_ChunkRead_idx1( stream_t *s, avi_chunk_t *p_chk ){    unsigned int i_count, i_index;    AVI_READCHUNK_ENTER;    i_count = __MIN( (int64_t)p_chk->common.i_chunk_size, i_read ) / 16;    p_chk->idx1.i_entry_count = i_count;    p_chk->idx1.i_entry_max   = i_count;    if( i_count > 0 )    {        p_chk->idx1.entry = calloc( i_count, sizeof( idx1_entry_t ) );        for( i_index = 0; i_index < i_count ; i_index++ )        {            AVI_READFOURCC( p_chk->idx1.entry[i_index].i_fourcc );            AVI_READ4BYTES( p_chk->idx1.entry[i_index].i_flags );            AVI_READ4BYTES( p_chk->idx1.entry[i_index].i_pos );            AVI_READ4BYTES( p_chk->idx1.entry[i_index].i_length );        }    }    else    {        p_chk->idx1.entry = NULL;    }#ifdef AVI_DEBUG    msg_Dbg( (vlc_object_t*)s, "idx1: index entry:%d", i_count );#endif    AVI_READCHUNK_EXIT( VLC_SUCCESS );}static void AVI_ChunkFree_idx1( avi_chunk_t *p_chk ){    p_chk->idx1.i_entry_count = 0;    p_chk->idx1.i_entry_max   = 0;    FREENULL( p_chk->idx1.entry );}static int AVI_ChunkRead_indx( stream_t *s, avi_chunk_t *p_chk ){    unsigned int i_count, i;    int32_t      i_dummy;    avi_chunk_indx_t *p_indx = (avi_chunk_indx_t*)p_chk;    AVI_READCHUNK_ENTER;    AVI_READ2BYTES( p_indx->i_longsperentry );    AVI_READ1BYTE ( p_indx->i_indexsubtype );    AVI_READ1BYTE ( p_indx->i_indextype );    AVI_READ4BYTES( p_indx->i_entriesinuse );    AVI_READ4BYTES( p_indx->i_id );    p_indx->idx.std     = NULL;    p_indx->idx.field   = NULL;    p_indx->idx.super   = NULL;    if( p_indx->i_indextype == AVI_INDEX_OF_CHUNKS && p_indx->i_indexsubtype == 0 )    {        AVI_READ8BYTES( p_indx->i_baseoffset );        AVI_READ4BYTES( i_dummy );        i_count = __MIN( p_indx->i_entriesinuse, i_read / 8 );        p_indx->i_entriesinuse = i_count;        p_indx->idx.std = calloc( sizeof( indx_std_entry_t ), i_count );        for( i = 0; i < i_count; i++ )        {            AVI_READ4BYTES( p_indx->idx.std[i].i_offset );            AVI_READ4BYTES( p_indx->idx.std[i].i_size );        }    }    else if( p_indx->i_indextype == AVI_INDEX_OF_CHUNKS && p_indx->i_indexsubtype == AVI_INDEX_2FIELD )    {        AVI_READ8BYTES( p_indx->i_baseoffset );        AVI_READ4BYTES( i_dummy );        i_count = __MIN( p_indx->i_entriesinuse, i_read / 12 );        p_indx->i_entriesinuse = i_count;        p_indx->idx.field = calloc( sizeof( indx_field_entry_t ), i_count );        for( i = 0; i < i_count; i++ )        {            AVI_READ4BYTES( p_indx->idx.field[i].i_offset );            AVI_READ4BYTES( p_indx->idx.field[i].i_size );            AVI_READ4BYTES( p_indx->idx.field[i].i_offsetfield2 );        }    }    else if( p_indx->i_indextype == AVI_INDEX_OF_INDEXES )    {        p_indx->i_baseoffset = 0;        AVI_READ4BYTES( i_dummy );        AVI_READ4BYTES( i_dummy );        AVI_READ4BYTES( i_dummy );        i_count = __MIN( p_indx->i_entriesinuse, i_read / 16 );        p_indx->i_entriesinuse = i_count;        p_indx->idx.super = calloc( sizeof( indx_super_entry_t ), i_count );        for( i = 0; i < i_count; i++ )        {            AVI_READ8BYTES( p_indx->idx.super[i].i_offset );            AVI_READ4BYTES( p_indx->idx.super[i].i_size );            AVI_READ4BYTES( p_indx->idx.super[i].i_duration );        }    }    else    {        msg_Warn( (vlc_object_t*)s, "unknow type/subtype index" );    }#ifdef AVI_DEBUG    msg_Dbg( (vlc_object_t*)s, "indx: type=%d subtype=%d entry=%d", p_indx->i_indextype, p_indx->i_indexsubtype, p_indx->i_entriesinuse );#endif    AVI_READCHUNK_EXIT( VLC_SUCCESS );}static void AVI_ChunkFree_indx( avi_chunk_t *p_chk ){    avi_chunk_indx_t *p_indx = (avi_chunk_indx_t*)p_chk;    FREENULL( p_indx->idx.std );    FREENULL( p_indx->idx.field );    FREENULL( p_indx->idx.super );}static const struct{    vlc_fourcc_t i_fourcc;    const char *psz_type;} AVI_strz_type[] ={    { AVIFOURCC_IARL, "archive location" },    { AVIFOURCC_IART, "artist" },    { AVIFOURCC_ICMS, "commisioned" },    { AVIFOURCC_ICMT, "comments" },    { AVIFOURCC_ICOP, "copyright" },    { AVIFOURCC_ICRD, "creation date" },    { AVIFOURCC_ICRP, "cropped" },    { AVIFOURCC_IDIM, "dimensions" },    { AVIFOURCC_IDPI, "dots per inch" },    { AVIFOURCC_IENG, "engineer" },    { AVIFOURCC_IGNR, "genre" },    { AVIFOURCC_IKEY, "keywords" },    { AVIFOURCC_ILGT, "lightness" },    { AVIFOURCC_IMED, "medium" },    { AVIFOURCC_INAM, "name" },    { AVIFOURCC_IPLT, "palette setting" },    { AVIFOURCC_IPRD, "product" },    { AVIFOURCC_ISBJ, "subject" },    { AVIFOURCC_ISFT, "software" },    { AVIFOURCC_ISHP, "sharpness" },    { AVIFOURCC_ISRC, "source" },    { AVIFOURCC_ISRF, "source form" },    { AVIFOURCC_ITCH, "technician" },    { AVIFOURCC_ISMP, "time code" },    { AVIFOURCC_IDIT, "digitalization time" },    { AVIFOURCC_strn, "stream name" },    { 0,              "???" }};static int AVI_ChunkRead_strz( stream_t *s, avi_chunk_t *p_chk ){    int i_index;    avi_chunk_STRING_t *p_strz = (avi_chunk_STRING_t*)p_chk;    AVI_READCHUNK_ENTER;    for( i_index = 0;; i_index++)    {        if( !AVI_strz_type[i_index].i_fourcc ||            AVI_strz_type[i_index].i_fourcc == p_strz->i_chunk_fourcc )        {            break;        }    }    p_strz->p_type = strdup( AVI_strz_type[i_index].psz_type );    p_strz->p_str = malloc( i_read + 1);    if( p_strz->i_chunk_size )    {        memcpy( p_strz->p_str, p_read, i_read );    }    p_strz->p_str[i_read] = 0;#ifdef AVI_DEBUG    msg_Dbg( (vlc_object_t*)s, "%4.4s: %s : %s",

⌨️ 快捷键说明

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