📄 video_stream.c
字号:
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 + -