//Creates and saves the NAL PPS (one per file) void CJOCh264encoder::create_pps () { add4bytesnoemulationprevention (0x000001); // NAL header addbits (0x0,1); // forbidden_bit addbits (0x3,2); // nal_ref_idc addbits (0x8,5); // nal_unit_type : 8 ( PPS ) addexpgolombunsigned(0); // pic_parameter_set_id addexpgolombunsigned(0); // seq_parameter_set_id addbits (0x0,1); // entropy_coding_mode_flag addbits (0x0,1); // bottom_field_pic_order_in frame_present_flag addexpgolombunsigned(0); // nun_slices_groups_minus1 addexpgolombunsigned(0); // num_ref_idx10_default_active_minus addexpgolombunsigned(0); // num_ref_idx11_default_active_minus addbits (0x0,1); // weighted_pred_flag addbits (0x0,2); // weighted_bipred_idc addexpgolombsigned(0); // pic_init_qp_minus26 addexpgolombsigned(0); // pic_init_qs_minus26 addexpgolombsigned(0); // chroma_qp_index_offset addbits (0x0,1); //deblocking_filter_present_flag addbits (0x0,1); // constrained_intra_pred_flag addbits (0x0,1); //redundant_pic_ent_present_flag addbits(0x1,1); // rbsp stop bit dobytealign(); }
void CJOCh264bitstream::addexpgolombsigned (long lval) { //it implements a signed exp golomb coding unsigned long lvalint = abs(lval) * 2 - 1; if (lval <= 0) lvalint = 2 * abs(lval); addexpgolombunsigned(lvalint); }
//Creates and saves the NAL SLICE (one per frame) void CJOCh264encoder::create_slice_header(unsigned long lFrameNum) { add4bytesnoemulationprevention (0x000001); // NAL header addbits (0x0,1); // forbidden_bit addbits (0x3,2); // nal_ref_idc addbits (0x5,5); // nal_unit_type : 5 ( Coded slice of an IDR picture ) addexpgolombunsigned(0); // first_mb_in_slice addexpgolombunsigned(7); // slice_type addexpgolombunsigned(0); // pic_param_set_id unsigned char cFrameNum = lFrameNum % 16; //(2⁴) addbits (cFrameNum,4); // frame_num ( numbits = v = log2_max_frame_num_minus4 + 4) unsigned long lidr_pic_id = lFrameNum % 512; //idr_pic_flag = 1 addexpgolombunsigned(lidr_pic_id); // idr_pic_id addbits(0x0,4); // pic_order_cnt_lsb (numbits = v = log2_max_fpic_order_cnt_lsb_minus4 + 4) addbits(0x0,1); //no_output_of_prior_pics_flag addbits(0x0,1); //long_term_reference_flag addexpgolombsigned(0); //slice_qp_delta //Probably NOT byte aligned!!! }
//Creates and saves the NAL SPS (including VUI) (one per file) void CJOCh264encoder::create_sps (int nImW, int nImH, int nMbW, int nMbH, int nFps, int nSARw, int nSARh) { add4bytesnoemulationprevention (0x000001); // NAL header addbits (0x0,1); // forbidden_bit addbits (0x3,2); // nal_ref_idc addbits (0x7,5); // nal_unit_type : 7 ( SPS ) addbits (0x42,8); // profile_idc = baseline ( 0x42 ) addbits (0x0,1); // constraint_set0_flag addbits (0x0,1); // constraint_set1_flag addbits (0x0,1); // constraint_set2_flag addbits (0x0,1); // constraint_set3_flag addbits (0x0,1); // constraint_set4_flag addbits (0x0,1); // constraint_set5_flag addbits (0x0,2); // reserved_zero_2bits /* equal to 0 */ addbits (0x0a,8); // level_idc: 3.1 (0x0a) addexpgolombunsigned(0); // seq_parameter_set_id addexpgolombunsigned(0); // log2_max_frame_num_minus4 addexpgolombunsigned(0); // pic_order_cnt_type addexpgolombunsigned(0); // log2_max_pic_order_cnt_lsb_minus4 addexpgolombunsigned(0); // max_num_refs_frames addbits(0x0,1); // gaps_in_frame_num_value_allowed_flag int nWinMbs = nImW / nMbW; addexpgolombunsigned(nWinMbs-1); // pic_width_in_mbs_minus_1 int nHinMbs = nImH / nMbH; addexpgolombunsigned(nHinMbs-1); // pic_height_in_map_units_minus_1 addbits(0x1,1); // frame_mbs_only_flag addbits(0x0,1); // direct_8x8_interfernce addbits(0x0,1); // frame_cropping_flag addbits(0x1,1); // vui_parameter_present //VUI parameters (AR, timming) addbits(0x1,1); //aspect_ratio_info_present_flag addbits(0xFF,8); //aspect_ratio_idc = Extended_SAR //AR addbits(nSARw, 16); //sar_width addbits(nSARh, 16); //sar_height addbits(0x0,1); //overscan_info_present_flag addbits(0x0,1); //video_signal_type_present_flag addbits(0x0,1); //chroma_loc_info_present_flag addbits(0x1,1); //timing_info_present_flag unsigned int nnum_units_in_tick = TIME_SCALE_IN_HZ / (2*nFps); addbits(nnum_units_in_tick,32); //num_units_in_tick addbits(TIME_SCALE_IN_HZ,32); //time_scale addbits(0x1,1); //fixed_frame_rate_flag addbits(0x0,1); //nal_hrd_parameters_present_flag addbits(0x0,1); //vcl_hrd_parameters_present_flag addbits(0x0,1); //pic_struct_present_flag addbits(0x0,1); //bitstream_restriction_flag //END VUI addbits(0x0,1); // frame_mbs_only_flag addbits(0x1,1); // rbsp stop bit dobytealign(); }
//Creates and saves the macroblock header(one per macroblock) void CJOCh264encoder::create_macroblock_header () { addexpgolombunsigned(25); // mb_type (I_PCM) }