X264帧内预测编码模式
H.264和x264的联系和区别

H.264随着HDTV的兴起,H.264这个规范频频出现在我们眼前,HD-DVD和蓝光DVD均计划采用这一标准进行节目制作。
而且自2005年下半年以来,无论是NVIDIA还是ATI都把支持H.264硬件解码加速作为自己最值得夸耀的视频技术。
H.264到底是何方“神圣”呢?什么是H.264?H.264是一种高性能的视频编解码技术。
目前国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。
而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(Advanced Video Coding,AVC),而且它将成为MPEG-4标准的第10部分。
因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。
H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。
举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1!H.264为什么有那么高的压缩比?低码率(Low Bit Rate)起了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。
尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像。
H.264算法的优势H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(Loop Filter)、熵编码(Entropy Coding)。
X264编码参数设置

X264编码参数设置By:林立翔standfly@北京邮电大学多媒体通信中心2011-11一,X264版本本项目使用X264编码版本为20091008-2245,附带FFMPEG解码器用以验证编码效果。
二,编译条件本测试在windows xp平台下的visual studio 2008 编译环境下进行三,软件配置1. 打开X264CODEC文件夹,双击X264CODEC解决方案,用Visual Studio 2008打开工程文档2. 单击左上角解决方案资源管理器中X264ENCODE解决方案—>击右键 左击属性,进入X264ENCODE属性页—>选择配置属性—>调试—>在右栏的命令参数中输入所需的编码参数。
四,编码参数设置1.x264基本参数设置格式[--参数名参数值 ...] --output 输出文件输入文件其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。
观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。
此外,还有短参数模式。
这是为了简化某些常用参数名设计的。
一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。
注意此时这个字母区分大小写。
在--fullhelp 列表里,有短参数的参数的短参数都列在此参数的前面。
2.本测试预设的编码参数--crf 23 --tune psnr --preset medium --output X:\xxx\xxx.264 --fps 25 X:\广科院测试序列\左测试序列1.yuv 1920x1080其中,1).crfcrf为一种根据片子质量自动分配码率的 vbr 码率控制方式。
可用的值从 1到 51,越小编码质量越好,码率越高。
一般使用 16 到 24可以为浮点。
本测试预采用此参数或许不同码率下的编码数据。
H.264帧内预测模式快速选择算法

H.264帧内预测模式快速选择算法刘西娟【期刊名称】《计算机与数字工程》【年(卷),期】2011(39)4【摘要】为降低帧内预测的复杂度,提出一种快速的帧内预测算法.该算法利用帧内4×4块最优预测模式与和它相邻的预测模式之间率失真代价(RDCost)的高相关性,以及绝对变换误差和(SATD)与率失真(RD)性能之间的强相关性,有效减少了预测模式,避免了不必要的RDCost计算.实验结果显示,该算法提高编码时间效率约为50%,同时保持视频的图像质量几乎不变.%To reduce computational complexity of intra prediction, an efficient fast mode selection is proposed. The proposed algorithm uses high correlation of RD cost between best prediction mode and its neighborhood prediction mode,strong correlation between sums of absolute transform diferences(SATD) and rate-distortion(RD) performance, efficiently reduces the prediction modes and avoids unnecessary RDCost computation. The simulation result shows that this algorithm is able to reduce about 50% encoding time while degradation of the image quality is negligible.【总页数】3页(P53-55)【作者】刘西娟【作者单位】西安航空职工大学宝成工学院,宝鸡721006【正文语种】中文【中图分类】TN919.81【相关文献】1.H.264/AVC帧内预测模式的快速选择算法 [J], 丁道林;张玲华2.基于纹理特征的H.264/AVC帧内预测模式快速选择算法 [J], 张小红;张媛3.H.264/AVC帧内预测模式快速选择算法研究 [J], 熊伟;杨静4.基于方向信息的H.264帧内预测快速模式选择算法 [J], 陈政;何卫锋5.基于模式相关性的H.264帧内预测快速模式选择算法 [J], 孔磊;于凤芹因版权原因,仅展示原文概要,查看原文内容请购买。
X264帧内预测编码模式

X264帧内预测编码模式帧内宏块预测编码模式:分别计算16X16和16个4X4块的代价,取两者中最小代价为该宏块的编码模式。
1、进行16X16模式的预测(1)根据周围宏块的情况判断其可能的预测模式。
(主要是上块TOP和左块LEFT)(2)计算各种可能模式的编码代价(3)取最小代价2、进行4X4块模式的预测(1)根据周围宏块情况判断其可能的预测模式。
(可以参考其他相邻宏块)(2)计算每个4X4块的每种预测模式的编码代价,并取代价最小(3)将16个4X4块的最小代价相加,得到总代价和。
3、将16X16模式的代价与4X4模式的代价和进行比较,取两者最小为最后的宏块预测编码模式。
X264中的代码分析:static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_satd_inter )//函数功能:帧内预测编码模式选择{const unsigned int flags = h->sh.i_type == SLICE_TYPE_I ? h->param.analyse.intra : h->param.analyse.inter;//判断是进行I片内的宏块帧内预测编码还是P或B片(帧间片)内的帧内模式预测编码uint8_t *p_src = h->mb.pic.p_fenc[0];uint8_t *p_dst = h->mb.pic.p_fdec[0];int i, idx;int i_max;int predict_mode[9];int b_merged_satd = h->pixf.intra_satd_x3_16x16 && h->pixf.mbcmp[0] == h->pixf.satd[0];/*---------------- Try all mode and calculate their score ---------------*//* 16x16 prediction selection */predict_16x16_mode_available( h->mb.i_neighbour, predict_mode, &i_max );//获取16X16的可用预测编码模式if( b_merged_satd && i_max == 4 )//如果b_merged_satd不为0且可用预测编码模式有4种,I帧时直接跳过{h->pixf.intra_satd_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );h->predict_16x16[I_PRED_16x16_P]( p_dst );a->i_satd_i16x16_dir[I_PRED_16x16_P] =h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE );for( i=0; i<4; i++ ){int cost = a->i_satd_i16x16_dir[i] += a->i_lambda * bs_size_ue(i);COPY2_IF_LT( a->i_satd_i16x16, cost, a->i_predict16x16, i );}}else{for( i = 0; i < i_max; i++ ){int i_satd;int i_mode = predict_mode[i];h->predict_16x16[i_mode]( p_dst );i_satd = h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE ) +a->i_lambda * bs_size_ue( x264_mb_pred_mode16x16_fix[i_mode] );//计算编码代价COPY2_IF_LT( a->i_satd_i16x16, i_satd, a->i_predict16x16, i_mode );//比较a->i_satd_i16x16与i_satd的大小,a->i_satd_i16x16的初值为COST_MAX /* 比较大小代码如下:#define COPY2_IF_LT(x,y,a,b)\if((y)<(x))\{\(x)=(y);\(a)=(b);\}如果i_satd比a->i_satd_i16x16小,则把i_satd值赋给a->i_satd_i16x16,作为当前最优代价,同时把该次预测模式作为当前最优模式;如果a->i_satd_i16x16比i_satd小,则不赋值,只作比较.*/}}if( h->sh.i_type == SLICE_TYPE_B )//如果是进行B片内的宏块帧内预测编码,I帧时直接跳过/* cavlc mb type prefix */a->i_satd_i16x16 += a->i_lambda * i_mb_b_cost_table[I_16x16];//在代价上增加一个prefixif( a->b_fast_intra && a->i_satd_i16x16 > 2*i_satd_inter )return;/* 8x8 prediction selection */if( flags & X264_ANAL YSE_I8x8 ){//省略8X8分块模式时的预测编码代价运算,一般情况下,8X8模式是关闭的.}/* 4x4 prediction selection */if( flags & X264_ANAL YSE_I4x4 )//进行4X4分块模式代价运算{int i_cost;int i_satd_thresh = X264_MIN3( i_satd_inter, a->i_satd_i16x16, a->i_satd_i8x8 );//获得帧间,帧内16X16及8X8模式下编码的最优代价b_merged_satd = h->pixf.intra_satd_x3_4x4 && h->pixf.mbcmp[0] == h->pixf.satd[0];if( a->b_mbrd )i_satd_thresh = i_satd_thresh * (10-a->b_fast_intra)/8;i_cost = a->i_lambda * 24; /* from JVT (SATD0) *///非RDO率失真优化模式下,宏块总代价cost_intra4*4 = 16个4*4 小块的最佳cost 求和+ 4 * 6 * lambda_mode.//此处由于还未进行4X4代价计算,只是预先增加4 * 6 * lambda_mode.//当采用4X4分块时,由于每个4X4块的最优预测编码模式都需要进行编码传输,这样,相比较于16X16模式就多了传输比特数,//为了合理公平比较,规定每个8*8块加一个6*lambda_mode,因此就等于是加了一个4 * 6 * lambda_mode.if( h->sh.i_type == SLICE_TYPE_B )i_cost += a->i_lambda * i_mb_b_cost_table[I_4x4];for( idx = 0;; idx++ ){int x = block_idx_x[idx];int y = block_idx_y[idx];//计算4X4块在所属宏块中的坐标或位置uint8_t *p_src_by = p_src + 4*x + 4*y*FENC_STRIDE;uint8_t *p_dst_by = p_dst + 4*x + 4*y*FDEC_STRIDE;int i_best = COST_MAX;int i_pred_mode = x264_mb_predict_intra4x4_mode( h, idx );predict_4x4_mode_available( h->mb.i_neighbour4[idx], predict_mode, &i_max );//根据周围块情况,获取可用编码模式if( (h->mb.i_neighbour4[idx] & (MB_TOPRIGHT|MB_TOP)) == MB_TOP )/* emulate missing topright samples */*(uint32_t*) &p_dst_by[4 - FDEC_STRIDE] = p_dst_by[3 - FDEC_STRIDE] * 0x01010101U;if( b_merged_satd && i_max >= 6 ){int satd[3];h->pixf.intra_satd_x3_4x4( p_src_by, p_dst_by, satd );if( i_pred_mode < 3 )satd[i_pred_mode] -= 3 * a->i_lambda;for( i=2; i>=0; i-- )COPY2_IF_LT( i_best, satd[i] + 4 * a->i_lambda,//非RDO率失真优化模式下, cost = SATD + 4 * lambda_mode(当前模式不是最有可能模式)a->i_predict4x4[idx], i );//把当前编码模式下的代价与原最优代价进行比较,得出新的最优代价模式.i = 3;}elsei = 0;for( ; i<i_max; i++ ){int i_satd;int i_mode = predict_mode[i];h->predict_4x4[i_mode]( p_dst_by );i_satd = h->pixf.mbcmp[PIXEL_4x4]( p_dst_by, FDEC_STRIDE,//进行代价计算,其中前半部分为绝对变换差和(SATD)p_src_by, FENC_STRIDE )+ a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);////SAD(绝对差值和)计算的差值是预测值与图像像素值的差值,为了更准确的比较每种模式的Cost值,H.264还对这些差值进行Hadamard变换,//将差值(这些值最后要变换到频域进行编码)变换到频域求绝对差值和,这样计算得到的值叫作绝对变换差和(SATD).COPY2_IF_LT( i_best, i_satd, a->i_predict4x4[idx], i_mode );//进行代价比较}i_cost += i_best;if( i_cost > i_satd_thresh || idx == 15 )//如果4X4块的代价总和过大或者已经计算完16个4X4块,则退出循环.break;/* we need to encode this block now (for next ones) */h->predict_4x4[a->i_predict4x4[idx]]( p_dst_by );x264_mb_encode_i4x4( h, idx, a->i_qp );h->mb.cache.intra4x4_pred_mode[x264_scan8[idx]] = a->i_predict4x4[idx];}if( idx == 15 )a->i_satd_i4x4 = i_cost;//如果已经计算完16个4X4块,则得到4X4分块模式的最小代价elsea->i_satd_i4x4 = COST_MAX;//如果4X4分块预测半路终止,则将其代价和赋值为最大,表示4X4分块模式不可用}}基于H.264的帧内预测和码率控制跳帧算法研究张永华硕士视频编码;H.264标准;帧内编码;码率控制;跳帧算法;实时视频通信;计算机软件与理论华南师范大学;H.264是由国际电信联盟ITU和国际标准化组织ISO联合成立的联合视频专家组JVT,Joint Video Team于2003年5月正式推出的视频编码标准与以往的视频编码标准相同,H.264采用的是基于块的混合视频编码模式,其基本的源编码算法是利用时间统计的相关性,开发帧间预测算法利用预测残留变换编码,开发空间统计的相关性同时该标准又使用了一系列先进的编码技术如帧内编码中的空域预测、可变块尺寸的运动补偿、4×4整数变换、多参考帧选择和内容自适应的二进制算术编码等H.264在编码效率、网络适应性等诸多方面都超越以往的视频编码标准因此受到业界的广泛关注在提高编码效率方面,没有一个单一的算法做出特别的贡献,而是大量的小的改善算法综合产生的结果为了达到高效的编码性能,H.264使用率失真优化RDO,Rate Distortion Optimization模型为每个宏块选择最佳编码模式和参考帧但是由于H.264使用全搜索算法,其计算复杂度远远高于现有的其他标准,无法满足实时视频通信等应用需求,所以必须对算法进行优化以降低复杂度H.264中提高编码性能的一个重要手段是帧内编码,它采用了多种预测模式,这些模式在对I、P和B帧编码时,都需要进行逐一计算因此,可以通过优化快速算法来降低帧内编码的整体复杂度。
X264编码参数设置

X264编码参数设置By:林立翔standfly@北京邮电大学多媒体通信中心2011-11一,X264版本本项目使用X264编码版本为20091008-2245,附带FFMPEG解码器用以验证编码效果。
二,编译条件本测试在windows xp平台下的visual studio 2008 编译环境下进行三,软件配置1. 打开X264CODEC文件夹,双击X264CODEC解决方案,用Visual Studio 2008打开工程文档2. 单击左上角解决方案资源管理器中X264ENCODE解决方案—>击右键 左击属性,进入X264ENCODE属性页—>选择配置属性—>调试—>在右栏的命令参数中输入所需的编码参数。
四,编码参数设置1.x264基本参数设置格式[--参数名参数值 ...] --output 输出文件输入文件其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。
观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。
此外,还有短参数模式。
这是为了简化某些常用参数名设计的。
一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。
注意此时这个字母区分大小写。
在--fullhelp 列表里,有短参数的参数的短参数都列在此参数的前面。
2.本测试预设的编码参数--crf 23 --tune psnr --preset medium --output X:\xxx\xxx.264 --fps 25 X:\广科院测试序列\左测试序列1.yuv 1920x1080其中,1).crfcrf为一种根据片子质量自动分配码率的 vbr 码率控制方式。
可用的值从 1到 51,越小编码质量越好,码率越高。
一般使用 16 到 24可以为浮点。
本测试预采用此参数或许不同码率下的编码数据。
X264-libx264编码库

X264-libx264编码库X264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。
编码帧的类型分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H264中叫做图像⽚Slice。
X264把整帧图像看作⼀个Slice,⽚中有slice_type_i、slice_type_p、slice_type_b之分。
I帧只有slice_type_i,P帧有slice_type_i、slice_type_p,B帧三种⽚都有。
X264的H264视频编码过程可以分为三个步骤:⾸先根据规则判定当前帧的编码类型,如果是B帧,要缓冲存放、获取;然后对待编码图像进⾏帧内预测、帧间预测、整数DCT变换、量化和熵编码;最后把压缩的H264数据进⾏NAL层打包输出。
X264编码器有关的重要结构体:x264_image_t:实际参与编码的编码帧图像信息。
typedef struct{int i_csp; //图像空间颜⾊int i_plane; //图像平⾯数⽬int i_stride[4]; //每个图像平⾯的跨度,也就是每⼀⾏数据的字节数uint8_t *plane[4]; //每个图像平⾯存放数据的起始地址,plane[0]是Y平⾯,plane[1]是U平⾯,plane[2]是V平⾯}x264_image_t; //待编码的图像x264_picture_t:x264编码器定义便于控制的图像帧,描述⼀帧的特征。
包含x264_image_t和x264_param_t结构体。
typedef struct{int i_type; //帧的类型,初始化为auto,在编码过程⾃⾏控制int i_qpplus1; //此参数减1代表当前帧的量化参数值int i_pic_struct; //帧的结构类型int b_keyframe; //输出是否是关键帧int64_t i_pts; //⼀帧的显⽰时间戳int64_t i_dts; //输出解码时间戳x264_param_t *param;x264_image_t img;x264_image_properties_t prop;x264_hrd_t hrd_timing;void *opaque;} x264_picture_t; //x264编码视频帧x264_param_t:初始化编码器。
H.264帧内编码的模式选择

H.264帧内编码的模式选择H.264中4X4亮度预测依据预测方向的不同共有9种预测模式。
在亮度4x4帧内预测时,其中DC预测(模式2)、垂直预测(模式0)和水平预测(模式2总是被认为有效的,即使在编码块上面像素或左边像素不可用的情况下(这时候上面像素或左边像素的值就使用128这个值来代替),而其它模式仅当所有需要利用的预测象素点都可用的情况下才可以使用(如果E, F, G,H不可用,可以用D的值来代替)。
这儿所说的像素点可用(available)是指此像素所在的子块存在并且与当前编码的子块属于同一个slice。
模式选择在H.264帧内编码中,每个宏块亮度信号都要完成9种4x4预测模式和4种16x16预测模式,然后通过预测模式选择,得出一种最佳预测模式使得编码后的图像在码流和图像质量两者权衡后的获得一个最佳。
H.264中模式选择方法有两种:1、使用率失真优化(RDO)模式选择。
使用这种RDO方式的模式选择过程如下:1)在给定最后解码的帧及宏块的量化因子QP后,计算拉格朗日因子:X=0.85*QP2 (1)2)在帧内亮度4x4预测的9种预测模式中,通过计算下面的函数使得其值最小,从中选择最佳的帧内亮度4x4预测模式。
J(s, c, m I QP, Xm )=SSD(s, c, m I QP)+X*R(s, c, m I QP) (2)式中QP是宏块的量化参数,X是(1)中的拉格朗日因子,SSD是原始的亮度块s与预测模式为m的重建块的平方差的和,R表示与选择模式m相关联的比特数,包括模式编帧内模式及DCT系数所需的比特数。
3)在帧内16x16预测模式中,通过计算4种16x16宏块的SATD(绝对变换差和)使得其值最小来确定最佳16x16亮度帧内预测模式。
4)通过比较一个宏块使用4x4预测模式时计算的RD代价值与使用16x16帧内预测模式时计算得到的最小代价值,选取代价最小的作为最佳预测模式。
2、基于SAD(或SATD)和速率估计的模式选择方法。
4.1.宏块级流程图MB-Analyse

[帧内预测] 比较帧间与帧 内的SATD
≥7
精确分析? h->mb.
<6
i_subpel_refine=?
X264_mb_analyse_p_rd(),
率失真优化
x264_intra_rd()
=6
P (1)快速探测B_SKIP模式 (2)计算B子宏块模式的运动矢量 及对应的SATD代价 (3)1/4像素细化 (4)帧内预测 (5)率失真优化
【宏块分析】分析各种可能帧内/帧间预测模式下的编码代价,寻找到最合 适的预测模式,如果是帧间预测模式,则保存运动估计得到的运动矢量。
输入参数 x264_t *h
SLICE_TYPE_I I帧
x264_ratecontrol_qp(), 功能:得到当前宏块的量化参数i_qp x264_mb_analyse_init() 功能:初始化宏块分析结构变量analysis h, analysis
h, analysis, i_partition
Yes
h->mb. b_chroma_me?
X264_mb_analyse
_intra_chroma()
No
h, analysis, i_partition X264_mb_analyse_intra()
h, analysis, i_partition
h->sh.i_type=?
SLICE_TYPE_B B帧
SLICE_TYPE_P P帧
左、左上、上、右上
【帧内预测】得到编码代价: x264_mb_analyse_intra() analysis.i_satd_i4x4
analysis.i_satd_i16x16
h, analysis
X264的帧间预测

【转】X264的帧间预测已有 162 次阅读2009-06-15 10:06【转】X264的帧间预测1、x264学习笔记(9)--x264中16x16运动搜索过程函数实现是函数 static void x264_mb_analyse_inter_p16x16( x264_t *h, x264_mb_analysis_t *a )1、大循环是参考帧的循环,从最近的一个参考帧开始搜索,一直到最远的一个参考帧;2、调用x264_mb_predict_mv_16x16函数,以上、右上、左块运动矢量的中值m.mvp作为候选运动矢量。
3、调用x264_mb_predict_mv_ref16x16函数,寻找其它候选运动矢量。
这些候选者包括:空间相邻的左、左上、上、右上块的MV;第0个参考帧中的当前块、右边块、下边快运动矢量乘以时间差权重。
4、调用x264_me_search_ref进行运动搜索。
搜索时先从所有候选运动矢量中选出最佳的起点,然后使用小钻石法、六边形法、UMH或者全搜索搜索出最佳的整像素位置。
5、x264_me_search_ref调用refine_subpel进行1/2和1/4运动搜索。
两者都使用小钻石法。
6、搜索出最佳运动矢量后,如果当前是最近一个参考帧,而且最佳SA(T)D小与检测门限,则尝试对其进行P_SKIP编码。
7、保存搜索结果。
2、x264学习笔记(10)---分像素的运动估计总结得到分像素的值函数是下面两个函数,对照着(1) static uint8_t *get_ref( uint8_t *src[4], int i_src_stride,uint8_t *dst, int * i_dst_stride, int mvx,int mvy,int i_width, int i_height ){int qpel_idx = ((mvy&3)<<2) + (mvx&3); //取出运动矢量的分像素部分。
H.264帧内预测模式的快速选择算法

H.264帧内预测模式的快速选择算法程飞北京邮电大学电信工程学院,北京(100876)E-mail:chengfei164@摘要:H.264视频压缩编码标准比先前的H.261和H.263标准有更好的编码效果。
这主要归功于H.264标准中在编码过程中采用的大量复杂的编码压缩方法。
多模式帧内预测就是这些方法之一。
为了达到更好的压缩性能,H.264标准中采用了13种不同的帧内预测模式。
比特率-失真度最优化算法(RDO)被引入到H.264标准中为每一个宏块来选择出最匹配的预测模式。
RDO算法在能够达到很好的编码效果的同时也给整个编码过程带来了很大的计算量并耗费了大部分的处理时间。
本文提出了一种新型的帧内预测模式的快速选择算法,该算法首先基于图像内部的差异度对16×16和4×4这两类预测模式进行选择,然后基于绝对变换误差(SATD)对细分的预测模式进行进一步的选择。
本文提出的算法简单有效,能够显著的减小候选模式和RDO的计算量。
最终的试验结果表明,文中提出的快速选择算法可以将整个编码时间减少到采用标准RDO算法时的41%-46%,而且和标准的RDO算法比较,最终压缩后的视频图像质量也只下降了0.4dB。
关键词:帧内预测,绝对变换误差(SATD),差异度,码率-失真度最优化(RDO)算法中图分类号:TN9151. 引言H.264/A VC是由ITUT和MPEG一起联合开发的新一代视频编解码标准,可以在不牺牲图像质量的前提下提供更高的压缩效率。
许多新的技术首次在该标准中采用,例如帧内编码的空间预测,可变块大小的运动补偿,多个参考帧以及自适应二进制编码。
在这新的特性中,通过运用可变大小块和多个方向预测的技术,帧内预测模式被极大的丰富了。
根据[1]的研究结果,借助于这些新特性H.264/A VC帧内编码的性能超过了JPEG-2000的静态图像压缩标准。
然而,为了达到上述目的,H.264/A VC大大增加了编码器的运算复杂度,从而增大了H.264编码器的硬件实施难度和实时的应用。
x264宏块模式选择

x264宏块模式选择2009-11-08 21:55选择模式前,先把mb模块的类型列举出来。
enum mb_class_e{//以I_表示的是I帧内的宏块模式,采用帧内预测I_4x4 = 0,I_8x8 = 1,I_16x16 = 2,I_PCM = 3,//P帧的宏块模式P_L0 = 4,P_8x8 = 5,P_SKIP = 6,//B帧的宏块模式B_DIRECT = 7,B_L0_L0 = 8,B_L0_L1 = 9,B_L0_BI = 10,B_L1_L0 = 11,B_L1_L1 = 12,B_L1_BI = 13,B_BI_L0 = 14,B_BI_L1 = 15,B_BI_BI = 16,B_8x8 = 17,B_SKIP = 18,X264_MBTYPE_MAX = 19};1.p/b_skip,一种宏块类型,当图像采用帧间预测编码时,在图像平坦的区域使用“跳跃”块,“跳跃”块本身不携带任何数据,在解码端是通过 direct方式预测出MV或者直接周围已重建的宏块来恢复。
对于B片中的skip宏块是采用direct模式,有时间和空间的direct预测方式。
对于P片的skip宏块采用利用周围已重建的宏块copy而来。
(/viewthread.php?tid=994&highlight=direct)2.b_direct, 一种宏块类型,采用direct的预测模式。
3.其他参数代表的含义在<新一代视频压缩标准>中有对应的解释,见7.3.9节“宏块层的语义”.下面是将Mb分割的块列举:enum mb_partition_e{/* sub partition type for P_8x8 and B_8x8 */D_L0_4x4 = 0,D_L0_8x4 = 1,D_L0_4x8 = 2,D_L0_8x8 = 3,/* sub partition type for B_8x8 only */D_L1_4x4 = 4,D_L1_8x4 = 5,D_L1_4x8 = 6,D_L1_8x8 = 7,D_BI_4x4 = 8,D_BI_8x4 = 9,D_BI_4x8 = 10,D_BI_8x8 = 11,D_DIRECT_8x8 = 12,/* partition */D_8x8 = 13,D_16x8 = 14,D_8x16 = 15,D_16x16 = 16,X264_PARTTYPE_MAX = 17,};模式选择:A. 帧内预测:根据H.264标准规定的9种帧内4x4亮度分量预测、4种帧内16xl6亮度分量预测以及4种帧内8x8色差分量预测模式,针对宏块左邻和上邻宏块存在或缺失的不同情况,分别直接调用不同的预测函数,以节约逻辑判断的时间。
X.264,H.264,divX等编码标准介绍

【基本定义】x264是一种免费的、具有更优秀算法的H.264/MPEG-4 AVC视频压缩编码格式。
它同xvid一样都是开源项目,但x264是采用H.264标准的,而xvid是采用MP EG-4早期标准的。
由于H.264是2003年正式发布的最新的视频编码标准,因此,在通常情况下,x264压缩出的视频文件在相同质量下要比xvid压缩出的文件要小,或者也可以说,在相同体积下比xvid压缩出的文件质量要好。
它符合GPL许可证。
[编辑本段]【X.264起源】X.264起源于H.264技术,是H.264的的变种版本。
与H.264相比,X.264是针对业余市场推出的一个免费编码格式,是H.264的子集,只能能实现H.264的部分功能。
X.264多见于网络上流传的重压缩的视频内容[编辑本段]【X.264特点】特点:日前,x264是最新的AVC编码格式之一。
■ 采用CAVLC/CABAC多种算法编码■ 内置所有macroblock格式(16x16, 8x8, and 4x4 )X.264界面■ Inter P:所有的分割块(从16x16到4x4 )■ Inter B:分割块从16x16到8x8■ 码率控制:恒定的分层编制,单次或多次的ABR压制,可选的VBV压制■ 场景剪切侦测■ 支持B-frame■ 能够任意编制B-frame命令行■ 无损模式■ 8x8和4x4的格式能够进行翻转或旋转■ 自定义精确的矩阵模板■ 可在多个CPU平行编码■ 隔行扫描[编辑本段]【技术区别】x264x264是一个基于h.264的免费开源的视频Codec,属于后起之秀,已经受到众多Riper的青睐,但是与Xvid相比,其在解码时对硬件的要求更高。
H.264H.264是由国际电信联盟(ITU-T)所制定的新一代的视频压缩格式。
H.264最具价值的部分无疑是更高的数据压缩比。
在同等的图像质量条件下,H.264的数据压缩比能比当前DVD系统中使用的MPEG-2高2-3倍,比MPEG-4高1.5-2倍。
x264实时编码的码率控制--一个简单的QP调节方法

x264实时编码的码率控制--一个简单的QP调节方法x264实时编码的码率控制一个简单的QP调节方法在用x264做实时视频,由于用在智能手机上,计算能力有限,网络带宽有限,故设计了一个简单的新的码率控制算法,效果还不错,与大家分享。
一般做实时视频,x264作者推荐用vbv-CBR模式,这样来稳定码流,适应带宽。
但对于嵌入式系统,CBR模式计算量较大。
CBR模式需要进行前期的半精度SATD值计算,以得到图像复杂度,进而得到预计的bits(这一SATD还用在slice type的选择,实际这个计算过程的函数就叫slice_type_decision,在lookaheand_get_frame中);通过预计bits与期望bits的比较得到qscale,进而得到本编码帧的QP。
当然若用上mb_tree,aq_mode 还更复杂。
这一前期的计算过程大致占整个计算量的12%-20%(根据参数的不同),但若略去这步,使用固定QP,码率波动较大。
现设计了一个新的模式,利用帧间的相似性,根据上一帧编码的实际bits与期望bits的差,来调节QP(帧级调整)。
实现上的思路也很简单,利用CQP模式的壳,在每帧编码前再次调节QP。
需要采用参数如下:--bframes 0 不要B帧对于嵌入式,手机等系统,建议采用:--scenecut 0---(不需额外增加i 帧,由于实时不需b帧,故一个GOP组中,只有一个IDR 帧及其余的P帧);--subme 1 1/4精度的SAD值--no-8x8dct (这个是high profile, 不需要,同样可加快编码,节省码流)--partition none 不要划分(可提高编码速度,节省码流,psnr基本不变)其余参数可参见,x264 --preset-veryfast的参数配置;好了接下来是帧级的码流控制,即调节QP;1. 在x264参数中添加新码率控制的参数(get_opt函数),如:--newqp2. 这个newqp与CQP,可以起使用。
X264编码流程详细分析

量化放缩 判断是否为skip模式, 并进行相关处理 x264_mb_encode_8x8
色度编码结束
计算亮度色度句型,以及非零计数
存储cbp: coded_ block_ pattern
检查P/B跳过情况, 进行相应处理
宏块编码结束
Encoder.c: x264_mb_encode_i16x16
反量化所有dct[1][][]中的系数
是
i<16
否 对dct[0][][]中的所有dc系数 进行量化和扫描,解雇存放于 h->dct.luma16x16_dc
重建块(idct,反量化),并将结果 存放入h->mb.pic.p_fdec[0]
宏块编码结束
Encoder.c: x264_mb_encode_i4×4 对4*4子块dct变换从p_src和p_dst 取出数据变换以后放在dct4*4中
X264.c: main
设置打开文件的方式
_setmode
x264_param_default 设置编码器默认参数
读取命令行并分析 Parse 编码Encode
X264.c:Encode
得到总帧数 p_get_frame_total 初始化编码器 x264_encoder_open 设置输出文件参数 p_set_outfile_param 为新图分配空间 x264_picture_alloc
选择帧类型
移动一些B 帧 和一个非B帧到编 码队列中去
获得要被编码 的帧
编码 Do encode
判断是否存放 重建的帧
计算和打印 统计值
更新编码器状态
设置输出 图片属性
Encoder.c: do encode
设置帧上下文 (初始化帧类型) 初始化 (参考列表,bit率控制)
x264源代码概述框架分析架构分析

x264源代码概述框架分析架构分析函数背景⾊函数在图中以⽅框的形式表现出来。
不同的背景⾊标志了该函数不同的作⽤:⽩⾊背景的函数:不加区分的普通内部函数。
浅红背景的函数:libx264类库的接⼝函数(API)。
粉红⾊背景函数:滤波函数(Filter)。
⽤于环路滤波,半像素插值,SSIM/PSNR的计算。
黄⾊背景函数:分析函数(Analysis)。
⽤于帧内预测模式的判断,或者帧间预测模式的判断。
绿⾊背景的函数:宏块编码函数(Encode)。
通过对残差的DCT变换、量化等⽅式对宏块进⾏编码。
紫⾊背景的函数:熵编码函数(Entropy Coding)。
对宏块编码后的数据进⾏CABAC或者CAVLC熵编码。
蓝⾊背景函数:汇编函数(Assembly)。
做过汇编优化的函数。
图中主要画出了这些函数的C语⾔版本,此外这些函数还包含MMX版本、SSE版本、NEON版本等。
浅蓝⾊背景函数:码率控制函数(Rate Control)。
对码率进⾏控制的函数。
具体的⽅法包括了ABR、CBR、CRF等。
区域整个关系图可以分为以下⼏个区域:最左边区域——x264命令⾏程序函数区域。
左边中间区域——libx264内部函数区域。
右上⽅粉红⾊区域——滤波模块。
其中包括了环路滤波,半像素插值,SSIM/PSNR计算。
右上⽅黄⾊区域——分析模块。
其中包含了帧内预测模式分析以及帧间运动估计等。
右中间绿⾊区域——宏块编码模块。
其中包含了针对编码帧的DCT变换,量化,Hadamard变换等;以及针对重建帧的DCT反变换,反量化,Hadamard反变换等。
右下⽅紫⾊区域——熵编码模块。
其中包含了CABAC或者CAVLC熵编码。
箭头线箭头线标志了函数的调⽤关系:⿊⾊箭头线:不加区别的调⽤关系。
粉红⾊的箭头线:滤波函数(Filter)之间的调⽤关系。
黄⾊箭头线:分析函数(Analysis)之间的调⽤关系。
绿⾊箭头线:宏块编码函数(Encode)之间的调⽤关系。
x264代码剖析(十七):核心算法之熵编码(EntropyEncoding)

x264代码剖析(十七):核心算法之熵编码(EntropyEncoding)熵编码是无损压缩编码方法,它生产的码流可以经解码无失真地恢复出原始数据。
熵编码是建立在随机过程的统计特性基础上的。
本文对熵编码中的CAVLC(基于上下文自适应的可变长编码)和CABAC (基于上下文的自适应二进制算术熵编码)进行简单介绍,并给出x264中熵编码对应的代码分析。
在H.264的CAVLC中,通过根据已编码句法元素的情况,动态调整编码中使用的码表,取得了极高的压缩比。
CAVLC用于亮度和色度残差数据的编码,CAVLC充分利用残差经过整数变换、量化后数据的特性进行压缩,进一步减少数据中的冗余信息,为H.264的编码效率的提升奠定了基础。
CAVLC的编码过程主要包括以下五个步骤:(1)对非零系数的数目(TotalCoeffs)以及拖尾系数的数目(TrailingOnes)进行编码;(2)对每个拖尾系数的符号进行编码;(3)对除了拖尾系数之外的非零系数的幅值(Levels)进行编码;(4)对最后一个非零系数前零的数目(TotalZeros)进行编码;(5)对每个非零系数前零的个数(RunBefore)进行编码。
在最新国际视频编码标准(High Efficiency Video Coding, HEVC)中,熵编码模块摒弃了CAVLC(基于上下文自适应的可变长编码),而仅仅采用了CABAC(基于上下文的自适应二进制算术熵编码),故本文只分析CAVLC在x264中的代码,对于CABAC的原理以及代码分析将在x265相关的代码分析文章中进行介绍。
在x264中,熵编码模块对应的函数关系图如下图所示:从图中可以看出,熵编码模块包含两个函数x264_macroblock_write_cabac()和x264_macroblock_write_cavlc()。
如果输出设置为CABAC编码,则会调用x264_macroblock_write_cabac();如果输出设置为CAVLC编码,则会调用x264_macroblock_write_cavlc()。
x264参数介绍(一、帧类型和码率控制)

/s/blog_4e0869690100xa87.html原文地址:【翻译】x264参数介绍(一、帧类型和码率控制)作者:南无阿弥陀佛【翻译】x264参数介绍(一、帧类型和码率控制)2010年10月2日评论发表评论翻译自:/wiki/X264_Settings,水平有限,勿吝指教。
第二部分:/?p=2206输入用1个绝对路径定义输入文件(或者2个,rawYUV文件)。
如下例:x264.exe -o NUL C:input.avsx264 -o /dev/null ~/input.y4m如果输入文件是rawYUV格式的,还要把分辨率一并输入。
如果开启了比特率控制,还需要输入帧率。
如下例:x264.exe -o NUL –fps 25 D:input.yuv 1280×720x264 -o /dev/null –fps 30000/1001 ~/input.yuv 640×480预设值预设值是x264在r1177版本增加的一个方便的命令行选项。
可以用x264.exe –fullhelp查看所有的命令行帮助。
profile默认:无说明:限制输出文件的profile。
这个参数将覆盖其它所有值,此选项能保证输出profile兼容的视频流。
如果使用了这个选项,将不能进行无损压缩(qp 0 or crf 0)。
可选:baseline,main,high建议:不设置。
除非解码环境只支持main或者baseline profile的解码。
preset默认:medium一些在压缩效率和运算时间中平衡的预设值。
如果指定了一个预设值,它会在其它选项生效前生效。
可选:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.建议:可接受的最慢的值tune默认:无说明:在上一个选项基础上进一步优化输入。
详解H.264之帧内预测模式

H264侦内预测模式在帧内预测模式中,预测块P是基于已编码重建块和当前块形成的。
对亮度像素而言,P块用于4×4子块或者16×16宏块的相关操作。
4×4亮度子块有9种可选预测模式,独立预测每一个4×4亮度子块,适用于带有大量细节的图像编码;16×16亮度块有4种预测模式,预测整个16×16亮度块,适用于平坦区域图像编码;色度块也有4种预测模式,类似于16×16亮度块预测模式。
编码器通常选择使P块和编码块之间差异最小的预测模式。
4×4亮度预测模式如图6.14所示,4×4亮度块的上方和左方像素A~M为已编码和重构像素,用作编解码器中的预测参考像素。
a~p为待预测像素,利用A~M值和9种模式实现。
其中模式2(DC 预测)根据A~M中已编码像素预测,而其余模式只有在所需预测像素全部提供才能使用。
图6.15箭头表明了每种模式预测方向。
对模式3~8,预测像素由A~M加权平均而得。
例如,模式4中,d=round(B/4+C/2+D/4)。
表2 16×16预测模式描述模式模式0(垂直)由上边像素推出相应像素值模式1(水平)由左边像素推出相应像素值模式2(DC)由上边和左边像素平均值推出相应像素值模式3(平面)利用线形“plane”函数及左、上像素推出相应像素值,适用于亮度变化平缓区域8×8色度块预测模式每个帧内编码宏块的8×8色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。
4种预测模式类似于帧内16×16预测的4种预测模式,只是模式编号不同。
其中DC(模式0)、水平(模式1)、垂直(模式2)、平面(模式3)。
对于当前块C, 编解码器按照如下方法计算probableprediction mode=min{prediction mode of A, predictionmodes of B}当A (或者B)的预测模式不可用时,prediction mode of A=2.例如A 和B块的预测模式分别为3 和1most probable mode for block C =1编码器为每个4x4 块发送一个标记flag,解码器按照如下方式解码Ifflag==1, prediction mode=most_probable_modeIfflag==0If rem_intra4×4_pred_mode< most_probable_modeprediction mode=rem_intra4×4_pred_modeelseprediction mode=rem_intra4×4_pred_mode+1这样表示9中预测模式只需要8个值(0 to 7)分享几个采用H.264视频编解码标准的即时通讯开发包给大家:/detail/aoliaoaoao/4981727/detail/aoliaoaoao/4983918/detail/aoliaoaoao/4983892/detail/aoliaoaoao/4983874。
FFmpeg-X264-编码参数

FFmpeg X264编码参数1.目录1.码率控制 (1)2.X264的preset和tune (2)3.编码延时建议 (2)4.ffmpeg编码参数和x264参数对照 (3)5.x264参数说明 (6)2.码率控制X264提供三种码率控制的方式:bitrate, qp, crf。
这三种方式是互斥的,使用时设置其中之一即可。
(1)bitratex264会尝试把给定的位元率作为整体平均值来编码。
这意味着最终编码文件的大小是已知的,但最终的品质未知。
此选项通常与-pass(两阶段编码)一起使用。
注意,ffmpeg中设置bitrate的具体参数为bit_rate,单位是bits/s(x264里面对应参数i_bitrate 的单位则是kbits/s, 1kbits为1000bits而非1024bits).(2)qp使用qp选项时,表示P帧的量化值为qp。
I帧和B帧的量化值则是从--ipratio和--pbratio中取得。
可使用默认参数,也可自己设定。
使用qp模式,即固定量化值,意味着停用弹性量化(aq_mode)。
当qp为0时,为无损编码。
(3)crf固定位元率系数,C onstant R ate f actor,可用的值从1到51,越小编码质量越好,码率越高。
一般使用16到24,可以为浮点。
(crf 并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量差较大,不同的片子之间就更没有可比性了)此模式把某个“质量”作为编码目标,根据片子质量自动分配码率的vbr(Variable Bit Rate 动态比特率)。
X264中构想是让crf n提供与qp n相当的视觉品质,但编码文件更小一些。
CRF是借由降低“较不重要”帧的品质来达到此目的。
在此情况下,“较不重要”是指在复杂或高动态场景的帧,其品质不是很耗费位元数就是不易察觉,所以会提高它们的量化值。
从这些帧里所节省下来的位元数被重新分配到可以更有效利用的帧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
X264帧内预测编码模式帧内宏块预测编码模式:分别计算16X16和16个4X4块的代价,取两者中最小代价为该宏块的编码模式。
1、进行16X16模式的预测(1)根据周围宏块的情况判断其可能的预测模式。
(主要是上块TOP和左块LEFT)(2)计算各种可能模式的编码代价(3)取最小代价2、进行4X4块模式的预测(1)根据周围宏块情况判断其可能的预测模式。
(可以参考其他相邻宏块)(2)计算每个4X4块的每种预测模式的编码代价,并取代价最小(3)将16个4X4块的最小代价相加,得到总代价和。
3、将16X16模式的代价与4X4模式的代价和进行比较,取两者最小为最后的宏块预测编码模式。
X264中的代码分析:static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_satd_inter )//函数功能:帧内预测编码模式选择{const unsigned int flags = h->sh.i_type == SLICE_TYPE_I ? h->param.analyse.intra : h->param.analyse.inter;//判断是进行I片内的宏块帧内预测编码还是P或B片(帧间片)内的帧内模式预测编码uint8_t *p_src = h->mb.pic.p_fenc[0];uint8_t *p_dst = h->mb.pic.p_fdec[0];int i, idx;int i_max;int predict_mode[9];int b_merged_satd = h->pixf.intra_satd_x3_16x16 && h->pixf.mbcmp[0] == h->pixf.satd[0];/*---------------- Try all mode and calculate their score ---------------*//* 16x16 prediction selection */predict_16x16_mode_available( h->mb.i_neighbour, predict_mode, &i_max );//获取16X16的可用预测编码模式if( b_merged_satd && i_max == 4 )//如果b_merged_satd不为0且可用预测编码模式有4种,I帧时直接跳过{h->pixf.intra_satd_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );h->predict_16x16[I_PRED_16x16_P]( p_dst );a->i_satd_i16x16_dir[I_PRED_16x16_P] =h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE );for( i=0; i<4; i++ ){int cost = a->i_satd_i16x16_dir[i] += a->i_lambda * bs_size_ue(i);COPY2_IF_LT( a->i_satd_i16x16, cost, a->i_predict16x16, i );}}else{for( i = 0; i < i_max; i++ ){int i_satd;int i_mode = predict_mode[i];h->predict_16x16[i_mode]( p_dst );i_satd = h->pixf.mbcmp[PIXEL_16x16]( p_dst, FDEC_STRIDE, p_src, FENC_STRIDE ) +a->i_lambda * bs_size_ue( x264_mb_pred_mode16x16_fix[i_mode] );//计算编码代价COPY2_IF_LT( a->i_satd_i16x16, i_satd, a->i_predict16x16, i_mode );//比较a->i_satd_i16x16与i_satd的大小,a->i_satd_i16x16的初值为COST_MAX/* 比较大小代码如下:#define COPY2_IF_LT(x,y,a,b)\if((y)<(x))\{\(x)=(y);\(a)=(b);\}如果i_satd比a->i_satd_i16x16小,则把i_satd值赋给a->i_satd_i16x16,作为当前最优代价,同时把该次预测模式作为当前最优模式;如果a->i_satd_i16x16比i_satd小,则不赋值,只作比较.*/}}if( h->sh.i_type == SLICE_TYPE_B )//如果是进行B片内的宏块帧内预测编码,I帧时直接跳过/* cavlc mb type prefix */a->i_satd_i16x16 += a->i_lambda * i_mb_b_cost_table[I_16x16];//在代价上增加一个prefixif( a->b_fast_intra && a->i_satd_i16x16 > 2*i_satd_inter )return;/* 8x8 prediction selection */if( flags & X264_ANAL YSE_I8x8 ){//省略8X8分块模式时的预测编码代价运算,一般情况下,8X8模式是关闭的.}/* 4x4 prediction selection */if( flags & X264_ANAL YSE_I4x4 )//进行4X4分块模式代价运算{int i_cost;int i_satd_thresh = X264_MIN3( i_satd_inter, a->i_satd_i16x16, a->i_satd_i8x8 );//获得帧间,帧内16X16及8X8模式下编码的最优代价b_merged_satd = h->pixf.intra_satd_x3_4x4 && h->pixf.mbcmp[0] == h->pixf.satd[0];if( a->b_mbrd )i_satd_thresh = i_satd_thresh * (10-a->b_fast_intra)/8;i_cost = a->i_lambda * 24; /* from JVT (SATD0) *///非RDO率失真优化模式下,宏块总代价cost_intra4*4 = 16个4*4 小块的最佳cost 求和+ 4 * 6 * lambda_mode.//此处由于还未进行4X4代价计算,只是预先增加4 * 6 * lambda_mode.//当采用4X4分块时,由于每个4X4块的最优预测编码模式都需要进行编码传输,这样,相比较于16X16模式就多了传输比特数,//为了合理公平比较,规定每个8*8块加一个6*lambda_mode,因此就等于是加了一个4 * 6 * lambda_mode.if( h->sh.i_type == SLICE_TYPE_B )i_cost += a->i_lambda * i_mb_b_cost_table[I_4x4];for( idx = 0;; idx++ ){int x = block_idx_x[idx];int y = block_idx_y[idx];//计算4X4块在所属宏块中的坐标或位置uint8_t *p_src_by = p_src + 4*x + 4*y*FENC_STRIDE;uint8_t *p_dst_by = p_dst + 4*x + 4*y*FDEC_STRIDE;int i_best = COST_MAX;int i_pred_mode = x264_mb_predict_intra4x4_mode( h, idx );predict_4x4_mode_available( h->mb.i_neighbour4[idx], predict_mode, &i_max );//根据周围块情况,获取可用编码模式if( (h->mb.i_neighbour4[idx] & (MB_TOPRIGHT|MB_TOP)) == MB_TOP )/* emulate missing topright samples */*(uint32_t*) &p_dst_by[4 - FDEC_STRIDE] = p_dst_by[3 - FDEC_STRIDE] * 0x01010101U;if( b_merged_satd && i_max >= 6 ){int satd[3];h->pixf.intra_satd_x3_4x4( p_src_by, p_dst_by, satd );if( i_pred_mode < 3 )satd[i_pred_mode] -= 3 * a->i_lambda;for( i=2; i>=0; i-- )COPY2_IF_LT( i_best, satd[i] + 4 * a->i_lambda,//非RDO率失真优化模式下, cost = SATD + 4 * lambda_mode(当前模式不是最有可能模式)a->i_predict4x4[idx], i );//把当前编码模式下的代价与原最优代价进行比较,得出新的最优代价模式.i = 3;}elsei = 0;for( ; i<i_max; i++ ){int i_satd;int i_mode = predict_mode[i];h->predict_4x4[i_mode]( p_dst_by );i_satd = h->pixf.mbcmp[PIXEL_4x4]( p_dst_by, FDEC_STRIDE,//进行代价计算,其中前半部分为绝对变换差和(SATD)p_src_by, FENC_STRIDE )+ a->i_lambda * (i_pred_mode == x264_mb_pred_mode4x4_fix(i_mode) ? 1 : 4);////SAD(绝对差值和)计算的差值是预测值与图像像素值的差值,为了更准确的比较每种模式的Cost值,H.264还对这些差值进行Hadamard变换,//将差值(这些值最后要变换到频域进行编码)变换到频域求绝对差值和,这样计算得到的值叫作绝对变换差和(SATD).COPY2_IF_LT( i_best, i_satd, a->i_predict4x4[idx], i_mode );//进行代价比较}i_cost += i_best;if( i_cost > i_satd_thresh || idx == 15 )//如果4X4块的代价总和过大或者已经计算完16个4X4块,则退出循环.break;/* we need to encode this block now (for next ones) */h->predict_4x4[a->i_predict4x4[idx]]( p_dst_by );x264_mb_encode_i4x4( h, idx, a->i_qp );h->mb.cache.intra4x4_pred_mode[x264_scan8[idx]] = a->i_predict4x4[idx];}if( idx == 15 )a->i_satd_i4x4 = i_cost;//如果已经计算完16个4X4块,则得到4X4分块模式的最小代价elsea->i_satd_i4x4 = COST_MAX;//如果4X4分块预测半路终止,则将其代价和赋值为最大,表示4X4分块模式不可用}}基于H.264的帧内预测和码率控制跳帧算法研究张永华硕士视频编码;H.264标准;帧内编码;码率控制;跳帧算法;实时视频通信;计算机软件与理论华南师范大学;H.264是由国际电信联盟ITU和国际标准化组织ISO联合成立的联合视频专家组JVT,Joint Video Team于2003年5月正式推出的视频编码标准与以往的视频编码标准相同,H.264采用的是基于块的混合视频编码模式,其基本的源编码算法是利用时间统计的相关性,开发帧间预测算法利用预测残留变换编码,开发空间统计的相关性同时该标准又使用了一系列先进的编码技术如帧内编码中的空域预测、可变块尺寸的运动补偿、4×4整数变换、多参考帧选择和内容自适应的二进制算术编码等H.264在编码效率、网络适应性等诸多方面都超越以往的视频编码标准因此受到业界的广泛关注在提高编码效率方面,没有一个单一的算法做出特别的贡献,而是大量的小的改善算法综合产生的结果为了达到高效的编码性能,H.264使用率失真优化RDO,Rate Distortion Optimization模型为每个宏块选择最佳编码模式和参考帧但是由于H.264使用全搜索算法,其计算复杂度远远高于现有的其他标准,无法满足实时视频通信等应用需求,所以必须对算法进行优化以降低复杂度H.264中提高编码性能的一个重要手段是帧内编码,它采用了多种预测模式,这些模式在对I、P和B帧编码时,都需要进行逐一计算因此,可以通过优化快速算法来降低帧内编码的整体复杂度。