///< residual_colour_transform_flag public void copyTo(SequenceParameterSet sps) { sps.profile_idc = profile_idc; sps.level_idc = level_idc; sps.chroma_format_idc = chroma_format_idc; sps.transform_bypass = transform_bypass; ///< qpprime_y_zero_transform_bypass_flag sps.log2_max_frame_num = log2_max_frame_num; ///< log2_max_frame_num_minus4 + 4 sps.poc_type = poc_type; ///< pic_order_cnt_type sps.log2_max_poc_lsb = log2_max_poc_lsb; ///< log2_max_pic_order_cnt_lsb_minus4 sps.delta_pic_order_always_zero_flag = delta_pic_order_always_zero_flag; sps.offset_for_non_ref_pic = offset_for_non_ref_pic; sps.offset_for_top_to_bottom_field = offset_for_top_to_bottom_field; sps.poc_cycle_length = poc_cycle_length; ///< num_ref_frames_in_pic_order_cnt_cycle sps.ref_frame_count = ref_frame_count; ///< num_ref_frames sps.gaps_in_frame_num_allowed_flag = gaps_in_frame_num_allowed_flag; sps.mb_width = mb_width; ///< pic_width_in_mbs_minus1 + 1 sps.mb_height = mb_height; ///< pic_height_in_map_units_minus1 + 1 sps.frame_mbs_only_flag = frame_mbs_only_flag; sps.mb_aff = mb_aff; ///<mb_adaptive_frame_field_flag sps.direct_8x8_inference_flag = direct_8x8_inference_flag; sps.crop = crop; ///< frame_cropping_flag sps.crop_left = crop_left; ///< frame_cropping_rect_left_offset sps.crop_right = crop_right; ///< frame_cropping_rect_right_offset sps.crop_top = crop_top; ///< frame_cropping_rect_top_offset sps.crop_bottom = crop_bottom; ///< frame_cropping_rect_bottom_offset sps.vui_parameters_present_flag = vui_parameters_present_flag; //sps.sar = null; sps.sar.num = sar.num; sps.sar.den = sar.den; sps.video_signal_type_present_flag = video_signal_type_present_flag; sps.full_range = full_range; sps.colour_description_present_flag = colour_description_present_flag; sps.color_primaries = color_primaries; sps.color_trc = color_trc; sps.colorspace = colorspace; sps.timing_info_present_flag = timing_info_present_flag; sps.num_units_in_tick = num_units_in_tick; sps.time_scale = time_scale; sps.fixed_frame_rate_flag = fixed_frame_rate_flag; sps.offset_for_ref_frame = new short[256]; //FIXME dyn aloc? Array.Copy(offset_for_ref_frame, 0, sps.offset_for_ref_frame, 0, 256); sps.bitstream_restriction_flag = bitstream_restriction_flag; sps.num_reorder_frames = num_reorder_frames; sps.scaling_matrix_present = scaling_matrix_present; sps.scaling_matrix4 = (int[][])scaling_matrix4.Clone(); sps.scaling_matrix8 = (int[][])scaling_matrix8.Clone(); sps.nal_hrd_parameters_present_flag = nal_hrd_parameters_present_flag; sps.vcl_hrd_parameters_present_flag = vcl_hrd_parameters_present_flag; sps.pic_struct_present_flag = pic_struct_present_flag; sps.time_offset_length = time_offset_length; sps.cpb_cnt = cpb_cnt; ///< See H.264 E.1.2 sps.initial_cpb_removal_delay_length = initial_cpb_removal_delay_length; ///< initial_cpb_removal_delay_length_minus1 +1 sps.cpb_removal_delay_length = cpb_removal_delay_length; ///< cpb_removal_delay_length_minus1 + 1 sps.dpb_output_delay_length = dpb_output_delay_length; ///< dpb_output_delay_length_minus1 + 1 sps.bit_depth_luma = bit_depth_luma; ///< bit_depth_luma_minus8 + 8 sps.bit_depth_chroma = bit_depth_chroma; ///< bit_depth_chroma_minus8 + 8 sps.residual_color_transform_flag = residual_color_transform_flag; ///< residual_colour_transform_flag }
//////////////////////////// // Decode SPS public int ff_h264_decode_seq_parameter_set() { int profile_idc, level_idc; /*unsigned */ int sps_id; int i; SequenceParameterSet sps; profile_idc = (int)s.gb.get_bits(8, "profile_idc"); s.gb.get_bits1("constraint_set0_flag"); //constraint_set0_flag s.gb.get_bits1("constraint_set1_flag"); //constraint_set1_flag s.gb.get_bits1("constraint_set2_flag"); //constraint_set2_flag s.gb.get_bits1("constraint_set3_flag"); //constraint_set3_flag s.gb.get_bits(4, "reserved"); // reserved level_idc = (int)s.gb.get_bits(8, "level_idc"); sps_id = s.gb.get_ue_golomb_31("sps_id"); if (sps_id >= MAX_SPS_COUNT) { //av_log(this.s.avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id); return -45; } sps = new SequenceParameterSet(); if (sps == null) return -46; sps.time_offset_length = 24; sps.profile_idc = profile_idc; sps.level_idc = level_idc; //Console.WriteLine("Decode SPS, Profile: "+profile_idc+", Level: "+level_idc); //memset(sps.scaling_matrix4, 16, sizeof(sps.scaling_matrix4)); //memset(sps.scaling_matrix8, 16, sizeof(sps.scaling_matrix8)); for (int k = 0; k < sps.scaling_matrix4.Length; k++) Arrays.Fill(sps.scaling_matrix4[k], 16); for (int k = 0; k < sps.scaling_matrix8.Length; k++) Arrays.Fill(sps.scaling_matrix8[k], 16); sps.scaling_matrix_present = 0; if (sps.profile_idc >= 100) { //high profile sps.chroma_format_idc = s.gb.get_ue_golomb_31("chroma_format_idc"); if (sps.chroma_format_idc == 3) sps.residual_color_transform_flag = (int)s.gb.get_bits1("residual_color_transform_flag"); sps.bit_depth_luma = s.gb.get_ue_golomb("bit_depth_luma") + 8; sps.bit_depth_chroma = s.gb.get_ue_golomb("bit_depth_chroma") + 8; sps.transform_bypass = (int)s.gb.get_bits1("transform_bypass"); decode_scaling_matrices(sps, null, 1, sps.scaling_matrix4, sps.scaling_matrix8); } else { sps.chroma_format_idc = 1; sps.bit_depth_luma = 8; sps.bit_depth_chroma = 8; } sps.log2_max_frame_num = s.gb.get_ue_golomb("log2_max_frame_num") + 4; sps.poc_type = s.gb.get_ue_golomb_31("poc_type"); // DebugTool.printDebugString("SPS: log2_max_frame_num = "+sps.log2_max_frame_num+"\n"); // DebugTool.printDebugString("SPS: poc_type = "+sps.poc_type+"\n"); if (sps.poc_type == 0) { //FIXME #define sps.log2_max_poc_lsb = s.gb.get_ue_golomb("log2_max_poc_lsb") + 4; // DebugTool.printDebugString("SPS: log2_max_poc_lsb = "+sps.log2_max_poc_lsb+"\n"); } else if (sps.poc_type == 1) {//FIXME #define sps.delta_pic_order_always_zero_flag = (int)s.gb.get_bits1("delta_pic_order_always_zero_flag"); sps.offset_for_non_ref_pic = s.gb.get_se_golomb("offset_for_non_ref_pic"); sps.offset_for_top_to_bottom_field = s.gb.get_se_golomb("offset_for_top_to_bottom_field"); sps.poc_cycle_length = s.gb.get_ue_golomb("poc_cycle_length"); // DebugTool.printDebugString("SPS: delta_pic_order_always_zero_flag = "+sps.delta_pic_order_always_zero_flag+"\n"); // DebugTool.printDebugString("SPS: offset_for_non_ref_pic = "+sps.offset_for_non_ref_pic+"\n"); // DebugTool.printDebugString("SPS: offset_for_top_to_bottom_field = "+sps.offset_for_top_to_bottom_field+"\n"); // DebugTool.printDebugString("SPS: poc_cycle_length = "+sps.poc_cycle_length+"\n"); if (/*(unsigned)*/sps.poc_cycle_length >= sps.offset_for_ref_frame.Length) { //av_log(this.s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps.poc_cycle_length); return -47; } for (i = 0; i < sps.poc_cycle_length; i++) { sps.offset_for_ref_frame[i] = (short)s.gb.get_se_golomb("offset_for_ref_frame"); // DebugTool.printDebugString("SPS: offset_for_ref_frame["+i+"] = "+sps.offset_for_ref_frame[i]+"\n"); } // if } else if (sps.poc_type != 2) { //av_log(this.s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps.poc_type); return -48; } sps.ref_frame_count = s.gb.get_ue_golomb_31("ref_frame_count"); // DebugTool.printDebugString("SPS: ref_frame_count = "+sps.ref_frame_count+"\n"); if (sps.ref_frame_count > MpegEncContext.MAX_PICTURE_COUNT - 2 || sps.ref_frame_count >= 32) { //av_log(this.s.avctx, AV_LOG_ERROR, "too many reference frames\n"); return -49; } sps.gaps_in_frame_num_allowed_flag = (int)s.gb.get_bits1("gaps_in_frame_num_allowed_flag"); sps.mb_width = s.gb.get_ue_golomb("mb_width") + 1; sps.mb_height = s.gb.get_ue_golomb("mb_height") + 1; if (/*(unsigned)*/sps.mb_width >= int.MaxValue / 16 || /*(unsigned)*/sps.mb_height >= int.MaxValue / 16 || MpegEncContext.av_image_check_size(16 * sps.mb_width, 16 * sps.mb_height, 0, this.s) != 0) { //av_log(this.s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n"); return -50; } // DebugTool.printDebugString("SPS: gaps_in_frame_num_allowed_flag = "+sps.gaps_in_frame_num_allowed_flag+"\n"); // DebugTool.printDebugString("SPS: mb_width = "+sps.mb_width+"\n"); // DebugTool.printDebugString("SPS: mb_height = "+sps.mb_height+"\n"); sps.frame_mbs_only_flag = (int)s.gb.get_bits1("frame_mbs_only_flag"); if (0 == sps.frame_mbs_only_flag) sps.mb_aff = (int)s.gb.get_bits1("mb_aff"); else sps.mb_aff = 0; // DebugTool.printDebugString("SPS: frame_mbs_only_flag = "+sps.frame_mbs_only_flag+"\n"); // DebugTool.printDebugString("SPS: mb_aff = "+sps.mb_aff+"\n"); sps.direct_8x8_inference_flag = (int)s.gb.get_bits1("direct_8x8_inference_flag"); if (0 == sps.frame_mbs_only_flag && 0 == sps.direct_8x8_inference_flag) { //av_log(this.s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n"); return -51; } // DebugTool.printDebugString("SPS: direct_8x8_inference_flag = "+sps.direct_8x8_inference_flag+"\n"); // if(sps.mb_aff) // av_log(this.s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); sps.crop = (int)s.gb.get_bits1("crop"); if (sps.crop != 0) { sps.crop_left = s.gb.get_ue_golomb("crop_left"); sps.crop_right = s.gb.get_ue_golomb("crop_right"); sps.crop_top = s.gb.get_ue_golomb("crop_top"); sps.crop_bottom = s.gb.get_ue_golomb("crop_bottom"); if (sps.crop_left != 0 || sps.crop_top != 0) { //av_log(this.s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); } if (sps.crop_right >= 8 || sps.crop_bottom >= 8) { //av_log(this.s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n"); } } else { sps.crop_left = sps.crop_right = sps.crop_top = sps.crop_bottom = 0; } // DebugTool.printDebugString("SPS: crop = "+sps.crop+"\n"); // DebugTool.printDebugString("SPS: crop_left = "+sps.crop_left+"\n"); // DebugTool.printDebugString("SPS: crop_right = "+sps.crop_right+"\n"); // DebugTool.printDebugString("SPS: crop_top = "+sps.crop_top+"\n"); // DebugTool.printDebugString("SPS: crop_bottom = "+sps.crop_bottom+"\n"); sps.vui_parameters_present_flag = (int)s.gb.get_bits1("vui_parameters_present_flag"); if (0 != sps.vui_parameters_present_flag) if (this.decode_vui_parameters(sps) < 0) return -52; if (0 == sps.sar.den) sps.sar.den = 1; /* if(s.avctx.debug&FF_DEBUG_PICT_INFO){ av_log(this.s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d\n", sps_id, sps.profile_idc, sps.level_idc, sps.poc_type, sps.ref_frame_count, sps.mb_width, sps.mb_height, sps.frame_mbs_only_flag ? "FRM" : (sps.mb_aff ? "MB-AFF" : "PIC-AFF"), sps.direct_8x8_inference_flag ? "8B8" : "", sps.crop_left, sps.crop_right, sps.crop_top, sps.crop_bottom, sps.vui_parameters_present_flag ? "VUI" : "", ((char*[]){"Gray","420","422","444"})[sps.chroma_format_idc], sps.timing_info_present_flag ? sps.num_units_in_tick : 0, sps.timing_info_present_flag ? sps.time_scale : 0 ); } */ //av_free(this.sps_buffers[sps_id]); this.sps_buffers[sps_id] = sps; this.sps = sps; return 0; }
public int decode_vui_parameters(SequenceParameterSet sps) { int aspect_ratio_info_present_flag; /*unsigned */ int aspect_ratio_idc; // DebugTool.printDebugString("decode_vui_parameters called..\n"); aspect_ratio_info_present_flag = (int)s.gb.get_bits1("aspect_ratio_info_present_flag"); // DebugTool.printDebugString(" -- SPS: aspect_ratio_info_present_flag = "+aspect_ratio_info_present_flag+"\n"); if (aspect_ratio_info_present_flag != 0) { aspect_ratio_idc = (int)s.gb.get_bits(8, "aspect_ratio_idc"); // DebugTool.printDebugString(" -- decoding aspect_ratio_info..\n"); // DebugTool.printDebugString(" -- SPS: aspect_ratio_idc = "+aspect_ratio_idc+"\n"); if (aspect_ratio_idc == EXTENDED_SAR) { sps.sar.num = (int)s.gb.get_bits(16, "sar_num"); sps.sar.den = (int)s.gb.get_bits(16, "sar_den"); // DebugTool.printDebugString(" -- SPS: num = "+sps.sar.num+"\n"); // DebugTool.printDebugString(" -- SPS: den = "+sps.sar.den+"\n"); } else if (aspect_ratio_idc < pixel_aspect.Length) { sps.sar = pixel_aspect[aspect_ratio_idc]; } else { //av_log(this.s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n"); return -36; } } else { sps.sar.num = sps.sar.den = 0; } // s.avctx.aspect_ratio= sar_width*s.width / (float)(s.height*sar_height); if (0 != (int)s.gb.get_bits1("overscan_info_present_flag")) { /* overscan_info_present_flag */ s.gb.get_bits1("overscan_appropriate_flag"); /* overscan_appropriate_flag */ // DebugTool.printDebugString(" -- decoding overscan_info..\n"); } sps.video_signal_type_present_flag = (int)s.gb.get_bits1("video_signal_type_present_flag"); if (0 != sps.video_signal_type_present_flag) { // DebugTool.printDebugString(" -- decoding video_signal_type..\n"); s.gb.get_bits(3, "video_signal_type_present_flag?"); /* video_format */ sps.full_range = (int)s.gb.get_bits1("full_range"); /* video_full_range_flag */ // DebugTool.printDebugString(" -- SPS: full_range = "+sps.full_range+"\n"); sps.colour_description_present_flag = (int)s.gb.get_bits1("colour_description_present_flag"); if (0 != sps.colour_description_present_flag) { // DebugTool.printDebugString(" -- decoding colour_description..\n"); sps.color_primaries = (int)s.gb.get_bits(8, "color_primaries"); /* colour_primaries */ sps.color_trc = (int)s.gb.get_bits(8, "color_trc"); /* transfer_characteristics */ sps.colorspace = (int)s.gb.get_bits(8, "colorspace"); /* matrix_coefficients */ if (sps.color_primaries >= MpegEncContext.AVCOL_PRI_NB) sps.color_primaries = MpegEncContext.AVCOL_PRI_UNSPECIFIED; if (sps.color_trc >= MpegEncContext.AVCOL_TRC_NB) sps.color_trc = MpegEncContext.AVCOL_TRC_UNSPECIFIED; if (sps.colorspace >= MpegEncContext.AVCOL_SPC_NB) sps.colorspace = MpegEncContext.AVCOL_SPC_UNSPECIFIED; } } if (0 != (int)s.gb.get_bits1("chroma_location_info_present_flag")) { /* chroma_location_info_present_flag */ // DebugTool.printDebugString(" -- decoding chroma_location_info..\n"); s.chroma_sample_location = s.gb.get_ue_golomb("chroma_sample_location") + 1; /* chroma_sample_location_type_top_field */ s.gb.get_ue_golomb("chroma_sample_location_type_bottom_field"); /* chroma_sample_location_type_bottom_field */ } sps.timing_info_present_flag = (int)s.gb.get_bits1("timing_info_present_flag"); // DebugTool.printDebugString(" -- SPS: timing_info_present_flag = "+sps.timing_info_present_flag+"\n"); if (0 != sps.timing_info_present_flag) { // DebugTool.printDebugString(" -- decoding timing_info..\n"); sps.num_units_in_tick = s.gb.get_bits_long(32, "num_units_in_tick"); sps.time_scale = s.gb.get_bits_long(32, "time_scale"); // DebugTool.printDebugString(" -- num_units_in_tick = "+sps.num_units_in_tick+", time_scale = "+sps.time_scale+"\n"); if (0 == sps.num_units_in_tick || 0 == sps.time_scale) { //av_log(this.s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps.time_scale, sps.num_units_in_tick); return -37; } sps.fixed_frame_rate_flag = (int)s.gb.get_bits1("fixed_frame_rate_flag"); } sps.nal_hrd_parameters_present_flag = (int)s.gb.get_bits1("nal_hrd_parameters_present_flag"); if (0 != sps.nal_hrd_parameters_present_flag) if (this.decode_hrd_parameters(sps) < 0) return -38; sps.vcl_hrd_parameters_present_flag = (int)s.gb.get_bits1("vcl_hrd_parameters_present_flag"); if (0 != sps.vcl_hrd_parameters_present_flag) if (this.decode_hrd_parameters(sps) < 0) return -39; if (0 != sps.nal_hrd_parameters_present_flag || 0 != sps.vcl_hrd_parameters_present_flag) s.gb.get_bits1("low_delay_hrd_flag"); /* low_delay_hrd_flag */ sps.pic_struct_present_flag = (int)s.gb.get_bits1("pic_struct_present_flag"); sps.bitstream_restriction_flag = (int)s.gb.get_bits1("bitstream_restriction_flag"); if (0 != sps.bitstream_restriction_flag) { s.gb.get_bits1("motion_vectors_over_pic_boundaries_flag"); /* motion_vectors_over_pic_boundaries_flag */ s.gb.get_ue_golomb("max_bytes_per_pic_denom"); /* max_bytes_per_pic_denom */ s.gb.get_ue_golomb("max_bits_per_mb_denom"); /* max_bits_per_mb_denom */ s.gb.get_ue_golomb("log2_max_mv_length_horizontal"); /* log2_max_mv_length_horizontal */ s.gb.get_ue_golomb("log2_max_mv_length_vertical"); /* log2_max_mv_length_vertical */ sps.num_reorder_frames = s.gb.get_ue_golomb("num_reorder_frames"); s.gb.get_ue_golomb("get_ue_golomb"); /*max_dec_frame_buffering*/ if (s.gb.size_in_bits < s.gb.get_bits_count()) { //av_log(this.s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", get_bits_count(&s.gb) - s.gb.size_in_bits); sps.num_reorder_frames = 0; sps.bitstream_restriction_flag = 0; } if (sps.num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/) { //av_log(this.s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps.num_reorder_frames); return -40; } } return 0; }
public void decode_scaling_matrices(SequenceParameterSet sps, PictureParameterSet pps, int is_sps, /* uint8_t (*scaling_matrix4)[16] */int[][] scaling_matrix4, /* * uint8_t * (* * scaling_matrix8 * )[64] */ int[][] scaling_matrix8) { int fallback_sps = (0 == is_sps && 0 != sps.scaling_matrix_present) ? 1 : 0; /* const uint8_t * */ int[][] fallback = new int[][] { (fallback_sps != 0) ? sps.scaling_matrix4[0] : default_scaling4[0], (fallback_sps != 0) ? sps.scaling_matrix4[3] : default_scaling4[1], (fallback_sps != 0) ? sps.scaling_matrix8[0] : default_scaling8[0], (fallback_sps != 0) ? sps.scaling_matrix8[1] : default_scaling8[1] }; if (0l != s.gb.get_bits1("01?")) { sps.scaling_matrix_present |= is_sps; decode_scaling_list(scaling_matrix4[0], 16, default_scaling4[0], fallback[0]); // Intra, Y decode_scaling_list(scaling_matrix4[1], 16, default_scaling4[0], scaling_matrix4[0]); // Intra, Cr decode_scaling_list(scaling_matrix4[2], 16, default_scaling4[0], scaling_matrix4[1]); // Intra, Cb decode_scaling_list(scaling_matrix4[3], 16, default_scaling4[1], fallback[1]); // Inter, Y decode_scaling_list(scaling_matrix4[4], 16, default_scaling4[1], scaling_matrix4[3]); // Inter, Cr decode_scaling_list(scaling_matrix4[5], 16, default_scaling4[1], scaling_matrix4[4]); // Inter, Cb if (is_sps != 0 || pps.transform_8x8_mode != 0) { decode_scaling_list(scaling_matrix8[0], 64, default_scaling8[0], fallback[2]); // Intra, Y decode_scaling_list(scaling_matrix8[1], 64, default_scaling8[1], fallback[3]); // Inter, Y } } }
public int decode_hrd_parameters(SequenceParameterSet sps) { int cpb_count, i; cpb_count = s.gb.get_ue_golomb_31("cpb_count") + 1; if (cpb_count > 32) { //av_log(this.s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count); return -35; } s.gb.get_bits(4, "bit_rate_scale"); /* bit_rate_scale */ s.gb.get_bits(4, "cpb_size_scale"); /* cpb_size_scale */ for (i = 0; i < cpb_count; i++) { s.gb.get_ue_golomb("bit_rate_value_minus1"); /* bit_rate_value_minus1 */ s.gb.get_ue_golomb("cpb_size_value_minus1"); /* cpb_size_value_minus1 */ s.gb.get_bits1("cbr_flag"); /* cbr_flag */ } sps.initial_cpb_removal_delay_length = (int)s.gb.get_bits(5, "initial_cpb_removal_delay_length") + 1; sps.cpb_removal_delay_length = (int)s.gb.get_bits(5, "cpb_removal_delay_length") + 1; sps.dpb_output_delay_length = (int)s.gb.get_bits(5, "dpb_output_delay_length") + 1; sps.time_offset_length = (int)s.gb.get_bits(5, "time_offset_length"); sps.cpb_cnt = cpb_count; return 0; }
public int decode_buffering_period() { /*unsigned */ int sps_id; int sched_sel_idx; SequenceParameterSet sps; sps_id = s.gb.get_ue_golomb_31("sps_id"); if (sps_id > 31 || null == this.sps_buffers[sps_id]) { //av_log(this.s.avctx, AV_LOG_ERROR, "non-existing SPS %d referenced in buffering period\n", sps_id); return -30; } sps = this.sps_buffers[sps_id]; // NOTE: This is really so duplicated in the standard... See H.264, D.1.1 if (sps.nal_hrd_parameters_present_flag != 0) { for (sched_sel_idx = 0; sched_sel_idx < sps.cpb_cnt; sched_sel_idx++) { this.initial_cpb_removal_delay[sched_sel_idx] = (int)s.gb.get_bits(sps.initial_cpb_removal_delay_length, "initial_cpb_removal_delay"); s.gb.skip_bits(sps.initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset } } if (sps.vcl_hrd_parameters_present_flag != 0) { for (sched_sel_idx = 0; sched_sel_idx < sps.cpb_cnt; sched_sel_idx++) { this.initial_cpb_removal_delay[sched_sel_idx] = (int)s.gb.get_bits(sps.initial_cpb_removal_delay_length, "initial_cpb_removal_delay"); s.gb.skip_bits(sps.initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset } } this.sei_buffering_period_present = 1; return 0; }
public void copyTo(SequenceParameterSet sps) { sps.profile_idc = profile_idc; sps.level_idc = level_idc; sps.chroma_format_idc = chroma_format_idc; sps.transform_bypass = transform_bypass; ///< qpprime_y_zero_transform_bypass_flag sps.log2_max_frame_num = log2_max_frame_num; ///< log2_max_frame_num_minus4 + 4 sps.poc_type = poc_type; ///< pic_order_cnt_type sps.log2_max_poc_lsb = log2_max_poc_lsb; ///< log2_max_pic_order_cnt_lsb_minus4 sps.delta_pic_order_always_zero_flag = delta_pic_order_always_zero_flag; sps.offset_for_non_ref_pic = offset_for_non_ref_pic; sps.offset_for_top_to_bottom_field = offset_for_top_to_bottom_field; sps.poc_cycle_length = poc_cycle_length; ///< num_ref_frames_in_pic_order_cnt_cycle sps.ref_frame_count = ref_frame_count; ///< num_ref_frames sps.gaps_in_frame_num_allowed_flag = gaps_in_frame_num_allowed_flag; sps.mb_width = mb_width; ///< pic_width_in_mbs_minus1 + 1 sps.mb_height = mb_height; ///< pic_height_in_map_units_minus1 + 1 sps.frame_mbs_only_flag = frame_mbs_only_flag; sps.mb_aff = mb_aff; ///<mb_adaptive_frame_field_flag sps.direct_8x8_inference_flag = direct_8x8_inference_flag; sps.crop = crop; ///< frame_cropping_flag sps.crop_left = crop_left; ///< frame_cropping_rect_left_offset sps.crop_right = crop_right; ///< frame_cropping_rect_right_offset sps.crop_top = crop_top; ///< frame_cropping_rect_top_offset sps.crop_bottom = crop_bottom; ///< frame_cropping_rect_bottom_offset sps.vui_parameters_present_flag = vui_parameters_present_flag; //sps.sar = null; sps.sar.num = sar.num; sps.sar.den = sar.den; sps.video_signal_type_present_flag = video_signal_type_present_flag; sps.full_range = full_range; sps.colour_description_present_flag = colour_description_present_flag; sps.color_primaries = color_primaries; sps.color_trc = color_trc; sps.colorspace = colorspace; sps.timing_info_present_flag = timing_info_present_flag; sps.num_units_in_tick = num_units_in_tick; sps.time_scale = time_scale; sps.fixed_frame_rate_flag = fixed_frame_rate_flag; sps.offset_for_ref_frame = new short[256]; //FIXME dyn aloc? Array.Copy(offset_for_ref_frame, 0, sps.offset_for_ref_frame, 0, 256); sps.bitstream_restriction_flag = bitstream_restriction_flag; sps.num_reorder_frames = num_reorder_frames; sps.scaling_matrix_present = scaling_matrix_present; sps.scaling_matrix4 = (int[][])scaling_matrix4.Clone(); sps.scaling_matrix8 = (int[][])scaling_matrix8.Clone(); sps.nal_hrd_parameters_present_flag = nal_hrd_parameters_present_flag; sps.vcl_hrd_parameters_present_flag = vcl_hrd_parameters_present_flag; sps.pic_struct_present_flag = pic_struct_present_flag; sps.time_offset_length = time_offset_length; sps.cpb_cnt = cpb_cnt; ///< See H.264 E.1.2 sps.initial_cpb_removal_delay_length = initial_cpb_removal_delay_length; ///< initial_cpb_removal_delay_length_minus1 +1 sps.cpb_removal_delay_length = cpb_removal_delay_length; ///< cpb_removal_delay_length_minus1 + 1 sps.dpb_output_delay_length = dpb_output_delay_length; ///< dpb_output_delay_length_minus1 + 1 sps.bit_depth_luma = bit_depth_luma; ///< bit_depth_luma_minus8 + 8 sps.bit_depth_chroma = bit_depth_chroma; ///< bit_depth_chroma_minus8 + 8 sps.residual_color_transform_flag = residual_color_transform_flag; ///< residual_colour_transform_flag }