PictureParameterSetpublic class PictureParameterSet extends BitstreamElement Picture Parameter Set entity of H264 bitstream
capable to serialize / deserialize with CAVLC bitstream |
Fields Summary |
---|
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 |
Methods Summary |
---|
public boolean | equals(java.lang.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;
| 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;
| public static com.googlecode.mp4parser.h264.model.PictureParameterSet | read(byte[] b)
return read(new ByteArrayInputStream(b));
| public static com.googlecode.mp4parser.h264.model.PictureParameterSet | read(java.io.InputStream is)
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 java.lang.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 +
'}";
| public void | write(java.io.OutputStream out)
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();
|
|