X264帧内预测编码模式

合集下载

H.264和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编码参数设置

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帧内预测模式快速选择算法

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帧内预测编码模式

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编码参数设置

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编码库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帧内编码的模式选择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

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
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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帧编码时,都需要进行逐一计算因此,可以通过优化快速算法来降低帧内编码的整体复杂度。

相关文档
最新文档