设为首页 加入收藏

TOP

h264文件分析(纯c解析代码)(二)
2019-03-10 22:08:03 】 浏览:653
Tags:h264 文件 分析 解析 代码
仔细证实): pic_order_cnt_type=2, 只有frame_num(无B帧);
71 pic_order_cnt_type=1, 暂未分析到; 72 pic_order_cnt_type=0, pic_order_cnt_lsb指示显示顺序, 一般为偶数增长(0, 2, 4, 6, 据说是什么场方式和帧方式, 场时其实是0 0 2 2 4 4). 73 74 ** 编码与显示的原因: 视频编码顺序与视频的播放顺序, 并不完全相同, 视频编码时, 如果采用了B帧编码, 由于B帧很多时候都是双向预测得来的, 75 这时会先编码B帧的后向预测图像(P帧), 然后再进行B帧编码, 因此会把视频原来的播放顺序打乱, 以新的编码顺序输出码流, 76 而在解码断接收到码流后, 需要把顺序还原成原本的播放顺序, 以输出正确的视频. 在编解码中, 视频的播放顺序序号叫做POC(picture order count). 77 78 ** 总结: 1. 码流中有很多SPS(序列), 一个序列中有多个图像, 一个图像中有多个片, 一个片中有多个块; 79 2. SPS中有seq_parameter_set_id. PPS中有pic_parameter_set_id, 并通过seq_parameter_set_id指明关联的序列. 80 SLICE中有pic_parameter_set_id, 指明关联的图像; 81 3. SPS中可计算宽高以及帧率, pic_order_cnt_type(显示顺序的类型); 82 SLICE HEADER中可算出解码的顺序, 以及根据pic_order_cnt_type算出显示顺序. 83 ************************************************************************************************************/ 84 typedef enum e_h264_nalu_priority 85 { 86 NALU_PRIORITY_DISPOSABLE = 0, 87 NALU_PRIORITY_LOW = 1, 88 NALU_PRIORITY_HIGH = 2, 89 NALU_PRIORITY_HIGHEST = 3, 90 } E_H264_NALU_PRIORITY; 91 92 typedef enum e_h264_nalu_type 93 { 94 NALU_TYPE_SLICE = 1, 95 NALU_TYPE_DPA = 2, 96 NALU_TYPE_DPB = 3, 97 NALU_TYPE_DPC = 4, 98 NALU_TYPE_IDR = 5, 99 NALU_TYPE_SEI = 6, 100 NALU_TYPE_SPS = 7, 101 NALU_TYPE_PPS = 8, 102 NALU_TYPE_AUD = 9, 103 NALU_TYPE_EOSEQ = 10, 104 NALU_TYPE_EOSTREAM = 11, 105 NALU_TYPE_FILL = 12, 106 } E_H264_NALU_TYPE; 107 108 typedef struct t_h264_nalu_header 109 { 110 unsigned char forbidden_bit:1, nal_reference_idc:2, nal_unit_type:5; 111 } T_H264_NALU_HEADER; 112 113 typedef struct t_h264_nalu 114 { 115 int startCodeLen; 116 117 T_H264_NALU_HEADER h264NaluHeader; 118 119 unsigned int bodyLen; 120 121 unsigned char *bodyData; 122 } T_H264_NALU; 123 124 /********************************************************************************** 125 1. h264的起始码: 0x000001(3 Bytes)或0x00000001(4 Bytes); 126 2. 文件流中用起始码来区分NALU. 127 ***********************************************************************************/ 128 static int FindStartCode3Bytes(unsigned char *scData) 129 { 130 int isFind = 0; 131 132 if ((0==scData[0]) && (0==scData[1]) && (1==scData[2])) 133 { 134 isFind = 1; 135 } 136 137 return isFind; 138 } 139 140 static int FindStartCode4Bytes(unsigned char *scData) 141 { 142 int isFind = 0; 143 144 if ((0==scData[0]) && (0==scData[1]) && (0==scData[2]) && (1 == scData[3])) 145 { 146 isFind = 1; 147 } 148 149 return isFind; 150 } 151 152 static int GetNaluDataLen(int startPos, int h264BitsSize, unsigned char *h264Bits) 153 { 154 int parsePos = 0; 155 156 parsePos = startPos; 157 158 while (parsePos < h264BitsSize) 159 { 160 if (FindStartCode3Bytes(&h264Bits[parsePos])) 161 { 162 return parsePos - startPos; 163 } 164 else if (FindStartCode4Bytes(&h264Bits[parsePos])) 165 { 166 return parsePos - startPos; 167 } 168 else 169 { 170 parsePos++; 171 } 172 } 173 174 return parsePos - startPos; // if file is end 175 } 176 177 static void ParseNaluData(const unsigned int naluLen, unsigned char* const nuluData) 178 { 179 static int naluNum = 0; 180 181 unsigned char *data = NULL; 182 unsigned char priorityStr[PRTNTF_STR_LEN+1] = {0}; 183 unsigned char typ
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇内核中对文件的读写操作 下一篇ACM1001:Sum Problem

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目