sps定义如下:
H264SPSPaser:
/**
* Created by swing on 2018/12/27.
* SPS解析类
*/
public class H264SPSPaser {
private int startBit = 0;
public int getStartBit() {
return startBit;
}
/*
* 从数据流data中第StartBit位开始读,读bitCnt位,以无符号整形返回
*/
public short u(byte[] data, int bitCnt, int StartBit) {
short ret = 0;
int start = StartBit;
for (int i = 0; i < bitCnt; i++) {
ret <<= 1;
if ((data[start / 8] & (0x80 >> (start % 8))) != 0) {
ret += 1;
}
start++;
}
startBit = StartBit + bitCnt;
return ret;
}
/*
* 无符号指数哥伦布编码
* leadingZeroBits = ?1;
* for( b = 0; !b; leadingZeroBits++ )
* b = read_bits( 1 )
* 变量codeNum 按照如下方式赋值:
* codeNum = 2^leadingZeroBits ? 1 + read_bits( leadingZeroBits )
* 这里read_bits( leadingZeroBits )的返回值使用高位在先的二进制无符号整数表示。
*/
public short ue(byte[] data, int StartBit) {
short ret = 0;
int leadingZeroBits = -1;
int tempStartBit = StartBit;
for (int b = 0; b != 1; leadingZeroBits++) {//读到第一个不为0的数,计算前面0的个数
b = u(data, 1, tempStartBit++);
}
ret = (short) (Math.pow(2, leadingZeroBits) - 1 + u(data, leadingZeroBits, tempStartBit));
startBit = tempStartBit + leadingZeroBits;
return ret;
}
/*
* 有符号指数哥伦布编码
* 9.1.1 有符号指数哥伦布编码的映射过程
*按照9.1节规定,本过程的输入是codeNum。
*本过程的输出是se(v)的值。
*表9-3中给出了分配给codeNum的语法元素值的规则,语法元素值按照绝对值的升序排列,负值按照其绝对
*值参与排列,但列在绝对值相等的正值之后。
*表 9-3-有符号指数哥伦布编码语法元素se(v)值与codeNum的对应
*codeNum 语法元素值
* 0 0
* 1 1
* 2 ?1
* 3 2
* 4 ?2
* 5 3
* 6 ?3
* k (?1)^(k+1) Ceil( k&pide;2 )
*/
public int se(byte[] data, int StartBit) {
int ret = 0;
short codeNum = ue(data, StartBit);
ret = (int) (Math.pow(-1, codeNum + 1) * Math.ceil(codeNum / 2));
return ret;
}
/**
* chroma_format_idc = 0,表示 色彩为单色
* chroma_format_idc = 1,表示 YUV 4:2:0
* chroma_format_idc = 2,表示 YUV 4:2:2
* chroma_format_idc = 3,表示 YUV 4:4:4
*/
public int getWidth(SpsFrame sps) {
int width = (sps.getPic_width_in_mbs_minus_1() + 1) * 16;
if (sps.getFrame_cropping_flag() == 1) {
int crop_unit_x;
if (0 == sps.getChroma_format_idc()) {
crop_unit_x = 1;
} else if (1 == sps.getChroma_format_idc()) {
crop_unit_x = 2;
} else if (2 == sps.getChroma_format_idc()) {
crop_unit_x = 2;
} else {
crop_unit_x = 1;
}
width -= crop_unit_x * (sps.getFrame_crop_left_offset() + sps.getFrame_crop_right_offset());
}
return width;
}
/**
* chroma_format_idc = 0,表示 色彩为单色
* chroma_format_idc = 1,表示 YUV 4:2:0
* chroma_format_idc = 2,表示 YUV 4:2:2
* chroma_format_idc = 3,表示 YUV 4:4:4
*/
public int getHeight(SpsFrame sps) {
int height = (2 - sps.getFrame_mbs_only_flag()) * (sps.getPic_height_in_map_units_minus_1() + 1) * 16;
if (sps.getFrame_cropping_flag() == 1) {
int crop_unit_y;
if (0 == sps.getChroma_format_idc()) {
crop_unit_y = 2 - sps.getFrame_mbs_only_flag();
} else if (1 == sps.getChroma_format_idc()) {
crop_unit_y = 2 * (2 - sps.getFrame_mbs_only_flag());
} else if (2 == sps.getChroma_format_idc()) {
crop_unit_y = 2 - sps.getFrame_mbs_only_flag();
} else {
crop_unit_y = 2 - sps.getFrame_mbs_only_flag();
}
height -= crop_unit_y * (sps.getFrame_crop_top_offset() + sps.getFrame_crop_bottom_offset());
}
return height;
}
}
SpsFrame:
/**
* Created by swing on 2018/12/28.
*/
public class SpsFrame {
private int forbidden_zero_bit;
private int nal_ref_idc;
private int nal_unit_type;
private int profile_idc;
private int constraint_set0_flag;
private int constraint_set1_flag;
private int constraint_set2_flag;
private int constraint_set3_flag;
private int reserved_zero_4bits;
private int level_idc;
private int seq_parameter_set_id;
//if(profile_idc == 100||profile_idc == 110||profile_idc == 122||profile_idc == 144){
private int chroma_format_idc;
//if(chroma_format_idc == 3){
private int residual_colour_transform_flag;
//}
private int bit_depth_luma_minus8;
private int bit_depth_chroma_minus8;
private int qpprime_y_zero_transform_bypass_flag;
private int seq_scaling_matrix_present_flag;
//if(seq_scaling_matrix_present_flag ==1 ){
//for(8)
private int[] seq_scaling_list_present_flag = new int[8];
//}}
private int log2_max_frame_num_minus4;
private int pic_order_cnt_type;
//if(pic_order_cnt_type == 0)
private int log2_max_pic_order_cnt_lsb_minus4;
//else if(pic_order_cnt_type == 1){
private int delta_pic_order_always_zero_flag;
private int offset_for_non_ref_pic;
private int offset_for_top_to_bottom_field;
private int getNum_ref_frames_in_pic_prder_cnt_cycle;
//for(getNum_ref_frames_in_pic_prder_cnt_cycle)
private int[] offset_for_ref_frame;
//}
private int num_ref_frames;
private int gaps_in_frame_num_value_allowed_flag;
private int pic_width_in_mbs_minus_1;
private int pic_height_in_map_units_minus_1;
private int frame_mbs_only_flag;
//if(frame_mbs_only_flag == 0){
private int mb_adaptive_frame_field_flag;
//}
private int direct_8x8_inference_flag;
private int frame_cropping_flag;
//if(frame_cropping_flag == 1){
private int frame_crop_left_offset;
private int frame_crop_right_offset;
private int frame_crop_top_offset;
private int frame_crop_bottom_offset;
// }
private int vui_prameters_present_flag;
//if(vui_prameters_present_flag == 1){
private int vui_parameters;
private int rbsp_stop_one_bit;
// }
public SpsFrame getSpsFrame(byte[] sps) {
H264SPSPaser h264SPSPaser = new H264SPSPaser();
forbidden_zero_bit = h264SPSPaser.u(sps, 1, 0);
nal_ref_idc = h264SPSPaser.u(sps, 2, h264SPSPaser.getStartBit());
nal_unit_type = h264SPSPaser.u(sps, 5, h264SPSPaser.getStartBit());
profile_idc = h264SPSPaser.u(sps, 8, h264SPSPaser.getStartBit());
constraint_set0_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
constraint_set1_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
constraint_set2_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
constraint_set3_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
reserved_zero_4bits = h264SPSPaser.u(sps, 4, h264SPSPaser.getStartBit());
level_idc = h264SPSPaser.u(sps, 8, h264SPSPaser.getStartBit());
seq_parameter_set_id = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 144) {
chroma_format_idc = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
if (chroma_format_idc == 3) {
residual_colour_transform_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
}
bit_depth_luma_minus8 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
bit_depth_chroma_minus8 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
qpprime_y_zero_transform_bypass_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
seq_scaling_matrix_present_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
if (seq_scaling_matrix_present_flag == 1) {
seq_scaling_list_present_flag = new int[8];
for (int i = 0; i < 8; i++) {
seq_scaling_list_present_flag[i] = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
}
}
}
log2_max_frame_num_minus4 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
pic_order_cnt_type = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
if (pic_order_cnt_type == 0)
log2_max_pic_order_cnt_lsb_minus4 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
else if (pic_order_cnt_type == 1) {
delta_pic_order_always_zero_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
offset_for_non_ref_pic = h264SPSPaser.se(sps, h264SPSPaser.getStartBit());
offset_for_top_to_bottom_field = h264SPSPaser.se(sps, h264SPSPaser.getStartBit());
getNum_ref_frames_in_pic_prder_cnt_cycle = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
offset_for_ref_frame = new int[getNum_ref_frames_in_pic_prder_cnt_cycle];
for (int i = 0; i < getNum_ref_frames_in_pic_prder_cnt_cycle; i++) {
offset_for_ref_frame[i] = h264SPSPaser.se(sps, h264SPSPaser.getStartBit());
}
}
num_ref_frames = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
gaps_in_frame_num_value_allowed_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
pic_width_in_mbs_minus_1 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
pic_height_in_map_units_minus_1 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
frame_mbs_only_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
if (frame_mbs_only_flag == 0) {
mb_adaptive_frame_field_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
}
direct_8x8_inference_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
frame_cropping_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
if (frame_cropping_flag == 1) {
frame_crop_left_offset = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
frame_crop_right_offset = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
frame_crop_top_offset = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
frame_crop_bottom_offset = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
}
vui_prameters_present_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
if (vui_prameters_present_flag == 1) {
vui_parameters = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
}
rbsp_stop_one_bit = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
return this;
}
public int getForbidden_zero_bit() {
return forbidden_zero_bit;
}
public void setForbidden_zero_bit(int forbidden_zero_bit) {
this.forbidden_zero_bit = forbidden_zero_bit;
}
public int getNal_ref_idc() {
return nal_ref_idc;
}
public void setNal_ref_idc(int nal_ref_idc) {
this.nal_ref_idc = nal_ref_idc;
}
public int getNal_unit_type() {
return nal_unit_type;
}
public void setNal_unit_type(int nal_unit_type) {
this.nal_unit_type = nal_unit_type;
}
public int getProfile_idc() {
return profile_idc;
}
public void setProfile_idc(int profile_idc) {
this.profile_idc = profile_idc;
}
public int getConstraint_set0_flag() {
return constraint_set0_flag;
}
public void setConstraint_set0_flag(int constraint_set0_flag) {
this.constraint_set0_flag = constraint_set0_flag;
}
public int getConstraint_set1_flag() {
return constraint_set1_flag;
}
public void setConstraint_set1_flag(int constraint_set1_flag) {
this.constraint_set1_flag = constraint_set1_flag;
}
public int getConstraint_set2_flag() {
return constraint_set2_flag;
}
public void setConstraint_set2_flag(int constraint_set2_flag) {
this.constraint_set2_flag = constraint_set2_flag;
}
public int getConstraint_set3_flag() {
return constraint_set3_flag;
}
public void setConstraint_set3_flag(int constraint_set3_flag) {
this.constraint_set3_flag = constraint_set3_flag;
}
public int getReserved_zero_4bits() {
return reserved_zero_4bits;
}
public void setReserved_zero_4bits(int reserved_zero_4bits) {
this.reserved_zero_4bits = reserved_zero_4bits;
}
public int getLevel_idc() {
return level_idc;
}
public void setLevel_idc(int level_idc) {
this.level_idc = level_idc;
}
public int getSeq_parameter_set_id() {
return seq_parameter_set_id;
}
public void setSeq_parameter_set_id(int seq_parameter_set_id) {
this.seq_parameter_set_id = seq_parameter_set_id;
}
public int getChroma_format_idc() {
return chroma_format_idc;
}
public void setChroma_format_idc(int chroma_format_idc) {
this.chroma_format_idc = chroma_format_idc;
}
public int getResidual_colour_transform_flag() {
return residual_colour_transform_flag;
}
public void setResidual_colour_transform_flag(int residual_colour_transform_flag) {
this.residual_colour_transform_flag = residual_colour_transform_flag;
}
public int getBit_depth_luma_minus8() {
return bit_depth_luma_minus8;
}
public void setBit_depth_luma_minus8(int bit_depth_luma_minus8) {
this.bit_depth_luma_minus8 = bit_depth_luma_minus8;
}
public int getBit_depth_chroma_minus8() {
return bit_depth_chroma_minus8;
}
public void setBit_depth_chroma_minus8(int bit_depth_chroma_minus8) {
this.bit_depth_chroma_minus8 = bit_depth_chroma_minus8;
}
public int getQpprime_y_zero_transform_bypass_flag() {
return qpprime_y_zero_transform_bypass_flag;
}
public void setQpprime_y_zero_transform_bypass_flag(int qpprime_y_zero_transform_bypass_flag) {
this.qpprime_y_zero_transform_bypass_flag = qpprime_y_zero_transform_bypass_flag;
}
public int getSeq_scaling_matrix_present_flag() {
return seq_scaling_matrix_present_flag;
}
public void setSeq_scaling_matrix_present_flag(int seq_scaling_matrix_present_flag) {
this.seq_scaling_matrix_present_flag = seq_scaling_matrix_present_flag;
}
public int[] getSeq_scaling_list_present_flag() {
return seq_scaling_list_present_flag;
}
public void setSeq_scaling_list_present_flag(int[] seq_scaling_list_present_flag) {
this.seq_scaling_list_present_flag = seq_scaling_list_present_flag;
}
public int getLog2_max_frame_num_minus4() {
return log2_max_frame_num_minus4;
}
public void setLog2_max_frame_num_minus4(int log2_max_frame_num_minus4) {
this.log2_max_frame_num_minus4 = log2_max_frame_num_minus4;
}
public int getPic_order_cnt_type() {
return pic_order_cnt_type;
}
public void setPic_order_cnt_type(int pic_order_cnt_type) {
this.pic_order_cnt_type = pic_order_cnt_type;
}
public int getLog2_max_pic_order_cnt_lsb_minus4() {
return log2_max_pic_order_cnt_lsb_minus4;
}
public void setLog2_max_pic_order_cnt_lsb_minus4(int log2_max_pic_order_cnt_lsb_minus4) {
this.log2_max_pic_order_cnt_lsb_minus4 = log2_max_pic_order_cnt_lsb_minus4;
}
public int getDelta_pic_order_always_zero_flag() {
return delta_pic_order_always_zero_flag;
}
public void setDelta_pic_order_always_zero_flag(int delta_pic_order_always_zero_flag) {
this.delta_pic_order_always_zero_flag = delta_pic_order_always_zero_flag;
}
public int getOffset_for_non_ref_pic() {
return offset_for_non_ref_pic;
}
public void setOffset_for_non_ref_pic(int offset_for_non_ref_pic) {
this.offset_for_non_ref_pic = offset_for_non_ref_pic;
}
public int getOffset_for_top_to_bottom_field() {
return offset_for_top_to_bottom_field;
}
public void setOffset_for_top_to_bottom_field(int offset_for_top_to_bottom_field) {
this.offset_for_top_to_bottom_field = offset_for_top_to_bottom_field;
}
public int getGetNum_ref_frames_in_pic_prder_cnt_cycle() {
return getNum_ref_frames_in_pic_prder_cnt_cycle;
}
public void setGetNum_ref_frames_in_pic_prder_cnt_cycle(int getNum_ref_frames_in_pic_prder_cnt_cycle) {
this.getNum_ref_frames_in_pic_prder_cnt_cycle = getNum_ref_frames_in_pic_prder_cnt_cycle;
}
public int[] getOffset_for_ref_frame() {
return offset_for_ref_frame;
}
public void setOffset_for_ref_frame(int[] offset_for_ref_frame) {
this.offset_for_ref_frame = offset_for_ref_frame;
}
public int getNum_ref_frames() {
return num_ref_frames;
}
public void setNum_ref_frames(int num_ref_frames) {
this.num_ref_frames = num_ref_frames;
}
public int getGaps_in_frame_num_value_allowed_flag() {
return gaps_in_frame_num_value_allowed_flag;
}
public void setGaps_in_frame_num_value_allowed_flag(int gaps_in_frame_num_value_allowed_flag) {
this.gaps_in_frame_num_value_allowed_flag = gaps_in_frame_num_value_allowed_flag;
}
public int getPic_width_in_mbs_minus_1() {
return pic_width_in_mbs_minus_1;
}
public void setPic_width_in_mbs_minus_1(int pic_width_in_mbs_minus_1) {
this.pic_width_in_mbs_minus_1 = pic_width_in_mbs_minus_1;
}
public int getPic_height_in_map_units_minus_1() {
return pic_height_in_map_units_minus_1;
}
public void setPic_height_in_map_units_minus_1(int pic_height_in_map_units_minus_1) {
this.pic_height_in_map_units_minus_1 = pic_height_in_map_units_minus_1;
}
public int getFrame_mbs_only_flag() {
return frame_mbs_only_flag;
}
public void setFrame_mbs_only_flag(int frame_mbs_only_flag) {
this.frame_mbs_only_flag = frame_mbs_only_flag;
}
public int getMb_adaptive_frame_field_flag() {
return mb_adaptive_frame_field_flag;
}
public void setMb_adaptive_frame_field_flag(int mb_adaptive_frame_field_flag) {
this.mb_adaptive_frame_field_flag = mb_adaptive_frame_field_flag;
}
public int getDirect_8x8_inference_flag() {
return direct_8x8_inference_flag;
}
public void setDirect_8x8_inference_flag(int direct_8x8_inference_flag) {
this.direct_8x8_inference_flag = direct_8x8_inference_flag;
}
public int getFrame_cropping_flag() {
return frame_cropping_flag;
}
public void setFrame_cropping_flag(int frame_cropping_flag) {
this.frame_cropping_flag = frame_cropping_flag;
}
public int getFrame_crop_left_offset() {
return frame_crop_left_offset;
}
public void setFrame_crop_left_offset(int frame_crop_left_offset) {
this.frame_crop_left_offset = frame_crop_left_offset;
}
public int getFrame_crop_right_offset() {
return frame_crop_right_offset;
}
public void setFrame_crop_right_offset(int frame_crop_right_offset) {
this.frame_crop_right_offset = frame_crop_right_offset;
}
public int getFrame_crop_top_offset() {
return frame_crop_top_offset;
}
public void setFrame_crop_top_offset(int frame_crop_top_offset) {
this.frame_crop_top_offset = frame_crop_top_offset;
}
public int getFrame_crop_bottom_offset() {
return frame_crop_bottom_offset;
}
public void setFrame_crop_bottom_offset(int frame_crop_bottom_offset) {
this.frame_crop_bottom_offset = frame_crop_bottom_offset;
}
public int getVui_prameters_present_flag() {
return vui_prameters_present_flag;
}
public void setVui_prameters_present_flag(int vui_prameters_present_flag) {
this.vui_prameters_present_flag = vui_prameters_present_flag;
}
public int getVui_parameters() {
return vui_parameters;
}
public void setVui_parameters(int vui_parameters) {
this.vui_parameters = vui_parameters;
}
public int getRbsp_stop_one_bit() {
return rbsp_stop_one_bit;
}
public void setRbsp_stop_one_bit(int rbsp_stop_one_bit) {
this.rbsp_stop_one_bit = rbsp_stop_one_bit;
}
@Override
public String toString() {
return String.valueOf(forbidden_zero_bit) + "," +
String.valueOf(nal_ref_idc) + "," +
String.valueOf(nal_unit_type) + "," +
String.valueOf(profile_idc) + "," +
String.valueOf(constraint_set0_flag) + "," +
String.valueOf(constraint_set1_flag) + "," +
String.valueOf(constraint_set2_flag) + "," +
String.valueOf(constraint_set3_flag) + "," +
String.valueOf(reserved_zero_4bits) + "," +
String.valueOf(level_idc) + "," +
String.valueOf(seq_parameter_set_id) + "," +
String.valueOf(log2_max_frame_num_minus4) + "," +
String.valueOf(pic_order_cnt_type) + "," +
String.valueOf(log2_max_pic_order_cnt_lsb_minus4) + "," +
String.valueOf(num_ref_frames) + "," +
String.valueOf(gaps_in_frame_num_value_allowed_flag) + "," +
String.valueOf(pic_width_in_mbs_minus_1) + "," +
String.valueOf(pic_height_in_map_units_minus_1) + "," +
String.valueOf(frame_mbs_only_flag) + "," +
String.valueOf(direct_8x8_inference_flag) + "," +
String.valueOf(frame_cropping_flag) + "," +
String.valueOf(vui_prameters_present_flag) + "," +
String.valueOf(rbsp_stop_one_bit);
}
}
Test:
@Test
public void h264SPSPaserT() {
byte[] sps = {0x67, 0x42, 0x00, 0x0a, (byte) 0xf8, 0x41, (byte) 0xa2};
byte[] sps2 = {0x67, 0x42, 0x00, 0x0a, (byte) 0xf8, 0x41, (byte) 0xa2};
H264SPSPaser h264SPSPaser = new H264SPSPaser();
int forbidden_zero_bit = h264SPSPaser.u(sps, 1, 0);
int nal_ref_idc = h264SPSPaser.u(sps, 2, 1);
int nal_unit_type = h264SPSPaser.u(sps, 5, 3);
int profile_idc = h264SPSPaser.u(sps, 8, 8);
int constraint_set0_flag = h264SPSPaser.u(sps, 1, 16);
int constraint_set1_flag = h264SPSPaser.u(sps, 1, 17);
int constraint_set2_flag = h264SPSPaser.u(sps, 1, 18);
int constraint_set3_flag = h264SPSPaser.u(sps, 1, 19);
int reserved_zero_4bits = h264SPSPaser.u(sps, 4, 20);
int level_idc = h264SPSPaser.u(sps, 8, 24);
int seq_parameter_set_id = h264SPSPaser.ue(sps, 32);
int log2_max_frame_num_minus4 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int pic_order_cnt_type = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int log2_max_pic_order_cnt_lsb_minus4 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int num_ref_frames = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int gaps_in_frame_num_value_allowed_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
int pic_width_in_mbs_minus_1 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int pic_height_in_map_units_minus_1 = h264SPSPaser.ue(sps, h264SPSPaser.getStartBit());
int frame_mbs_only_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
int direct_8x8_inference_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
int frame_cropping_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
int vui_prameters_present_flag = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
int rbsp_stop_one_bit = h264SPSPaser.u(sps, 1, h264SPSPaser.getStartBit());
System.out.print(
String.valueOf(forbidden_zero_bit) + "," +
String.valueOf(nal_ref_idc) + "," +
String.valueOf(nal_unit_type) + "," +
String.valueOf(profile_idc) + "," +
String.valueOf(constraint_set0_flag) + "," +
String.valueOf(constraint_set1_flag) + "," +
String.valueOf(constraint_set2_flag) + "," +
String.valueOf(constraint_set3_flag) + "," +
String.valueOf(reserved_zero_4bits) + "," +
String.valueOf(level_idc) + "," +
String.valueOf(seq_parameter_set_id) + "," +
String.valueOf(log2_max_frame_num_minus4) + "," +
String.valueOf(pic_order_cnt_type) + "," +
String.valueOf(log2_max_pic_order_cnt_lsb_minus4) + "," +
String.valueOf(num_ref_frames) + "," +
String.valueOf(gaps_in_frame_num_value_allowed_flag) + "," +
String.valueOf(pic_width_in_mbs_minus_1) + "," +
String.valueOf(pic_height_in_map_units_minus_1) + "," +
String.valueOf(frame_mbs_only_flag) + "," +
String.valueOf(direct_8x8_inference_flag) + "," +
String.valueOf(frame_cropping_flag) + "," +
String.valueOf(vui_prameters_present_flag) + "," +
String.valueOf(rbsp_stop_one_bit) + "\n"
);
SpsFrame spsFrame = new SpsFrame().getSpsFrame(sps2);
System.out.print(spsFrame.toString()+ "\n");
System.out.print(h264SPSPaser.getWidth(spsFrame)+ "\n");
System.out.print(h264SPSPaser.getHeight(spsFrame)+ "\n");
assertEquals(rbsp_stop_one_bit, 1);
}
结果:
0,3,7,66,0,0,0,0,0,10,0,0,0,0,0,0,7,5,1,0,0,0,1
0,3,7,66,0,0,0,0,0,10,0,0,0,0,0,0,7,5,1,0,0,0,1
128
96