package org.jcodec.codecs.h264.io.model; import static org.jcodec.codecs.h264.decode.CAVLCReader.readBool; import static org.jcodec.codecs.h264.decode.CAVLCReader.readNBit; import static org.jcodec.codecs.h264.decode.CAVLCReader.readSE; import static org.jcodec.codecs.h264.decode.CAVLCReader.readUEtrace; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeBool; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeNBit; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeSEtrace; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeTrailingBits; import static org.jcodec.codecs.h264.io.write.CAVLCWriter.writeUEtrace; import static org.jcodec.common.model.ColorSpace.MONO; import static org.jcodec.common.model.ColorSpace.YUV420J; import static org.jcodec.common.model.ColorSpace.YUV422; import static org.jcodec.common.model.ColorSpace.YUV444; import org.jcodec.common.io.BitReader; import org.jcodec.common.io.BitWriter; import org.jcodec.common.model.ColorSpace; import java.nio.ByteBuffer; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * Sequence Parameter Set structure of h264 bitstream * * capable to serialize and deserialize with CAVLC bitstream * * @author The JCodec project * */ public class SeqParameterSet { public int pic_order_cnt_type; public boolean field_pic_flag; public boolean delta_pic_order_always_zero_flag; public boolean mb_adaptive_frame_field_flag; public boolean direct_8x8_inference_flag; public ColorSpace chroma_format_idc; public int log2_max_frame_num_minus4; public int log2_max_pic_order_cnt_lsb_minus4; public int pic_height_in_map_units_minus1; public int pic_width_in_mbs_minus1; public int bit_depth_luma_minus8; public int bit_depth_chroma_minus8; public boolean qpprime_y_zero_transform_bypass_flag; public int profile_idc; public boolean constraint_set_0_flag; public boolean constraint_set_1_flag; public boolean constraint_set_2_flag; public boolean constraint_set_3_flag; public boolean constraint_set_4_flag; public boolean constraint_set_5_flag; public int level_idc; public int seq_parameter_set_id; public boolean residual_color_transform_flag; public int offset_for_non_ref_pic; public int offset_for_top_to_bottom_field; public int num_ref_frames; public boolean gaps_in_frame_num_value_allowed_flag; public boolean frame_mbs_only_flag; public boolean frame_cropping_flag; public int frame_crop_left_offset; public int frame_crop_right_offset; public int frame_crop_top_offset; public int frame_crop_bottom_offset; public int[] offsetForRefFrame; public VUIParameters vuiParams; public ScalingMatrix scalingMatrix; public int num_ref_frames_in_pic_order_cnt_cycle; public static ColorSpace getColor(int id) { switch (id) { case 0: return MONO; case 1: return YUV420J; case 2: return YUV422; case 3: return YUV444; } throw new RuntimeException("Colorspace not supported"); } public static int fromColor(ColorSpace color) { if (color == MONO) { return 0; } else if (color == YUV420J) { return 1; } else if (color == YUV422) { return 2; } else if (color == YUV444) { return 3; } throw new RuntimeException("Colorspace not supported"); } public static SeqParameterSet read(ByteBuffer is) { BitReader _in = BitReader.createBitReader(is); SeqParameterSet sps = new SeqParameterSet(); sps.profile_idc = readNBit(_in, 8, "SPS: profile_idc"); sps.constraint_set_0_flag = readBool(_in, "SPS: constraint_set_0_flag"); sps.constraint_set_1_flag = readBool(_in, "SPS: constraint_set_1_flag"); sps.constraint_set_2_flag = readBool(_in, "SPS: constraint_set_2_flag"); sps.constraint_set_3_flag = readBool(_in, "SPS: constraint_set_3_flag"); sps.constraint_set_4_flag = readBool(_in, "SPS: constraint_set_4_flag"); sps.constraint_set_5_flag = readBool(_in, "SPS: constraint_set_5_flag"); readNBit(_in, 2, "SPS: reserved_zero_2bits"); sps.level_idc = (int) readNBit(_in, 8, "SPS: level_idc"); sps.seq_parameter_set_id = readUEtrace(_in, "SPS: seq_parameter_set_id"); if (sps.profile_idc == 100 || sps.profile_idc == 110 || sps.profile_idc == 122 || sps.profile_idc == 144) { sps.chroma_format_idc = getColor(readUEtrace(_in, "SPS: chroma_format_idc")); if (sps.chroma_format_idc == YUV444) { sps.residual_color_transform_flag = readBool(_in, "SPS: residual_color_transform_flag"); } sps.bit_depth_luma_minus8 = readUEtrace(_in, "SPS: bit_depth_luma_minus8"); sps.bit_depth_chroma_minus8 = readUEtrace(_in, "SPS: bit_depth_chroma_minus8"); sps.qpprime_y_zero_transform_bypass_flag = readBool(_in, "SPS: qpprime_y_zero_transform_bypass_flag"); boolean seqScalingMatrixPresent = readBool(_in, "SPS: seq_scaling_matrix_present_lag"); if (seqScalingMatrixPresent) { readScalingListMatrix(_in, sps); } } else { sps.chroma_format_idc = YUV420J; } sps.log2_max_frame_num_minus4 = readUEtrace(_in, "SPS: log2_max_frame_num_minus4"); sps.pic_order_cnt_type = readUEtrace(_in, "SPS: pic_order_cnt_type"); if (sps.pic_order_cnt_type == 0) { sps.log2_max_pic_order_cnt_lsb_minus4 = readUEtrace(_in, "SPS: log2_max_pic_order_cnt_lsb_minus4"); } else if (sps.pic_order_cnt_type == 1) { sps.delta_pic_order_always_zero_flag = readBool(_in, "SPS: delta_pic_order_always_zero_flag"); sps.offset_for_non_ref_pic = readSE(_in, "SPS: offset_for_non_ref_pic"); sps.offset_for_top_to_bottom_field = readSE(_in, "SPS: offset_for_top_to_bottom_field"); sps.num_ref_frames_in_pic_order_cnt_cycle = readUEtrace(_in, "SPS: num_ref_frames_in_pic_order_cnt_cycle"); sps.offsetForRefFrame = new int[sps.num_ref_frames_in_pic_order_cnt_cycle]; for (int i = 0; i < sps.num_ref_frames_in_pic_order_cnt_cycle; i++) { sps.offsetForRefFrame[i] = readSE(_in, "SPS: offsetForRefFrame [" + i + "]"); } } sps.num_ref_frames = readUEtrace(_in, "SPS: num_ref_frames"); sps.gaps_in_frame_num_value_allowed_flag = readBool(_in, "SPS: gaps_in_frame_num_value_allowed_flag"); sps.pic_width_in_mbs_minus1 = readUEtrace(_in, "SPS: pic_width_in_mbs_minus1"); sps.pic_height_in_map_units_minus1 = readUEtrace(_in, "SPS: pic_height_in_map_units_minus1"); sps.frame_mbs_only_flag = readBool(_in, "SPS: frame_mbs_only_flag"); if (!sps.frame_mbs_only_flag) { sps.mb_adaptive_frame_field_flag = readBool(_in, "SPS: mb_adaptive_frame_field_flag"); } sps.direct_8x8_inference_flag = readBool(_in, "SPS: direct_8x8_inference_flag"); sps.frame_cropping_flag = readBool(_in, "SPS: frame_cropping_flag"); if (sps.frame_cropping_flag) { sps.frame_crop_left_offset = readUEtrace(_in, "SPS: frame_crop_left_offset"); sps.frame_crop_right_offset = readUEtrace(_in, "SPS: frame_crop_right_offset"); sps.frame_crop_top_offset = readUEtrace(_in, "SPS: frame_crop_top_offset"); sps.frame_crop_bottom_offset = readUEtrace(_in, "SPS: frame_crop_bottom_offset"); } boolean vui_parameters_present_flag = readBool(_in, "SPS: vui_parameters_present_flag"); if (vui_parameters_present_flag) sps.vuiParams = readVUIParameters(_in); return sps; } private static void readScalingListMatrix(BitReader _in, SeqParameterSet sps) { sps.scalingMatrix = new ScalingMatrix(); for (int i = 0; i < 8; i++) { boolean seqScalingListPresentFlag = readBool(_in, "SPS: seqScalingListPresentFlag"); if (seqScalingListPresentFlag) { sps.scalingMatrix.ScalingList4x4 = new ScalingList[8]; sps.scalingMatrix.ScalingList8x8 = new ScalingList[8]; if (i < 6) { sps.scalingMatrix.ScalingList4x4[i] = ScalingList.read(_in, 16); } else { sps.scalingMatrix.ScalingList8x8[i - 6] = ScalingList.read(_in, 64); } } } } private static VUIParameters readVUIParameters(BitReader _in) { VUIParameters vuip = new VUIParameters(); vuip.aspect_ratio_info_present_flag = readBool(_in, "VUI: aspect_ratio_info_present_flag"); if (vuip.aspect_ratio_info_present_flag) { vuip.aspect_ratio = AspectRatio.fromValue((int) readNBit(_in, 8, "VUI: aspect_ratio")); if (vuip.aspect_ratio == AspectRatio.Extended_SAR) { vuip.sar_width = (int) readNBit(_in, 16, "VUI: sar_width"); vuip.sar_height = (int) readNBit(_in, 16, "VUI: sar_height"); } } vuip.overscan_info_present_flag = readBool(_in, "VUI: overscan_info_present_flag"); if (vuip.overscan_info_present_flag) { vuip.overscan_appropriate_flag = readBool(_in, "VUI: overscan_appropriate_flag"); } vuip.video_signal_type_present_flag = readBool(_in, "VUI: video_signal_type_present_flag"); if (vuip.video_signal_type_present_flag) { vuip.video_format = (int) readNBit(_in, 3, "VUI: video_format"); vuip.video_full_range_flag = readBool(_in, "VUI: video_full_range_flag"); vuip.colour_description_present_flag = readBool(_in, "VUI: colour_description_present_flag"); if (vuip.colour_description_present_flag) { vuip.colour_primaries = (int) readNBit(_in, 8, "VUI: colour_primaries"); vuip.transfer_characteristics = (int) readNBit(_in, 8, "VUI: transfer_characteristics"); vuip.matrix_coefficients = (int) readNBit(_in, 8, "VUI: matrix_coefficients"); } } vuip.chroma_loc_info_present_flag = readBool(_in, "VUI: chroma_loc_info_present_flag"); if (vuip.chroma_loc_info_present_flag) { vuip.chroma_sample_loc_type_top_field = readUEtrace(_in, "VUI chroma_sample_loc_type_top_field"); vuip.chroma_sample_loc_type_bottom_field = readUEtrace(_in, "VUI chroma_sample_loc_type_bottom_field"); } vuip.timing_info_present_flag = readBool(_in, "VUI: timing_info_present_flag"); if (vuip.timing_info_present_flag) { vuip.num_units_in_tick = (int) readNBit(_in, 32, "VUI: num_units_in_tick"); vuip.time_scale = (int) readNBit(_in, 32, "VUI: time_scale"); vuip.fixed_frame_rate_flag = readBool(_in, "VUI: fixed_frame_rate_flag"); } boolean nal_hrd_parameters_present_flag = readBool(_in, "VUI: nal_hrd_parameters_present_flag"); if (nal_hrd_parameters_present_flag) vuip.nalHRDParams = readHRDParameters(_in); boolean vcl_hrd_parameters_present_flag = readBool(_in, "VUI: vcl_hrd_parameters_present_flag"); if (vcl_hrd_parameters_present_flag) vuip.vclHRDParams = readHRDParameters(_in); if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) { vuip.low_delay_hrd_flag = readBool(_in, "VUI: low_delay_hrd_flag"); } vuip.pic_struct_present_flag = readBool(_in, "VUI: pic_struct_present_flag"); boolean bitstream_restriction_flag = readBool(_in, "VUI: bitstream_restriction_flag"); if (bitstream_restriction_flag) { vuip.bitstreamRestriction = new VUIParameters.BitstreamRestriction(); vuip.bitstreamRestriction.motion_vectors_over_pic_boundaries_flag = readBool(_in, "VUI: motion_vectors_over_pic_boundaries_flag"); vuip.bitstreamRestriction.max_bytes_per_pic_denom = readUEtrace(_in, "VUI max_bytes_per_pic_denom"); vuip.bitstreamRestriction.max_bits_per_mb_denom = readUEtrace(_in, "VUI max_bits_per_mb_denom"); vuip.bitstreamRestriction.log2_max_mv_length_horizontal = readUEtrace(_in, "VUI log2_max_mv_length_horizontal"); vuip.bitstreamRestriction.log2_max_mv_length_vertical = readUEtrace(_in, "VUI log2_max_mv_length_vertical"); vuip.bitstreamRestriction.num_reorder_frames = readUEtrace(_in, "VUI num_reorder_frames"); vuip.bitstreamRestriction.max_dec_frame_buffering = readUEtrace(_in, "VUI max_dec_frame_buffering"); } return vuip; } private static HRDParameters readHRDParameters(BitReader _in) { HRDParameters hrd = new HRDParameters(); hrd.cpb_cnt_minus1 = readUEtrace(_in, "SPS: cpb_cnt_minus1"); hrd.bit_rate_scale = (int) readNBit(_in, 4, "HRD: bit_rate_scale"); hrd.cpb_size_scale = (int) readNBit(_in, 4, "HRD: cpb_size_scale"); hrd.bit_rate_value_minus1 = new int[hrd.cpb_cnt_minus1 + 1]; hrd.cpb_size_value_minus1 = new int[hrd.cpb_cnt_minus1 + 1]; hrd.cbr_flag = new boolean[hrd.cpb_cnt_minus1 + 1]; for (int SchedSelIdx = 0; SchedSelIdx <= hrd.cpb_cnt_minus1; SchedSelIdx++) { hrd.bit_rate_value_minus1[SchedSelIdx] = readUEtrace(_in, "HRD: bit_rate_value_minus1"); hrd.cpb_size_value_minus1[SchedSelIdx] = readUEtrace(_in, "HRD: cpb_size_value_minus1"); hrd.cbr_flag[SchedSelIdx] = readBool(_in, "HRD: cbr_flag"); } hrd.initial_cpb_removal_delay_length_minus1 = (int) readNBit(_in, 5, "HRD: initial_cpb_removal_delay_length_minus1"); hrd.cpb_removal_delay_length_minus1 = (int) readNBit(_in, 5, "HRD: cpb_removal_delay_length_minus1"); hrd.dpb_output_delay_length_minus1 = (int) readNBit(_in, 5, "HRD: dpb_output_delay_length_minus1"); hrd.time_offset_length = (int) readNBit(_in, 5, "HRD: time_offset_length"); return hrd; } public void write(ByteBuffer out) { BitWriter writer = new BitWriter(out); writeNBit(writer, profile_idc, 8, "SPS: profile_idc"); writeBool(writer, constraint_set_0_flag, "SPS: constraint_set_0_flag"); writeBool(writer, constraint_set_1_flag, "SPS: constraint_set_1_flag"); writeBool(writer, constraint_set_2_flag, "SPS: constraint_set_2_flag"); writeBool(writer, constraint_set_3_flag, "SPS: constraint_set_3_flag"); writeBool(writer, constraint_set_4_flag, "SPS: constraint_set_4_flag"); writeBool(writer, constraint_set_5_flag, "SPS: constraint_set_5_flag"); writeNBit(writer, 0, 2, "SPS: reserved"); writeNBit(writer, level_idc, 8, "SPS: level_idc"); writeUEtrace(writer, seq_parameter_set_id, "SPS: seq_parameter_set_id"); if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 144) { writeUEtrace(writer, fromColor(chroma_format_idc), "SPS: chroma_format_idc"); if (chroma_format_idc == YUV444) { writeBool(writer, residual_color_transform_flag, "SPS: residual_color_transform_flag"); } writeUEtrace(writer, bit_depth_luma_minus8, "SPS: "); writeUEtrace(writer, bit_depth_chroma_minus8, "SPS: "); writeBool(writer, qpprime_y_zero_transform_bypass_flag, "SPS: qpprime_y_zero_transform_bypass_flag"); writeBool(writer, scalingMatrix != null, "SPS: "); if (scalingMatrix != null) { for (int i = 0; i < 8; i++) { if (i < 6) { writeBool(writer, scalingMatrix.ScalingList4x4[i] != null, "SPS: "); if (scalingMatrix.ScalingList4x4[i] != null) { scalingMatrix.ScalingList4x4[i].write(writer); } } else { writeBool(writer, scalingMatrix.ScalingList8x8[i - 6] != null, "SPS: "); if (scalingMatrix.ScalingList8x8[i - 6] != null) { scalingMatrix.ScalingList8x8[i - 6].write(writer); } } } } } writeUEtrace(writer, log2_max_frame_num_minus4, "SPS: log2_max_frame_num_minus4"); writeUEtrace(writer, pic_order_cnt_type, "SPS: pic_order_cnt_type"); if (pic_order_cnt_type == 0) { writeUEtrace(writer, log2_max_pic_order_cnt_lsb_minus4, "SPS: log2_max_pic_order_cnt_lsb_minus4"); } else if (pic_order_cnt_type == 1) { writeBool(writer, delta_pic_order_always_zero_flag, "SPS: delta_pic_order_always_zero_flag"); writeSEtrace(writer, offset_for_non_ref_pic, "SPS: offset_for_non_ref_pic"); writeSEtrace(writer, offset_for_top_to_bottom_field, "SPS: offset_for_top_to_bottom_field"); writeUEtrace(writer, offsetForRefFrame.length, "SPS: "); for (int i = 0; i < offsetForRefFrame.length; i++) writeSEtrace(writer, offsetForRefFrame[i], "SPS: "); } writeUEtrace(writer, num_ref_frames, "SPS: num_ref_frames"); writeBool(writer, gaps_in_frame_num_value_allowed_flag, "SPS: gaps_in_frame_num_value_allowed_flag"); writeUEtrace(writer, pic_width_in_mbs_minus1, "SPS: pic_width_in_mbs_minus1"); writeUEtrace(writer, pic_height_in_map_units_minus1, "SPS: pic_height_in_map_units_minus1"); writeBool(writer, frame_mbs_only_flag, "SPS: frame_mbs_only_flag"); if (!frame_mbs_only_flag) { writeBool(writer, mb_adaptive_frame_field_flag, "SPS: mb_adaptive_frame_field_flag"); } writeBool(writer, direct_8x8_inference_flag, "SPS: direct_8x8_inference_flag"); writeBool(writer, frame_cropping_flag, "SPS: frame_cropping_flag"); if (frame_cropping_flag) { writeUEtrace(writer, frame_crop_left_offset, "SPS: frame_crop_left_offset"); writeUEtrace(writer, frame_crop_right_offset, "SPS: frame_crop_right_offset"); writeUEtrace(writer, frame_crop_top_offset, "SPS: frame_crop_top_offset"); writeUEtrace(writer, frame_crop_bottom_offset, "SPS: frame_crop_bottom_offset"); } writeBool(writer, vuiParams != null, "SPS: "); if (vuiParams != null) writeVUIParameters(vuiParams, writer); writeTrailingBits(writer); } private void writeVUIParameters(VUIParameters vuip, BitWriter writer) { writeBool(writer, vuip.aspect_ratio_info_present_flag, "VUI: aspect_ratio_info_present_flag"); if (vuip.aspect_ratio_info_present_flag) { writeNBit(writer, vuip.aspect_ratio.getValue(), 8, "VUI: aspect_ratio"); if (vuip.aspect_ratio == AspectRatio.Extended_SAR) { writeNBit(writer, vuip.sar_width, 16, "VUI: sar_width"); writeNBit(writer, vuip.sar_height, 16, "VUI: sar_height"); } } writeBool(writer, vuip.overscan_info_present_flag, "VUI: overscan_info_present_flag"); if (vuip.overscan_info_present_flag) { writeBool(writer, vuip.overscan_appropriate_flag, "VUI: overscan_appropriate_flag"); } writeBool(writer, vuip.video_signal_type_present_flag, "VUI: video_signal_type_present_flag"); if (vuip.video_signal_type_present_flag) { writeNBit(writer, vuip.video_format, 3, "VUI: video_format"); writeBool(writer, vuip.video_full_range_flag, "VUI: video_full_range_flag"); writeBool(writer, vuip.colour_description_present_flag, "VUI: colour_description_present_flag"); if (vuip.colour_description_present_flag) { writeNBit(writer, vuip.colour_primaries, 8, "VUI: colour_primaries"); writeNBit(writer, vuip.transfer_characteristics, 8, "VUI: transfer_characteristics"); writeNBit(writer, vuip.matrix_coefficients, 8, "VUI: matrix_coefficients"); } } writeBool(writer, vuip.chroma_loc_info_present_flag, "VUI: chroma_loc_info_present_flag"); if (vuip.chroma_loc_info_present_flag) { writeUEtrace(writer, vuip.chroma_sample_loc_type_top_field, "VUI: chroma_sample_loc_type_top_field"); writeUEtrace(writer, vuip.chroma_sample_loc_type_bottom_field, "VUI: chroma_sample_loc_type_bottom_field"); } writeBool(writer, vuip.timing_info_present_flag, "VUI: timing_info_present_flag"); if (vuip.timing_info_present_flag) { writeNBit(writer, vuip.num_units_in_tick, 32, "VUI: num_units_in_tick"); writeNBit(writer, vuip.time_scale, 32, "VUI: time_scale"); writeBool(writer, vuip.fixed_frame_rate_flag, "VUI: fixed_frame_rate_flag"); } writeBool(writer, vuip.nalHRDParams != null, "VUI: "); if (vuip.nalHRDParams != null) { writeHRDParameters(vuip.nalHRDParams, writer); } writeBool(writer, vuip.vclHRDParams != null, "VUI: "); if (vuip.vclHRDParams != null) { writeHRDParameters(vuip.vclHRDParams, writer); } if (vuip.nalHRDParams != null || vuip.vclHRDParams != null) { writeBool(writer, vuip.low_delay_hrd_flag, "VUI: low_delay_hrd_flag"); } writeBool(writer, vuip.pic_struct_present_flag, "VUI: pic_struct_present_flag"); writeBool(writer, vuip.bitstreamRestriction != null, "VUI: "); if (vuip.bitstreamRestriction != null) { writeBool(writer, vuip.bitstreamRestriction.motion_vectors_over_pic_boundaries_flag, "VUI: motion_vectors_over_pic_boundaries_flag"); writeUEtrace(writer, vuip.bitstreamRestriction.max_bytes_per_pic_denom, "VUI: max_bytes_per_pic_denom"); writeUEtrace(writer, vuip.bitstreamRestriction.max_bits_per_mb_denom, "VUI: max_bits_per_mb_denom"); writeUEtrace(writer, vuip.bitstreamRestriction.log2_max_mv_length_horizontal, "VUI: log2_max_mv_length_horizontal"); writeUEtrace(writer, vuip.bitstreamRestriction.log2_max_mv_length_vertical, "VUI: log2_max_mv_length_vertical"); writeUEtrace(writer, vuip.bitstreamRestriction.num_reorder_frames, "VUI: num_reorder_frames"); writeUEtrace(writer, vuip.bitstreamRestriction.max_dec_frame_buffering, "VUI: max_dec_frame_buffering"); } } private void writeHRDParameters(HRDParameters hrd, BitWriter writer) { writeUEtrace(writer, hrd.cpb_cnt_minus1, "HRD: cpb_cnt_minus1"); writeNBit(writer, hrd.bit_rate_scale, 4, "HRD: bit_rate_scale"); writeNBit(writer, hrd.cpb_size_scale, 4, "HRD: cpb_size_scale"); for (int SchedSelIdx = 0; SchedSelIdx <= hrd.cpb_cnt_minus1; SchedSelIdx++) { writeUEtrace(writer, hrd.bit_rate_value_minus1[SchedSelIdx], "HRD: "); writeUEtrace(writer, hrd.cpb_size_value_minus1[SchedSelIdx], "HRD: "); writeBool(writer, hrd.cbr_flag[SchedSelIdx], "HRD: "); } writeNBit(writer, hrd.initial_cpb_removal_delay_length_minus1, 5, "HRD: initial_cpb_removal_delay_length_minus1"); writeNBit(writer, hrd.cpb_removal_delay_length_minus1, 5, "HRD: cpb_removal_delay_length_minus1"); writeNBit(writer, hrd.dpb_output_delay_length_minus1, 5, "HRD: dpb_output_delay_length_minus1"); writeNBit(writer, hrd.time_offset_length, 5, "HRD: time_offset_length"); } public SeqParameterSet copy() { ByteBuffer buf = ByteBuffer.allocate(2048); write(buf); buf.flip(); return read(buf); } public int getPic_order_cnt_type() { return pic_order_cnt_type; } public boolean isField_pic_flag() { return field_pic_flag; } public boolean isDelta_pic_order_always_zero_flag() { return delta_pic_order_always_zero_flag; } public boolean isMb_adaptive_frame_field_flag() { return mb_adaptive_frame_field_flag; } public boolean isDirect_8x8_inference_flag() { return direct_8x8_inference_flag; } public ColorSpace getChroma_format_idc() { return chroma_format_idc; } public int getLog2_max_frame_num_minus4() { return log2_max_frame_num_minus4; } public int getLog2_max_pic_order_cnt_lsb_minus4() { return log2_max_pic_order_cnt_lsb_minus4; } public int getPic_height_in_map_units_minus1() { return pic_height_in_map_units_minus1; } public int getPic_width_in_mbs_minus1() { return pic_width_in_mbs_minus1; } public int getBit_depth_luma_minus8() { return bit_depth_luma_minus8; } public int getBit_depth_chroma_minus8() { return bit_depth_chroma_minus8; } public boolean isQpprime_y_zero_transform_bypass_flag() { return qpprime_y_zero_transform_bypass_flag; } public int getProfile_idc() { return profile_idc; } public boolean isConstraint_set_0_flag() { return constraint_set_0_flag; } public boolean isConstraint_set_1_flag() { return constraint_set_1_flag; } public boolean isConstraint_set_2_flag() { return constraint_set_2_flag; } public boolean isConstraint_set_3_flag() { return constraint_set_3_flag; } public boolean isConstraint_set_4_flag() { return constraint_set_4_flag; } public boolean isConstraint_set_5_flag() { return constraint_set_5_flag; } public int getLevel_idc() { return level_idc; } public int getSeq_parameter_set_id() { return seq_parameter_set_id; } public boolean isResidual_color_transform_flag() { return residual_color_transform_flag; } public int getOffset_for_non_ref_pic() { return offset_for_non_ref_pic; } public int getOffset_for_top_to_bottom_field() { return offset_for_top_to_bottom_field; } public int getNum_ref_frames() { return num_ref_frames; } public boolean isGaps_in_frame_num_value_allowed_flag() { return gaps_in_frame_num_value_allowed_flag; } public boolean isFrame_mbs_only_flag() { return frame_mbs_only_flag; } public boolean isFrame_cropping_flag() { return frame_cropping_flag; } public int getFrame_crop_left_offset() { return frame_crop_left_offset; } public int getFrame_crop_right_offset() { return frame_crop_right_offset; } public int getFrame_crop_top_offset() { return frame_crop_top_offset; } public int getFrame_crop_bottom_offset() { return frame_crop_bottom_offset; } public int[] getOffsetForRefFrame() { return offsetForRefFrame; } public VUIParameters getVuiParams() { return vuiParams; } public ScalingMatrix getScalingMatrix() { return scalingMatrix; } public int getNum_ref_frames_in_pic_order_cnt_cycle() { return num_ref_frames_in_pic_order_cnt_cycle; } public static int getPicHeightInMbs(SeqParameterSet sps) { int picHeightInMbs = (sps.pic_height_in_map_units_minus1 + 1) << (sps.frame_mbs_only_flag ? 0 : 1); return picHeightInMbs; } }