摘要: 在H.264中衡量失真(distortion)的方法 主要有:SAD,SATD和SSD三种方法,即:这三种失真计算方法使用的场合是不一样的.(1)SAD/SATD主要用于在帧间预测中, 进行运动搜索的时候,计算块匹配之间的代价的时候,在进行模式选择的时候, 使用的是SAD, 或者SATD(2) SSD 计算的失真比较精确, 主要是在真正的编码过程中所使用的. 在进行模式选择的时候, 如何使用RDO的话, 也要计算SSD(3)对于整象素点的 MV 搜索,Distortion 采用 SAD,对于亚(分数)象素点的 MV 搜索,Distortion 采用 SATD。H.264编码后码流的生成 H.. 阅读全文
posted @ 2012-07-31 15:12 Mr.Rico 阅读(2459) 评论(0) 推荐(0)
摘要: 关于JM93的compute_colocated函数1、为什么用到RSD这个宏?#define RSD(x) ((x&2) ? (x|1) : (x&(~1)))关于这个宏的使用协议中是否有相应的说明?2、storable_picture结构体中ref_idx, re_pic_id, ref_id有什么区别? int*** ref_idx; //!moving_block[i][j] = !((!p->is_long_term &&((p->ref_idx[LIST_0][i][j] == 0) && (abs(p->mv[LI 阅读全文
posted @ 2012-07-31 15:09 Mr.Rico 阅读(1100) 评论(0) 推荐(0)
摘要: JM8.6中的运动搜索:BlockSAD数组的理解,SetupLargrBlocks函数理解整象素搜索主要包括3个函数SetupFastFullPelSearch,SetMotionVectorPredictor,SetupLargerBlocks, 都位于文件mv_search.c中间。int *****BlockSAD; //!max_num_references+1][8][16][ max_pos] BlockSAD用于根据4x4块来计算其他大块的SAD值从对BlockSAD进行分配空间的函数可以看出: InitializeFastFullIntegerSearch 通过对函数void 阅读全文
posted @ 2012-07-31 15:06 Mr.Rico 阅读(878) 评论(0) 推荐(0)
摘要: 主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值), 每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 个点需要 8x3=24 bites(如下图第一个图). 而现在仅需要 8+(8/4)+(8/4)=12bites, 平均每个点占12bites(如下图第二个图)。这样就把图像的数据压缩了一半。 上边仅给出了理论上的示例, 阅读全文
posted @ 2012-07-31 14:36 Mr.Rico 阅读(11668) 评论(3) 推荐(7)
摘要: 这是网上的一篇文章, 我重新读了一下, 然后做了一些整理 1.为什么要进行变换 空间图像数据通常是很难压缩的:相邻的采样点具有很强的相关性(相互关联的),而且能量一般平均分布在一幅图像中,从而要想丢掉某些数据和降低数据精度而不明显影响图像质量,就要选择合适的变换,方法,使图像易于被压缩。适合压缩的变换方法要有这样几个性质: (1).可以聚集图像的能量(将能量集中到少数有意义的数值上),如下图: 举个例子说明, 左图是变换前的数据, 右图是变换后的数据: 可以看出,经变换后,数据的能量基本上集中到左上方(低频信号)了,而变换后的数据完全可以通过反变换还原成原来的数据。为了达到压缩文件... 阅读全文
posted @ 2012-07-31 14:27 Mr.Rico 阅读(13531) 评论(2) 推荐(2)
摘要: 2011年4月20日15:16:43 JM8.6中对数据分割的一点解释 分析currslice->partarr[partmap[SE_MVD]] (关于数据分割的实现) Currslice指当前slice Partarr是一个datapartition数组 Partmap :const int* partmap = assignse2partition[input->partition_mode]; Int * assignse2partition[2] ; Static int assignse2partition_nodp[SE_MAX_ELEMENTS] = { 0, 0, 阅读全文
posted @ 2012-07-31 14:16 Mr.Rico 阅读(1018) 评论(0) 推荐(0)
摘要: 2011-9-6 10:16:12find_sad_16x16是一个比较重要的函数, 下面是其被调用过程: 在find_sad_16x16中有一个/4和/2的问题, 这其实就牵扯到hadamard变换的问题.在H.264乐园论坛上给出的解释如下:hadamard 变换本身就有一个 /2 的操作,因此每次变换都要对所有系数进行 /2。而 find_sad_16x16 函数执行了两次 hadamard 变换:首先对 256 个系数进行一次,其次对所有 DC 系数再做一次,因此对DC 系数应该 /4,而对 AC 系数应该 /2。find_sad_16x16 函数中的:M4[ i ][j]=M0[0. 阅读全文
posted @ 2012-07-31 13:33 Mr.Rico 阅读(3308) 评论(1) 推荐(0)
摘要: MPEG系列标准 H.26x系列标准 H.264的技术改进 (1)更加精细的宏块分割模式,运动估计的精度更高(1/4像素的亮度精度和1/8像素的色度精度) (2)整数DCT变换, 变换过程全部采用整数运算, 避免了浮点数运算过程中导致的错误积累, 降低了复杂度,并且正向的操作和逆向操作可以完全吻合. (3)H.264中的环内去块效应滤波器可以很好的改善图像的质量, 使得进行运动估计时的结果更加准确. (4)熵编码中的CAVLC和CABAC比之前的方法效率更高, 特别是CABAC 阅读全文
posted @ 2012-07-31 13:28 Mr.Rico 阅读(3039) 评论(0) 推荐(0)
摘要: H.264编码器框架图 H.264解码器框架图 H264encflow1_v2.jpg:JM6.1 H264encflow2_v2:JM6.1 H264deblock_V2:JM6.1 H.264中运动估计和运动搜索:JM6.1 H.264中的亚像素预测 JM13.2 流程图:编码与解码流程 1/4像素插值:红色的是整像素,蓝色是1/2像素(半像素),黄色是1/4像素 JM中的函数流程 阅读全文
posted @ 2012-07-31 13:06 Mr.Rico 阅读(2878) 评论(0) 推荐(0)
摘要: 码率控制部分关键函数5.1 x264_ratecontrol_start( x264_t *h,int i_slice_type)功能根据不同的slice类型调整qp的值输入项目x264_t *h, int i_slice_type输出项目x264_t *h程序逻辑如附图14所示: 附图14: x264_ratecontrol_start流程图5.2 x264_ratecontrol_mb( x264_t *h, int bits )功能生成下一个宏块的qp的值输入项目x264_t *h, int bits输出项目x264_t *h程序逻辑如附图15所示: 附图15: x264_r... 阅读全文
posted @ 2012-07-31 12:54 Mr.Rico 阅读(654) 评论(0) 推荐(0)
摘要: JM86中多参考帧相关问题关于jm86中MAX_LIST_SIZE值的选取我们知道在参考图像队列中listX[ i ][ j ], 这边的i的取值范围是0~5,而且0~5所代表的含义论坛上已经有人说过。即如下:istXsize[6];奇数为参考帧列表 list0 中参考帧的个数;偶数为参考帧列表 list1 中参考帧的个数。0、1用于帧图像或者场图像,2、3用于MBAFF帧图像中顶宏块,4、5用于MBAFF帧图像中底宏块所有涉及帧间参考的大小为6的数组都可以这样类推。例如listX[6],它的解释就是:奇数为参考帧列表 list0;偶数为参考帧列表 list1。0、1用于帧图像或者场图像,2、 阅读全文
posted @ 2012-07-31 12:39 Mr.Rico 阅读(2601) 评论(1) 推荐(0)
摘要: 2011年9月5日13:47:04帧内预测之Intra16x16中的4种模式选择在JM8.6中对应的函数是Intra16x16_Mode_Decision, 该函数包括3部分: intrapred_luma_16x16:计算4种模式的预测值 find_sad_16x16: 计算SATD值作为代价,从而得到最优的模式 dct_luma_16x16:对于所选出的最优模式进行DCT变换/量化和反DCT变换和量化下面对这三个函数进行详细分析一下:(1)intrapred_luma_16x16 这个函数其实很简单, 都是对应着标准来写的. Intra16x16有vertical,... 阅读全文
posted @ 2012-07-31 11:07 Mr.Rico 阅读(3952) 评论(0) 推荐(1)
摘要: NAL部分关键函数4.1 int x264_nal_encode( void *, int *, int b_annexeb, x264_nal_t *nal )功能对一个片进行NAL编码。输入项目一个片的RBSP的数据流。输出项目一个NAL单元。算法从SODB到RBSP的生成过程:如果SODB内容是空,生成的RBSP也是空的。否则,RBSP由如下的方式产生:RBSP的第一个字节直接取自SODB的第1~8个比特(RBSP字节内的比特按照从左到右对应为从高到低的顺序排列,most significant),依此类推,RBSP的其余的每个字节都直接取自SODB的相应比特。RBSP的最后一个字节包含 阅读全文
posted @ 2012-07-31 01:04 Mr.Rico 阅读(631) 评论(0) 推荐(0)
摘要: 去块滤波(Deblocking)部分关键函数3.1 deblocking_filter_edgev( x264_t *h, uint8_t *pix, int i_pix_stride, int bS[4], int i_QP )功能对亮度宏块的垂直边界进行边界滤波性能。输入项目x264_t *h: 指向x264_t类型的结构体变量的指针变量;uint8_t *pix: 指向uint8_t变量的指针,代表存储像素的内存地址;int i_pix_stride:像素步长,对cif格式的亮度块来说是416,为352+64,64是左右两边分别进行了32个像素的扩边;int bS[4]:边界强度,有0. 阅读全文
posted @ 2012-07-31 01:03 Mr.Rico 阅读(315) 评论(0) 推荐(0)
摘要: CAVLC编码部分的关键函数2.1 x264_macroblock_write_cavlc(x264_t *h, bs_t *s)功能判断宏块类型,对宏块进行CAVLC编码。输入项目x264_t *h:指向x264_t类型的结构体的指针变量。输出项目bs_t *s: 指向bs_s类型结构体的指针变量。流程图如附图6所示: 附图6: x264_macroblock_write_cavlc流程图2.2 block_residual_write_cavlc(x264_t *h,bs_t *s,int i_idx,int *l, int i_count)功能对得到的残差数据进行cavlc编... 阅读全文
posted @ 2012-07-31 01:01 Mr.Rico 阅读(552) 评论(0) 推荐(0)
摘要: 帧内帧间编码部分关键函数1.1 x264_encoder_open (x264_param_t *param )功能分配编码器所需结构体。检测参数有效性。初始化sps和pps。分配编码器所需memory空间,包括参考帧和缓冲帧。初始化macroblock cache相应空间。分配编码器所需memory空间,包括参考帧和缓冲帧。根据cpu类型,初始化各指令集加速函数。输入项目x264_param_t *param输出项目x264_t *h存储分配x264_t *h = x264_malloc( sizeof( x264_t ) );h->out.p_bitstream = x264_mal 阅读全文
posted @ 2012-07-31 01:00 Mr.Rico 阅读(660) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2012-07-31 00:50 Mr.Rico 阅读(2741) 评论(1) 推荐(0)
摘要: l 相关说明: 1. 使用版本:x264-cvs-2004-05-11 2. 这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置几个区间,进行分工阅读,将各个区间击破了. 3. 需要学习的知识: a) 编码器的工作流程. b) H.264的码流结构,像x264_sps_t,x264_pps_t等参数的定义基本上都完全符合标准文档中参数集的定义,抓住主要参数,次要参数也应该有所了解. c) 数学知识,对dct变换等与数学相关的知识的编程实现要有较好理解. d) C语言的知识.涉及到c语言的较多不经常用的特性,如函... 阅读全文
posted @ 2012-07-31 00:37 Mr.Rico 阅读(990) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2012-07-31 00:24 Mr.Rico 阅读(1452) 评论(0) 推荐(0)