static void encoder_state_write_bitstream_vid_parameter_set(encoder_state * const encoder_state) { bitstream * const stream = &encoder_state->stream; int i; #ifdef _DEBUG printf("=========== Video Parameter Set ID: 0 ===========\n"); #endif WRITE_U(stream, 0, 4, "vps_video_parameter_set_id"); WRITE_U(stream, 3, 2, "vps_reserved_three_2bits" ); WRITE_U(stream, 0, 6, "vps_reserved_zero_6bits" ); WRITE_U(stream, 1, 3, "vps_max_sub_layers_minus1"); WRITE_U(stream, 0, 1, "vps_temporal_id_nesting_flag"); WRITE_U(stream, 0xffff, 16, "vps_reserved_ffff_16bits"); encoder_state_write_bitstream_PTL(encoder_state); WRITE_U(stream, 0, 1, "vps_sub_layer_ordering_info_present_flag"); //for each layer for (i = 0; i < 1; i++) { WRITE_UE(stream, 1, "vps_max_dec_pic_buffering"); WRITE_UE(stream, 0, "vps_num_reorder_pics"); WRITE_UE(stream, 0, "vps_max_latency_increase"); } WRITE_U(stream, 0, 6, "vps_max_nuh_reserved_zero_layer_id"); WRITE_UE(stream, 0, "vps_max_op_sets_minus1"); WRITE_U(stream, 0, 1, "vps_timing_info_present_flag"); //IF timing info //END IF WRITE_U(stream, 0, 1, "vps_extension_flag"); }
static void encoder_state_write_bitstream_seq_parameter_set(encoder_state_t * const state) { bitstream_t * const stream = &state->stream; const encoder_control_t * encoder = state->encoder_control; #ifdef KVZ_DEBUG printf("=========== Sequence Parameter Set ID: 0 ===========\n"); #endif // TODO: profile IDC and level IDC should be defined later on WRITE_U(stream, 0, 4, "sps_video_parameter_set_id"); WRITE_U(stream, 1, 3, "sps_max_sub_layers_minus1"); WRITE_U(stream, 0, 1, "sps_temporal_id_nesting_flag"); encoder_state_write_bitstream_PTL(state); WRITE_UE(stream, 0, "sps_seq_parameter_set_id"); WRITE_UE(stream, state->encoder_control->in.video_format, "chroma_format_idc"); if (state->encoder_control->in.video_format == 3) { WRITE_U(stream, 0, 1, "separate_colour_plane_flag"); } WRITE_UE(stream, encoder->in.width, "pic_width_in_luma_samples"); WRITE_UE(stream, encoder->in.height, "pic_height_in_luma_samples"); if (encoder->in.width != encoder->in.real_width || encoder->in.height != encoder->in.real_height) { // The standard does not seem to allow setting conf_win values such that // the number of luma samples is not a multiple of 2. Options are to either // hide one line or show an extra line of non-video. Neither seems like a // very good option, so let's not even try. assert(!(encoder->in.width % 2)); WRITE_U(stream, 1, 1, "conformance_window_flag"); WRITE_UE(stream, 0, "conf_win_left_offset"); WRITE_UE(stream, (encoder->in.width - encoder->in.real_width) >> 1, "conf_win_right_offset"); WRITE_UE(stream, 0, "conf_win_top_offset"); WRITE_UE(stream, (encoder->in.height - encoder->in.real_height) >> 1, "conf_win_bottom_offset"); } else {