![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
H264解析Demo
文章平均质量分 52
以代码的形式实践理解H264协议
努力努力再努力~~
这个作者很懒,什么都没留下…
展开
-
【H264解析Demo】12、去块滤波
框架结构一帧的所有宏块的在重建完成解码像素之后,针对整个slice操作的,所以去块滤波的操作需要放在slice的解析中,对整个一帧数据for (int idx = 0; idx < m_max_mb_number; idx++){ m_macroblocks[idx]->Deblock_macroblock();}1、获取当前是否为上边沿和左边沿宏块2、获取slice heder中的标志位,确定当前slice是否需要进行去块滤波3、分别进行垂直和水平方向的滤波//<去块原创 2021-05-31 23:36:12 · 325 阅读 · 0 评论 -
【H264解析Demo】11、帧内预测编码_2_获得参考的像素值
基础知识请参考:十五、帧内编码:3、获取预测数据知识储备保存邻块像素值到数组中,数组的存放顺序如下图:(绿色为当前待解析的4 * 4宏块)定义//<预测编码><6>表示44=16个子宏块 * (44=16)每个子宏块中的4*4个像素 (先是列坐标)UINT8 m_reconstructed_block[4][4][4][4];代码实现//<预测编码><5>获得参考像素:neighbors相邻宏块,当前宏块index,refPixBuf参原创 2021-05-09 19:00:27 · 240 阅读 · 0 评论 -
【H264解析Demo】11、帧内预测编码_1_预测当前块的预测模式
1、调用遍历所有的宏块,先将宏块通过cavlc、反变换、反量化解析出残差数据,然后再解码宏块for (int idx = 0; idx < m_max_mb_number; idx++) //m_max_mb_number一帧数据中的所有16*16的宏块{ m_macroblocks[idx] = new CMacroblock(m_pSODB, macroblockOffset, idx); m_macroblocks[idx]->Set_paramaters(m_pps_ac原创 2021-05-07 21:28:54 · 224 阅读 · 0 评论 -
【H264解析Demo】10、变换量化_3_反变换
代码实现//<变换量化><4>反变换(参数1:保存反量化系数 参数2:保存反变换之后)void CResidual::coeff_invers_transform(int(*coeff_buf)[4], int(*residual_buf)[4]){ int temp1[4] = { 0 }, temp2[4] = { 0 }; // horizontal-trans //<变换量化><4>水平变换 for (int j = 0; j <原创 2021-05-03 18:08:19 · 143 阅读 · 1 评论 -
【H264解析Demo】10、变换量化_2_反量化
获取量化参数QPpps中的qp值+slice header中qp值+mb中qp值:m_mb_qp_delta = Get_sev_code_num(m_pSODB, m_bypeOffset, m_bitOffset); m_mb_qp = m_pps_active->Get_pic_init_qp() + m_slice->m_sliceHeader->Get_slice_qp_delta() + m_mb_qp_delta;定义根据前面我们已经知道反量化操作是通过一个预定原创 2021-05-03 15:57:22 · 244 阅读 · 0 评论 -
【H264解析Demo】10、变换量化_1_CAVLC结果还原为系数矩阵
前面已经通过cavlc解析出了numCoeff、trailingOnes、trailingSigns(拖尾系数符号)、levels、totalZeros、runBefore等值,在反变换量化之前,需要根据这些值还原系数矩阵一、定义定义数据保存矩阵:int m_residual_matrix_luma[16][4][4];定义还原函数:Restore_coeff_matrix二、知识储备一个宏块在进行CAVLC编码时是如何划分的:4 * 4模式是如何划分的呢?首先将16 * 16的宏块划分成4个8原创 2021-05-03 11:29:53 · 220 阅读 · 0 评论 -
【H264解析Demo】9、CAVLC编码
编码系数矩阵:{ 3, 2, -1, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0,}Z扫描之后:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]对该数据进行CAVLC编码:#include "stdafx.h"#include "CAVLC.h"#include "CAVLC_Map.h"#include <math.h>#include <algorithm>#i原创 2021-04-17 13:35:21 · 379 阅读 · 0 评论 -
【H264解析Demo】8、解析Slice Body、宏块解析
一、标准文档解析1、macroblock_layer解析1、获取宏块类型2、判断宏块类型:区分I_PCM、1616、NN(本节解析NN)3、nn所以执行到序号24、判断pps中填充的非88并且宏块类型是NN:解析mb_pred,宏块预测5、判断宏块类型非16*16,则获取m_coded_block_pattern6、if (m_cbp_luma > 0 || m_cbp_chroma > 0 || (m_mb_type > 0 && m_mb_type <原创 2021-04-17 10:05:25 · 437 阅读 · 0 评论 -
【H264解析Demo】7、解析Slice Header
理论知识参考十一、H.264的Slice Header解析1、理论依据2、类定义slice头部//解析slice头部class CSliceHeader{public: CSliceHeader(UINT8 *pSODB, CSeqParamSet *sps, CPicParamSet *pps, UINT8 nalType); ~CSliceHeader(); UINT32 Parse_slice_header(); //解析slice头部 int m_disable_原创 2021-04-14 00:15:58 · 832 阅读 · 1 评论 -
【H264解析Demo】6、图像参数集Picture Paramater Set(PPS)解析
理论知识请参考:十、图像参数集Picture Paramater Set(PPS)解析1、解析理论依据参考官方标准协议文档节:7.3.2.1.2 Picture parameter set RBSP syntax2、成员定义根据标准文档,提取了关键的变量解析private: UINT8 m_pps_id; //当前PPS的id,slice引用PPS的方式就是在Slice header中保存PPS的id值 UINT8 m_sps_id; //当前PPS所引用的激活的SPS的id bo原创 2021-04-12 23:41:13 · 324 阅读 · 0 评论 -
【H264解析Demo】5、解析序列参数集Sequence Paramater Set(SPS)
理论知识请参考九、序列参数集Sequence Paramater Set(SPS)解析1、解析理论依据参考官方标准协议文档节:7.3.2.1.1 Sequence parameter set data syntaxu(8)表示该变量占据了8位u(1)表示该变量占据了1位ue(v)表示采用指数哥伦布编码2、成员定义根据标准文档,提取了关键的变量解析private: UINT8 m_profile_idc; UINT8 m_level_idc; UINT8 m_sps_原创 2021-04-11 16:15:38 · 361 阅读 · 1 评论 -
【H264解析Demo】4、指数哥伦布编码
本节是基于指数哥伦布编码的理论知识八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码对一段数据{ 0xA6, 0x42, 0x98, 0xE2, 0x04, 0x8A }进行解析可使用该代码对H.264编码数据中采用指数哥伦布编码的数据进行解析,例:SPS代码实现// ExpColum.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <assert.h>#include "cstdlib"typedef原创 2021-04-04 15:52:58 · 188 阅读 · 0 评论 -
【H264解析Demo】3、哈夫曼编码生成码表
本文是基于之前哈夫曼树编码的基础知识:七、熵编码算法(1):基础知识写程序对下面文件进行解析,通过哈夫曼树生成码表待解析文件:代码实现:// Huffuman.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <fstream>#include <queue>#include <vector>#include <string>us原创 2021-04-04 13:43:29 · 529 阅读 · 0 评论 -
【H264解析Demo】2、分析NAL Unit内容
本文是基于NAL Unit提取的基础上进行解析,提取EBSP中的SODB元素【H264解析】1、提取一个Nal Unit单元1、解析NAL Unit类型int CStreamFile::Parse_h264_bitstream(){ int ret = 0; UINT8 nalType = 0; UINT32 sliceIdx = 0; do { /* 提取NAL UNIT单元 */ ret = find_nal_prefix(); //解析NAL UNIT if (m_原创 2021-04-04 12:08:22 · 224 阅读 · 0 评论 -
【H264解析Demo】1、提取一个Nal Unit单元
0、前言本文指在从一个H.264码流中提取出一个一段一段的NAL Unit单元1、理论依据:H.264码流结构2、编码提取思路:将码流中字节依次保存在一个数组中进行判断,如果不等一001或者0001则将读取的下一个字节存放在数组的第一成员/*[0][1][2] = {0 0 0} -> [1][2][0] ={0 0 0} -> [2][0][1] = {0 0 0}getc() = 1 -> 0 0 0 1[0][1][2] = {0 0 1} -> [1][2]原创 2021-04-03 15:28:24 · 384 阅读 · 1 评论