07 2012 档案

摘要:在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 阅读 (1278) | 评论 (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 阅读 (575) | 评论 (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 阅读 (434) | 评论 (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 阅读 (9443) | 评论 (3) 编辑
摘要:这是网上的一篇文章, 我重新读了一下, 然后做了一些整理 1.为什么要进行变换 空间图像数据通常是很难压缩的:相邻的采样点具有很强的相关性(相互关联的),而且能量一般平均分布在一幅图像中,从而要想丢掉某些数据和降低数据精度而不明显影响图像质量,就要选择合适的变换,方法,使图像易于被压缩。适合压缩的变换方法要有这样几个性质: (1).可以聚集图像的能量(将能量集中到少数有意义的数值上),如下图: 举个例子说明, 左图是变换前的数据, 右图是变换后的数据: 可以看出,经变换后,数据的能量基本上集中到左上方(低频信号)了,而变换后的数据完全可以通过反变换还原成原来的数据。为了达到压缩文件... 阅读全文
posted @ 2012-07-31 14:27 Mr.Rico 阅读 (8266) | 评论 (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 阅读 (789) | 评论 (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 阅读 (2301) | 评论 (1) 编辑
摘要: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 阅读 (2071) | 评论 (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 阅读 (2117) | 评论 (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 阅读 (1921) | 评论 (1) 编辑
摘要: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 阅读 (2930) | 评论 (0) 编辑
摘要:第12章 差错控制1. 视频传输错误视频传输的信道有可能是不可靠的无线信道Internet传输错误随机的比特错误比特反置、比特插入、比特丢失突发错误(Bursty Error)数据包丢失局域网数据包冲突延迟缓冲区溢出噪声干扰 2. 差错控制的目的目的克服由于信道传输错误及有这些错误产生的影响差错控制技术可以应用在信源编码信道编码解码端3. 差错控制技术数据重传(Retransmission)前向纠错(Forward Error Correction,FEC)差错隐藏(Error Concealment)差错恢复(Error Resilience)信道编码数据重传,FEC信源编码差错隐藏,差错恢 阅读全文
posted @ 2012-07-30 10:03 Mr.Rico 阅读 (3941) | 评论 (0) 编辑
摘要:第10章 视频处理1.视频处理在视频压缩前后,对视频图像质量增强的操作视频编解码系统输出的图像主观质量不仅与压缩算法的性能有关,还受视频处理的影响压缩之前对视频的处理称作预处理(Pre-processing)压缩之后对视频的处理称作后处理(Post-processing) 2. 预处理预处理的目的为了减少原图像受到的损害,保持原图像的重要特征,使原图像能被高效的压缩噪声污染光照差抖动为了进行视频格式转换去隔行空间缩放帧率转换去噪声处理 去隔行(Deinterlace)隔行扫描的视频图像在逐行扫描播放设备上播放会有隔行效应,降低了主观质量 3. 去隔行的方法在单场内去隔行用奇数(偶数)行插值.. 阅读全文
posted @ 2012-07-30 00:52 Mr.Rico 阅读 (6308) | 评论 (0) 编辑
摘要:远程桌面连接可以很方便的在远端控制其他地方的机器。在Window下,windows本身带有远程连接的程序。比如在Windows xp下是下面的:在Windows7下是这样的:两者基本一样的。在linux下就不一样的,方式很多。我使用的是Fedora 14,所以主要讨论关于Fedora 14的。下面主要讨论以下几种情况的远程连接:1. Windows连接Windows这个就很简单了,直接输入对方的ip地址就可以的。不过要注意的是,被连接的机器要在“我的电脑->属性”中设置一下:允许远程桌面连接。否则还是无法连接成功的。2. Windows连接Fedora比较简单的一种方法是使用Xrdp软件 阅读全文
posted @ 2012-07-30 00:04 Mr.Rico 阅读 (6166) | 评论 (0) 编辑
摘要:第6章 变换编码1. 变换编码变换编码的目的去除空间信号的相关性将空间信号的能力集中到频域的一小部分低频系数上能量小的系数可通过量化去除,而不会严重影响重构图像的质量块变换和全局变换块变换:离散余弦变换(Discrete Cosine Transform,DCT),4x4,8x8,16x16全局变换:小波变换(Wavelet)变换的能量集中特性DCT编码 2. 变换类型K-L变换傅里叶变换余弦变换小波变换3. KL变换最优变换基函数根据具体图像而确定没有快速算法实际中很少使用复杂度极高 K-L变换非常复杂度很高,不实用需要计算协方差矩阵U 需要计算特征向量需要发送 到解码器4. ... 阅读全文
posted @ 2012-07-29 20:09 Mr.Rico 阅读 (14743) | 评论 (6) 编辑
摘要:第四章 视频编码基础 1. 压缩码流语法:码流中各个元素的位置关系01001001…图像编码类型(01),宏块类型(00),编码系数1001等语义:每个语法元素所表达的意义。例如:图像编码类型 2. 编码层次序列(Sequence)图像组(Group of Pictures,GOP)图像(Picture)条带(Slice)宏块(Macroblock,MB)块(Block)3. 码流结构 3. PB帧编码 4. 序列编码对象(1)IBBP序列 序列:一段连续编码的并具有相同参数的视频图像。序列起始码:专有的一段比特串,标识一个序列的压缩数据的开始MPEG-2的序列起始码为十六进制数000001( 阅读全文
posted @ 2012-07-29 09:52 Mr.Rico 阅读 (16679) | 评论 (4) 编辑
摘要:第1章介绍1. 为什么要进行视频压缩?未经压缩的数字视频的数据量巨大存储困难一张DVD只能存储几秒钟的未压缩数字视频。传输困难1兆的带宽传输一秒的数字电视视频需要大约4分钟。 2. 为什么可以压缩去除冗余信息空间冗余:图像相邻像素之间有较强的相关性时间冗余:视频序列的相邻图像之间内容相似编码冗余:不同像素值出现的概率不同视觉冗余:人的视觉系统对某些细节不敏感知识冗余:规律性的结构可由先验知识和背景知识得到 3. 数据压缩分类无损压缩(Lossless)压缩前解压缩后图像完全一致X=X'压缩比低(2:1~3:1)例如:Winzip,JPEG-LS有损压缩(Lossy)压缩前解压缩后图像不 阅读全文
posted @ 2012-07-28 23:27 Mr.Rico 阅读 (64953) | 评论 (19) 编辑
摘要:Raw Byte Sequence Packet (RBSP)String Of Data Bits (SODB)POC:Picture Order CountSequence parameter set (SPS)Picture parameter set (PPS)DPB 解码图像缓冲区decoder picture bufferIDR图像 立即刷新图像 一个序列的第一个图像,IDR图像都是I帧图像PAFF means "Picture Adaptive Field Frame", MBAFF means "MacroBlock Adaptive Field 阅读全文
posted @ 2012-07-28 14:59 Mr.Rico 阅读 (3215) | 评论 (0) 编辑
摘要:1. jm8.6中所涉及的几项关于比特分布的地方: 序列参数集SPS: parset.c文件中的GernateSPS... 具体宏块编码中的比特分布: #if TRACE snprintf(currSE->tracestring, TRACESTRING_SIZE, "Intra mode = %3d %d",currSE->value1,currSE->context); #endif 还有很相关的一个是和比特计数相关的: bitCount[BITS_COEFF_Y_MB]+=currSE->len; rate += currSE->l... 阅读全文
posted @ 2012-07-28 14:54 Mr.Rico 阅读 (1932) | 评论 (0) 编辑
摘要:帧、场编码的个人理解一、概述原始视频帧(最原始的视频数据)根据编码的需要,以不同的方式进行扫描产生两种视频帧:连续或隔行视频帧,隔行视频帧包括顶场和底场,连续(遂行)扫描的视频帧与隔行扫描视频帧有着不同的特性和编码特征,产生了所谓的帧编码和场编码。一般情况下,遂行帧进行帧编码,隔行帧可在帧编码和场编码间选取。 在帧编码中,参考为帧图像,采用帧运动补偿,两个场是联合编码;在场编码中,参考为场图像,两个场是分别编码,采用场运动补偿。二、视频序列帧、场编码方式1.固定帧编码(全帧)----视频序列的全部帧始终采用帧编码方式。 2.固定场编码(全场) 视频序列中帧被分成两个场独立编码。编码规则:(1. 阅读全文
posted @ 2012-07-28 14:18 Mr.Rico 阅读 (2432) | 评论 (0) 编辑
摘要:1、H.264新特性学习阶段 首先,我们学习的weigand的那篇关于H.264 overview的经典文献,这篇文献对H.264的新特性大部分都有讲到。之后,我们共开展三次会议来分组深入地学习H.264的各个新特性。 帧间编码小组主讲的内容有:高精度运动估计,分析了H.264的半象素点插值预测和1/4象素点插值预测,同时还分析了H.263的半象素点的插值预测以作比较。多参考帧和7种宏块模式,分析它们的基本原理,并列举了一些快速算法。B帧,讲解了B帧的新特性,同时详细讲述了B帧独有的两种宏块模式direct mode和multihypothesis mode。 帧内编码小组主讲的内容有:... 阅读全文
posted @ 2012-07-28 14:15 Mr.Rico 阅读 (3596) | 评论 (0) 编辑
摘要:<<H.264 中 4x4 块的快速帧内预测算法>>作者:王启文,黄东军目前,对帧内预测的研究已取得很多成果,如快速三步法 [1]。该算法利用相邻预测方向的相关性,选择性地计算帧内方向预测模式,以达到减少率失真优化计算量的目的,但它对编码时间的节约效果不理想。文献[2]利用子块边缘的变化方向从预选模式中选取最可能的预测方向,该算法采用边缘梯度直方图法,在几种最可能的预测方向中选取最佳预测方向,在视频场景较复杂的情况下,其视频压缩效果不佳。文献[3]对文献[2]算法进行改进,但对预测正确率的提高效果不明显。文献[4]提出自适应阈值快速算法,利用邻块相关性为当前块的率失真设 阅读全文
posted @ 2012-07-28 13:52 Mr.Rico 阅读 (1473) | 评论 (0) 编辑
摘要:2011年8月18日 09时31分13秒SODB到RBSP的转换:对SODB的最后填充rbsp_trailing_bits就得到RBSP,而这个rbsp_trailing_bits是第一个比特为1,接下来是0,直到字节对齐。比如SODB的最后几个比特是1001,这时rbsp_trailing_bits即为:1000SODB 到RBSP到转换代码如下:void SODBtoRBSP(Bitstream*currStream){ currStream->byte_buf <<= 1; //左移1bit currStream->byte_buf |= 1; //在尾部填一个& 阅读全文
posted @ 2012-07-28 11:16 Mr.Rico 阅读 (5077) | 评论 (0) 编辑
摘要:writeSyntaxElement_NumCoeffTrailingOnes里有lentab[3][4][17] codtab[3][4][17]编码非零系数数目 (NumCoeff)和拖尾系数数目(TrailingOnes)writeSyntaxElement_NumCoeffTrailingOnesChromaDC里有lentab[4][5] codtab[4][5]与上面的函数功能一样, 只是这儿特别针对Chroma DC(色度直流系数)writeSyntaxElement_TotalZeros里有lentab[TOTRUN_NUM(15)][16] codtab[TOTRUN_NUM 阅读全文
posted @ 2012-07-28 09:23 Mr.Rico 阅读 (2476) | 评论 (0) 编辑
摘要:首先,写一些关于-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 阅读 (1691) | 评论 (0) 编辑
摘要:在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 阅读 (1477) | 评论 (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 阅读 (879) | 评论 (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 阅读 (821) | 评论 (1) 编辑
摘要: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 阅读 (433) | 评论 (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 阅读 (605) | 评论 (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 阅读 (1318) | 评论 (2) 编辑
摘要: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 阅读 (522) | 评论 (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 阅读 (1817) | 评论 (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 阅读 (466) | 评论 (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 阅读 (1489) | 评论 (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 阅读 (6325) | 评论 (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 阅读 (3699) | 评论 (1) 编辑
摘要:第2章 数据类型与表达式 1. C++中的数据类型如下:2. C++中常量变量的值应该是可以变化的,怎么值是固定的量也称变量呢?其实,从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。对常变量来说,无非在此变量的基础上加上一个限定: 存储单元中的值不允许变化。因此常变量又称为只读变量(read-only-variable)。 请区别用#define命令定义的符号常量和用const定义的常变量。符号常量只是用一个符号代替一个字符串,在预编译时把所有符号常量替换为所指定的字符串,它没有类型,在内存中并不存在以符号常量命名的存储单元。而常变 阅读全文
posted @ 2012-07-27 13:49 Mr.Rico 阅读 (314) | 评论 (0) 编辑
摘要:第1章 C语言概述1. C语言出现的历史背景C语言是国际上广泛流行的高级语言。C语言是在B语言的基础上发展起来的。B (BCPL)语言是1970年由美国贝尔实验室设计的, 并用于编写了第一个UNIX操作系统,在PDP 7上实现。优点:精练,接近硬件,缺点:过于简单,数据无类型。 1973年贝尔实验室的D.M.Ritchie 在B语言的基础上设计出了C语言,对B取长补短,并用之改写了原来用汇编编写的UNIX,(即UNIX第5版),但仅在贝尔实验室使用。1975年UNIX第6版发布,C优点突出引起关注。1977年出现了《可移植C语言编译程序》 ,推动了UNIX在各种机器上实现 ,C语言也得到推广, 阅读全文
posted @ 2012-07-24 21:34 Mr.Rico 阅读 (240) | 评论 (0) 编辑
摘要:这儿所讨论的是x86机器下的内存分配。其他机器下的情况可能不一样。首先,下面是一段测试程序:#includeusingnamespacestd;intmain(){inta[]={1,2,3,4,5,0,-5,-4,-3,-2,-1};char*s="helloworld";char*s2="I'maboy";char*s3="helloworld";floatf=1.0f;doubled=1.0;printf("a:%0#x\n",a);printf("s:%0#x\n",s);pri 阅读全文
posted @ 2012-07-24 21:20 Mr.Rico 阅读 (176) | 评论 (0) 编辑
摘要:之前有文章介绍过临时对象和返回值优化RVO方面的问题。见此处。在C++中,返回对象这一点经常被诟病,因为这个地方的效率比较低,需要进行很多的操作,生成一些临时对象,如果对象比较大的会就会比较耗时。但是在编译器实现的时候,经常是对返回对象的情况进行优化,也就是进行返回值优化 。在g++中,这个是默认已经进行了优化。以前我希望看看到底C++怎么操作的,但是无法看到,就是因为G++进行了默认的返回值优化RVO。今天在晚上发现可以有一中方法来禁止这个RVO,可以参考这儿。具体来说就是在编译的时候,加上-fno-elide-constructors这个选项,即:g++ -o rvo_test rvo_t 阅读全文
posted @ 2012-07-21 11:23 Mr.Rico 阅读 (1665) | 评论 (0) 编辑
摘要:第1章 C++基础1. C++起源C的成功及广受欢迎是与UNIX操作系统密切相关。第3章 函数基础伪随机数第11章 名字空间1. 未命名空间文件是一个编码单元,例如类的实现文件,以及那些使用#include命令包含的文件,如类的接口文件。每个编码单元都有一个未命名的名字空间。所有在未命名空间中定义名字都局限于该编码单元中,所以这些名字在该编码单元之外可以重新使用。2. 使用未命名名字空间将某个定义局限于编码单元中。3. 混淆未命名空间和全局命名空间。4. 利用未命名名字空间代替static修饰词第12章 流和文件I/O操作1. 打开文件的方式使用open函数:ifstream ins;ins. 阅读全文
posted @ 2012-07-20 09:25 Mr.Rico 阅读 (127) | 评论 (0) 编辑
摘要:这本书主要介绍的是C++标准的TR1库。对相关的库都进行了介绍。类似一个参考手册。 前言 C++ TR1库简介 元组tuple 元组的tuple的声明 2. 创建tuple对象 使用make_tuple函数来创建tuple对象,但是make_tuple并不区分对象和对象的引用,两者都会得到和对象相同 类型的成员。 TR1库中的函数模板ref和cref可以创建包含引用的tuple对象。在头文件中定义。cref告诉make_tuple所要创建的成员是对常量类型的引用。 函数模板tie可以创建tuple对象包含对参数的引用。 程序代码:make_tuple.cc View Code #include 阅读全文
posted @ 2012-07-18 13:52 Mr.Rico 阅读 (303) | 评论 (0) 编辑
摘要:1. 面向对象:封装(数据抽象)是基础,继承是手段,多态是目的;泛型编程:参数化类型(概念抽象)是基础,模板是手段,通用是目的2. 面向对象是运行时问题空间的多态,泛型编程是编译时算法空间的多态3. OO以Type为中心,GP以Concept为中心,而Concept完全独立于Type;OO的type是显式定义的,type之间的关系也是显式定义的,是语言支持的 ;GP的Concept是由算法隐式定义的,Concept之间的关系,是无法用目前的C++语法直接表达的;Concept的Model完全可以是毫无关系的Type,refinement独立于inheritence,original conc. 阅读全文
posted @ 2012-07-16 21:03 Mr.Rico 阅读 (342) | 评论 (0) 编辑
摘要:一个比较简单的程序题。题目虽简单,但写起来需要注意的东西还是很多的。题目:读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出.输入:测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.输出:对每个测试用例输出1行,即A+B的值.样例输入:one + two = three four + five six = zero seven + eight nine = zero + zero =样例输出:3 90 96下面是我写的一段程序:# 阅读全文
posted @ 2012-07-16 20:46 Mr.Rico 阅读 (188) | 评论 (0) 编辑
摘要:本篇内容来源于互联网 前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧:intp;//这是一个普通的整型变量int*p;//首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针intp[3];//首先从P处开始,先与[]结合. 阅读全文
posted @ 2012-07-16 15:33 Mr.Rico 阅读 (175) | 评论 (0) 编辑
摘要:第2部分 C/C++程序设计1. 二进制位变换对于整型x:x&(x-1)的结果是x最右边的1被置为0这儿有详细介绍:http://www.cnblogs.com/xkfz007/archive/2012/06/27/2566478.html 2. 类型转换这儿提到的类型转换主要是指,浮点型和整型之间的转换。例如:float x=2.5f;则printf("%#x\n",*(int*)&x);//0x40200000printf("%#x\n",(int&)x);//0x40200000(这个需要在C++下编译)(int&) 阅读全文
posted @ 2012-07-16 13:14 Mr.Rico 阅读 (358) | 评论 (0) 编辑
摘要:参考:http://blog.csdn.net/haoel/article/details/3081328,http://blog.csdn.net/haoel/article/details/3081385前言 07年12月,我写了一篇《C++虚函数表解析》 的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么 再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单。不想,这篇 文章成为了打开C++对象模型内存布局的一个引子 阅读全文
posted @ 2012-07-15 19:25 Mr.Rico 阅读 (114) | 评论 (0) 编辑
摘要:参考:http://www.cnblogs.com/itech/archive/2009/02/27/1399996.html一 虚继承1) 代码:#includeusingnamespacestd;classB{public:inti;virtualvoidvB(){cout(pB);pGD->i=10;pGD->x=20;pGD->y=30;pGD->a=40;PrintMemberAndVT(pGD);deletepGD;}6)验证代码结果:7)总结:虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移。二 阅读全文
posted @ 2012-07-15 18:19 Mr.Rico 阅读 (212) | 评论 (0) 编辑
摘要:之前有对虚函数机制的讲解,见这先讨论是多级继承的虚函数表。首先是没有函数覆盖的情况,继承方式如下图所示:对于实例DDerive dd;其所对应的虚函数列表是:测试代码如下:View Code classBase{public:typedefvoid(Base::*Fun)();virtualvoidf(){Funq=&Base::f;cout<<"Base::f->"<<(int)*(void**)&q<<endl;}virtualvoidg(){Funq=&Base::g;cout<<" 阅读全文
posted @ 2012-07-15 17:24 Mr.Rico 阅读 (454) | 评论 (0) 编辑
摘要:C++中的虚函数机制 虚函数的定义:虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是 public(可以定义为 private or proteceted, 但是对于多态来说,没有意义)。在基类的类定义中定义虚函数的一般形式:virtual 函数返回值类型 虚函数名(形参表){ 函数体 }虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义(形式也是:virtual 函数返回值类型 虚函数名(形参表){ 函数体 }),在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定 阅读全文
posted @ 2012-07-15 14:06 Mr.Rico 阅读 (1430) | 评论 (0) 编辑
摘要:第2部分 C/C++基础知识1. C++中的基本数据类型:2. C++中的整型:3. C++中的常见常量常量按照数据类型的不同分为整型常量,浮点型常量,字符型常量,还有字符串常量,转义字符常量和地址常量。整型常量可以有二进制,八进制和十六进制三种表示形式。加上L或U来表示长整型或者无符号型。浮点型常量,float型需要添加后缀f或F。浮点数只有一种进制(十进制),所有的浮点常数都是默认为double的。字符型常量,\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。字符串常量,这个是从C中继承而来的。转义字符常量,\x,\n,\b,\r,\n地址常量4. 常量和变量的区别(1)常量的 阅读全文
posted @ 2012-07-13 14:16 Mr.Rico 阅读 (197) | 评论 (0) 编辑
摘要:条款3:使容器里对象的拷贝操作轻量而正确STL中采用的都是拷贝对象的方式如果所有这些使STL的拷贝机制听起来很疯狂,就请重新想想。是,STL进行了大量拷贝,但它通常设计为避免不必要的对象拷贝,实际上,它也被实现为避免不必要的对象拷贝。和C和C++内建容器的行为做个对比,下面的数组:Widget w[maxNumWidgets];// 建立一个大小为maxNumWidgets的Widgets数组// 默认构造每个元素即使我们一般只使用其中的一些或者我们立刻使用从某个地方获取(比如,一个文件)的值覆盖每个默认构造的值,这也得构造maxNumWidgets个Widget对象。使用STL来代替数组,你 阅读全文
posted @ 2012-07-11 23:07 Mr.Rico 阅读 (359) | 评论 (0) 编辑
摘要:第1讲 打磨工具 1. C++/CLI与C++是不同的 第2讲 阅读C++代码 1.核心语言与标准库 C++与C以及其他很多语言类似,区分核心语言与标准库。核心语言和标准库都是标准语言的一部分,不包含这二者的工具套件是不完整的。 二者的区别在于核心语言是自包含的。例如,有些类型是语言内建的,编译器对其提供内在的支持,而其他类型是通过内建类型来定义的,他们在标准库中声明,使用时需要通知编译器将其导入。 第3讲 整数表达式 第17讲 字符集 1. 单词计数:将单词限定为字母和类字母的字符 代码如下:View Code #include#include#include#includeusingnam 阅读全文
posted @ 2012-07-09 18:53 Mr.Rico 阅读 (339) | 评论 (0) 编辑
摘要:第5章 lexical_cast介绍 测试代码: View Code #include#include#includeusingnamespacestd;usingnamespaceboost;voidtest1(){intx=lexical_cast("100");longy=lexical_cast("2000");floatpai=lexical_cast("3.14159e5");doublee=lexical_cast("2.71828");cout(456);cout(0.6810)(0x10)#inc 阅读全文
posted @ 2012-07-09 00:00 Mr.Rico 阅读 (959) | 评论 (0) 编辑
摘要:第0章 导读 第1章 Boost程序库总论 1.什么是Boost 2. 如何使用Boost 3.什么是STLprot 4.开发环境 第2章 时间与日期 1. timer库 代码如下:View Code #include#includeusingnamespacestd;usingnamespaceboost;intmain(){timert;cout#include#include#include#includeusingnamespacestd;usingnamespaceboost;intmain(){vectorv(1000000);ofstreamfs("a.txt" 阅读全文
posted @ 2012-07-06 18:11 Mr.Rico 阅读 (2670) | 评论 (0) 编辑
摘要:第9章 优先队列与第6章FIFO结构的队列不同,优先队列中元素出队列的顺序由元素的优先级决定。从优先队列中删除元素是根据优先权高或低的次序,而不是元素进入队列的次序。可以利用堆数据结构来高效地实现优先队列。堆是一棵完全二叉树,可用8.4节所介绍的公式化描述方法来高效存储完全二叉树。在高度和重量上取得平衡的左高树很适合于用来实现优先队列。本章的内容涵盖了堆和左高树。在本章的应用部分,利用堆开发了一种复杂性为O(nlogn)的排序算法,称为堆排序。在第2章所介绍的对n个元素进行排序的算法,其复杂性均为O(n^2)。虽然第3章介绍的箱子排序和基数排序算法的运行时间为Θ(n),但算法中元素的取值必须在 阅读全文
posted @ 2012-07-04 00:10 Mr.Rico 阅读 (121) | 评论 (0) 编辑
摘要:内存对齐常量折叠 堆栈解退(stack unwinding) 模板特化模板偏特化 模板实例化 函数对象 单一定义规则(One-Definition Rule,ODR) 自引用 对象切片(object slicing)/切割:当把一个派生类对象赋给一个基类对象时,会发生对象切割。(另外用基类对象强制转换派生类对象也会),多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态。 所有权语义(owership semantics) 破坏性复制语义(distructive copy semantics) 菱形继承 向下强制:基类到派生类的转换 向上强制:派生类到基类的转换 交叉强制:从 阅读全文
posted @ 2012-07-02 22:10 Mr.Rico 阅读 (2085) | 评论 (0) 编辑
摘要:第8章 二叉树和其他树1. 术语:树和二叉树的术语,如高度、深度、层、根、叶子、子节点、父节点和兄弟节点。4种常用的二叉树遍历方法:前序遍历,中序遍历,后序遍历和按层遍历。2. 线性数据结构,表数据结构,层次数据结构3. 二叉树与树的根本区别4. 二叉树的特性5. 二叉树遍历方法在前三种方法中,每个节点的左子树在其右子树之前遍历。这三种遍历的区别在于对同一个节点在不同时刻进行访问。在进行前序遍历时,每个节点是在其左右子树被访问之前进行访问的;在中序遍历时,首先访问左子树,然后访问子树的根节点,最后访问右子树。在后序遍历时,当左右子树均访问完之后才访问子树的根节点。在逐层遍历过程中,按从顶层到. 阅读全文
posted @ 2012-07-02 11:23 Mr.Rico 阅读 (191) | 评论 (0) 编辑
摘要:常量 起初读者可能认为合乎逻辑的选择是把一个const放在类里,但这不会产生预期的结果。在一个类里,const 恢复它在C中的一部分意思。 它在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能改变。在一个类里使用const的意思是“在这个对象声明期内,这个是一个常量”。 然而,对这个常量来讲,每个不同的对象可以含一个不同的值。 把一个内部数据类型封装在一个类里以保证用构造函数初始化,是很用的。例如 class interger{int i;public:interger(int ... 阅读全文
posted @ 2012-07-02 02:41 Mr.Rico 阅读 (654) | 评论 (0) 编辑
摘要:1. 初始化一个引用变量必须在定义的时候。 而所有的运算符操作都被视为赋值而不是初始化,所以引用参数的初始化必须在初始化列表中进行。 class Test{ public: Test(int val) : ref_(val){} ~Test() {} private: int & ... 阅读全文
posted @ 2012-07-02 02:36 Mr.Rico 阅读 (467) | 评论 (0) 编辑
摘要:1、什么是static? static是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。 2、为什么要引入static? 函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。 3、什么时候用static? 需要 一个... 阅读全文
posted @ 2012-07-02 02:33 Mr.Rico 阅读 (651) | 评论 (0) 编辑
摘要:求两个数的最大公约数问题,即常说的GCD问题,是一个经常用到的问题。这个问题的求解最常用的方法就是辗转相除的方法。这个方法其实就是下面的一个公式:gcd(a,b)=gcd(b,a%b)记住了这个公式就很容易写出它的程序了。第一:可以采用递归的方法: unsignedgcd(unsigneda,unsignedb){if(!b)returna;if(a<b)returngcd(b,a);elsereturngcd(b,a%b);}第二:所有的递归都可以转为迭代实现: unsignedgcd2(unsigneda,unsignedb){unsignedtmp;while(b!=0){tmp= 阅读全文
posted @ 2012-07-02 02:19 Mr.Rico 阅读 (150) | 评论 (0) 编辑
摘要:之前介绍过常见的排序算法,可以查看这里之前实现的代码都是针对int型的算法,现在我将代码改写成了模板,这样可以应用于常见的一些类型。为了测试比较不同的排序算法,采用了两种计时方式。注意,下面的两段代码中,void(*_sort[])(T*,int) 是函数指针数组。1. 采用clock函数,统计排序算法所使用的时钟数代码如下: template<classT>voidclock_test(){void(*_sort[])(T*,int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,select 阅读全文
posted @ 2012-07-02 01:10 Mr.Rico 阅读 (1309) | 评论 (0) 编辑
摘要:总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序、分配排序和计数排序。插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序和快速排序;归并排序主要包括二路归并(常用的归并排序)和自然归并。分配排序主要包括箱排序和基数排序。计数排序就一种。稳定排序:假设在待排序的文件中,存在两个. 阅读全文
posted @ 2012-07-01 16:11 Mr.Rico 阅读 (10419) | 评论 (2) 编辑