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.ByteArrayInputStream;
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException;
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.InputStream;
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.OutputStream;
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.Arrays;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Picture Parameter Set entity of H264 bitstream
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * <p/>
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * capable to serialize / deserialize with CAVLC bitstream
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @author Stanislav Vitvitskiy
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class PictureParameterSet extends BitstreamElement {
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static class PPSExt {
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public boolean transform_8x8_mode_flag;
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public ScalingMatrix scalindMatrix = new ScalingMatrix();
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int second_chroma_qp_index_offset;
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public boolean[] pic_scaling_list_present_flag;
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        @Override
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public String toString() {
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return "PPSExt{" +
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    "transform_8x8_mode_flag=" + transform_8x8_mode_flag +
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", scalindMatrix=" + scalindMatrix +
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", second_chroma_qp_index_offset=" + second_chroma_qp_index_offset +
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    ", pic_scaling_list_present_flag=" + pic_scaling_list_present_flag +
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    '}';
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean entropy_coding_mode_flag;
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int num_ref_idx_l0_active_minus1;
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int num_ref_idx_l1_active_minus1;
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int slice_group_change_rate_minus1;
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int pic_parameter_set_id;
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int seq_parameter_set_id;
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean pic_order_present_flag;
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int num_slice_groups_minus1;
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int slice_group_map_type;
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean weighted_pred_flag;
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int weighted_bipred_idc;
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int pic_init_qp_minus26;
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int pic_init_qs_minus26;
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int chroma_qp_index_offset;
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean deblocking_filter_control_present_flag;
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean constrained_intra_pred_flag;
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean redundant_pic_cnt_present_flag;
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int[] top_left;
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int[] bottom_right;
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int[] run_length_minus1;
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean slice_group_change_direction_flag;
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int[] slice_group_id;
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public PPSExt extended;
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static PictureParameterSet read(byte[] b) throws IOException {
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return read(new ByteArrayInputStream(b));
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static PictureParameterSet read(InputStream is) throws IOException {
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        CAVLCReader reader = new CAVLCReader(is);
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        PictureParameterSet pps = new PictureParameterSet();
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.pic_parameter_set_id = reader.readUE("PPS: pic_parameter_set_id");
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.seq_parameter_set_id = reader.readUE("PPS: seq_parameter_set_id");
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.entropy_coding_mode_flag = reader
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readBool("PPS: entropy_coding_mode_flag");
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.pic_order_present_flag = reader
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readBool("PPS: pic_order_present_flag");
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.num_slice_groups_minus1 = reader
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readUE("PPS: num_slice_groups_minus1");
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (pps.num_slice_groups_minus1 > 0) {
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.slice_group_map_type = reader
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    .readUE("PPS: slice_group_map_type");
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.top_left = new int[pps.num_slice_groups_minus1 + 1];
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.bottom_right = new int[pps.num_slice_groups_minus1 + 1];
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.run_length_minus1 = new int[pps.num_slice_groups_minus1 + 1];
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (pps.slice_group_map_type == 0)
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int iGroup = 0; iGroup <= pps.num_slice_groups_minus1; iGroup++)
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    pps.run_length_minus1[iGroup] = reader
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            .readUE("PPS: run_length_minus1");
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            else if (pps.slice_group_map_type == 2)
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int iGroup = 0; iGroup < pps.num_slice_groups_minus1; iGroup++) {
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    pps.top_left[iGroup] = reader.readUE("PPS: top_left");
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    pps.bottom_right[iGroup] = reader
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            .readUE("PPS: bottom_right");
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            else if (pps.slice_group_map_type == 3
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    || pps.slice_group_map_type == 4
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    || pps.slice_group_map_type == 5) {
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                pps.slice_group_change_direction_flag = reader
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        .readBool("PPS: slice_group_change_direction_flag");
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                pps.slice_group_change_rate_minus1 = reader
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        .readUE("PPS: slice_group_change_rate_minus1");
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else if (pps.slice_group_map_type == 6) {
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int NumberBitsPerSliceGroupId;
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                if (pps.num_slice_groups_minus1 + 1 > 4)
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 3;
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                else if (pps.num_slice_groups_minus1 + 1 > 2)
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 2;
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                else
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 1;
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int pic_size_in_map_units_minus1 = reader
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        .readUE("PPS: pic_size_in_map_units_minus1");
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                pps.slice_group_id = new int[pic_size_in_map_units_minus1 + 1];
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int i = 0; i <= pic_size_in_map_units_minus1; i++) {
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    pps.slice_group_id[i] = reader.readU(
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            NumberBitsPerSliceGroupId, "PPS: slice_group_id ["
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            + i + "]f");
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.num_ref_idx_l0_active_minus1 = reader
140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readUE("PPS: num_ref_idx_l0_active_minus1");
141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.num_ref_idx_l1_active_minus1 = reader
142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readUE("PPS: num_ref_idx_l1_active_minus1");
143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.weighted_pred_flag = reader.readBool("PPS: weighted_pred_flag");
144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.weighted_bipred_idc = (int) reader.readNBit(2,
145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: weighted_bipred_idc");
146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.pic_init_qp_minus26 = reader.readSE("PPS: pic_init_qp_minus26");
147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.pic_init_qs_minus26 = reader.readSE("PPS: pic_init_qs_minus26");
148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.chroma_qp_index_offset = reader
149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readSE("PPS: chroma_qp_index_offset");
150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.deblocking_filter_control_present_flag = reader
151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readBool("PPS: deblocking_filter_control_present_flag");
152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.constrained_intra_pred_flag = reader
153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readBool("PPS: constrained_intra_pred_flag");
154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        pps.redundant_pic_cnt_present_flag = reader
155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                .readBool("PPS: redundant_pic_cnt_present_flag");
156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (reader.moreRBSPData()) {
157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.extended = new PictureParameterSet.PPSExt();
158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.extended.transform_8x8_mode_flag = reader
159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    .readBool("PPS: transform_8x8_mode_flag");
160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            boolean pic_scaling_matrix_present_flag = reader
161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    .readBool("PPS: pic_scaling_matrix_present_flag");
162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (pic_scaling_matrix_present_flag) {
163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int i = 0; i < 6 + 2 * (pps.extended.transform_8x8_mode_flag ? 1
164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        : 0); i++) {
165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    boolean pic_scaling_list_present_flag = reader
166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            .readBool("PPS: pic_scaling_list_present_flag");
167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    if (pic_scaling_list_present_flag) {
168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        pps.extended.scalindMatrix.ScalingList4x4 = new ScalingList[8];
169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        pps.extended.scalindMatrix.ScalingList8x8 = new ScalingList[8];
170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        if (i < 6) {
171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            pps.extended.scalindMatrix.ScalingList4x4[i] = ScalingList
172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    .read(reader, 16);
173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        } else {
174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            pps.extended.scalindMatrix.ScalingList8x8[i - 6] = ScalingList
175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    .read(reader, 64);
176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        }
177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    }
178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            pps.extended.second_chroma_qp_index_offset = reader
181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    .readSE("PPS: second_chroma_qp_index_offset");
182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        reader.readTrailingBits();
185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return pps;
187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void write(OutputStream out) throws IOException {
190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        CAVLCWriter writer = new CAVLCWriter(out);
191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeUE(pic_parameter_set_id, "PPS: pic_parameter_set_id");
193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeUE(seq_parameter_set_id, "PPS: seq_parameter_set_id");
194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(entropy_coding_mode_flag,
195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: entropy_coding_mode_flag");
196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(pic_order_present_flag, "PPS: pic_order_present_flag");
197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeUE(num_slice_groups_minus1, "PPS: num_slice_groups_minus1");
198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (num_slice_groups_minus1 > 0) {
199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            writer.writeUE(slice_group_map_type, "PPS: slice_group_map_type");
200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            int[] top_left = new int[1];
201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            int[] bottom_right = new int[1];
202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            int[] run_length_minus1 = new int[1];
203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (slice_group_map_type == 0) {
204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++) {
205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    writer.writeUE(run_length_minus1[iGroup], "PPS: ");
206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else if (slice_group_map_type == 2) {
208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++) {
209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    writer.writeUE(top_left[iGroup], "PPS: ");
210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    writer.writeUE(bottom_right[iGroup], "PPS: ");
211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else if (slice_group_map_type == 3 || slice_group_map_type == 4
213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    || slice_group_map_type == 5) {
214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                writer.writeBool(slice_group_change_direction_flag,
215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        "PPS: slice_group_change_direction_flag");
216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                writer.writeUE(slice_group_change_rate_minus1,
217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        "PPS: slice_group_change_rate_minus1");
218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else if (slice_group_map_type == 6) {
219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int NumberBitsPerSliceGroupId;
220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                if (num_slice_groups_minus1 + 1 > 4)
221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 3;
222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                else if (num_slice_groups_minus1 + 1 > 2)
223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 2;
224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                else
225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    NumberBitsPerSliceGroupId = 1;
226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                writer.writeUE(slice_group_id.length, "PPS: ");
227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int i = 0; i <= slice_group_id.length; i++) {
228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    writer.writeU(slice_group_id[i], NumberBitsPerSliceGroupId);
229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeUE(num_ref_idx_l0_active_minus1,
233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: num_ref_idx_l0_active_minus1");
234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeUE(num_ref_idx_l1_active_minus1,
235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: num_ref_idx_l1_active_minus1");
236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(weighted_pred_flag, "PPS: weighted_pred_flag");
237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeNBit(weighted_bipred_idc, 2, "PPS: weighted_bipred_idc");
238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeSE(pic_init_qp_minus26, "PPS: pic_init_qp_minus26");
239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeSE(pic_init_qs_minus26, "PPS: pic_init_qs_minus26");
240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeSE(chroma_qp_index_offset, "PPS: chroma_qp_index_offset");
241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(deblocking_filter_control_present_flag,
242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: deblocking_filter_control_present_flag");
243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(constrained_intra_pred_flag,
244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: constrained_intra_pred_flag");
245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeBool(redundant_pic_cnt_present_flag,
246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "PPS: redundant_pic_cnt_present_flag");
247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (extended != null) {
248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            writer.writeBool(extended.transform_8x8_mode_flag,
249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    "PPS: transform_8x8_mode_flag");
250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            writer.writeBool(extended.scalindMatrix != null,
251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    "PPS: scalindMatrix");
252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (extended.scalindMatrix != null) {
253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int i = 0; i < 6 + 2 * (extended.transform_8x8_mode_flag ? 1
254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        : 0); i++) {
255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    if (i < 6) {
256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        writer
257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                .writeBool(
258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                        extended.scalindMatrix.ScalingList4x4[i] != null,
259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                        "PPS: ");
260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        if (extended.scalindMatrix.ScalingList4x4[i] != null) {
261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            extended.scalindMatrix.ScalingList4x4[i]
262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    .write(writer);
263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        }
264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    } else {
266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        writer
267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                .writeBool(
268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                        extended.scalindMatrix.ScalingList8x8[i - 6] != null,
269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                        "PPS: ");
270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        if (extended.scalindMatrix.ScalingList8x8[i - 6] != null) {
271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            extended.scalindMatrix.ScalingList8x8[i - 6]
272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    .write(writer);
273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        }
274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    }
275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            writer.writeSE(extended.second_chroma_qp_index_offset, "PPS: ");
278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
279dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
280dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writer.writeTrailingBits();
281dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
282dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
283dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
284dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int hashCode() {
285dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        final int prime = 31;
286dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int result = 1;
287dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + Arrays.hashCode(bottom_right);
288dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + chroma_qp_index_offset;
289dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + (constrained_intra_pred_flag ? 1231 : 1237);
290dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result
291dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                + (deblocking_filter_control_present_flag ? 1231 : 1237);
292dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + (entropy_coding_mode_flag ? 1231 : 1237);
293dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result
294dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                + ((extended == null) ? 0 : extended.hashCode());
295dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + num_ref_idx_l0_active_minus1;
296dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + num_ref_idx_l1_active_minus1;
297dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + num_slice_groups_minus1;
298dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + pic_init_qp_minus26;
299dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + pic_init_qs_minus26;
300dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + (pic_order_present_flag ? 1231 : 1237);
301dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + pic_parameter_set_id;
302dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result
303dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                + (redundant_pic_cnt_present_flag ? 1231 : 1237);
304dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + Arrays.hashCode(run_length_minus1);
305dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + seq_parameter_set_id;
306dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result
307dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                + (slice_group_change_direction_flag ? 1231 : 1237);
308dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + slice_group_change_rate_minus1;
309dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + Arrays.hashCode(slice_group_id);
310dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + slice_group_map_type;
311dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + Arrays.hashCode(top_left);
312dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + weighted_bipred_idc;
313dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        result = prime * result + (weighted_pred_flag ? 1231 : 1237);
314dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return result;
315dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
316dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
317dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
318dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean equals(Object obj) {
319dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (this == obj)
320dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return true;
321dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (obj == null)
322dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
323dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (getClass() != obj.getClass())
324dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
325dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        PictureParameterSet other = (PictureParameterSet) obj;
326dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (!Arrays.equals(bottom_right, other.bottom_right))
327dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
328dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (chroma_qp_index_offset != other.chroma_qp_index_offset)
329dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
330dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (constrained_intra_pred_flag != other.constrained_intra_pred_flag)
331dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
332dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (deblocking_filter_control_present_flag != other.deblocking_filter_control_present_flag)
333dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
334dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (entropy_coding_mode_flag != other.entropy_coding_mode_flag)
335dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
336dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (extended == null) {
337dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (other.extended != null)
338dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                return false;
339dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        } else if (!extended.equals(other.extended))
340dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
341dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (num_ref_idx_l0_active_minus1 != other.num_ref_idx_l0_active_minus1)
342dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
343dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (num_ref_idx_l1_active_minus1 != other.num_ref_idx_l1_active_minus1)
344dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
345dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (num_slice_groups_minus1 != other.num_slice_groups_minus1)
346dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
347dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (pic_init_qp_minus26 != other.pic_init_qp_minus26)
348dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
349dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (pic_init_qs_minus26 != other.pic_init_qs_minus26)
350dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
351dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (pic_order_present_flag != other.pic_order_present_flag)
352dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
353dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (pic_parameter_set_id != other.pic_parameter_set_id)
354dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
355dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (redundant_pic_cnt_present_flag != other.redundant_pic_cnt_present_flag)
356dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
357dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (!Arrays.equals(run_length_minus1, other.run_length_minus1))
358dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
359dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (seq_parameter_set_id != other.seq_parameter_set_id)
360dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
361dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (slice_group_change_direction_flag != other.slice_group_change_direction_flag)
362dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
363dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (slice_group_change_rate_minus1 != other.slice_group_change_rate_minus1)
364dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
365dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (!Arrays.equals(slice_group_id, other.slice_group_id))
366dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
367dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (slice_group_map_type != other.slice_group_map_type)
368dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
369dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (!Arrays.equals(top_left, other.top_left))
370dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
371dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (weighted_bipred_idc != other.weighted_bipred_idc)
372dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
373dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (weighted_pred_flag != other.weighted_pred_flag)
374dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return false;
375dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return true;
376dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
377dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
378dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
379dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String toString() {
380dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return "PictureParameterSet{" +
381dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "\n       entropy_coding_mode_flag=" + entropy_coding_mode_flag +
382dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       num_ref_idx_l0_active_minus1=" + num_ref_idx_l0_active_minus1 +
383dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       num_ref_idx_l1_active_minus1=" + num_ref_idx_l1_active_minus1 +
384dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       slice_group_change_rate_minus1=" + slice_group_change_rate_minus1 +
385dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       pic_parameter_set_id=" + pic_parameter_set_id +
386dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       seq_parameter_set_id=" + seq_parameter_set_id +
387dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       pic_order_present_flag=" + pic_order_present_flag +
388dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       num_slice_groups_minus1=" + num_slice_groups_minus1 +
389dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       slice_group_map_type=" + slice_group_map_type +
390dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       weighted_pred_flag=" + weighted_pred_flag +
391dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       weighted_bipred_idc=" + weighted_bipred_idc +
392dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       pic_init_qp_minus26=" + pic_init_qp_minus26 +
393dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       pic_init_qs_minus26=" + pic_init_qs_minus26 +
394dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       chroma_qp_index_offset=" + chroma_qp_index_offset +
395dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       deblocking_filter_control_present_flag=" + deblocking_filter_control_present_flag +
396dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       constrained_intra_pred_flag=" + constrained_intra_pred_flag +
397dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       redundant_pic_cnt_present_flag=" + redundant_pic_cnt_present_flag +
398dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       top_left=" + top_left +
399dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       bottom_right=" + bottom_right +
400dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       run_length_minus1=" + run_length_minus1 +
401dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       slice_group_change_direction_flag=" + slice_group_change_direction_flag +
402dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       slice_group_id=" + slice_group_id +
403dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ",\n       extended=" + extended +
404dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                '}';
405dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
406dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
407