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

📄 video_stream.c

📁 基于linux的DVD播放器程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	  q_shmid = ev.gntpicbuf.q_shmid;	  break;	} else {	  handle_events(msgq, &ev);	}      }    }    if(q_shmid >= 0) {      if((q_shmaddr = shmat(q_shmid, NULL, SHM_SHARE_MMU)) == (void *)-1) {	perror("**video_decode: attach_picq_buffer(), shmat()");	return -1;      }            q_head = (q_head_t *)q_shmaddr;      q_elems = (q_elem_t *)(q_shmaddr+sizeof(q_head_t));          } else {      ERROR("%s", "couldn't get qbuffer\n");    }      } else {    ERROR("%s", "couldn't get buffer\n");  }    data_q->q_head = q_head;  data_q->q_elems = q_elems;  data_q->data_head = data_head;  data_q->data_elems = data_elems;  data_q->image_bufs = image_bufs;    #ifdef HAVE_MMX  emms();#endif    /* this should not be here */  DNOTE("horizontal_size: %d, vertical_size: %d\n",	seq.horizontal_size, seq.vertical_size);  DNOTE("padded_width: %d, padded_height: %d\n",	padded_width, padded_height);    DNOTE("%s", "frame rate: ");  switch(seq.header.frame_rate_code) {  case 0x0:    break;  case 0x1:    DNOTEC("%s", "24000/1001 (23.976)\n");    break;  case 0x2:    DNOTEC("%s", "24\n");    break;  case 0x3:    DNOTEC("%s", "25\n");    break;  case 0x4:    DNOTEC("%s", "30000/1001 (29.97)\n");    break;  case 0x5:    DNOTEC("%s", "30\n");    break;  case 0x6:    DNOTEC("%s", "50\n");    break;  case 0x7:    DNOTEC("%s", "60000/1001 (59.94)\n");    break;  case 0x8:    DNOTEC("%s", "60\n");    break;  default:    DNOTEC("%f (computed)\n",	   (double)(seq.header.frame_rate_code)*	   ((double)(seq.ext.frame_rate_extension_n)+1.0)/	   ((double)(seq.ext.frame_rate_extension_d)+1.0));    break;  }  return 0;}/* 6.2.2.3 Sequence extension */void sequence_extension(void) {  long int frame_interval_pts = 0;  uint32_t extension_start_code;    extension_start_code = GETBITS(32, "extension_start_code");  if(extension_start_code != MPEG2_VS_EXTENSION_START_CODE) {    WARNING("wrong start_code extension_start_code: %08x\n",	    extension_start_code);  }  DPRINTFI(1, "sequence_extension()\n");  DINDENT(2);    seq.ext.extension_start_code_identifier     = GETBITS(4, "extension_start_code_identifier");  seq.ext.profile_and_level_indication     = GETBITS(8, "profile_and_level_indication");  seq.ext.progressive_sequence = GETBITS(1, "progressive_sequence");  seq.ext.chroma_format = GETBITS(2, "chroma_format");  seq.ext.horizontal_size_extension = GETBITS(2, "horizontal_size_extension");  seq.ext.vertical_size_extension = GETBITS(2, "vertical_size_extension");  seq.ext.bit_rate_extension = GETBITS(12, "bit_rate_extension");  marker_bit();  seq.ext.vbv_buffer_size_extension = GETBITS(8, "vbv_buffer_size_extension");  seq.ext.low_delay = GETBITS(1, "low_delay");  seq.ext.frame_rate_extension_n = GETBITS(2, "frame_rate_extension_n");  seq.ext.frame_rate_extension_d = GETBITS(5, "frame_rate_extension_d");  next_start_code();  seq.horizontal_size |= (seq.ext.horizontal_size_extension << 12);  seq.vertical_size |= (seq.ext.vertical_size_extension << 12);  seq.dpy_ext.display_horizontal_size = 0; //reset  seq.dpy_ext.display_vertical_size = 0;    //frame_centre_horizontal_offset = 0; // reset  //frame_centre_vertical_offset = 0;#ifdef DEBUG	     DPRINTFI(2, "profile_and_level_indication: ");  if(seq.ext.profile_and_level_indication & 0x80) {    DPRINTF(2, "(reserved)\n");  } else {    DPRINTF(2, "Profile: ");    switch((seq.ext.profile_and_level_indication & 0x70)>>4) {    case 0x5:      DPRINTF(2, "Simple");      break;    case 0x4:      DPRINTF(2, "Main");      break;    case 0x3:      DPRINTF(2, "SNR Scalable");      break;    case 0x2:      DPRINTF(2, "Spatially Scalable");      break;    case 0x1:      DPRINTF(2, "High");      break;    default:      DPRINTF(2, "(reserved)");      break;    }    DPRINTF(2, ", Level: ");    switch(seq.ext.profile_and_level_indication & 0x0f) {    case 0xA:      DPRINTF(2, "Low");      break;    case 0x8:      DPRINTF(2, "Main");      break;    case 0x6:      DPRINTF(2, "High 1440");      break;    case 0x4:      DPRINTF(2, "High");      break;    default:      DPRINTF(2, "(reserved)");      break;    }    DPRINTF(2, "\n");  }   DPRINTFI(2, "progressive seq: %01x\n", seq.ext.progressive_sequence);  DPRINTFI(2, "chroma_format:(0x%01x) ", seq.ext.chroma_format);  switch(seq.ext.chroma_format) {  case 0x0:    DPRINTF(2, "reserved\n");    break;  case 0x1:    DPRINTF(2, "4:2:0\n");    break;  case 0x2:    DPRINTF(2, "4:2:2\n");    break;  case 0x3:    DPRINTF(2, "4:4:4\n");    break;  }#endif  DPRINTFI(2, "horizontal_size: %u\n", seq.horizontal_size);  DPRINTFI(2, "vertical_size: %u\n", seq.vertical_size);  DPRINTFI(2, "bit_rate: %d bits/second\n",	  400 * ((seq.ext.bit_rate_extension << 12) 		 | seq.header.bit_rate_value));  DPRINTFI(2, "vbv_buffer_size: min %d bits\n",	   16*1024*((seq.ext.vbv_buffer_size_extension << 10) |		    seq.header.vbv_buffer_size_value));  DPRINTFI(2, "low_delay: %01x\n", seq.ext.low_delay);    DPRINTFI(2, "frame_rate: ");  switch(seq.header.frame_rate_code) {  case 0x0:    DPRINTF(2, "forbidden\n");    break;  case 0x1:    DPRINTF(2, "24000/1001 (23.976)\n");    frame_interval_pts = 3754;    break;  case 0x2:    DPRINTF(2, "24\n");    frame_interval_pts = 3750;    break;  case 0x3:    DPRINTF(2, "25\n");    frame_interval_pts = 3600;    break;  case 0x4:    DPRINTF(2, "30000/1001 (29.97)\n");    if(last_gop_had_repeat_field_progressive_frame) {      /* it's probably coded as 24 fps progressive */      frame_interval_pts = 3754;    } else {      frame_interval_pts = 3003;    }    break;  case 0x5:    DPRINTF(2, "30\n");    frame_interval_pts = 3000;    break;  case 0x6:    DPRINTF(2, "50\n");    frame_interval_pts = 1800;    break;  case 0x7:    DPRINTF(2, "60000/1001 (59.94)\n");    frame_interval_pts = 1502;    break;  case 0x8:    DPRINTF(2, "60\n");    frame_interval_pts = 1500;    break;  default:    DPRINTF(2, "%f (computed)\n",	    (double)(seq.header.frame_rate_code)*	    ((double)(seq.ext.frame_rate_extension_n)+1.0)/	    ((double)(seq.ext.frame_rate_extension_d)+1.0));    //TODO: frame_interval_nsec = ?    fprintf(stderr, "fixme computed framerate\n");    break;  }  if(forced_frame_rate == -1) { /* No forced frame rate */    //buf_ctrl_head->frame_interval = frame_interval_pts;    frame_interval = frame_interval_pts;  } else {    if(forced_frame_rate == 0) {      //buf_ctrl_head->frame_interval = 1;      frame_interval = 1;    } else {      //buf_ctrl_head->frame_interval = PTS_BASE/forced_frame_rate;      frame_interval = PTS_BASE/forced_frame_rate;    }  }  DINDENT(-2);}/* 6.2.2.2 Extension and user data */void extension_and_user_data(const unsigned int i) {    DPRINTFI(1, "extension_and_user_data(%u)\n", i);  DINDENT(2);  while((nextbits(32) == MPEG2_VS_EXTENSION_START_CODE) ||	(nextbits(32) == MPEG2_VS_USER_DATA_START_CODE)) {    if(i != 1) {      if(nextbits(32) == MPEG2_VS_EXTENSION_START_CODE) {	extension_data(i);      }    }    if(nextbits(32) == MPEG2_VS_USER_DATA_START_CODE) {      user_data();    }  }  DINDENT(-2);}/* 6.2.3.1 Picture coding extension */int picture_coding_extension(void){  uint32_t extension_start_code;  unsigned int m,n;  DPRINTFI(1, "picture_coding_extension()\n");  DINDENT(2);  extension_start_code = GETBITS(32, "extension_start_code");  if(extension_start_code != MPEG2_VS_EXTENSION_START_CODE) {    WARNING("wrong start_code extension_start_code: %08x\n",	    extension_start_code);    DINDENT(-2);    return -1;  }  pic.coding_ext.extension_start_code_identifier     = GETBITS(4, "extension_start_code_identifier");  pic.coding_ext.f_code[0][0] = GETBITS(4, "f_code[0][0]");  pic.coding_ext.f_code[0][1] = GETBITS(4, "f_code[0][1]");  pic.coding_ext.f_code[1][0] = GETBITS(4, "f_code[1][0]");  pic.coding_ext.f_code[1][1] = GETBITS(4, "f_code[1][1]");    /* FIXME: Workaround for faulty streams. */  for(n = 0; n < 2; n++) {    for(m = 0; m < 2; m++) {      if(pic.coding_ext.f_code[n][m] == 0) {	pic.coding_ext.f_code[n][m] = 1;	WARNING("f_code[%d][%d] == ZERO\n", n, m);      }    }  }  pic.coding_ext.intra_dc_precision = GETBITS(2, "intra_dc_precision");  /** opt4 **/  switch(pic.coding_ext.intra_dc_precision) {  case 0x0:    mb.intra_dc_mult = 8;    break;  case 0x1:    mb.intra_dc_mult = 4;    break;  case 0x2:    mb.intra_dc_mult = 2;    break;  case 0x3:    mb.intra_dc_mult = 1;    break;  }  /**/  pic.coding_ext.picture_structure = GETBITS(2, "picture_structure");  #ifdef DEBUG  /* Table 6-14 Meaning of picture_structure */  DPRINTFI(2, "picture_structure: ");  switch(pic.coding_ext.picture_structure) {  case PIC_STRUCT_RESERVED:    DPRINTF(2, "reserved");    break;  case PIC_STRUCT_TOP_FIELD:    DPRINTF(2, "Top Field");    break;  case PIC_STRUCT_BOTTOM_FIELD:    DPRINTF(2, "Bottom Field");    break;  case PIC_STRUCT_FRAME_PICTURE:    DPRINTF(2, "Frame Picture");    break;  }  DPRINTF(2, "\n");#endif    /* FIXME: Workaround for faulty streams. */  if(pic.coding_ext.picture_structure == PIC_STRUCT_RESERVED)    pic.coding_ext.picture_structure = PIC_STRUCT_FRAME_PICTURE;  pic.coding_ext.top_field_first = GETBITS(1, "top_field_first");  pic.coding_ext.frame_pred_frame_dct = GETBITS(1, "frame_pred_frame_dct");  pic.coding_ext.concealment_motion_vectors     = GETBITS(1, "concealment_motion_vectors");  pic.coding_ext.q_scale_type = GETBITS(1, "q_scale_type");  pic.coding_ext.intra_vlc_format = GETBITS(1, "intra_vlc_format");  pic.coding_ext.alternate_scan = GETBITS(1, "alternate_scan");  pic.coding_ext.repeat_first_field = GETBITS(1, "repeat_first_field");  pic.coding_ext.chroma_420_type = GETBITS(1, "chroma_420_type");  pic.coding_ext.progressive_frame = GETBITS(1, "progressive_frame");  pic.coding_ext.composite_display_flag = GETBITS(1, "composite_display_flag");    DPRINTFI(2, "top_field_first: %01x\n", pic.coding_ext.top_field_first);  DPRINTFI(2, "frame_pred_frame_dct: %01x\n", pic.coding_ext.frame_pred_frame_dct);  DPRINTFI(2, "intra_vlc_format: %01x\n", pic.coding_ext.intra_vlc_format);  DPRINTFI(2, "alternate_scan: %01x\n", pic.coding_ext.alternate_scan);  DPRINTFI(2, "repeat_first_field: %01x\n", pic.coding_ext.repeat_first_field);  DPRINTFI(2, "progressive_frame: %01x\n", pic.coding_ext.progressive_frame);  DPRINTFI(2, "composite_display_flag: %01x\n", pic.coding_ext.composite_display_flag);    if(pic.coding_ext.composite_display_flag) {    pic.coding_ext.v_axis = GETBITS(1, "v_axis");    pic.coding_ext.field_sequence = GETBITS(3, "field_sequence");    pic.coding_ext.sub_carrier = GETBITS(1, "sub_carrier");    pic.coding_ext.burst_amplitude = GETBITS(7, "burst_amplitude");    pic.coding_ext.sub_carrier_phase = GETBITS(8, "sub_carrier_phase");  }    if(pic.coding_ext.progressive_frame &&     pic.coding_ext.repeat_first_field) {    last_gop_had_repeat_field_progressive_frame++;  }  seq.mb_width = (seq.horizontal_size+15)/16;    if(seq.ext.progressive_sequence) {    seq.mb_height = (seq.vertical_size+15)/16;  } else {    if(pic.coding_ext.picture_structure == PIC_STRUCT_FRAME_PICTURE) {      /* frame pic */      seq.mb_height = 2*((seq.vertical_size+31)/32);    } else {      /* field_picture */      seq.mb_height = ((seq.vertical_size+31)/32);    }  }  DINDENT(-2);  next_start_code();  return 0;}/* 6.2.2.2.2 User data */void user_data(void){  uint32_t user_data_start_code;    DPRINTFI(1, "user_data()\n");  DINDENT(2);  user_data_start_code = GETBITS(32, "user_data_start_code");  /* It's safe, all callers have already tested for the correct start code */  while(nextbits(24) != 0x000001) {    GETBITS(8, "user_data");  }  DINDENT(-2);  next_start_code();  }/* 6.2.2.6 Group of pictures header */void group_of_pictures_header(void){  uint32_t group_start_code;  uint32_t time_code;  uint8_t closed_gop;  uint8_t broken_link;    DPRINTFI(1, "group_of_pictures_header()\n");  DINDENT(2);  group_start_code = GETBITS(32, "group_start_code");  if(group_start_code != MPEG2_VS_GROUP_START_CODE) {    WARNING("wrong start_code group_start_code: %08x\n",	    group_start_code);  }  /* TODO hack for progessive 24 */  last_gop_had_repeat_field_progressive_frame = 0;  time_code = GETBITS(25, "time_code");  /* Table 6-11 --- time_code */  DPRINTFI(2, "time_code: %02d:%02d.%02d'%02d\n",	  (time_code & 0x00f80000)>>19,	  (time_code & 0x0007e000)>>13,	  (time_code & 0x00000fc0)>>6,	  (time_code & 0x0000003f));    /* These need to be in seq or some thing like that */  closed_gop = GETBITS(1, "closed_gop");  broken_link = GETBITS(1, "broken_link");  last_temporal_ref_to_dpy = -1;  prev_coded_temp_ref = -2;    DINDENT(-2);  next_start_code();}/* 6.2.3 Picture header */int picture_header(void){  uint32_t picture_start_code;  DPRINTFI(1, "picture_header()\n");  DINDENT(2);    seq.mb_row = 0;  picture_start_code = GETBITS(32, "picture_start_code");

⌨️ 快捷键说明

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