in ftl_app/nalu.c [389:579]
int nalu_parse_sps(struct bitstream_elmt_t *bs, struct sequence_params_set_t *sps)
{
int i;
sps->profile_idc = bitstream_u(bs, 8);
sps->constraint_set0_flag = bitstream_u(bs, 1);
sps->constraint_set1_flag = bitstream_u(bs, 1);
sps->constraint_set2_flag = bitstream_u(bs, 1);
sps->constraint_set3_flag = bitstream_u(bs, 1);
sps->reserved_zero_4bits = bitstream_u(bs, 4); /* equal to 0 */
sps->level_idc = bitstream_u(bs, 8);
sps->seq_parameter_set_id = bitstream_ue(bs);
sps->log2_max_frame_num_minus4 = bitstream_ue(bs);
sps->pic_order_cnt_type = bitstream_ue(bs);
if(sps->pic_order_cnt_type == 0)
{
sps->log2_max_pic_order_cnt_lsb_minus4 = bitstream_ue(bs);
}
else if(sps->pic_order_cnt_type == 1)
{
sps->delta_pic_order_always_zero_flag = bitstream_u(bs, 1);
sps->offset_for_non_ref_pic = bitstream_se(bs);
sps->offset_for_top_to_bottom_field = bitstream_se(bs);
sps->num_ref_frames_in_pic_order_cnt_cycle = bitstream_ue(bs);
sps->offset_for_ref_frame = malloc(sizeof(sps->offset_for_ref_frame[0]) * sps->num_ref_frames_in_pic_order_cnt_cycle);
for(i=0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++)
{
sps->offset_for_ref_frame[i] = bitstream_se(bs);
}
}
sps->num_ref_frames = bitstream_ue(bs);
sps->gaps_in_frame_num_value_allowed_flag = bitstream_u(bs, 1);
sps->pic_width_in_mbs_minus1 = bitstream_ue(bs);
sps->pic_height_in_map_units_minus1 = bitstream_ue(bs);
sps->frame_mbs_only_flag = bitstream_u(bs, 1);
if(!sps->frame_mbs_only_flag)
{
sps->mb_adaptive_frame_field_flag = bitstream_u(bs, 1);
}
sps->direct_8x8_inference_flag = bitstream_u(bs, 1);
sps->frame_cropping_flag = bitstream_u(bs, 1);
if(sps->frame_cropping_flag)
{
sps->frame_crop_left_offset = bitstream_ue(bs);
sps->frame_crop_right_offset = bitstream_ue(bs);
sps->frame_crop_top_offset = bitstream_ue(bs);
sps->frame_crop_bottom_offset = bitstream_ue(bs);
}
sps->vui_parameters_present_flag = bitstream_u(bs, 1);
if(sps->vui_parameters_present_flag)
{
sps->vui.aspect_ratio_info_present_flag = bitstream_u(bs, 1);
if( sps->vui.aspect_ratio_info_present_flag )
{
sps->vui.aspect_ratio_idc = bitstream_u(bs, 8);
if( sps->vui.aspect_ratio_idc == VUI_SAR_EXTENDED)
{
sps->vui.sar_width = bitstream_u(bs, 16);
sps->vui.sar_height = bitstream_u(bs, 16);
}
}
sps->vui.overscan_info_present_flag = bitstream_u(bs, 1);
if( sps->vui.overscan_info_present_flag )
{
sps->vui.overscan_appropriate_flag = bitstream_u(bs, 1);
}
sps->vui.video_signal_type_present_flag = bitstream_u(bs, 1);
if( sps->vui.video_signal_type_present_flag )
{
sps->vui.video_format = bitstream_u(bs, 3);
sps->vui.video_full_range_flag = bitstream_u(bs, 1);
sps->vui.colour_description_present_flag = bitstream_u(bs, 1);
if( sps->vui.colour_description_present_flag )
{
sps->vui.colour_primaries = bitstream_u(bs, 8);
sps->vui.transfer_characteristics = bitstream_u(bs, 8);
sps->vui.matrix_coefficients = bitstream_u(bs, 8);
}
}
sps->vui.chroma_loc_info_present_flag = bitstream_u(bs, 1);
if( sps->vui.chroma_loc_info_present_flag )
{
sps->vui.chroma_sample_loc_type_top_field = bitstream_ue(bs);
sps->vui.chroma_sample_loc_type_bottom_field = bitstream_ue(bs);
}
sps->vui.timing_info_present_flag = bitstream_u(bs, 1);
if( sps->vui.timing_info_present_flag )
{
sps->vui.num_units_in_tick = bitstream_u(bs, 32);
sps->vui.time_scale = bitstream_u(bs, 32);
sps->vui.fixed_frame_rate_flag = bitstream_u(bs, 1);
}
sps->vui.nal_hrd_parameters_present_flag = bitstream_u(bs, 1);
if( sps->vui.nal_hrd_parameters_present_flag )
{
int SchedSelIdx;
sps->vui.nal_hrd.cpb_cnt_minus1 = bitstream_ue(bs);
sps->vui.nal_hrd.bit_rate_scale = bitstream_u(bs, 4);
sps->vui.nal_hrd.cpb_size_scale = bitstream_u(bs, 4);
sps->vui.nal_hrd.bit_rate_value_minus1 = malloc(sizeof(sps->vui.nal_hrd.bit_rate_value_minus1[0]) * (sps->vui.nal_hrd.cpb_cnt_minus1 + 1));
sps->vui.nal_hrd.cpb_size_value_minus1 = malloc(sizeof(sps->vui.nal_hrd.cpb_size_value_minus1[0]) * (sps->vui.nal_hrd.cpb_cnt_minus1 + 1));
sps->vui.nal_hrd.cbr_flag = malloc(sizeof(sps->vui.nal_hrd.cbr_flag[0]) * (sps->vui.nal_hrd.cpb_cnt_minus1 + 1));
for( SchedSelIdx = 0; SchedSelIdx <= sps->vui.nal_hrd.cpb_cnt_minus1; SchedSelIdx++ )
{
sps->vui.nal_hrd.bit_rate_value_minus1[ SchedSelIdx ] = bitstream_ue(bs);
sps->vui.nal_hrd.cpb_size_value_minus1[ SchedSelIdx ] = bitstream_ue(bs);
sps->vui.nal_hrd.cbr_flag[ SchedSelIdx ] = bitstream_u(bs, 1);
}
sps->vui.nal_hrd.initial_cpb_removal_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.nal_hrd.cpb_removal_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.nal_hrd.dpb_output_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.nal_hrd.time_offset_length = bitstream_u(bs, 5);
}
sps->vui.vcl_hrd_parameters_present_flag = bitstream_u(bs, 1);
if( sps->vui.vcl_hrd_parameters_present_flag )
{
int SchedSelIdx;
sps->vui.vlc_hrd.cpb_cnt_minus1 = bitstream_ue(bs);
sps->vui.vlc_hrd.bit_rate_scale = bitstream_u(bs, 4);
sps->vui.vlc_hrd.cpb_size_scale = bitstream_u(bs, 4);
sps->vui.vlc_hrd.bit_rate_value_minus1 = malloc(sizeof(sps->vui.vlc_hrd.bit_rate_value_minus1[0]) * (sps->vui.vlc_hrd.cpb_cnt_minus1 + 1));
sps->vui.vlc_hrd.cpb_size_value_minus1 = malloc(sizeof(sps->vui.vlc_hrd.cpb_size_value_minus1[0]) * (sps->vui.vlc_hrd.cpb_cnt_minus1 + 1));
sps->vui.vlc_hrd.cbr_flag = malloc(sizeof(sps->vui.vlc_hrd.cbr_flag[0]) * (sps->vui.vlc_hrd.cpb_cnt_minus1 + 1));
for( SchedSelIdx = 0; SchedSelIdx <= sps->vui.vlc_hrd.cpb_cnt_minus1; SchedSelIdx++ )
{
sps->vui.vlc_hrd.bit_rate_value_minus1[ SchedSelIdx ] = bitstream_ue(bs);
sps->vui.vlc_hrd.cpb_size_value_minus1[ SchedSelIdx ] = bitstream_ue(bs);
sps->vui.vlc_hrd.cbr_flag[ SchedSelIdx ] = bitstream_u(bs, 1);
}
sps->vui.vlc_hrd.initial_cpb_removal_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.vlc_hrd.cpb_removal_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.vlc_hrd.dpb_output_delay_length_minus1 = bitstream_u(bs, 5);
sps->vui.vlc_hrd.time_offset_length = bitstream_u(bs, 5);
}
if( sps->vui.nal_hrd_parameters_present_flag || sps->vui.vcl_hrd_parameters_present_flag )
{
sps->vui.low_delay_hrd_flag = bitstream_u(bs, 1);
}
sps->vui.pic_struct_present_flag = bitstream_u(bs, 1);
sps->vui.bitstream_restriction_flag = bitstream_u(bs, 1);
if( sps->vui.bitstream_restriction_flag )
{
sps->vui.motion_vectors_over_pic_boundaries_flag = bitstream_u(bs, 1);
sps->vui.max_bytes_per_pic_denom = bitstream_ue(bs);
sps->vui.max_bits_per_mb_denom = bitstream_ue(bs);
sps->vui.log2_max_mv_length_horizontal = bitstream_ue(bs);
sps->vui.log2_max_mv_length_vertical = bitstream_ue(bs);
sps->vui.num_reorder_frames = bitstream_ue(bs);
sps->vui.max_dec_frame_buffering = bitstream_ue(bs);
}
}
_rbsp_trailing_bits(bs);
return 0;
}