📄 bitstream.cpp
字号:
if (e->no_update) bs->Skip(8); /* */ if (e->upsampling) bs->Skip(8); /* */ if (e->intra_blocks) bs->Skip(8); /* */ if (e->not_coded_blocks) bs->Skip(8); /* */ if (e->dct_coefs) bs->Skip(8); /* */ if (e->dct_lines) bs->Skip(8); /* */ if (e->vlc_symbols) bs->Skip(8); /* */ if (e->vlc_bits) bs->Skip(8); /* */ if (e->inter_blocks) bs->Skip(8); /* */ if (e->inter4v_blocks) bs->Skip(8); /* */ if (e->apm) bs->Skip(8); /* */ if (e->npm) bs->Skip(8); /* */ if (e->forw_back_mc_q) bs->Skip(8); /* */ if (e->halfpel2) bs->Skip(8); /* */ if (e->halfpel4) bs->Skip(8); /* */ if (e->sadct) bs->Skip(8); /* */ if (e->quarterpel) bs->Skip(8); /* */ } if (coding_type == B_VOP) { if (e->opaque) bs->Skip(8); /* */ if (e->transparent) bs->Skip(8); /* */ if (e->intra_cae) bs->Skip(8); /* */ if (e->inter_cae) bs->Skip(8); /* */ if (e->no_update) bs->Skip(8); /* */ if (e->upsampling) bs->Skip(8); /* */ if (e->intra_blocks) bs->Skip(8); /* */ if (e->not_coded_blocks) bs->Skip(8); /* */ if (e->dct_coefs) bs->Skip(8); /* */ if (e->dct_lines) bs->Skip(8); /* */ if (e->vlc_symbols) bs->Skip(8); /* */ if (e->vlc_bits) bs->Skip(8); /* */ if (e->inter_blocks) bs->Skip(8); /* */ if (e->inter4v_blocks) bs->Skip(8); /* */ if (e->apm) bs->Skip(8); /* */ if (e->npm) bs->Skip(8); /* */ if (e->forw_back_mc_q) bs->Skip(8); /* */ if (e->halfpel2) bs->Skip(8); /* */ if (e->halfpel4) bs->Skip(8); /* */ if (e->interpolate_mc_q) bs->Skip(8); /* */ if (e->sadct) bs->Skip(8); /* */ if (e->quarterpel) bs->Skip(8); /* */ } if (coding_type == S_VOP && sprite_enable == SPRITE_STATIC) { if (e->intra_blocks) bs->Skip(8); /* */ if (e->not_coded_blocks) bs->Skip(8); /* */ if (e->dct_coefs) bs->Skip(8); /* */ if (e->dct_lines) bs->Skip(8); /* */ if (e->vlc_symbols) bs->Skip(8); /* */ if (e->vlc_bits) bs->Skip(8); /* */ if (e->inter_blocks) bs->Skip(8); /* */ if (e->inter4v_blocks) bs->Skip(8); /* */ if (e->apm) bs->Skip(8); /* */ if (e->npm) bs->Skip(8); /* */ if (e->forw_back_mc_q) bs->Skip(8); /* */ if (e->halfpel2) bs->Skip(8); /* */ if (e->halfpel4) bs->Skip(8); /* */ if (e->interpolate_mc_q) bs->Skip(8); /* */ } }}//----------------------------// decode headers// returns coding_type, or -1 if error#define VIDOBJ_START_CODE_MASK 0x0000001f#define VIDOBJLAY_START_CODE_MASK 0x0000000fint S_decoder::BitstreamReadHeaders(Bitstream * bs, bool &rounding, bool *reduced_resolution, dword *quant, dword *fcode_forward, dword *fcode_backward, dword *intra_dc_threshold, WARPPOINTS *gmc_warp){ dword vol_ver_id; dword coding_type; dword start_code; dword time_incr = 0; int time_increment = 0; int resize = 0; while((bs->Pos() >> 3) < bs->length){ bs->ByteAlign(); start_code = bs->ShowBits(32); switch(start_code){ case VISOBJSEQ_START_CODE: { DPRINTF(XVID_DEBUG_STARTCODE, "<visual_object_sequence>\n"); bs->Skip(32); //visual_object_sequence_start_code int profile = bs->GetBits(8); //profile_and_level_indication DPRINTF(XVID_DEBUG_HEADER, "profile_and_level_indication %i\n", profile); } break; case VISOBJSEQ_STOP_CODE: { //visual_object_sequence_stop_code bs->Skip(32); DPRINTF(XVID_DEBUG_STARTCODE, "</visual_object_sequence>\n"); } break; case VISOBJ_START_CODE: { DPRINTF(XVID_DEBUG_STARTCODE, "<visual_object>\n"); bs->Skip(32); //visual_object_start_code int visobj_ver_id; //is_visual_object_identified if(bs->GetBit()){ visobj_ver_id = bs->GetBits(4); /* visual_object_ver_id */ DPRINTF(XVID_DEBUG_HEADER,"visobj_ver_id %i\n", visobj_ver_id); bs->Skip(3); //visual_object_priority }else{ visobj_ver_id = 1; } if(bs->ShowBits(4) != VISOBJ_TYPE_VIDEO){ //visual_object_type DPRINTF(XVID_DEBUG_ERROR, "visual_object_type != video\n"); return -1; } bs->Skip(4); //video_signal_type if(bs->GetBit()){ DPRINTF(XVID_DEBUG_HEADER,"+ video_signal_type\n"); bs->Skip(3); /* video_format */ bs->Skip(1); /* video_range */ if (bs->GetBit()) /* color_description */ { DPRINTF(XVID_DEBUG_HEADER,"+ color_description"); bs->Skip(8); /* color_primaries */ bs->Skip(8); /* transfer_characteristics */ bs->Skip(8); /* matrix_coefficients */ } } } break; case GRPOFVOP_START_CODE: { DPRINTF(XVID_DEBUG_STARTCODE, "<group_of_vop>\n"); bs->Skip(32); { int hours, minutes, seconds; hours = bs->GetBits(5); minutes = bs->GetBits(6); READ_MARKER(); seconds = bs->GetBits(6); //DPRINTF(XVID_DEBUG_HEADER, "time %ih%im%is\n", hours,minutes,seconds); } bs->Skip(1); /* closed_gov */ bs->Skip(1); /* broken_link */ } break; case VOP_START_CODE: { DPRINTF(XVID_DEBUG_STARTCODE, "<vop>\n"); bs->Skip(32); /* vop_start_code */ coding_type = bs->GetBits(2); /* vop_coding_type */ DPRINTF(XVID_DEBUG_HEADER, "coding_type %i\n", coding_type); /*********************** for decode B-frame time ***********************/ while (bs->GetBit() != 0) /* time_base */ time_incr++; READ_MARKER(); if (time_inc_bits) { time_increment = (bs->GetBits(time_inc_bits)); /* vop_time_increment */ } DPRINTF(XVID_DEBUG_HEADER, "time_base %i\n", time_incr); DPRINTF(XVID_DEBUG_HEADER, "time_increment %i\n", time_increment); //DPRINTF(XVID_DEBUG_TIMECODE, "%c %i:%i\n", coding_type == I_VOP ? 'I' : coding_type == P_VOP ? 'P' : coding_type == B_VOP ? 'B' : 'S', time_incr, time_increment); if (coding_type != B_VOP) { last_time_base = time_base; time_base += time_incr; time = time_increment; #if 0 time_base * time_inc_resolution + time_increment;#endif time_pp = (dword) (time_inc_resolution + time - last_non_b_time)%time_inc_resolution; last_non_b_time = time; } else { time = time_increment;#if 0 (last_time_base + time_incr) * time_inc_resolution + time_increment;#endif time_bp = (dword) (time_inc_resolution + last_non_b_time - time)%time_inc_resolution; } DPRINTF(XVID_DEBUG_HEADER,"time_pp=%i\n", time_pp); DPRINTF(XVID_DEBUG_HEADER,"time_bp=%i\n", time_bp); READ_MARKER(); if (!bs->GetBit()) /* vop_coded */ { DPRINTF(XVID_DEBUG_HEADER, "vop_coded==false\n"); return N_VOP; } if (newpred_enable) { int vop_id; int vop_id_for_prediction; vop_id = bs->GetBits(MIN(time_inc_bits + 3, 15)); DPRINTF(XVID_DEBUG_HEADER, "vop_id %i\n", vop_id); if (bs->GetBit()) /* vop_id_for_prediction_indication */ { vop_id_for_prediction = bs->GetBits(MIN(time_inc_bits + 3, 15)); DPRINTF(XVID_DEBUG_HEADER, "vop_id_for_prediction %i\n", vop_id_for_prediction); } READ_MARKER(); } //fix a little bug by MinChen <chenm002@163.com> if((shape != VIDOBJLAY_SHAPE_BINARY_ONLY) && ((coding_type == P_VOP) || (coding_type == S_VOP && sprite_enable == SPRITE_GMC))){ rounding = !!bs->GetBit(); //rounding_type DPRINTF(XVID_DEBUG_HEADER, "rounding %i\n", rounding); } if(reduced_resolution_enable && shape == VIDOBJLAY_SHAPE_RECTANGULAR && (coding_type == P_VOP || coding_type == I_VOP)) { *reduced_resolution = !!bs->GetBit(); DPRINTF(XVID_DEBUG_HEADER, "reduced_resolution %i\n", *reduced_resolution); }else{ *reduced_resolution = false; } if (shape != VIDOBJLAY_SHAPE_RECTANGULAR) { if(!(sprite_enable == SPRITE_STATIC && coding_type == I_VOP)) { dword width, height; dword horiz_mc_ref, vert_mc_ref; width = bs->GetBits(13); READ_MARKER(); height = bs->GetBits(13); READ_MARKER(); horiz_mc_ref = bs->GetBits(13); READ_MARKER(); vert_mc_ref = bs->GetBits(13); READ_MARKER(); DPRINTF(XVID_DEBUG_HEADER, "width %i\n", width); DPRINTF(XVID_DEBUG_HEADER, "height %i\n", height); DPRINTF(XVID_DEBUG_HEADER, "horiz_mc_ref %i\n", horiz_mc_ref); DPRINTF(XVID_DEBUG_HEADER, "vert_mc_ref %i\n", vert_mc_ref); } bs->Skip(1); /* change_conv_ratio_disable */ if (bs->GetBit()) /* vop_constant_alpha */ { bs->Skip(8); /* vop_constant_alpha_value */ } } if (shape != VIDOBJLAY_SHAPE_BINARY_ONLY) { if (!complexity_estimation_disable) { read_vop_complexity_estimation_header(bs, coding_type); } /* intra_dc_vlc_threshold */ *intra_dc_threshold = intra_dc_threshold_table[bs->GetBits(3)]; top_field_first = 0; alternate_vertical_scan = 0; if(interlacing){ top_field_first = bs->GetBit(); DPRINTF(XVID_DEBUG_HEADER, "interlace top_field_first %i\n", top_field_first); alternate_vertical_scan = bs->GetBit(); DPRINTF(XVID_DEBUG_HEADER, "interlace alternate_vertical_scan %i\n", alternate_vertical_scan); } } if ((sprite_enable == SPRITE_STATIC || sprite_enable== SPRITE_GMC) && coding_type == S_VOP) { int i; for (i = 0 ; i < sprite_warping_points; i++) { int length; int x = 0, y = 0; /* sprite code borowed from ffmpeg; thx Michael Niedermayer <michaelni@gmx.at> */ length = bs->bs_get_spritetrajectory(); if(length){ x= bs->GetBits(length); if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/ x = - (x ^ ((1 << length) - 1)); } READ_MARKER(); length = bs->bs_get_spritetrajectory(); if(length){ y = bs->GetBits(length); if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/ y = - (y ^ ((1 << length) - 1)); } READ_MARKER(); gmc_warp->duv[i].x = x; gmc_warp->duv[i].y = y; //DPRINTF(XVID_DEBUG_HEADER,"sprite_warping_point[%i] xy=(%i,%i)\n", i, x, y); } if (sprite_brightness_change) { /* XXX: brightness_change_factor() */ } if (sprite_enable == SPRITE_STATIC) { /* XXX: todo */ } } if ((*quant = bs->GetBits(quant_bits)) < 1) /* vop_quant */ *quant = 1; DPRINTF(XVID_DEBUG_HEADER, "quant %i\n", *quant); if (coding_type != I_VOP) { *fcode_forward = bs->GetBits(3); /* fcode_forward */ DPRINTF(XVID_DEBUG_HEADER, "fcode_forward %i\n", *fcode_forward); } if (coding_type == B_VOP) { *fcode_backward = bs->GetBits(3); /* fcode_backward */ DPRINTF(XVID_DEBUG_HEADER, "fcode_backward %i\n", *fcode_backward); } if(!scalability){ if ((shape != VIDOBJLAY_SHAPE_RECTANGULAR) && (coding_type != I_VOP)) { bs->Skip(1); /* vop_shape_coding_type */ } } return coding_type; } break; case USERDATA_START_CODE: { char tmp[256]; int i; bs->Skip(32); /* user_data_start_code */ tmp[0] = bs->ShowBits(8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -