1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuCopyright (c) 2011 Stanislav Vitvitskiy 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPermission is hereby granted, free of charge, to any person obtaining a copy of this 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusoftware and associated documentation files (the "Software"), to deal in the Software 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuwithout restriction, including without limitation the rights to use, copy, modify, 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhumerge, publish, distribute, sublicense, and/or sell copies of the Software, and to 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupermit persons to whom the Software is furnished to do so, subject to the following 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconditions: 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuThe above copyright notice and this permission notice shall be included in all copies or 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusubstantial portions of the Software. 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOR OTHER DEALINGS IN THE SOFTWARE. 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/ 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.h264.model; 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.read.CAVLCReader; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.write.CAVLCWriter; 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.InputStream; 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.OutputStream; 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/** 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Sequence Parameter Set structure of h264 bitstream 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * <p/> 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * capable to serialize and deserialize with CAVLC bitstream 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @author Stanislav Vitvitskiy 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class SeqParameterSet extends BitstreamElement { 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int pic_order_cnt_type; 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean field_pic_flag; 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean delta_pic_order_always_zero_flag; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean weighted_pred_flag; 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int weighted_bipred_idc; 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean entropy_coding_mode_flag; 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean mb_adaptive_frame_field_flag; 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean direct_8x8_inference_flag; 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public ChromaFormat chroma_format_idc; 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int log2_max_frame_num_minus4; 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int log2_max_pic_order_cnt_lsb_minus4; 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int pic_height_in_map_units_minus1; 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int pic_width_in_mbs_minus1; 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int bit_depth_luma_minus8; 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int bit_depth_chroma_minus8; 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean qpprime_y_zero_transform_bypass_flag; 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int profile_idc; 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean constraint_set_0_flag; 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean constraint_set_1_flag; 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean constraint_set_2_flag; 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean constraint_set_3_flag; 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int level_idc; 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int seq_parameter_set_id; 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean residual_color_transform_flag; 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int offset_for_non_ref_pic; 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int offset_for_top_to_bottom_field; 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int num_ref_frames; 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean gaps_in_frame_num_value_allowed_flag; 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean frame_mbs_only_flag; 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public boolean frame_cropping_flag; 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int frame_crop_left_offset; 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int frame_crop_right_offset; 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int frame_crop_top_offset; 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int frame_crop_bottom_offset; 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int[] offsetForRefFrame; 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public VUIParameters vuiParams; 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public ScalingMatrix scalingMatrix; 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public int num_ref_frames_in_pic_order_cnt_cycle; 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static SeqParameterSet read(InputStream is) throws IOException { 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu CAVLCReader reader = new CAVLCReader(is); 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu SeqParameterSet sps = new SeqParameterSet(); 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.profile_idc = (int) reader.readNBit(8, "SPS: profile_idc"); 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.constraint_set_0_flag = reader 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: constraint_set_0_flag"); 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.constraint_set_1_flag = reader 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: constraint_set_1_flag"); 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.constraint_set_2_flag = reader 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: constraint_set_2_flag"); 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.constraint_set_3_flag = reader 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: constraint_set_3_flag"); 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu reader.readNBit(4, "SPS: reserved_zero_4bits"); 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.level_idc = (int) reader.readNBit(8, "SPS: level_idc"); 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.seq_parameter_set_id = reader.readUE("SPS: seq_parameter_set_id"); 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sps.profile_idc == 100 || sps.profile_idc == 110 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu || sps.profile_idc == 122 || sps.profile_idc == 144) { 96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.chroma_format_idc = ChromaFormat.fromId(reader 97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: chroma_format_idc")); 98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sps.chroma_format_idc == ChromaFormat.YUV_444) { 99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.residual_color_transform_flag = reader 100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: residual_color_transform_flag"); 101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.bit_depth_luma_minus8 = reader 103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: bit_depth_luma_minus8"); 104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.bit_depth_chroma_minus8 = reader 105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: bit_depth_chroma_minus8"); 106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.qpprime_y_zero_transform_bypass_flag = reader 107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: qpprime_y_zero_transform_bypass_flag"); 108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean seqScalingMatrixPresent = reader 109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: seq_scaling_matrix_present_lag"); 110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (seqScalingMatrixPresent) { 111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu readScalingListMatrix(reader, sps); 112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.chroma_format_idc = ChromaFormat.YUV_420; 115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.log2_max_frame_num_minus4 = reader 117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: log2_max_frame_num_minus4"); 118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.pic_order_cnt_type = reader.readUE("SPS: pic_order_cnt_type"); 119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sps.pic_order_cnt_type == 0) { 120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.log2_max_pic_order_cnt_lsb_minus4 = reader 121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: log2_max_pic_order_cnt_lsb_minus4"); 122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else if (sps.pic_order_cnt_type == 1) { 123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.delta_pic_order_always_zero_flag = reader 124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: delta_pic_order_always_zero_flag"); 125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.offset_for_non_ref_pic = reader 126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readSE("SPS: offset_for_non_ref_pic"); 127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.offset_for_top_to_bottom_field = reader 128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readSE("SPS: offset_for_top_to_bottom_field"); 129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.num_ref_frames_in_pic_order_cnt_cycle = reader 130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: num_ref_frames_in_pic_order_cnt_cycle"); 131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.offsetForRefFrame = new int[sps.num_ref_frames_in_pic_order_cnt_cycle]; 132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < sps.num_ref_frames_in_pic_order_cnt_cycle; i++) { 133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.offsetForRefFrame[i] = reader 134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readSE("SPS: offsetForRefFrame [" + i + "]"); 135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.num_ref_frames = reader.readUE("SPS: num_ref_frames"); 138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.gaps_in_frame_num_value_allowed_flag = reader 139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: gaps_in_frame_num_value_allowed_flag"); 140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.pic_width_in_mbs_minus1 = reader 141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: pic_width_in_mbs_minus1"); 142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.pic_height_in_map_units_minus1 = reader 143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: pic_height_in_map_units_minus1"); 144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_mbs_only_flag = reader.readBool("SPS: frame_mbs_only_flag"); 145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (!sps.frame_mbs_only_flag) { 146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.mb_adaptive_frame_field_flag = reader 147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: mb_adaptive_frame_field_flag"); 148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.direct_8x8_inference_flag = reader 150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: direct_8x8_inference_flag"); 151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_cropping_flag = reader.readBool("SPS: frame_cropping_flag"); 152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sps.frame_cropping_flag) { 153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_crop_left_offset = reader 154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: frame_crop_left_offset"); 155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_crop_right_offset = reader 156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: frame_crop_right_offset"); 157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_crop_top_offset = reader 158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: frame_crop_top_offset"); 159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.frame_crop_bottom_offset = reader 160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("SPS: frame_crop_bottom_offset"); 161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean vui_parameters_present_flag = reader 163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: vui_parameters_present_flag"); 164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vui_parameters_present_flag) 165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.vuiParams = ReadVUIParameters(reader); 166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu reader.readTrailingBits(); 168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return sps; 170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private static void readScalingListMatrix(CAVLCReader reader, 173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu SeqParameterSet sps) throws IOException { 174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.scalingMatrix = new ScalingMatrix(); 175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < 8; i++) { 176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean seqScalingListPresentFlag = reader 177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("SPS: seqScalingListPresentFlag"); 178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (seqScalingListPresentFlag) { 179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.scalingMatrix.ScalingList4x4 = new ScalingList[8]; 180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.scalingMatrix.ScalingList8x8 = new ScalingList[8]; 181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (i < 6) { 182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.scalingMatrix.ScalingList4x4[i] = ScalingList.read( 183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu reader, 16); 184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sps.scalingMatrix.ScalingList8x8[i - 6] = ScalingList.read( 186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu reader, 64); 187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private static VUIParameters ReadVUIParameters(CAVLCReader reader) 193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu VUIParameters vuip = new VUIParameters(); 195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.aspect_ratio_info_present_flag = reader 196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: aspect_ratio_info_present_flag"); 197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.aspect_ratio_info_present_flag) { 198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.aspect_ratio = AspectRatio.fromValue((int) reader.readNBit(8, 199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: aspect_ratio")); 200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.aspect_ratio == AspectRatio.Extended_SAR) { 201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.sar_width = (int) reader.readNBit(16, "VUI: sar_width"); 202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.sar_height = (int) reader.readNBit(16, "VUI: sar_height"); 203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.overscan_info_present_flag = reader 206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: overscan_info_present_flag"); 207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.overscan_info_present_flag) { 208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.overscan_appropriate_flag = reader 209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: overscan_appropriate_flag"); 210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.video_signal_type_present_flag = reader 212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: video_signal_type_present_flag"); 213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.video_signal_type_present_flag) { 214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.video_format = (int) reader.readNBit(3, "VUI: video_format"); 215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.video_full_range_flag = reader 216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: video_full_range_flag"); 217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.colour_description_present_flag = reader 218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: colour_description_present_flag"); 219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.colour_description_present_flag) { 220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.colour_primaries = (int) reader.readNBit(8, 221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: colour_primaries"); 222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.transfer_characteristics = (int) reader.readNBit(8, 223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: transfer_characteristics"); 224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.matrix_coefficients = (int) reader.readNBit(8, 225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: matrix_coefficients"); 226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.chroma_loc_info_present_flag = reader 229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: chroma_loc_info_present_flag"); 230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.chroma_loc_info_present_flag) { 231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.chroma_sample_loc_type_top_field = reader 232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI chroma_sample_loc_type_top_field"); 233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.chroma_sample_loc_type_bottom_field = reader 234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI chroma_sample_loc_type_bottom_field"); 235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.timing_info_present_flag = reader 237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: timing_info_present_flag"); 238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.timing_info_present_flag) { 239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.num_units_in_tick = (int) reader.readNBit(32, 240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: num_units_in_tick"); 241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.time_scale = (int) reader.readNBit(32, "VUI: time_scale"); 242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.fixed_frame_rate_flag = reader 243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: fixed_frame_rate_flag"); 244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean nal_hrd_parameters_present_flag = reader 246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: nal_hrd_parameters_present_flag"); 247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (nal_hrd_parameters_present_flag) 248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.nalHRDParams = readHRDParameters(reader); 249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean vcl_hrd_parameters_present_flag = reader 250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: vcl_hrd_parameters_present_flag"); 251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vcl_hrd_parameters_present_flag) 252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.vclHRDParams = readHRDParameters(reader); 253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) { 254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.low_delay_hrd_flag = reader 255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: low_delay_hrd_flag"); 256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.pic_struct_present_flag = reader 258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: pic_struct_present_flag"); 259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu boolean bitstream_restriction_flag = reader 260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: bitstream_restriction_flag"); 261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (bitstream_restriction_flag) { 262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction = new VUIParameters.BitstreamRestriction(); 263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.motion_vectors_over_pic_boundaries_flag = reader 264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readBool("VUI: motion_vectors_over_pic_boundaries_flag"); 265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.max_bytes_per_pic_denom = reader 266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI max_bytes_per_pic_denom"); 267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.max_bits_per_mb_denom = reader 268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI max_bits_per_mb_denom"); 269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.log2_max_mv_length_horizontal = reader 270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI log2_max_mv_length_horizontal"); 271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.log2_max_mv_length_vertical = reader 272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI log2_max_mv_length_vertical"); 273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.num_reorder_frames = reader 274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI num_reorder_frames"); 275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.max_dec_frame_buffering = reader 276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("VUI max_dec_frame_buffering"); 277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 279dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return vuip; 280dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 281dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 282dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private static HRDParameters readHRDParameters(CAVLCReader reader) 283dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 284dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu HRDParameters hrd = new HRDParameters(); 285dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cpb_cnt_minus1 = reader.readUE("SPS: cpb_cnt_minus1"); 286dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.bit_rate_scale = (int) reader.readNBit(4, "HRD: bit_rate_scale"); 287dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cpb_size_scale = (int) reader.readNBit(4, "HRD: cpb_size_scale"); 288dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.bit_rate_value_minus1 = new int[hrd.cpb_cnt_minus1 + 1]; 289dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cpb_size_value_minus1 = new int[hrd.cpb_cnt_minus1 + 1]; 290dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cbr_flag = new boolean[hrd.cpb_cnt_minus1 + 1]; 291dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 292dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int SchedSelIdx = 0; SchedSelIdx <= hrd.cpb_cnt_minus1; SchedSelIdx++) { 293dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.bit_rate_value_minus1[SchedSelIdx] = reader 294dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("HRD: bit_rate_value_minus1"); 295dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cpb_size_value_minus1[SchedSelIdx] = reader 296dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .readUE("HRD: cpb_size_value_minus1"); 297dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cbr_flag[SchedSelIdx] = reader.readBool("HRD: cbr_flag"); 298dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 299dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.initial_cpb_removal_delay_length_minus1 = (int) reader.readNBit(5, 300dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: initial_cpb_removal_delay_length_minus1"); 301dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.cpb_removal_delay_length_minus1 = (int) reader.readNBit(5, 302dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: cpb_removal_delay_length_minus1"); 303dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.dpb_output_delay_length_minus1 = (int) reader.readNBit(5, 304dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: dpb_output_delay_length_minus1"); 305dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu hrd.time_offset_length = (int) reader.readNBit(5, 306dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: time_offset_length"); 307dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return hrd; 308dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 309dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 310dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void write(OutputStream out) throws IOException { 311dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu CAVLCWriter writer = new CAVLCWriter(out); 312dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 313dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(profile_idc, 8, "SPS: profile_idc"); 314dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(constraint_set_0_flag, "SPS: constraint_set_0_flag"); 315dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(constraint_set_1_flag, "SPS: constraint_set_1_flag"); 316dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(constraint_set_2_flag, "SPS: constraint_set_2_flag"); 317dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(constraint_set_3_flag, "SPS: constraint_set_3_flag"); 318dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(0, 4, "SPS: reserved"); 319dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(level_idc, 8, "SPS: level_idc"); 320dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(seq_parameter_set_id, "SPS: seq_parameter_set_id"); 321dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 322dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 323dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu || profile_idc == 144) { 324dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(chroma_format_idc.getId(), "SPS: chroma_format_idc"); 325dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (chroma_format_idc == ChromaFormat.YUV_444) { 326dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(residual_color_transform_flag, 327dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: residual_color_transform_flag"); 328dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 329dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(bit_depth_luma_minus8, "SPS: "); 330dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(bit_depth_chroma_minus8, "SPS: "); 331dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(qpprime_y_zero_transform_bypass_flag, 332dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: qpprime_y_zero_transform_bypass_flag"); 333dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(scalingMatrix != null, "SPS: "); 334dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (scalingMatrix != null) { 335dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < 8; i++) { 336dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (i < 6) { 337dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool( 338dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu scalingMatrix.ScalingList4x4[i] != null, 339dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: "); 340dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (scalingMatrix.ScalingList4x4[i] != null) { 341dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu scalingMatrix.ScalingList4x4[i].write(writer); 342dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 343dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 344dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool( 345dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu scalingMatrix.ScalingList8x8[i - 6] != null, 346dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: "); 347dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (scalingMatrix.ScalingList8x8[i - 6] != null) { 348dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu scalingMatrix.ScalingList8x8[i - 6].write(writer); 349dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 350dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 351dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 352dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 353dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 354dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(log2_max_frame_num_minus4, 355dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: log2_max_frame_num_minus4"); 356dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(pic_order_cnt_type, "SPS: pic_order_cnt_type"); 357dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (pic_order_cnt_type == 0) { 358dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(log2_max_pic_order_cnt_lsb_minus4, 359dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: log2_max_pic_order_cnt_lsb_minus4"); 360dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else if (pic_order_cnt_type == 1) { 361dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(delta_pic_order_always_zero_flag, 362dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: delta_pic_order_always_zero_flag"); 363dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeSE(offset_for_non_ref_pic, 364dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: offset_for_non_ref_pic"); 365dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeSE(offset_for_top_to_bottom_field, 366dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: offset_for_top_to_bottom_field"); 367dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(offsetForRefFrame.length, "SPS: "); 368dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < offsetForRefFrame.length; i++) 369dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeSE(offsetForRefFrame[i], "SPS: "); 370dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 371dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(num_ref_frames, "SPS: num_ref_frames"); 372dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(gaps_in_frame_num_value_allowed_flag, 373dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: gaps_in_frame_num_value_allowed_flag"); 374dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(pic_width_in_mbs_minus1, "SPS: pic_width_in_mbs_minus1"); 375dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(pic_height_in_map_units_minus1, 376dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: pic_height_in_map_units_minus1"); 377dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(frame_mbs_only_flag, "SPS: frame_mbs_only_flag"); 378dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (!frame_mbs_only_flag) { 379dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(mb_adaptive_frame_field_flag, 380dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: mb_adaptive_frame_field_flag"); 381dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 382dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(direct_8x8_inference_flag, 383dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: direct_8x8_inference_flag"); 384dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(frame_cropping_flag, "SPS: frame_cropping_flag"); 385dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (frame_cropping_flag) { 386dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(frame_crop_left_offset, 387dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: frame_crop_left_offset"); 388dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(frame_crop_right_offset, 389dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: frame_crop_right_offset"); 390dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(frame_crop_top_offset, "SPS: frame_crop_top_offset"); 391dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(frame_crop_bottom_offset, 392dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "SPS: frame_crop_bottom_offset"); 393dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 394dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuiParams != null, "SPS: "); 395dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuiParams != null) 396dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeVUIParameters(vuiParams, writer); 397dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 398dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeTrailingBits(); 399dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 400dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 401dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private void writeVUIParameters(VUIParameters vuip, CAVLCWriter writer) 402dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 403dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.aspect_ratio_info_present_flag, 404dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: aspect_ratio_info_present_flag"); 405dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.aspect_ratio_info_present_flag) { 406dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.aspect_ratio.getValue(), 8, 407dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: aspect_ratio"); 408dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.aspect_ratio == AspectRatio.Extended_SAR) { 409dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.sar_width, 16, "VUI: sar_width"); 410dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.sar_height, 16, "VUI: sar_height"); 411dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 412dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 413dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.overscan_info_present_flag, 414dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: overscan_info_present_flag"); 415dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.overscan_info_present_flag) { 416dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.overscan_appropriate_flag, 417dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: overscan_appropriate_flag"); 418dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 419dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.video_signal_type_present_flag, 420dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: video_signal_type_present_flag"); 421dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.video_signal_type_present_flag) { 422dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.video_format, 3, "VUI: video_format"); 423dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.video_full_range_flag, 424dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: video_full_range_flag"); 425dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.colour_description_present_flag, 426dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: colour_description_present_flag"); 427dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.colour_description_present_flag) { 428dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.colour_primaries, 8, 429dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: colour_primaries"); 430dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.transfer_characteristics, 8, 431dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: transfer_characteristics"); 432dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.matrix_coefficients, 8, 433dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: matrix_coefficients"); 434dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 435dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 436dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.chroma_loc_info_present_flag, 437dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: chroma_loc_info_present_flag"); 438dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.chroma_loc_info_present_flag) { 439dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.chroma_sample_loc_type_top_field, 440dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: chroma_sample_loc_type_top_field"); 441dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.chroma_sample_loc_type_bottom_field, 442dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: chroma_sample_loc_type_bottom_field"); 443dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 444dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.timing_info_present_flag, 445dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: timing_info_present_flag"); 446dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.timing_info_present_flag) { 447dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.num_units_in_tick, 32, 448dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: num_units_in_tick"); 449dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(vuip.time_scale, 32, "VUI: time_scale"); 450dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.fixed_frame_rate_flag, 451dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: fixed_frame_rate_flag"); 452dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 453dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.nalHRDParams != null, "VUI: "); 454dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.nalHRDParams != null) { 455dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeHRDParameters(vuip.nalHRDParams, writer); 456dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 457dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.vclHRDParams != null, "VUI: "); 458dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.vclHRDParams != null) { 459dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeHRDParameters(vuip.vclHRDParams, writer); 460dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 461dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 462dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.nalHRDParams != null || vuip.vclHRDParams != null) { 463dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer 464dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .writeBool(vuip.low_delay_hrd_flag, 465dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: low_delay_hrd_flag"); 466dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 467dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.pic_struct_present_flag, 468dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: pic_struct_present_flag"); 469dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(vuip.bitstreamRestriction != null, "VUI: "); 470dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (vuip.bitstreamRestriction != null) { 471dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer 472dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu .writeBool( 473dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.motion_vectors_over_pic_boundaries_flag, 474dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: motion_vectors_over_pic_boundaries_flag"); 475dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.bitstreamRestriction.max_bytes_per_pic_denom, 476dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: max_bytes_per_pic_denom"); 477dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.bitstreamRestriction.max_bits_per_mb_denom, 478dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: max_bits_per_mb_denom"); 479dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE( 480dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.log2_max_mv_length_horizontal, 481dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: log2_max_mv_length_horizontal"); 482dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE( 483dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu vuip.bitstreamRestriction.log2_max_mv_length_vertical, 484dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: log2_max_mv_length_vertical"); 485dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.bitstreamRestriction.num_reorder_frames, 486dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: num_reorder_frames"); 487dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(vuip.bitstreamRestriction.max_dec_frame_buffering, 488dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "VUI: max_dec_frame_buffering"); 489dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 490dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 491dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 492dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 493dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private void writeHRDParameters(HRDParameters hrd, CAVLCWriter writer) 494dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 495dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(hrd.cpb_cnt_minus1, "HRD: cpb_cnt_minus1"); 496dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.bit_rate_scale, 4, "HRD: bit_rate_scale"); 497dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.cpb_size_scale, 4, "HRD: cpb_size_scale"); 498dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 499dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int SchedSelIdx = 0; SchedSelIdx <= hrd.cpb_cnt_minus1; SchedSelIdx++) { 500dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(hrd.bit_rate_value_minus1[SchedSelIdx], "HRD: "); 501dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeUE(hrd.cpb_size_value_minus1[SchedSelIdx], "HRD: "); 502dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeBool(hrd.cbr_flag[SchedSelIdx], "HRD: "); 503dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 504dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.initial_cpb_removal_delay_length_minus1, 5, 505dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: initial_cpb_removal_delay_length_minus1"); 506dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.cpb_removal_delay_length_minus1, 5, 507dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: cpb_removal_delay_length_minus1"); 508dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.dpb_output_delay_length_minus1, 5, 509dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "HRD: dpb_output_delay_length_minus1"); 510dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writer.writeNBit(hrd.time_offset_length, 5, "HRD: time_offset_length"); 511dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 512dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 513dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 514dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public String toString() { 515dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return "SeqParameterSet{ " + 516dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "\n pic_order_cnt_type=" + pic_order_cnt_type + 517dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n field_pic_flag=" + field_pic_flag + 518dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n delta_pic_order_always_zero_flag=" + delta_pic_order_always_zero_flag + 519dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n weighted_pred_flag=" + weighted_pred_flag + 520dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n weighted_bipred_idc=" + weighted_bipred_idc + 521dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n entropy_coding_mode_flag=" + entropy_coding_mode_flag + 522dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n mb_adaptive_frame_field_flag=" + mb_adaptive_frame_field_flag + 523dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n direct_8x8_inference_flag=" + direct_8x8_inference_flag + 524dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n chroma_format_idc=" + chroma_format_idc + 525dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n log2_max_frame_num_minus4=" + log2_max_frame_num_minus4 + 526dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n log2_max_pic_order_cnt_lsb_minus4=" + log2_max_pic_order_cnt_lsb_minus4 + 527dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n pic_height_in_map_units_minus1=" + pic_height_in_map_units_minus1 + 528dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n pic_width_in_mbs_minus1=" + pic_width_in_mbs_minus1 + 529dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n bit_depth_luma_minus8=" + bit_depth_luma_minus8 + 530dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n bit_depth_chroma_minus8=" + bit_depth_chroma_minus8 + 531dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n qpprime_y_zero_transform_bypass_flag=" + qpprime_y_zero_transform_bypass_flag + 532dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n profile_idc=" + profile_idc + 533dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n constraint_set_0_flag=" + constraint_set_0_flag + 534dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n constraint_set_1_flag=" + constraint_set_1_flag + 535dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n constraint_set_2_flag=" + constraint_set_2_flag + 536dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n constraint_set_3_flag=" + constraint_set_3_flag + 537dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n level_idc=" + level_idc + 538dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n seq_parameter_set_id=" + seq_parameter_set_id + 539dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n residual_color_transform_flag=" + residual_color_transform_flag + 540dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n offset_for_non_ref_pic=" + offset_for_non_ref_pic + 541dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n offset_for_top_to_bottom_field=" + offset_for_top_to_bottom_field + 542dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n num_ref_frames=" + num_ref_frames + 543dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n gaps_in_frame_num_value_allowed_flag=" + gaps_in_frame_num_value_allowed_flag + 544dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_mbs_only_flag=" + frame_mbs_only_flag + 545dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_cropping_flag=" + frame_cropping_flag + 546dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_crop_left_offset=" + frame_crop_left_offset + 547dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_crop_right_offset=" + frame_crop_right_offset + 548dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_crop_top_offset=" + frame_crop_top_offset + 549dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n frame_crop_bottom_offset=" + frame_crop_bottom_offset + 550dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n offsetForRefFrame=" + offsetForRefFrame + 551dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n vuiParams=" + vuiParams + 552dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n scalingMatrix=" + scalingMatrix + 553dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", \n num_ref_frames_in_pic_order_cnt_cycle=" + num_ref_frames_in_pic_order_cnt_cycle + 554dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu '}'; 555dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 556dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}