ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

H264 SPS中得到宽高的代码(java)

2021-02-28 20:33:30  阅读:229  来源: 互联网

标签:java StartBit H264 SPS nLen int flag Ue buf


数据需要去掉头,SPS测试数据 byte[] buffer = new byte[]{103, 66, -64, 12, -38, 5, 7, -56, 7, -124, 2} 得到结果宽320高240.

public class H264SpsParser {
    private final static String TAG = H264SpsParser.class.getCanonicalName();
    private final static int NAL_HEADER = 0;

    private static int nStartBit = 0;


    private static int Ue(byte[] pBuff, int nLen) {
        int nZeroNum = 0;
        while (nStartBit < nLen * 8) {
            if ((pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8))) != 0) {
                break;
            }
            nZeroNum++;
            nStartBit++;
        }
        nStartBit++;

        int dwRet = 0;
        for (int i = 0; i < nZeroNum; i++) {
            dwRet <<= 1;
            if ((pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8))) != 0) {
                dwRet += 1;
            }
            nStartBit++;
        }
        return (1 << nZeroNum) - 1 + dwRet;
    }

    private static int Se(byte[] pBuff, int nLen) {
        int UeVal = Ue(pBuff, nLen);
        double k = UeVal;
        int nValue = (int) Math.ceil(k / 2);
        if (UeVal % 2 == 0) {
            nValue = -nValue;
        }
        return nValue;
    }

    private static int u(int BitCount, byte[] buf) {
        int dwRet = 0;
        for (int i = 0; i < BitCount; i++) {
            dwRet <<= 1;
            if ((buf[nStartBit / 8] & (0x80 >> (nStartBit % 8))) != 0) {
                dwRet += 1;
            }
            nStartBit++;
        }
        return dwRet;
    }

    private static boolean h264_decode_seq_parameter_set(byte[] buf, int nLen, int[] size) {
        nStartBit = 0;
        int forbidden_zero_bit = u(1, buf);
        int nal_ref_idc = u(2, buf);
        int nal_unit_type = u(5, buf);
        if (nal_unit_type == 7) {
            int profile_idc = u(8, buf);
            int constraint_set0_flag = u(1, buf);//(buf[1] & 0x80)>>7;
            int constraint_set1_flag = u(1, buf);//(buf[1] & 0x40)>>6;
            int constraint_set2_flag = u(1, buf);//(buf[1] & 0x20)>>5;
            int constraint_set3_flag = u(1, buf);//(buf[1] & 0x10)>>4;
            int reserved_zero_4bits = u(4, buf);
            int level_idc = u(8, buf);

            int seq_parameter_set_id = Ue(buf, nLen);

            if (profile_idc == 100 || profile_idc == 110 ||
                    profile_idc == 122 || profile_idc == 144) {
                int chroma_format_idc = Ue(buf, nLen);
                if (chroma_format_idc == 3) {
                    int residual_colour_transform_flag = u(1, buf);
                }
                int bit_depth_luma_minus8 = Ue(buf, nLen);
                int bit_depth_chroma_minus8 = Ue(buf, nLen);
                int qpprime_y_zero_transform_bypass_flag = u(1, buf);
                int seq_scaling_matrix_present_flag = u(1, buf);

                int[] seq_scaling_list_present_flag = new int[8];
                if (seq_scaling_matrix_present_flag != 0) {
                    for (int i = 0; i < 8; i++) {
                        seq_scaling_list_present_flag[i] = u(1, buf);
                    }
                }
            }
            int log2_max_frame_num_minus4 = Ue(buf, nLen);
            int pic_order_cnt_type = Ue(buf, nLen);
            if (pic_order_cnt_type == 0) {
                int log2_max_pic_order_cnt_lsb_minus4 = Ue(buf, nLen);
            } else if (pic_order_cnt_type == 1) {
                int delta_pic_order_always_zero_flag = u(1, buf);
                int offset_for_non_ref_pic = Se(buf, nLen);
                int offset_for_top_to_bottom_field = Se(buf, nLen);
                int num_ref_frames_in_pic_order_cnt_cycle = Ue(buf, nLen);

                int[] offset_for_ref_frame = new int[num_ref_frames_in_pic_order_cnt_cycle];
                for (int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
                    offset_for_ref_frame[i] = Se(buf, nLen);
                }
            }
            int num_ref_frames = Ue(buf, nLen);
            int gaps_in_frame_num_value_allowed_flag = u(1, buf);
            int pic_width_in_mbs_minus1 = Ue(buf, nLen);
            int pic_height_in_map_units_minus1 = Ue(buf, nLen);

            size[0] = (pic_width_in_mbs_minus1 + 1) * 16;
            size[1] = (pic_height_in_map_units_minus1 + 1) * 16;

/*
        int frame_mbs_only_flag=u(1,buf,StartBit);
        if(!frame_mbs_only_flag)
            int mb_adaptive_frame_field_flag=u(1,buf,StartBit);

        int direct_8x8_inference_flag=u(1,buf,StartBit);
        int frame_cropping_flag=u(1,buf,StartBit);
        if(frame_cropping_flag)
        {
            int frame_crop_left_offset=Ue(buf,nLen,StartBit);
            int frame_crop_right_offset=Ue(buf,nLen,StartBit);
            int frame_crop_top_offset=Ue(buf,nLen,StartBit);
            int frame_crop_bottom_offset=Ue(buf,nLen,StartBit);
        }
        int vui_parameter_present_flag=u(1,buf,StartBit);
        if(vui_parameter_present_flag)
        {
            int aspect_ratio_info_present_flag=u(1,buf,StartBit);
            if(aspect_ratio_info_present_flag)
            {
                int aspect_ratio_idc=u(8,buf,StartBit);
                if(aspect_ratio_idc==255)
                {
                    int sar_width=u(16,buf,StartBit);
                    int sar_height=u(16,buf,StartBit);
                }
            }
            int overscan_info_present_flag=u(1,buf,StartBit);
            if(overscan_info_present_flag)
                int overscan_appropriate_flagu=u(1,buf,StartBit);
            int video_signal_type_present_flag=u(1,buf,StartBit);
            if(video_signal_type_present_flag)
            {
                int video_format=u(3,buf,StartBit);
                int video_full_range_flag=u(1,buf,StartBit);
                int colour_description_present_flag=u(1,buf,StartBit);
                if(colour_description_present_flag)
                {
                    int colour_primaries=u(8,buf,StartBit);
                    int transfer_characteristics=u(8,buf,StartBit);
                    int matrix_coefficients=u(8,buf,StartBit);
                }
            }
            int chroma_loc_info_present_flag=u(1,buf,StartBit);
            if(chroma_loc_info_present_flag)
            {
                int chroma_sample_loc_type_top_field=Ue(buf,nLen,StartBit);
                int chroma_sample_loc_type_bottom_field=Ue(buf,nLen,StartBit);
            }
            int timing_info_present_flag=u(1,buf,StartBit);

            if(timing_info_present_flag)
            {
                int num_units_in_tick=u(32,buf,StartBit);
                int time_scale=u(32,buf,StartBit);
                fps=time_scale/num_units_in_tick;
                int fixed_frame_rate_flag=u(1,buf,StartBit);
                if(fixed_frame_rate_flag)
                {
                    fps=fps/2;
                }
            }
        }
*/
            return true;
        }
        return false;
    }

    public static int[] getSizeFromSps(byte[] data) {
//        for (int i=0; i<data.length-4; i++)
//        {
            if (data[i]==0 && data[i+1]==0 && data[i+2]==0 && data[i+3]==1 && data[i+4]==0x67)
            {
                int[] size = new int[2];
                h264_decode_seq_parameter_set(data, data.length, size);
                Log.d(TAG, "Sps=("+size[0]+", "+size[1]+")");
                return size;
            }
//        }
        int[] size = new int[2];
        h264_decode_seq_parameter_set(data, data.length, size);
        Log.e(TAG, "Sps=(" + size[0] + ", " + size[1] + ")");
        return size;
    }

}

 

标签:java,StartBit,H264,SPS,nLen,int,flag,Ue,buf
来源: https://blog.csdn.net/xiaopangcame/article/details/114239161

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有