summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base')
-rw-r--r--isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base406
1 files changed, 406 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base b/isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base
new file mode 100644
index 0000000..9154c38
--- /dev/null
+++ b/isoparser/src/main/java/com/googlecode/mp4parser/h264/model/.svn/text-base/PictureParameterSet.java.svn-base
@@ -0,0 +1,406 @@
+/*
+Copyright (c) 2011 Stanislav Vitvitskiy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+package com.googlecode.mp4parser.h264.model;
+
+import com.googlecode.mp4parser.h264.read.CAVLCReader;
+import com.googlecode.mp4parser.h264.write.CAVLCWriter;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+/**
+ * Picture Parameter Set entity of H264 bitstream
+ * <p/>
+ * capable to serialize / deserialize with CAVLC bitstream
+ *
+ * @author Stanislav Vitvitskiy
+ */
+public class PictureParameterSet extends BitstreamElement {
+
+ public static class PPSExt {
+ public boolean transform_8x8_mode_flag;
+ public ScalingMatrix scalindMatrix = new ScalingMatrix();
+ public int second_chroma_qp_index_offset;
+ public boolean[] pic_scaling_list_present_flag;
+
+ @Override
+ public String toString() {
+ return "PPSExt{" +
+ "transform_8x8_mode_flag=" + transform_8x8_mode_flag +
+ ", scalindMatrix=" + scalindMatrix +
+ ", second_chroma_qp_index_offset=" + second_chroma_qp_index_offset +
+ ", pic_scaling_list_present_flag=" + pic_scaling_list_present_flag +
+ '}';
+ }
+ }
+
+ public boolean entropy_coding_mode_flag;
+ public int num_ref_idx_l0_active_minus1;
+ public int num_ref_idx_l1_active_minus1;
+ public int slice_group_change_rate_minus1;
+ public int pic_parameter_set_id;
+ public int seq_parameter_set_id;
+ public boolean pic_order_present_flag;
+ public int num_slice_groups_minus1;
+ public int slice_group_map_type;
+ public boolean weighted_pred_flag;
+ public int weighted_bipred_idc;
+ public int pic_init_qp_minus26;
+ public int pic_init_qs_minus26;
+ public int chroma_qp_index_offset;
+ public boolean deblocking_filter_control_present_flag;
+ public boolean constrained_intra_pred_flag;
+ public boolean redundant_pic_cnt_present_flag;
+ public int[] top_left;
+ public int[] bottom_right;
+ public int[] run_length_minus1;
+ public boolean slice_group_change_direction_flag;
+ public int[] slice_group_id;
+ public PPSExt extended;
+
+ public static PictureParameterSet read(byte[] b) throws IOException {
+ return read(new ByteArrayInputStream(b));
+ }
+
+ public static PictureParameterSet read(InputStream is) throws IOException {
+ CAVLCReader reader = new CAVLCReader(is);
+ PictureParameterSet pps = new PictureParameterSet();
+
+ pps.pic_parameter_set_id = reader.readUE("PPS: pic_parameter_set_id");
+ pps.seq_parameter_set_id = reader.readUE("PPS: seq_parameter_set_id");
+ pps.entropy_coding_mode_flag = reader
+ .readBool("PPS: entropy_coding_mode_flag");
+ pps.pic_order_present_flag = reader
+ .readBool("PPS: pic_order_present_flag");
+ pps.num_slice_groups_minus1 = reader
+ .readUE("PPS: num_slice_groups_minus1");
+ if (pps.num_slice_groups_minus1 > 0) {
+ pps.slice_group_map_type = reader
+ .readUE("PPS: slice_group_map_type");
+ pps.top_left = new int[pps.num_slice_groups_minus1 + 1];
+ pps.bottom_right = new int[pps.num_slice_groups_minus1 + 1];
+ pps.run_length_minus1 = new int[pps.num_slice_groups_minus1 + 1];
+ if (pps.slice_group_map_type == 0)
+ for (int iGroup = 0; iGroup <= pps.num_slice_groups_minus1; iGroup++)
+ pps.run_length_minus1[iGroup] = reader
+ .readUE("PPS: run_length_minus1");
+ else if (pps.slice_group_map_type == 2)
+ for (int iGroup = 0; iGroup < pps.num_slice_groups_minus1; iGroup++) {
+ pps.top_left[iGroup] = reader.readUE("PPS: top_left");
+ pps.bottom_right[iGroup] = reader
+ .readUE("PPS: bottom_right");
+ }
+ else if (pps.slice_group_map_type == 3
+ || pps.slice_group_map_type == 4
+ || pps.slice_group_map_type == 5) {
+ pps.slice_group_change_direction_flag = reader
+ .readBool("PPS: slice_group_change_direction_flag");
+ pps.slice_group_change_rate_minus1 = reader
+ .readUE("PPS: slice_group_change_rate_minus1");
+ } else if (pps.slice_group_map_type == 6) {
+ int NumberBitsPerSliceGroupId;
+ if (pps.num_slice_groups_minus1 + 1 > 4)
+ NumberBitsPerSliceGroupId = 3;
+ else if (pps.num_slice_groups_minus1 + 1 > 2)
+ NumberBitsPerSliceGroupId = 2;
+ else
+ NumberBitsPerSliceGroupId = 1;
+ int pic_size_in_map_units_minus1 = reader
+ .readUE("PPS: pic_size_in_map_units_minus1");
+ pps.slice_group_id = new int[pic_size_in_map_units_minus1 + 1];
+ for (int i = 0; i <= pic_size_in_map_units_minus1; i++) {
+ pps.slice_group_id[i] = reader.readU(
+ NumberBitsPerSliceGroupId, "PPS: slice_group_id ["
+ + i + "]f");
+ }
+ }
+ }
+ pps.num_ref_idx_l0_active_minus1 = reader
+ .readUE("PPS: num_ref_idx_l0_active_minus1");
+ pps.num_ref_idx_l1_active_minus1 = reader
+ .readUE("PPS: num_ref_idx_l1_active_minus1");
+ pps.weighted_pred_flag = reader.readBool("PPS: weighted_pred_flag");
+ pps.weighted_bipred_idc = (int) reader.readNBit(2,
+ "PPS: weighted_bipred_idc");
+ pps.pic_init_qp_minus26 = reader.readSE("PPS: pic_init_qp_minus26");
+ pps.pic_init_qs_minus26 = reader.readSE("PPS: pic_init_qs_minus26");
+ pps.chroma_qp_index_offset = reader
+ .readSE("PPS: chroma_qp_index_offset");
+ pps.deblocking_filter_control_present_flag = reader
+ .readBool("PPS: deblocking_filter_control_present_flag");
+ pps.constrained_intra_pred_flag = reader
+ .readBool("PPS: constrained_intra_pred_flag");
+ pps.redundant_pic_cnt_present_flag = reader
+ .readBool("PPS: redundant_pic_cnt_present_flag");
+ if (reader.moreRBSPData()) {
+ pps.extended = new PictureParameterSet.PPSExt();
+ pps.extended.transform_8x8_mode_flag = reader
+ .readBool("PPS: transform_8x8_mode_flag");
+ boolean pic_scaling_matrix_present_flag = reader
+ .readBool("PPS: pic_scaling_matrix_present_flag");
+ if (pic_scaling_matrix_present_flag) {
+ for (int i = 0; i < 6 + 2 * (pps.extended.transform_8x8_mode_flag ? 1
+ : 0); i++) {
+ boolean pic_scaling_list_present_flag = reader
+ .readBool("PPS: pic_scaling_list_present_flag");
+ if (pic_scaling_list_present_flag) {
+ pps.extended.scalindMatrix.ScalingList4x4 = new ScalingList[8];
+ pps.extended.scalindMatrix.ScalingList8x8 = new ScalingList[8];
+ if (i < 6) {
+ pps.extended.scalindMatrix.ScalingList4x4[i] = ScalingList
+ .read(reader, 16);
+ } else {
+ pps.extended.scalindMatrix.ScalingList8x8[i - 6] = ScalingList
+ .read(reader, 64);
+ }
+ }
+ }
+ }
+ pps.extended.second_chroma_qp_index_offset = reader
+ .readSE("PPS: second_chroma_qp_index_offset");
+ }
+
+ reader.readTrailingBits();
+
+ return pps;
+ }
+
+ public void write(OutputStream out) throws IOException {
+ CAVLCWriter writer = new CAVLCWriter(out);
+
+ writer.writeUE(pic_parameter_set_id, "PPS: pic_parameter_set_id");
+ writer.writeUE(seq_parameter_set_id, "PPS: seq_parameter_set_id");
+ writer.writeBool(entropy_coding_mode_flag,
+ "PPS: entropy_coding_mode_flag");
+ writer.writeBool(pic_order_present_flag, "PPS: pic_order_present_flag");
+ writer.writeUE(num_slice_groups_minus1, "PPS: num_slice_groups_minus1");
+ if (num_slice_groups_minus1 > 0) {
+ writer.writeUE(slice_group_map_type, "PPS: slice_group_map_type");
+ int[] top_left = new int[1];
+ int[] bottom_right = new int[1];
+ int[] run_length_minus1 = new int[1];
+ if (slice_group_map_type == 0) {
+ for (int iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++) {
+ writer.writeUE(run_length_minus1[iGroup], "PPS: ");
+ }
+ } else if (slice_group_map_type == 2) {
+ for (int iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++) {
+ writer.writeUE(top_left[iGroup], "PPS: ");
+ writer.writeUE(bottom_right[iGroup], "PPS: ");
+ }
+ } else if (slice_group_map_type == 3 || slice_group_map_type == 4
+ || slice_group_map_type == 5) {
+ writer.writeBool(slice_group_change_direction_flag,
+ "PPS: slice_group_change_direction_flag");
+ writer.writeUE(slice_group_change_rate_minus1,
+ "PPS: slice_group_change_rate_minus1");
+ } else if (slice_group_map_type == 6) {
+ int NumberBitsPerSliceGroupId;
+ if (num_slice_groups_minus1 + 1 > 4)
+ NumberBitsPerSliceGroupId = 3;
+ else if (num_slice_groups_minus1 + 1 > 2)
+ NumberBitsPerSliceGroupId = 2;
+ else
+ NumberBitsPerSliceGroupId = 1;
+ writer.writeUE(slice_group_id.length, "PPS: ");
+ for (int i = 0; i <= slice_group_id.length; i++) {
+ writer.writeU(slice_group_id[i], NumberBitsPerSliceGroupId);
+ }
+ }
+ }
+ writer.writeUE(num_ref_idx_l0_active_minus1,
+ "PPS: num_ref_idx_l0_active_minus1");
+ writer.writeUE(num_ref_idx_l1_active_minus1,
+ "PPS: num_ref_idx_l1_active_minus1");
+ writer.writeBool(weighted_pred_flag, "PPS: weighted_pred_flag");
+ writer.writeNBit(weighted_bipred_idc, 2, "PPS: weighted_bipred_idc");
+ writer.writeSE(pic_init_qp_minus26, "PPS: pic_init_qp_minus26");
+ writer.writeSE(pic_init_qs_minus26, "PPS: pic_init_qs_minus26");
+ writer.writeSE(chroma_qp_index_offset, "PPS: chroma_qp_index_offset");
+ writer.writeBool(deblocking_filter_control_present_flag,
+ "PPS: deblocking_filter_control_present_flag");
+ writer.writeBool(constrained_intra_pred_flag,
+ "PPS: constrained_intra_pred_flag");
+ writer.writeBool(redundant_pic_cnt_present_flag,
+ "PPS: redundant_pic_cnt_present_flag");
+ if (extended != null) {
+ writer.writeBool(extended.transform_8x8_mode_flag,
+ "PPS: transform_8x8_mode_flag");
+ writer.writeBool(extended.scalindMatrix != null,
+ "PPS: scalindMatrix");
+ if (extended.scalindMatrix != null) {
+ for (int i = 0; i < 6 + 2 * (extended.transform_8x8_mode_flag ? 1
+ : 0); i++) {
+ if (i < 6) {
+ writer
+ .writeBool(
+ extended.scalindMatrix.ScalingList4x4[i] != null,
+ "PPS: ");
+ if (extended.scalindMatrix.ScalingList4x4[i] != null) {
+ extended.scalindMatrix.ScalingList4x4[i]
+ .write(writer);
+ }
+
+ } else {
+ writer
+ .writeBool(
+ extended.scalindMatrix.ScalingList8x8[i - 6] != null,
+ "PPS: ");
+ if (extended.scalindMatrix.ScalingList8x8[i - 6] != null) {
+ extended.scalindMatrix.ScalingList8x8[i - 6]
+ .write(writer);
+ }
+ }
+ }
+ }
+ writer.writeSE(extended.second_chroma_qp_index_offset, "PPS: ");
+ }
+
+ writer.writeTrailingBits();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + Arrays.hashCode(bottom_right);
+ result = prime * result + chroma_qp_index_offset;
+ result = prime * result + (constrained_intra_pred_flag ? 1231 : 1237);
+ result = prime * result
+ + (deblocking_filter_control_present_flag ? 1231 : 1237);
+ result = prime * result + (entropy_coding_mode_flag ? 1231 : 1237);
+ result = prime * result
+ + ((extended == null) ? 0 : extended.hashCode());
+ result = prime * result + num_ref_idx_l0_active_minus1;
+ result = prime * result + num_ref_idx_l1_active_minus1;
+ result = prime * result + num_slice_groups_minus1;
+ result = prime * result + pic_init_qp_minus26;
+ result = prime * result + pic_init_qs_minus26;
+ result = prime * result + (pic_order_present_flag ? 1231 : 1237);
+ result = prime * result + pic_parameter_set_id;
+ result = prime * result
+ + (redundant_pic_cnt_present_flag ? 1231 : 1237);
+ result = prime * result + Arrays.hashCode(run_length_minus1);
+ result = prime * result + seq_parameter_set_id;
+ result = prime * result
+ + (slice_group_change_direction_flag ? 1231 : 1237);
+ result = prime * result + slice_group_change_rate_minus1;
+ result = prime * result + Arrays.hashCode(slice_group_id);
+ result = prime * result + slice_group_map_type;
+ result = prime * result + Arrays.hashCode(top_left);
+ result = prime * result + weighted_bipred_idc;
+ result = prime * result + (weighted_pred_flag ? 1231 : 1237);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ PictureParameterSet other = (PictureParameterSet) obj;
+ if (!Arrays.equals(bottom_right, other.bottom_right))
+ return false;
+ if (chroma_qp_index_offset != other.chroma_qp_index_offset)
+ return false;
+ if (constrained_intra_pred_flag != other.constrained_intra_pred_flag)
+ return false;
+ if (deblocking_filter_control_present_flag != other.deblocking_filter_control_present_flag)
+ return false;
+ if (entropy_coding_mode_flag != other.entropy_coding_mode_flag)
+ return false;
+ if (extended == null) {
+ if (other.extended != null)
+ return false;
+ } else if (!extended.equals(other.extended))
+ return false;
+ if (num_ref_idx_l0_active_minus1 != other.num_ref_idx_l0_active_minus1)
+ return false;
+ if (num_ref_idx_l1_active_minus1 != other.num_ref_idx_l1_active_minus1)
+ return false;
+ if (num_slice_groups_minus1 != other.num_slice_groups_minus1)
+ return false;
+ if (pic_init_qp_minus26 != other.pic_init_qp_minus26)
+ return false;
+ if (pic_init_qs_minus26 != other.pic_init_qs_minus26)
+ return false;
+ if (pic_order_present_flag != other.pic_order_present_flag)
+ return false;
+ if (pic_parameter_set_id != other.pic_parameter_set_id)
+ return false;
+ if (redundant_pic_cnt_present_flag != other.redundant_pic_cnt_present_flag)
+ return false;
+ if (!Arrays.equals(run_length_minus1, other.run_length_minus1))
+ return false;
+ if (seq_parameter_set_id != other.seq_parameter_set_id)
+ return false;
+ if (slice_group_change_direction_flag != other.slice_group_change_direction_flag)
+ return false;
+ if (slice_group_change_rate_minus1 != other.slice_group_change_rate_minus1)
+ return false;
+ if (!Arrays.equals(slice_group_id, other.slice_group_id))
+ return false;
+ if (slice_group_map_type != other.slice_group_map_type)
+ return false;
+ if (!Arrays.equals(top_left, other.top_left))
+ return false;
+ if (weighted_bipred_idc != other.weighted_bipred_idc)
+ return false;
+ if (weighted_pred_flag != other.weighted_pred_flag)
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "PictureParameterSet{" +
+ "\n entropy_coding_mode_flag=" + entropy_coding_mode_flag +
+ ",\n num_ref_idx_l0_active_minus1=" + num_ref_idx_l0_active_minus1 +
+ ",\n num_ref_idx_l1_active_minus1=" + num_ref_idx_l1_active_minus1 +
+ ",\n slice_group_change_rate_minus1=" + slice_group_change_rate_minus1 +
+ ",\n pic_parameter_set_id=" + pic_parameter_set_id +
+ ",\n seq_parameter_set_id=" + seq_parameter_set_id +
+ ",\n pic_order_present_flag=" + pic_order_present_flag +
+ ",\n num_slice_groups_minus1=" + num_slice_groups_minus1 +
+ ",\n slice_group_map_type=" + slice_group_map_type +
+ ",\n weighted_pred_flag=" + weighted_pred_flag +
+ ",\n weighted_bipred_idc=" + weighted_bipred_idc +
+ ",\n pic_init_qp_minus26=" + pic_init_qp_minus26 +
+ ",\n pic_init_qs_minus26=" + pic_init_qs_minus26 +
+ ",\n chroma_qp_index_offset=" + chroma_qp_index_offset +
+ ",\n deblocking_filter_control_present_flag=" + deblocking_filter_control_present_flag +
+ ",\n constrained_intra_pred_flag=" + constrained_intra_pred_flag +
+ ",\n redundant_pic_cnt_present_flag=" + redundant_pic_cnt_present_flag +
+ ",\n top_left=" + top_left +
+ ",\n bottom_right=" + bottom_right +
+ ",\n run_length_minus1=" + run_length_minus1 +
+ ",\n slice_group_change_direction_flag=" + slice_group_change_direction_flag +
+ ",\n slice_group_id=" + slice_group_id +
+ ",\n extended=" + extended +
+ '}';
+ }
+}