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}