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

📄 ps.h

📁 video linux conference
💻 H
📖 第 1 页 / 共 2 页
字号:
    switch( header[3] )    {        case 0xBC:  /* Program stream map */        case 0xBE:  /* Padding */        case 0xBF:  /* Private stream 2 */        case 0xB0:  /* ECM */        case 0xB1:  /* EMM */        case 0xFF:  /* Program stream directory */        case 0xF2:  /* DSMCC stream */        case 0xF8:  /* ITU-T H.222.1 type E stream */            i_skip = 6;            break;        default:            if( ( header[6]&0xC0 ) == 0x80 )            {                /* mpeg2 PES */                i_skip = header[8] + 9;                if( header[7]&0x80 )    /* has pts */                {                    p_pes->i_pts = ((mtime_t)(header[ 9]&0x0e ) << 29)|                                    (mtime_t)(header[10] << 22)|                                   ((mtime_t)(header[11]&0xfe) << 14)|                                    (mtime_t)(header[12] << 7)|                                    (mtime_t)(header[13] >> 1);                    if( header[7]&0x40 )    /* has dts */                    {                         p_pes->i_dts = ((mtime_t)(header[14]&0x0e ) << 29)|                                         (mtime_t)(header[15] << 22)|                                        ((mtime_t)(header[16]&0xfe) << 14)|                                         (mtime_t)(header[17] << 7)|                                         (mtime_t)(header[18] >> 1);                    }                }            }            else            {                i_skip = 6;                while( i_skip < 23 && header[i_skip] == 0xff )                {                    i_skip++;                }                if( i_skip == 23 )                {                    /* msg_Err( p_demux, "too much MPEG-1 stuffing" ); */                    return VLC_EGENERIC;                }                if( ( header[i_skip] & 0xC0 ) == 0x40 )                {                    i_skip += 2;                }                if(  header[i_skip]&0x20 )                {                     p_pes->i_pts = ((mtime_t)(header[i_skip]&0x0e ) << 29)|                                     (mtime_t)(header[i_skip+1] << 22)|                                    ((mtime_t)(header[i_skip+2]&0xfe) << 14)|                                     (mtime_t)(header[i_skip+3] << 7)|                                     (mtime_t)(header[i_skip+4] >> 1);                    if( header[i_skip]&0x10 )    /* has dts */                    {                         p_pes->i_dts = ((mtime_t)(header[i_skip+5]&0x0e ) << 29)|                                         (mtime_t)(header[i_skip+6] << 22)|                                        ((mtime_t)(header[i_skip+7]&0xfe) << 14)|                                         (mtime_t)(header[i_skip+8] << 7)|                                         (mtime_t)(header[i_skip+9] >> 1);                         i_skip += 10;                    }                    else                    {                        i_skip += 5;                    }                }                else                {                    i_skip += 1;                }            }    }    i_skip += i_skip_extra;    if( p_pes->i_buffer <= i_skip )    {        return VLC_EGENERIC;    }    p_pes->p_buffer += i_skip;    p_pes->i_buffer -= i_skip;    p_pes->i_dts = 100 * p_pes->i_dts / 9;    p_pes->i_pts = 100 * p_pes->i_pts / 9;    return VLC_SUCCESS;}/* Program stream map handling */typedef struct ps_es_t{    int i_type;    int i_id;    int i_descriptor;    uint8_t *p_descriptor;    /* Language is iso639-2T */    uint8_t lang[3];} ps_es_t;struct ps_psm_t{    int i_version;    int     i_es;    ps_es_t **es;};static inline int ps_id_to_type( ps_psm_t *p_psm, int i_id ){    int i;    for( i = 0; p_psm && i < p_psm->i_es; i++ )    {        if( p_psm->es[i]->i_id == i_id ) return p_psm->es[i]->i_type;         }    return 0;}static inline char *ps_id_to_lang( ps_psm_t *p_psm, int i_id ){    int i;    for( i = 0; p_psm && i < p_psm->i_es; i++ )    {        if( p_psm->es[i]->i_id == i_id ) return p_psm->es[i]->lang;         }    return 0;}static inline void ps_psm_init( ps_psm_t *p_psm ){    p_psm->i_version = 0xFFFF;    p_psm->i_es = 0;    p_psm->es = 0;}static inline void ps_psm_destroy( ps_psm_t *p_psm ){    while( p_psm->i_es-- )    {        if( p_psm->es[p_psm->i_es]->i_descriptor )            free( p_psm->es[p_psm->i_es]->p_descriptor );        free( p_psm->es[p_psm->i_es] );    }    if( p_psm->es ) free( p_psm->es );    p_psm->es = 0;    p_psm->i_es = 0;}static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,                               ps_track_t tk[PS_TK_COUNT], es_out_t *out ){    int i_buffer = p_pkt->i_buffer;    uint8_t *p_buffer = p_pkt->p_buffer;    int i_length, i_version, i_info_length, i_esm_length, i_es_base, i;    if( !p_psm || p_buffer[3] != 0xbc ) return VLC_EGENERIC;    i_length = (uint16_t)(p_buffer[4] << 8) + p_buffer[5] + 6;    if( i_length > i_buffer ) return VLC_EGENERIC;    //i_current_next_indicator = (p_buffer[6] && 0x01);    i_version = (p_buffer[6] && 0xf8);    if( p_psm->i_version == i_version ) return VLC_EGENERIC;    ps_psm_destroy( p_psm );    i_info_length = (uint16_t)(p_buffer[8] << 8) + p_buffer[9];    if( i_info_length + 10 > i_length ) return VLC_EGENERIC;    /* Elementary stream map */    i_esm_length = (uint16_t)(p_buffer[ 10 + i_info_length ] << 8) +        p_buffer[ 11 + i_info_length];    i_es_base = 12 + i_info_length;    while( i_es_base + 4 < i_length )    {        ps_es_t es;        es.lang[0] = es.lang[1] = es.lang[2] = 0;        es.i_type = p_buffer[ i_es_base  ];        es.i_id = p_buffer[ i_es_base + 1 ];        i_info_length = (uint16_t)(p_buffer[ i_es_base + 2 ] << 8) +            p_buffer[ i_es_base + 3 ];        if( i_es_base + 4 + i_info_length > i_length ) break;        es.p_descriptor = 0;        es.i_descriptor = i_info_length;        if( i_info_length > 0 )        {            int i = 0;            es.p_descriptor = malloc( i_info_length );            memcpy( es.p_descriptor, p_buffer + i_es_base + 4, i_info_length);            while( i <= es.i_descriptor - 2 )            {                /* Look for the ISO639 language descriptor */                if( es.p_descriptor[i] != 0x0a )                {                    i += es.p_descriptor[i+1] + 2;                    continue;                }                if( i <= es.i_descriptor - 6 )                {                    es.lang[0] = es.p_descriptor[i+2];                    es.lang[1] = es.p_descriptor[i+3];                    es.lang[2] = es.p_descriptor[i+4];                }                break;            }        }        p_psm->es = realloc( p_psm->es, sizeof(ps_es_t *) * (p_psm->i_es+1) );        p_psm->es[p_psm->i_es] = malloc( sizeof(ps_es_t) );        *p_psm->es[p_psm->i_es++] = es;        i_es_base += 4 + i_info_length;     }    /* TODO: CRC */    p_psm->i_version = i_version;    /* Check/Modify our existing tracks */    for( i = 0; i < PS_TK_COUNT; i++ )    {        ps_track_t tk_tmp;        if( !tk[i].b_seen || !tk[i].es ) continue;        if( ps_track_fill( &tk_tmp, p_psm, tk[i].i_id ) != VLC_SUCCESS )            continue;        if( tk_tmp.fmt.i_codec == tk[i].fmt.i_codec ) continue;        es_out_Del( out, tk[i].es );        tk[i] = tk_tmp;        tk[i].b_seen = VLC_TRUE;        tk[i].es = es_out_Add( out, &tk[i].fmt );    }    return VLC_SUCCESS;}

⌨️ 快捷键说明

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