void read_sei_end_bits(h264_stream_t* h, bs_t* b ) { // if the message doesn't end at a byte border if ( !bs_byte_aligned( b ) ) { if ( !bs_read_u1( b ) ) fprintf(stderr, "WARNING: bit_equal_to_one is 0!!!!\n"); while ( ! bs_byte_aligned( b ) ) { if ( bs_read_u1( b ) ) fprintf(stderr, "WARNING: bit_equal_to_zero is 1!!!!\n"); } } read_rbsp_trailing_bits(h, b); }
//7.3.2.1 Sequence parameter set RBSP syntax int read_seq_parameter_set_rbsp(sps_t* sps, bs_t* b) { int i; memset(sps, 0, sizeof(sps_t)); sps->profile_idc = bs_read_u8(b); sps->constraint_set0_flag = bs_read_u1(b); sps->constraint_set1_flag = bs_read_u1(b); sps->constraint_set2_flag = bs_read_u1(b); sps->constraint_set3_flag = bs_read_u1(b); sps->constraint_set4_flag = bs_read_u1(b); sps->constraint_set5_flag = bs_read_u1(b); sps->reserved_zero_2bits = bs_read_u(b,2); /* all 0's */ sps->level_idc = bs_read_u8(b); sps->seq_parameter_set_id = bs_read_ue(b); sps->chroma_format_idc = 1; if( sps->profile_idc == 100 || sps->profile_idc == 110 || sps->profile_idc == 122 || sps->profile_idc == 144 ) { sps->chroma_format_idc = bs_read_ue(b); if( sps->chroma_format_idc == 3 ) { sps->residual_colour_transform_flag = bs_read_u1(b); } sps->bit_depth_luma_minus8 = bs_read_ue(b); sps->bit_depth_chroma_minus8 = bs_read_ue(b); sps->qpprime_y_zero_transform_bypass_flag = bs_read_u1(b); sps->seq_scaling_matrix_present_flag = bs_read_u1(b); if( sps->seq_scaling_matrix_present_flag ) { for( i = 0; i < 8; i++ ) { sps->seq_scaling_list_present_flag[ i ] = bs_read_u1(b); if( sps->seq_scaling_list_present_flag[ i ] ) { if( i < 6 ) { read_scaling_list( b, sps->ScalingList4x4[ i ], 16, sps->UseDefaultScalingMatrix4x4Flag[ i ]); } else { read_scaling_list( b, sps->ScalingList8x8[ i - 6 ], 64, sps->UseDefaultScalingMatrix8x8Flag[ i - 6 ] ); } } } } } sps->log2_max_frame_num_minus4 = bs_read_ue(b); sps->pic_order_cnt_type = bs_read_ue(b); if( sps->pic_order_cnt_type == 0 ) { sps->log2_max_pic_order_cnt_lsb_minus4 = bs_read_ue(b); } else if( sps->pic_order_cnt_type == 1 ) { sps->delta_pic_order_always_zero_flag = bs_read_u1(b); sps->offset_for_non_ref_pic = bs_read_se(b); sps->offset_for_top_to_bottom_field = bs_read_se(b); sps->num_ref_frames_in_pic_order_cnt_cycle = bs_read_ue(b); for( i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++ ) { sps->offset_for_ref_frame[ i ] = bs_read_se(b); } } sps->num_ref_frames = bs_read_ue(b); sps->gaps_in_frame_num_value_allowed_flag = bs_read_u1(b); sps->pic_width_in_mbs_minus1 = bs_read_ue(b); sps->pic_height_in_map_units_minus1 = bs_read_ue(b); sps->frame_mbs_only_flag = bs_read_u1(b); if( !sps->frame_mbs_only_flag ) { sps->mb_adaptive_frame_field_flag = bs_read_u1(b); } sps->direct_8x8_inference_flag = bs_read_u1(b); sps->frame_cropping_flag = bs_read_u1(b); if( sps->frame_cropping_flag ) { sps->frame_crop_left_offset = bs_read_ue(b); sps->frame_crop_right_offset = bs_read_ue(b); sps->frame_crop_top_offset = bs_read_ue(b); sps->frame_crop_bottom_offset = bs_read_ue(b); } sps->vui_parameters_present_flag = bs_read_u1(b); if( sps->vui_parameters_present_flag ) { read_vui_parameters(sps, b); } read_rbsp_trailing_bits(b); return 0; }