📄 programstream.c
字号:
uint8_t pack_field_length = 0; uint8_t PES_extension_field_length = 0; unsigned int bytes_read = 0; uint8_t original_stuff_length; uint8_t P_STD_buffer_scale; uint16_t P_STD_buffer_size; uint16_t N; uint32_t pes_packet_offs; DPRINTF(2, "PES_packet()\n"); pes_packet_offs = offs-(bits_left/8); GETBITS(24 ,"packet_start_code_prefix"); stream_id = GETBITS(8, "stream_id"); PES_packet_length = GETBITS(16, "PES_packet_length"); DPRINTF(2, "stream_id: "); dprintf_stream_id(2, stream_id); DPRINTF(2, "PES_packet_length: %u\n", PES_packet_length); if((stream_id != MPEG2_PRIVATE_STREAM_2) && (stream_id != MPEG2_PADDING_STREAM)) { DPRINTF(1, "packet() stream: %02x\n", stream_id); GETBITS(2, "10"); PES_scrambling_control = GETBITS(2, "PES_scrambling_control"); PES_priority = GETBITS(1, "PES_priority"); data_alignment_indicator = GETBITS(1, "data_alignment_indicator"); copyright = GETBITS(1, "copyright"); original_or_copy = GETBITS(1, "original_or_copy"); PTS_DTS_flags = GETBITS(2, "PTS_DTS_flags"); ESCR_flag = GETBITS(1, "ESCR_flag"); ES_rate_flag = GETBITS(1, "ES_rate_flag"); DSM_trick_mode_flag = GETBITS(1, "DSM_trick_mode_flag"); additional_copy_info_flag = GETBITS(1, "additional_copy_info_flag"); PES_CRC_flag = GETBITS(1, "PES_CRC_flag"); PES_extension_flag = GETBITS(1, "PES_extension_flag"); PES_header_data_length = GETBITS(8, "PES_header_data_length"); bytes_read = 3; if(PES_scrambling_control != 0) { WARNING("Found a scrambled PES packet! (%d)\n", PES_scrambling_control); } if(PTS_DTS_flags == 0x2) { GETBITS(4, "0010"); PTS = GETBITS(3, "PTS [32..30]")<<30; marker_bit(); PTS |= GETBITS(15, "PTS [29..15]")<<15; marker_bit(); PTS |= GETBITS(15, "PTS [14..0]"); marker_bit(); bytes_read += 5; DPRINTF(1, "PES_packet() PTS: %llu [%6f s]\n", PTS, ((double)PTS)/90E3); } if(PTS_DTS_flags == 0x3) { GETBITS(4, "0011"); PTS = GETBITS(3, "PTS [32..30]")<<30; marker_bit(); PTS |= GETBITS(15, "PTS [29..15]")<<15; marker_bit(); PTS |= GETBITS(15, "PTS [14..0]"); marker_bit(); DPRINTF(1, "PES_packet() PTS: %llu [%6f s]\n", PTS, ((double)PTS)/90E3); GETBITS(4, "0001"); DTS = GETBITS(3, "DTS [32..30]")<<30; marker_bit(); DTS |= GETBITS(15, "DTS [29..15]")<<15; marker_bit(); DTS |= GETBITS(15, "DTS [14..0]"); marker_bit(); DPRINTF(1, "PES_packet() DTS: %llu [%6f s]\n", DTS, ((double)DTS)/90E3); bytes_read += 10; } if(ESCR_flag == 0x01) { GETBITS(2, "reserved"); ESCR_base = GETBITS(3, "ESCR_base [32..30]")<<30; marker_bit(); ESCR_base |= GETBITS(15, "ESCR_base [29..15]")<<15; marker_bit(); ESCR_base |= GETBITS(15, "ESCR_base [14..0]"); marker_bit(); ESCR_extension = GETBITS(9, "ESCR_extension"); marker_bit(); DPRINTF(1, "ESCR_base: %llu [%6f s]\n", ESCR_base, ((double)ESCR_base)/90E3); bytes_read += 6; } if(ES_rate_flag == 0x01) { marker_bit(); ES_rate = GETBITS(22, "ES_rate"); marker_bit(); bytes_read += 3; } if(DSM_trick_mode_flag == 0x01) { trick_mode_control = GETBITS(3, "trick_mode_control"); if(trick_mode_control == 0x00) { field_id = GETBITS(2, "field_id"); intra_slice_refresh = GETBITS(1, "intra_slice_refresh"); frequency_truncation = GETBITS(2, "frequency_truncation"); } else if(trick_mode_control == 0x01) { field_rep_cntrl = GETBITS(5, "field_rep_cntrl"); } else if(trick_mode_control == 0x02) { field_id = GETBITS(2, "field_id"); GETBITS(3, "reserved"); } else if(trick_mode_control == 0x03) { field_id = GETBITS(2, "field_id"); intra_slice_refresh = GETBITS(1, "intra_slice_refresh"); frequency_truncation = GETBITS(2, "frequency_truncation"); } bytes_read += 1; } if(additional_copy_info_flag == 0x01) { marker_bit(); additional_copy_info = GETBITS(7, "additional_copy_info"); bytes_read += 1; } if(PES_CRC_flag == 0x01) { previous_PES_packet_CRC = GETBITS(16, "previous_PES_packet_CRC"); bytes_read += 2; } if(PES_extension_flag == 0x01) { PES_private_data_flag = GETBITS(1, "PES_private_data_flag"); pack_header_field_flag = GETBITS(1, "pack_header_field_flag"); program_packet_sequence_counter_flag = GETBITS(1, "program_packet_sequence_counter_flag"); P_STD_buffer_flag = GETBITS(1, "P_STD_buffer_flag"); GETBITS(3, "reserved"); PES_extension_field_flag = GETBITS(1, "PES_extension_field_flag"); bytes_read += 1; } if(PES_private_data_flag == 0x01) { //TODO GETBITS(32, "PES_private_data"); GETBITS(32, "PES_private_data"); GETBITS(32, "PES_private_data"); GETBITS(32, "PES_private_data"); bytes_read += 16; } if(pack_header_field_flag == 0x01) { pack_field_length = GETBITS(8, "pack_field_length"); pack_header(); bytes_read += 1; bytes_read += pack_field_length; /* { int n; for(n = 0; n < pack_field_length; n++) { fprintf(stderr, "%02x, ", data[i+n+1]); } fprintf(stderr, "\n"); } */ } if(program_packet_sequence_counter_flag == 0x01) { marker_bit(); program_packet_sequence_counter = GETBITS(7, "program_packet_sequence_counter"); marker_bit(); original_stuff_length = GETBITS(7, "original_stuff_length"); bytes_read += 2; } if(P_STD_buffer_flag == 0x01) { GETBITS(2, "01"); P_STD_buffer_scale = GETBITS(1, "P_STD_buffer_scale"); P_STD_buffer_size = GETBITS(13, "P_STD_buffer_size"); bytes_read += 2; } if(PES_extension_field_flag == 0x01) { int i; marker_bit(); PES_extension_field_length = GETBITS(7, "PES_extension_field_length"); for(i=0; i<PES_extension_field_length; i++) { GETBITS(8, "reserved"); } bytes_read += 1; bytes_read += PES_extension_field_length; } N = (PES_header_data_length+3)-bytes_read; drop_bytes(N); bytes_read += N; N = PES_packet_length-bytes_read; //FIXME kolla specen... //FIXME push pes.. push_stream_data(stream_id, N, PTS_DTS_flags, PTS, DTS, PacketType_PES, pes_packet_offs); } else if(stream_id == MPEG2_PRIVATE_STREAM_2) { push_stream_data(stream_id, PES_packet_length, PTS_DTS_flags, PTS, DTS, PacketType_PES, pes_packet_offs); //fprintf(stderr, "*PRIVATE_stream_2, %d\n", PES_packet_length); } else if(stream_id == MPEG2_PADDING_STREAM) { drop_bytes(PES_packet_length); // push_stream_data(stream_id, PES_packet_length); }}// MPEG-1 packetvoid packet(void){ uint8_t stream_id; uint16_t packet_length; uint8_t P_STD_buffer_scale; uint16_t P_STD_buffer_size; uint64_t PTS = 0; uint64_t DTS = 0; int N; uint8_t pts_dts_flags = 0; uint32_t mpeg1_packet_offs; mpeg1_packet_offs = offs-(bits_left/8); GETBITS(24 ,"packet_start_code_prefix"); stream_id = GETBITS(8, "stream_id"); packet_length = GETBITS(16, "packet_length"); N = packet_length; if(stream_id != MPEG2_PRIVATE_STREAM_2) { DPRINTF(1, "packet() stream: %02x\n", stream_id); while(nextbits(8) == 0xff) { GETBITS(8, "stuffing byte"); N--; } if(nextbits(2) == 0x1) { GETBITS(2, "01"); P_STD_buffer_scale = GETBITS(1, "P_STD_buffer_scale"); P_STD_buffer_size = GETBITS(13, "P_STD_buffer_size"); N -= 2; } if(nextbits(4) == 0x2) { pts_dts_flags = 0x2; GETBITS(4, "0010"); PTS = GETBITS(3, "PTS [32..30]")<<30; marker_bit(); PTS |= GETBITS(15, "PTS [29..15]")<<15; marker_bit(); PTS |= GETBITS(15, "PTS [14..0]"); marker_bit(); DPRINTF(1, "packet() PTS: %llu [%6f s]\n", PTS, ((double)PTS)/90E3); N -= 5; } else if(nextbits(4) == 0x3) { pts_dts_flags = 0x3; GETBITS(4, "0011"); PTS = GETBITS(3, "PTS [32..30]")<<30; marker_bit(); PTS |= GETBITS(15, "PTS [29..15]")<<15; marker_bit(); PTS |= GETBITS(15, "PTS [14..0]"); marker_bit(); DPRINTF(1, "packet() PTS: %llu [%6f s]\n", PTS, ((double)PTS)/90E3); GETBITS(4, "0001"); DTS = GETBITS(3, "DTS [32..30]")<<30; marker_bit(); DTS |= GETBITS(15, "DTS [29..15]")<<15; marker_bit(); DTS |= GETBITS(15, "DTS [14..0]"); marker_bit(); DPRINTF(1, "packet() DTS: %llu [%6f s]\n", DTS, ((double)DTS)/90E3); N -= 10; } else { GETBITS(8, "00001111"); N--; } } push_stream_data(stream_id, N, pts_dts_flags, PTS, DTS, PacketType_MPEG1, mpeg1_packet_offs); }void pack(void){ uint32_t start_code; uint8_t stream_id; uint8_t is_PES = 0; int mpeg_version; MsgEvent_t ev; SCR_flags = 0; /* TODOD clean up */ if(msgqid != -1) { if(off_to != -1) { if(off_to <= offs-(bits_left/8)) { //fprintf(stderr, "demux: off_to %d offs %d pack\n", off_to, offs); off_to = -1; get_next_demux_q(); } } if(off_from != -1) { //fprintf(stderr, "demux: off_from pack\n"); offs = off_from; bits_left = 64; off_from = -1; GETBITS(32, "skip1"); GETBITS(32, "skip2"); } while(MsgCheckEvent(msgq, &ev) != -1) { handle_events(&ev); } } mpeg_version = pack_header(); switch(mpeg_version) { case MPEG1: /* TODO clean up */ if(msgqid != -1) { if(off_to != -1) { if(off_to <= offs-(bits_left/8)) { //fprintf(stderr, "demux: off_to %d offs %d mpeg1\n", off_to, offs); off_to = -1; get_next_demux_q(); //wait_for_msg(CMD_CTRL_CMD); } } if(off_from != -1) { //fprintf(stderr, "demux: off_from mpeg1\n"); offs = off_from; bits_left = 64; off_from = -1; GETBITS(32, "skip1"); GETBITS(32, "skip2"); } while(MsgCheckEvent(msgq, &ev) != -1) { handle_events(&ev); } } next_start_code(); while(nextbits(32) >= 0x000001BC) { packet(); /* TODO clean up */ if(msgqid != -1) { if(off_to != -1) { if(off_to <= offs-(bits_left/8)) { //fprintf(stderr, "demux: off_to %d offs %d packet\n", off_to, offs); off_to = -1; get_next_demux_q(); //wait_for_msg(CMD_CTRL_CMD); } } if(off_from != -1) { //fprintf(stderr, "demux: off_from packet\n"); offs = off_from; bits_left = 64; off_from = -1; GETBITS(32, "skip1"); GETBITS(32, "skip2"); } while(MsgCheckEvent(msgq, &ev) != -1) { handle_events(&ev); } } next_start_code(); } break; case MPEG2: while((((start_code = nextbits(32))>>8)&0x00ffffff) == MPEG2_PES_PACKET_START_CODE_PREFIX) { stream_id = (start_code&0xff); is_PES = 0; if((stream_id >= 0xc0) && (stream_id < 0xe0)) { /* ISO/IEC 11172-3/13818-3 audio stream */ is_PES = 1; } else if((stream_id >= 0xe0) && (stream_id < 0xf0)) { /* ISO/IEC 11172-3/13818-3 video stream */ is_PES = 1; } else { switch(stream_id) { case 0xBC: /* program stream map */ fprintf(stderr, "demux: Program Stream map\n"); case 0xBD: /* private stream 1 */ case 0xBE: /* padding stream */ case 0xBF: /* private stream 2 */ is_PES = 1; break; case 0xBA: //fprintf(stderr, "Pack Start Code\n"); is_PES = 0; break; default: is_PES = 0; fprintf(stderr, "demux: unknown stream_id: 0x%02x\n", stream_id); break; } } if(!is_PES) { break; } PES_packet(); SCR_flags = 0; /* TODO clean up */ if(msgqid != -1) { if(off_to != -1) { if(off_to <= offs-(bits_left/8)) { //fprintf(stderr, "demux: off_to %d offs %d mpeg2\n", off_to, offs); off_to = -1; get_next_demux_q(); //wait_for_msg(CMD_CTRL_CMD); } } if(off_from != -1) { //fprintf(stderr, "demux: off_from mpeg2\n"); offs = off_from; bits_left = 64; off_from = -1; GETBITS(32, "skip1"); GETBITS(32, "skip2"); } while(MsgCheckEvent(msgq, &ev) != -1) { handle_events(&ev); } } } break; } packnr++;}void MPEG2_program_stream(void){ DPRINTF(2,"MPEG2_program_stream()\n"); do { pack(); } while(nextbits(32) == MPEG2_PS_PACK_START_CODE); if(GETBITS(32, "MPEG2_PS_PROGRAM_END_CODE") == MPEG2_PS_PROGRAM_END_CODE) { DPRINTF(1, "MPEG Program End\n"); //system_header_set = 0; } else { synced = 0; WARNING("Lost Sync at offset: %u bytes\n", offs); }}void segvhandler (int id){ FATAL("%s", "Segmentation fault\n");#ifdef STATS printf("\n----------------------------------------------\n"); printf("Unaligned video packets:\t\t%u\n", stat_video_unaligned_packet_offset); printf("Video packets with unaligned ends:\t%u\n", stat_video_unaligned_packet_end); printf("Total video packets:\t\t\t%u\n", stat_video_n_packets); printf("Total audio packets:\t\t\t%u\n", stat_audio_n_packets); printf("Total subpicture packets:\t\t%u\n", stat_subpicture_n_packets); printf("Total packets:\t\t\t\t%u\n", stat_n_packets);#endif //STATS exit(0);}void loadinputfile(char *infilename){ static struct stat statbuf; int rv; if(disk_buf != NULL) { munmap(disk_buf, statbuf.st_size); } infilefd = open(infilename, O_RDONLY); if(infilefd == -1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -