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

📄 programstream.c

📁 基于linux的DVD播放器程序
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -