📄 ps.h
字号:
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 + -