摘要: 首先,写一些关于-f和-d命令的使用情况吧。在jm代码内部,默认的设置文件是encoder.cfg,这个文件需要在工作目录下,程序才找得到。如果在工作目录下有这个cfg文件,选用-d xxxx.cfg或-f xxxx.cfg时的效果是一样的。如果工作目录下没有这个encoder.cfg文件,选用-d xxxx.cfg会达到效果,但是-f xxxx.cfg 却不能达到效果。我看了一下代码主要原因是程序在测试是否为-f命令之前要对一个配置文件进行解析,如果默认的配置文件不存在,程序在解析配置默认文件 (encoder.cfg)时出错,直接退出了 配置文件的理解:Files输入/输出文件配置 这.. 阅读全文
posted @ 2012-07-27 22:52 Mr.Rico 阅读(2121) 评论(0) 推荐(1)
摘要: 在JM代码中共有3个方法进行RDCost的计算,主要为:RDCost_for_4x4IntraBlocks, RDCost_for_4x4IntraBlocks被调用的函数 可以发现, RDCost_for_4x4IntraBlocks只被一个函数直接调用, 从调用流程我们就可精确的知道RDCost_for_4x4IntraBlocks的用处:帧内模式I4MB在RDO方式下的计算函数, 主要是计算一个4x4块的RDO代价RDCost_for_8x8blocks, 该函数一个宏块的4个8x8块在亚宏块模式下进行模式选择的时候, 计算其RDO代价, 根据求得的代价对当前的... 阅读全文
posted @ 2012-07-27 21:27 Mr.Rico 阅读(2164) 评论(0) 推荐(0)
摘要: JM8.6中关于PSNR(峰值信噪比), img->quad的解释:在JM代码中,多次遇到img->quad这个东西,而在官方代码中只给出了一句说明: 我开始看了好几遍都没有看懂,然后看到后面有snr,所以想应该和snr有关吧.然后再代码中寻找snr,发现jm代码中有一个函数,然后就往下看,忽然发现这儿 在老毕的书上有 我们可以对比上面的公式发现,令n=8,我们可以得出代码中的65025=(2^8-1)=255^2,所以主要是MSE的计算,而MSE是均方误差,所以可以推断出diff_y应该是误差的平方,我们看看diff_y的计算, 联系一下quad的含义,我突然感觉有些明白原代码注 阅读全文
posted @ 2012-07-27 18:58 Mr.Rico 阅读(1274) 评论(1) 推荐(0)
摘要: 关于 int ****cofAC变量的理解 对cofAC, cofAC8x8, cofDC, cofAC4x4, cofAC4x4intern的探讨 我要在这儿解释一下红框内的一些变量的含义:我在JM86的代码中搜索了一下,发现cofAC4x4intern使用的地方没有几处: 再看,我觉得貌似cofAC4x4intern没有什么用处, 只是为了通过get_memACcoeff来对cofAC4x4进行分配内存空间,可能懒得再写一个单独为cofAC4x4分配空间的函数了吧。对于cofAC4x4这个容易理解了,就是一个4x4小块的AC系数cofDC是包括色度块在内的6个8x8大小块(亮... 阅读全文
posted @ 2012-07-27 18:57 Mr.Rico 阅读(1305) 评论(2) 推荐(0)
摘要: JM8.6中的关于写比特流的问题 通过上面的对比, 我们可以发现store_coding_state函数和reset_coding_state函数基本上完全一致, 对于cs_mb, store_coding_state函数将img->currentslice变量中的一些需要保存的量存储在cs_mb中, 然后等到进行编码完成后, 要恢复现场, 利用reset_coding_state函数将cs_mb中保存的相关量恢复到变量img->currentslice中, 便于下面的利用.从上面的截图我们也可以看出, 对于非CABAC编码的状况, 主要是保存的bitstream 而对于CABAC 阅读全文
posted @ 2012-07-27 17:04 Mr.Rico 阅读(771) 评论(0) 推荐(0)
摘要: JM8.6中的运动估计BlockMotionSearch函数对不同帧间模式block type (1-16x16 ... 7-4x4)进行运动搜索.从该函数中,我们可以发现,有一个局部变量,通过下面的语句将img->pred_mv与pred_mv联系了起来, 这样其实通过调用函数SetMotionVectorPredictor来计算运动矢量的预测值(MVpred), 代码中向SetMotionVectorPredictor函数传递了pred_mv这个整型指针(指向img->pred_mv具体要保存的地方), 这样在函数SetMotionVectorPredictor中求出运动矢量的 阅读全文
posted @ 2012-07-27 17:02 Mr.Rico 阅读(1002) 评论(0) 推荐(0)
摘要: JM8.6中encode_one_macroblock函数的运作流程[宏块代价函数的使用或帧间帧内模式选择流程]在JM中最重要, 最核心的一个函数就是encode_one_macroblock, 这个函数是整个编码器的核心, 其实, 通过读源码,可以发现, encode_one_macroblock中的大部分工作是在进行模式的选择, 下面我们跟着代码走一下, 看看具体的流程: (我们假设帧间帧内同时都允许)1. 帧间三种帧间宏块级模式( 16×16, 16×8,8×16) 循环, 进行择优 同时将min_cost初始化为最大值, 将best_mode初始化为1(1 阅读全文
posted @ 2012-07-27 17:02 Mr.Rico 阅读(2065) 评论(2) 推荐(0)
摘要: JM8.6中enc_frame_picture, enc_pictures的理解 在frame_picture函数中有这么一句: 同样在field_picture中有这么一句: 从上面我们似乎可以看出一点东西, enc_picture就是指的图像, 这个图像的含义比较广, 包括了frame_picture, top_picture和bottom_picture. 所以我们看到在代码中有将enc_frame_picture, enc_top_picture和enc_bottom_picture分别赋值给enc_picture. 我们猜想, 因为在frame_picture() 和field_pi 阅读全文
posted @ 2012-07-27 17:00 Mr.Rico 阅读(734) 评论(0) 推荐(0)
摘要: JM8.6代码文件结构总结一下, JM8.6中比较重要的源代码文件[block.c]用于处理一个块 void intrapred_luma (int img_x, int img_y, int *left_available, int *up_available, int *all_available)void intrapred_luma_16x16 ()int dct_luma_16x16 (int new_intra_mode)int dct_luma (int block_x, int block_y, int *coeff_cost, int old_intra_mode)in... 阅读全文
posted @ 2012-07-27 16:57 Mr.Rico 阅读(2427) 评论(0) 推荐(0)
摘要: 2011年5月2日16:31:18img->mb_ximg->block_ximg->pix_ximg->opix_xin the function init_frame, we got this: it is obvious that here , the function just initialize the variables.在函数set_MB_parameters中完成了对img中几个变量的赋值如: 阅读全文
posted @ 2012-07-27 16:43 Mr.Rico 阅读(703) 评论(0) 推荐(0)
摘要: 2011年4月24日9:30:25JM8.6中重要结构体说明[global.h文件]下面是一些枚举类型的定义数据分区方式:PAR_DP_TYPE[PAR_DP_1(不使用数据分区), PAR_DP_3(使用ABC3数据分区)]输出文件的类型:PAR_OF_TYPE[PAR_OF_ANNEXB, PAR_OF_RTP] 编码的方式: CodingType [FRAME_CODING, FIELD_CODING, ADAPTIVE_CODING]句法元素的类型: SE_type[SE_HEADER, SE_PTYPE, SE_MBTYPE, SE_REFFRAME, SE_INTR... 阅读全文
posted @ 2012-07-27 16:33 Mr.Rico 阅读(2003) 评论(0) 推荐(0)
摘要: 2011年4月23日22:22:12H.264编码后码流的生成 H.264 比较全的编码框架 2011年4月23日22:23:35H.264中的PB帧编码 在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信 息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到 更高的压缩且无明显的压缩痕迹。在H.264编码中,I帧是内部编码帧,不需要参考其它帧,P帧需要前向的I帧作为参考,B是双向预测帧,需... 阅读全文
posted @ 2012-07-27 16:30 Mr.Rico 阅读(7372) 评论(2) 推荐(2)
摘要: 2011年4月22日19:49:49题目: JM8.6中帧内帧间模式的选择在JM8.6中帧内与帧间模式的选择是其中非常重要的一部分, 模式选择的过程其实涵盖了H.264编码中的大部分内容. 从代码看来, 这一部分其实和码率控制中的代价函数计算是重叠在一起的, 在进行代价函数的计算过程中也就实现了模式的选择, 代价计算完毕, 最优模式也就选择完毕. 1. 下面, 我们先回顾一下H.264中的帧内预测算法: 2. H.264中的帧间模式选择算法: 在帧间模式选中, 要进行的一个重要的过程就是运动估计(运动搜索)3. 代价函数在上面我们也提到过, 帧内帧间模式的选择其实和代价的计算是重... 阅读全文
posted @ 2012-07-27 16:13 Mr.Rico 阅读(4944) 评论(1) 推荐(0)
摘要: 第2章 数据类型与表达式 1. C++中的数据类型如下:2. C++中常量变量的值应该是可以变化的,怎么值是固定的量也称变量呢?其实,从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。对常变量来说,无非在此变量的基础上加上一个限定: 存储单元中的值不允许变化。因此常变量又称为只读变量(read-only-variable)。 请区别用#define命令定义的符号常量和用const定义的常变量。符号常量只是用一个符号代替一个字符串,在预编译时把所有符号常量替换为所指定的字符串,它没有类型,在内存中并不存在以符号常量命名的存储单元。而常变 阅读全文
posted @ 2012-07-27 13:49 Mr.Rico 阅读(771) 评论(0) 推荐(0)