• ps文件解析(纯c解析代码)


    参考链接:1. PS流的格式和解析总结 http://www.cnblogs.com/lihaiping/p/4181607.html
         2. TS科普5 PES包解析 https://blog.csdn.net/cabbage2008/article/details/49612011

    PES包的解析(本代码主要解析了PTS和DTS, 需结合下图和代码中的PES包的伪代码看):

    startcode(24) + streamid(8) + pes_len(16) + {header: flag1(8) + flag2(8, pts标识在这儿) + header_len(8)} + {header_data(header_len, 若前面的flag有数据, 数据就在这儿)} + pes_data(pes_len-3-header_len)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <arpa/inet.h>
      5 
      6 #define TAB44 "    "
      7 #define PRINTF_DEBUG
      8 
      9 #define MAX_PS_STARTCODE_LEN 4
     10 #define MAX_PDTS_LEN 5
     11 #define MAX_ES_NUMS 6
     12 #define MAX_PDTS_STRING_LEN 12
     13 #define MMIN_PS_HEADER_LEN 14
     14 
     15 
     16 #define SCODE_PS_END 0x000001B9
     17 #define SCODE_PS_HEADER 0x000001BA
     18 #define SCODE_PS_SYSTEM_HEADER 0x000001BB
     19 #define SCODE_PS_SYSTEM_MAP_HEADER 0x000001BC
     20 
     21 /**********************************************************************************************************
     22 pack_header() {
     23     pack_start_code                                        32 bits
     24     '01'                                                2 bits
     25     system_clock_reference_base[32..30]                    3 bits
     26     marker_bit                                            1 bit
     27     system_clock_reference_base[29..15]                    15 bits
     28     marker_bit                                            1 bit
     29     system_clock_reference_base[14..0]                    15 bits
     30     marker_bit                                            1 bit
     31     system_clock_reference_extension                    9 bits
     32     marker_bit                                            1 bit
     33     program_mux_rate                                    22 bits
     34     marker_bit                                            1 bit
     35     marker_bit                                            1 bit
     36     reserved                                            5 bit
     37     pack_stuffing_length                                3 bits
     38 
     39     for (i=0; i<pack_stuffing_length; i++){
     40         stuffing_byte                                    8 bits
     41     }
     42 
     43     if (nextbits() == system_header_start_code) {
     44         system_header()
     45     }
     46 }
     47 **********************************************************************************************************/
     48 
     49 
     50 /**********************************************************************************************************
     51 system_header() {
     52     system_header_start_code                            32 bits
     53     header_length                                        16 bits
     54     marker_bit                                            1 bit
     55     rate_bound                                            22 bits
     56     marker_bit                                            1 bit
     57     audio_bound                                            6 bits
     58     fixed_flag                                            1 bit
     59     CSPS_flag                                            1 bit
     60     system_audio_lock_flag                                1 bit
     61     system_video_lock_flag                                1 bit
     62     marker_bit                                            1 bit
     63     vedio_bound                                            5 bits
     64     packet_rate_restriction_flag                        1 bit
     65     reserved_bits                                        7 bits
     66 
     67     while (nextbits() == '1') {
     68         stream_id                                        8 bits
     69         '11'                                            2 bits
     70         P-STD_buffer_bound_scale                        1 bit
     71         P-STD_buffer_size_bound                            13 bits
     72     }
     73 }
     74 **********************************************************************************************************/
     75 
     76 
     77 /**********************************************************************************************************
     78 program_stream_map() {
     79     packet_start_code_prefix             24 bits
     80     map_stream_id                        8 bits
     81     program_stream_map_length            16 bits
     82     current_next_indicator                1 bit
     83     reserved                            2 bits
     84     program_stream_map_version            5 bits
     85     reserved                            7 bits
     86     marker_bit                            1 bit
     87     program_stream_info_length            16 bits
     88 
     89     for (i=0;i<N;i++) {
     90         descriptor()
     91     }
     92 
     93     elementary_stream_map_length        16 bits
     94 
     95     for (i=0;i<N1;i++) {
     96        stream_type                        8 bits
     97        elementary_stream_id                8 bits
     98 
     99        elementary_stream_info_length    16 bits
    100 
    101        for (i=0;i<N2;i++) {
    102            descriptor()
    103        }
    104     }
    105 
    106     CRC_32                                32 bits
    107 }
    108 
    109 ** current_next_indicator: 当前下一个指示符字段, 1位字段. 置'1'时表示传送的节目流映射当前是可用的.
    110         置'0'时表示传送的节目流映射还不可用, 但它将是下一个生效的表.
    111 ** program_stream_map_version: 5位字段, 表示整个节目流映射的版本号. 一旦节目流映射的定义发生变化,
    112         该字段将递增1, 并对32取模. 在current_next_indicator为'1'时, 该字段应该是当前适用的节目流映射的版本号;
    113         在current_next_indicator为'0'时, 该字段应该是下一个适用的节目流映射的版本号.
    114 ** stream_type: 流类型字段, 该字段只能标志包含在PES分组中的基本流且取值不能为0x05.
    115                 1. MPEG-4视频流: 0x10;
    116                 2. H.264视频流: 0x1B;
    117                 3. SVAC视频流: 0x80;
    118                 4. G.711音频流: 0x90;
    119                 5. G.722.1音频流: 0x92;
    120                 6. G.723.1音频流: 0x93;
    121                 7. G.729音频流: 0x99;
    122                 8. SVAC音频流: 0x9B.
    123         因为节目映射流字段只有在关键帧打包的时候, 才会存在, 所以如果要判断PS打包的流编码类型, 就根据这个字段来判断.
    124 ** elementary_stream_map_length: 基本流映射长度字段. 指出在该节目流映射中的所有基本流信息的字节长度.
    125         它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段.
    126 ** elementary_stream_id: 基本流标识字段, 8位字段, 指出该基本流所在PES分组的PES分组标题中stream_id字段的值.
    127         这个字段的定义, 其中0x(C0~DF)指音频, 0x(E0~EF)为视频.
    128 **********************************************************************************************************/
    129 typedef struct t_es_map
    130 {
    131     unsigned char streamType;
    132     unsigned char esId;
    133     unsigned short esInfoLen;
    134 } T_ES_MAP;
    135 
    136 typedef struct t_ps_map 
    137 {
    138     unsigned char curNextInd:1, :2, version:5;
    139     
    140     unsigned short psInfoLen;
    141     unsigned short esStreamMapLen;
    142     
    143     unsigned int esMapNum;
    144     
    145     T_ES_MAP esMaps[MAX_ES_NUMS];
    146 } T_PS_MAP;
    147 
    148 /**********************************************************************************************************
    149 PES_packet() {
    150     packet_start_code_prefix                                24 bits
    151     stream_id                                                8 bits
    152     PES_packet_length                                        16 bits
    153 
    154     if (stream_id != program_stream_map 
    155         && stream_id != padding_stream
    156         && stream_id != private_stream_2
    157         && stream_id != ECM
    158         && stream_id != EMM
    159         && stream_id != program_stream_directory
    160         && stream_id !=    DSMCC_stream
    161         && stream_id != ITU-T Rec.H.222.1 type E stream) {
    162             '10'                                            2 bits
    163             PES_scrambling_control                            2 bits
    164             PES_priority                                    1 bit
    165             data_alignment_indicator                        1 bit
    166             copyright                                        1 bit
    167             original_or_copy                                1 bit
    168             
    169             PTS_DTS_flags                                    2 bits
    170             ESCR_flag                                        1 bit
    171             ES_rate_flag                                    1 bit
    172             DSM_trick_mode_flag                                1 bit
    173             additional_copy_info_flag                        1 bit
    174             PES_CRC_flag                                    1 bit
    175             PES_extension_flag                                1 bit
    176             
    177             PES_header_data_length                            8 bits
    178 
    179             if (PTS_DTS_flags == '10') {
    180                 '0010'                                        4 bits
    181                 PTS[32..30]                                    3 bits
    182                 marker_bit                                    1 bit
    183                 PTS[29..15]                                    15 bits
    184                 marker_bit                                    1 bit
    185                 PTS[14..0]                                    15 bits
    186                 marker_bit                                    1 bit
    187             }
    188             
    189             if (PTS_DTS_flags == '11') {
    190                 '0011'                                        4 bits
    191                 PTS[32..30]                                    3 bits
    192                 marker_bit                                    1 bit
    193                 PTS[29..15]                                    15 bits
    194                 marker_bit                                    1 bit
    195                 PTS[14..0]                                    15 bits
    196                 marker_bit                                    1 bit
    197                 '0001'                                        4 bits
    198                 PTS[32..30]                                    3 bits
    199                 marker_bit                                    1 bit
    200                 PTS[29..15]                                    15 bits
    201                 marker_bit                                    1 bits
    202                 PTS[14..0]                                    15 bits
    203                 marker_bit                                    1 bit
    204             }
    205 
    206             if (ESCR_flag == '1') {
    207                 reserved                                    2 bits
    208                 ESCR_base[32..30]                            3 bits
    209                 marker_bit                                    1 bit
    210                 ESCR_base[29..15]                            15 bits
    211                 marker_bit                                    1 bit
    212                 ESCR_base[14..0]                            15 bits
    213                 marker_bit                                    1 bit
    214                 ESCR_extension                                9 bits
    215                 marker_bit                                    1 bit
    216             }
    217 
    218             if (ES_rate_flag == '1') {
    219                 marker_bit                                    1 bit
    220                 ES_rate                                        22 bits
    221                 marker_bit                                    1 bit
    222             }
    223 
    224             if (DSM_trick_mode_flag == '1') {
    225                 trick_mode_control                            3 bits
    226 
    227                 if (trick_mode_control == fast_forward) {
    228                     field_id                                2 bits
    229                     intra_slice_refresh                        1 bits
    230                     frequency_truncation                    2 bits
    231                 } else if (trick_mode_control == slow_motion) {
    232                     rep_cntrl                                5 bits
    233                 } else if (trick_mode _control == freeze_frame) {
    234                     field_id                                2 bits
    235                     reserved                                3 bits
    236                 } else if (trick_mode _control == fast_reverse) {
    237                     field_id                                2 bits
    238                     intra_slice_refresh                        1 bit
    239                     frequency_truncation                    2 bits
    240                 } else if (trick_mode_control == slow_reverse) {
    241                     rep_cntrl                                5 bits
    242                 } else {
    243                     reserved                                5 bits
    244                 }
    245             }
    246 
    247             if (additional_copy_info_flag =='1') {
    248                 marker_bit                                    1 bit
    249                 additional_copy_info                        7 bits
    250             }
    251 
    252             if (PES_CRC_flag == ‘1’) {
    253                 previous_PES_packet_CRC                        16 bits
    254             }
    255 
    256             if (PES_extension_flag == '1') {
    257                 PES_private_data_flag                        1 bit
    258                 pack_header_field_flag                        1 bit
    259                 program_packet_sequence_counter_flag        1 bit
    260                 P-STD_buffer_flag                            1 bit
    261                 reserved                                    3 bits
    262                 PES_extension_flag_2                        1 bit
    263 
    264                 if (PES_private_data_flag == '1') {
    265                     PES_private_data                        128 bits
    266                 }
    267 
    268                 if (pack_header_field_flag == '1') {
    269                     pack_field_length                        8 bits
    270                     pack_header()
    271                 }
    272 
    273                 if (program_packet_sequence_counter_flag == '1') {
    274                     marker_bit                                1 bit
    275                     program_packet_sequence_counter            7 bits
    276                     marker-bit                                1 bit
    277                     MPEG1_MPEG2_indentifier                    1 bit
    278                     original_stuff_length                    6 bits
    279                 }
    280 
    281                 if (P-STD_buffer_flag == '1') {
    282                     '01'                                    2 bits
    283                     P-STD_buffer_scale                        1 bit
    284                     P-STD_buffer_size                        13 bits
    285                 }
    286 
    287                 if (PES_extension_flag_2 == '1') {
    288                     marker_bit                                1 bit
    289                     PES_extension_field_length                7 bits
    290 
    291                     for (i=0; i<PES_extension_field_length; i++) {
    292                         reserved                            8 bits
    293                     }
    294                 }
    295             }
    296 
    297             for (i=0; i<N1; i++) {
    298                 stuffing_byte                                    8 bits
    299             }
    300             
    301             for (i=0; i<N2; i++) {
    302                 PES_packet_data_byte                            8 bits
    303             }
    304     } else if (stream_id == program_stream_map
    305                 || stream_id == private_stream_2
    306                 || stream_id == ECM
    307                 || stream_id == EMM
    308                 || stream_id == program_stream_directory
    309                 || stream_id == DSMCC_stream
    310                 || stream_id == ITU-T Rec. H.222.1 type E stream ) {
    311                     for (i=0; i<PES_packet_length; i++) {
    312                         PES_packet_data_byte                    8 bits
    313                     }
    314     } else if (steam_id == padding_stream) {
    315         for (i=0; i<PES_packet_length; i++) {
    316             padding_byte                                        8 bits
    317         }
    318     }
    319 }
    320 
    321 ** stream_id:
    322         1011 1100        program_stream_map(0xBC)
    323         1011 1101        private_stream_1(0xBD)
    324         1011 1110        padding_stream(0xBE)
    325         1011 1111        private_stream-2(0xBF)
    326         110x xxxx        GB/T XXXX.3或GB/T AAAA.3音频流编号xxxx(0xC0~0xDF)
    327         1110 xxxx        GB/T XXXX.2或GB/T AAAA.2视频流编号xxxx(0xE0~0xEF)
    328         1111 0000        ECM_stream(0xF0)
    329         1111 0001        EMM_stream(0xF1)
    330         1111 0010        GB/T XXXX.1附录B或GB/T XXXX.6_DSMCC_stream(0xF2)
    331         1111 0011        ISO/IEC_13522_stream(0xF3)
    332         1111 0100        ITU-T Rec. H.222.1类型A
    333         1111 0101        ITU-T Rec. H.222.1类型B
    334         1111 0110        ITU-T Rec. H.222.1类型C
    335         1111 0111        ITU-T Rec. H.222.1类型D
    336         1111 1000        ITU-T Rec. H.222.1类型E
    337         1111 1001        ancillary_stream(0xF9)
    338         1111 1010…1111 1110        保留数据流
    339         1111 1111        program_stream_directory(0xFF)
    340         符号x表示值'0'或'1'均被允许且可产生相同的流类型. 流号码由x的取值决定.
    341 **********************************************************************************************************/
    342 typedef struct t_ps_pes
    343 {
    344     unsigned char streamId;
    345     
    346     long long pts;
    347     long long dts;
    348     
    349     unsigned char ptsStr[MAX_PDTS_STRING_LEN+1];
    350     unsigned char dtsStr[MAX_PDTS_STRING_LEN+1];
    351     
    352     unsigned char pesHeaderLen;
    353 } T_PS_PES;
    354 
    355 static void parsePsHeader(unsigned char* const psHeaderData)
    356 {
    357     
    358 }
    359 
    360 static void parsePsSystemHeader(unsigned char* const psSysHeaderData)
    361 {
    362 
    363 }
    364 
    365 static void parsePsSystemMapHeader(unsigned char* const psMapHeaderData)
    366 {
    367     int i = 0;
    368     
    369     T_PS_MAP psMap = {0};
    370     
    371     unsigned char *data = NULL;
    372     
    373     data = psMapHeaderData;
    374     
    375     memset(&psMap, 0, sizeof(psMap));
    376     
    377     psMap.curNextInd = (data[0]>>7) & 0x1;
    378     psMap.version = data[0] & 0x1f;
    379     
    380     data += 2;
    381     
    382     psMap.psInfoLen = (data[0] << 8) | data[1];
    383     
    384     data += psMap.psInfoLen;
    385     
    386     psMap.esStreamMapLen = (data[0] << 8) | data[1];
    387     
    388     psMap.esMapNum = psMap.esStreamMapLen / 4;
    389     
    390     for (i=0; i<psMap.esMapNum; i++)
    391     {
    392         if (i == MAX_ES_NUMS)
    393         {
    394             printf("now just save %d es info!
    ", MAX_ES_NUMS);
    395             
    396             break;
    397         }
    398         
    399         psMap.esMaps[i].streamType = data[0];
    400         psMap.esMaps[i].esId = data[1];
    401         psMap.esMaps[i].esInfoLen = (data[2] << 8) | data[3];
    402         
    403         data += (4+psMap.esMaps[i].esInfoLen);
    404     }
    405     
    406 #ifdef PRINTF_DEBUG
    407     int mNUm = 0;
    408     
    409     if (psMap.esMapNum > MAX_ES_NUMS)
    410     {
    411         mNUm = MAX_ES_NUMS;
    412     }
    413     
    414     for (i=0; i<mNUm; i++)
    415     {
    416         printf("%s%sstreamNum: %d, streamType: %d, esId: %d
    ",  TAB44, TAB44, i, psMap.esMaps[i].streamType, psMap.esMaps[i].esId);
    417     }
    418 #endif
    419 }
    420 
    421 static void getPdts(unsigned char *pdtsData, long long *pdts, unsigned char *pdtsString)
    422 {
    423     int hour = 0;
    424     int minute = 0;
    425     int second = 0;
    426     int msecond = 0;
    427     
    428     long long pts = 0;
    429     long long pts2Ms = 0;
    430 
    431     unsigned char ptsStr[MAX_PDTS_STRING_LEN+1] = {0};
    432     
    433     /* 5个字节转33位的值 */
    434     pts = (((pdtsData[0]>>1) & 0x7) << 30) | (pdtsData[1] << 22) | (((pdtsData[2]>>1) & 0x7f) << 15) | (pdtsData[3] << 7) | (pdtsData[4]>>1 & 0x7f);
    435     
    436     /* 90KHz, 1000ms/90 */
    437     pts2Ms = pts/90;
    438     
    439     hour = pts2Ms/(60*60*1000);
    440     minute = (pts2Ms - hour * (60*60*1000)) / (60*1000);
    441     second = (pts2Ms - hour * (60*60*1000) - minute * (60*1000)) / 1000;
    442     msecond = pts2Ms - hour * (60*60*1000) - minute * (60*1000) - second * 1000;
    443     
    444     sprintf(ptsStr, "%02d:%02d:%02d:%03d", hour, minute, second, msecond);
    445     
    446     ptsStr[MAX_PDTS_STRING_LEN] = '';
    447     
    448     memcpy(pdtsString, ptsStr, MAX_PDTS_STRING_LEN);
    449     
    450     *pdts = pts;
    451 }
    452 
    453 /*********************************************************************************
    454     startcode(24) + streamid(8) + pes_len(16) + {header: flag1(8) + flag2(8, pts标识在这儿) + header_len(8)} + {header_data(header_len, 若前面的flag有数据, 数据就在这儿)} + pes_data(pes_len-3-header_len)
    455 **********************************************************************************/
    456 static void parsePes(const unsigned char streamId, unsigned char* const pesData, const unsigned short pesLen)
    457 {
    458     unsigned char pts_dts_flag;
    459     
    460     static int audioNum = 0;
    461     static int videoNum = 0;
    462     static int privateNum = 0;
    463     static int paddingNum = 0;
    464     
    465     unsigned char *data = NULL;
    466     
    467     unsigned char pts[MAX_PDTS_LEN+1] = {0};
    468     unsigned char dts[MAX_PDTS_LEN+1] = {0};
    469 
    470     T_PS_PES psPes = {0};
    471     
    472     data = pesData;
    473     
    474     memset(&psPes, 0x0, sizeof(psPes));
    475     
    476     psPes.streamId = streamId;
    477     
    478     if (((streamId>=0xC0) && (streamId<=0xDF)) || ((streamId>=0xE0) && (streamId<=0xEF)))
    479     {
    480         pts_dts_flag = data[1]>>6 & 0x3;
    481 
    482         psPes.pesHeaderLen = data[2];
    483         
    484         data += 3;
    485         
    486         switch (pts_dts_flag)
    487         {
    488             case 0: /* 00, no pts, dts */
    489                 break;
    490             
    491             case 2: /* 10, only pts*/
    492                 memset(pts, 0x0, sizeof(pts));
    493 
    494                 memcpy(pts, data, MAX_PDTS_LEN);
    495                 
    496                 getPdts(pts, &psPes.pts, psPes.ptsStr);
    497                 
    498                 break;
    499                 
    500             case 3: /* 11 pts & dts*/
    501                 memset(pts, 0x0, sizeof(pts));
    502                 memset(dts, 0x0, sizeof(dts));
    503 
    504                 memcpy(pts, data, MAX_PDTS_LEN);
    505                 memcpy(dts, data+MAX_PDTS_LEN, MAX_PDTS_LEN);
    506                 
    507                 getPdts(pts, &psPes.pts, psPes.ptsStr);
    508                 getPdts(dts, &psPes.dts, psPes.dtsStr);
    509 
    510                 break;
    511                 
    512             default:
    513                 break;    
    514         }
    515     }
    516     
    517     
    518 #ifdef PRINTF_DEBUG
    519     if ((streamId>=0xC0) && (streamId<=0xDF))
    520     {
    521         audioNum++;
    522         
    523         printf("%s%spes, Audio[%d], streamId: 0x%02X(%d), pesLength: %d, pesHeaderLen: %d", TAB44, TAB44, audioNum, streamId, streamId, pesLen, psPes.pesHeaderLen);
    524         
    525         if (2 == pts_dts_flag)
    526         {
    527             printf(", pts: %s(%lld)", psPes.ptsStr, psPes.pts);
    528         }
    529 
    530         if (3 == pts_dts_flag)
    531         {
    532             printf(", pts: %s(%lld), dts: %s(%lld)", psPes.ptsStr, psPes.pts, psPes.dtsStr, psPes.dts);
    533         }
    534 
    535         printf("
    ");
    536     }
    537     else if ((streamId>=0xE0) && (streamId<=0xEF))
    538     {
    539         videoNum++;
    540 
    541         printf("%s%spes, Video[%d], streamId: 0x%02X(%d), pesLength: %d, pesHeaderLen: %d", TAB44, TAB44, videoNum, streamId, streamId, pesLen, psPes.pesHeaderLen);
    542 
    543         if (2 == pts_dts_flag)
    544         {
    545             printf(", pts: %s(%lld)", psPes.ptsStr, psPes.pts);
    546         }
    547         
    548         if (3 == pts_dts_flag)
    549         {
    550             printf(", pts: %s(%lld), dts: %s(%lld)", psPes.ptsStr, psPes.pts, psPes.dtsStr, psPes.dts);
    551         }
    552         
    553         printf("
    ");
    554     }
    555     else if ((streamId==0xBD) || (streamId==0xBF))
    556     {
    557         privateNum++;
    558         
    559         printf("%s%spes, private[%d], streamId: 0x%02X(%d), pesLength: %d
    ", TAB44, TAB44, privateNum, streamId, streamId, pesLen);
    560     }
    561     else if (streamId==0xBE)
    562     {
    563         paddingNum++;
    564         
    565         printf("%s%spes, padding[%d], streamId: 0x%02X(%d), pesLength: %d
    ", TAB44, TAB44, privateNum, streamId, streamId, pesLen);
    566     }
    567     else
    568     {
    569         printf("%s%spes, streamId: 0x%02X(%d), pesLength: %d
    ", TAB44, TAB44, streamId, streamId, pesLen);
    570     }
    571 #endif
    572 }
    573 
    574 int main(int argc, char *argv[])
    575 {
    576     int readLen = 0;
    577     int pack_stuffing_length = 0;
    578     
    579     unsigned int startCode = 0;
    580     
    581     unsigned short pesPacketLen = 0;
    582     unsigned short psSystemHeaderLen = 0;
    583     unsigned short psSystemMapHeaderLen = 0;
    584     
    585     unsigned char pesStreamId = 0;
    586     
    587     unsigned char sCodeData[MAX_PS_STARTCODE_LEN+1] = {0};
    588     unsigned char psData[MMIN_PS_HEADER_LEN-3] = {0};
    589     
    590     unsigned char *pesData = NULL;
    591 
    592     FILE *fp = NULL;
    593 
    594     if (2 != argc)
    595     {
    596         printf("Usage: flvparse **.mpg
    ");
    597 
    598         return -1;
    599     }
    600 
    601     fp = fopen(argv[1], "rb");
    602     if (!fp)
    603     {
    604         printf("open file[%s] error!
    ", argv[1]);
    605 
    606         return -1;
    607     }
    608 
    609     while (1)
    610     {
    611         readLen = fread(&startCode, MAX_PS_STARTCODE_LEN, 1, fp);
    612         if (1 != readLen)
    613         {
    614             break;
    615         }
    616         
    617         startCode = ntohl(startCode);
    618 
    619 #ifdef PRINTF_DEBUG
    620         if (SCODE_PS_HEADER == startCode)
    621         {
    622             printf("+startCode: 0x%08X
    ", startCode);
    623         }
    624         else
    625         {
    626             printf("%s+startCode: 0x%08X
    ", TAB44, startCode);
    627         }
    628 #endif
    629 
    630         if ((0 != (startCode>>24 & 0xff)) && (0 != (startCode>>16 & 0xff)) && (1 != (startCode>>8 & 0xff)))
    631         {
    632             return -1;
    633         }
    634         
    635         switch (startCode)
    636         {
    637             case SCODE_PS_HEADER:
    638                 memset(psData, 0x0, sizeof(psData));
    639                 
    640                 readLen = fread(psData, 1, MMIN_PS_HEADER_LEN-4, fp);
    641                 if ((MMIN_PS_HEADER_LEN-4) != readLen)
    642                 {
    643                     fclose(fp);
    644                     
    645                     return 0;
    646                 }
    647                 
    648                 pack_stuffing_length = psData[MMIN_PS_HEADER_LEN-5] & 0x7;
    649 
    650                 fseek(fp, pack_stuffing_length, SEEK_CUR);
    651                 
    652                 break;
    653 
    654             case SCODE_PS_SYSTEM_HEADER:
    655                 if (1 != fread(&psSystemHeaderLen, 2, 1, fp))
    656                 {
    657                     fclose(fp);
    658 
    659                     return 0;
    660                 }
    661                 
    662                 psSystemHeaderLen = ntohs(psSystemHeaderLen);
    663 
    664                 fseek(fp, psSystemHeaderLen, SEEK_CUR);
    665 
    666                 break;
    667 
    668             case SCODE_PS_SYSTEM_MAP_HEADER:
    669                 if (1 != fread(&psSystemMapHeaderLen, 2, 1, fp))
    670                 {
    671                     fclose(fp);
    672 
    673                     return 0;
    674                 }
    675                 
    676                 psSystemMapHeaderLen = ntohs(psSystemMapHeaderLen);
    677 
    678                 pesData = (unsigned char*)malloc(psSystemMapHeaderLen);
    679                 if (pesData)
    680                 {
    681                     memset(pesData, 0x0, pesPacketLen);
    682                     
    683                     if (psSystemMapHeaderLen != fread(pesData, 1, psSystemMapHeaderLen, fp))
    684                     {
    685                         fclose(fp);
    686 
    687                         return 0;
    688                     }
    689                     
    690                     parsePsSystemMapHeader(pesData);
    691                     
    692                     free(pesData);
    693                     
    694                     pesData = NULL;
    695                 }
    696                 
    697                 break;
    698                 
    699             case SCODE_PS_END:
    700 #ifdef PRINTF_DEBUG
    701                 printf("ps is end!
    ");
    702 #endif
    703                 
    704                 return 0;
    705                 
    706                 break;
    707 
    708             /* pes pcaket */
    709             default:
    710                 pesStreamId = startCode & 0xff;
    711                 
    712                 if (1 != fread(&pesPacketLen, 2, 1, fp))
    713                 {
    714                     fclose(fp);
    715 
    716                     return 0;
    717                 }
    718                 
    719                 pesPacketLen = ntohs(pesPacketLen);
    720                 
    721                 pesData = (unsigned char*)malloc(pesPacketLen);
    722                 if (pesData)
    723                 {
    724                     memset(pesData, 0x0, pesPacketLen);
    725                     
    726                     if (pesPacketLen != fread(pesData, 1, pesPacketLen, fp))
    727                     {
    728                         fclose(fp);
    729 
    730                         return 0;
    731                     }
    732                     
    733                     parsePes(pesStreamId, pesData, pesPacketLen);
    734                     
    735                     free(pesData);
    736                     
    737                     pesData = NULL;
    738                 }
    739                 
    740                 break;
    741         }
    742     }
    743 
    744     fclose(fp);
    745     
    746     return 0;
    747 }
    View Code

       最后如果您觉得本篇对您有帮助,可以打赏下,谢谢!!!

  • 相关阅读:
    BZOJ3732: Network(Kruskal重构树)
    AtCoder Beginner Contest 103
    2018.7.21NOIP模拟赛?解题报告
    PE刷题记
    杜教筛入门
    浅谈积性函数的线性筛法
    BZOJ4916: 神犇和蒟蒻(杜教筛)
    BZOJ2818: Gcd(莫比乌斯反演)
    LD1-B(最短路径-SPFA)
    UVa 10837 A Research Problem 欧拉函数
  • 原文地址:https://www.cnblogs.com/leaffei/p/10487540.html
Copyright © 2020-2023  润新知