精华内容
下载资源
问答
  • 视频编码器h.264mpeg4的区别?
    千次阅读
    2020-09-02 13:55:16

    MPEG-4编码技术
    MPEG-4:MPEG-4是一个适用于低传输速率应用的方案,MPEG-4是在MPEG-1、MPEG-2基础上发展而来,是为了播放流式媒体的高质量视频而专门设计的,它可利用很窄的带度,通过帧重建技术,压缩和传输数据,以求使用最少的数据获得最佳的图像质量。
    MPEG-4标准则是基于对象和内容的编码方式,和传统的图像帧编码方式不同,它只处理图像帧与帧之间的差异元素,抛弃相同图像元素,因此大大减少了合成多媒体文件的体积,从而以较小的文件体积同样可得到高清晰的还原图像。换句话说,相同的原始图像,MPEG-4编码标准具有更高的压缩比。

    H.264编码技术
    H.264是ITU-T国际电联与ISO国际标准化组织联合制定的视频编解码技术标准,h.264是一种高性能的视频编解码技术。
    H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。
    一个原始文件是102G大小的视频,经过H.264编码后变成了1个G,压缩比竟达到了102:1。因此H.264的低码率技术起到了至关重要的作用,
    在用户获得高质量流畅图像的同时,大大节省了下载时间和数据流量,也大大减少了图像存储空间。
    H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(Loop Filter)、熵编码(Entropy Coding)。

    视频监控技术经过多年的发展,监控画面正经历着从最初的D1标清图像,向4K高清、8K超清时代前进。前端像素的提高给视频传输和后端录像存储带来了巨大的压力,在相同的编码压缩比例下,用户需要投入更多的设备和资金,因此编解码技术发展近些年也是突飞猛进。由于H.264的高压缩性能,目前市场上主流的视频基本采用的是H.264标准。
    H.264的特征优势
    1、低码流:和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。
    显然,H.264压缩技术的采用将大大节省用户的下载时间和数据流量收费。
    2、高质量的图象:H.264能提供连续、流畅的高质量图象(DVD质量)。
    3、容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
    4、网络适应性强:H.264提供了网络适应层, 使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。
    扩展阅读:
    H.265编码技术

    H.265技术是ITU-T VCEG 继H.264之后所制定的新的视频编码标准。H.265标准围绕现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进。新技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。H.264由于算法优化,可以低于1Mbps的速度实现标清数字图像传送,H.265则可以实现利用1~2Mbps的传输速度实现720P(分辨率1280*720)普通高清音视频传送。
    目前,H.265成为视频主流编解码技术。H.265对比传统H.264,码率降低50%,压缩比高。
    H.265旨在在有限带宽下传输更高质量的网络视频,仅需原先的一半带宽即可播放相同质量的视频。H.265标准也同时支持4K(4096×2160)和8K(8192×4320)超高清视频。可以说,H.265标准让网络视频跟上了显示屏“高分辨率化”的脚步。千视作为音视频IP化传输解决方案专家,H.265或H.264音视频传输解决方案都有。

    H.266编码技术
    随着全球互联网视频需求的增长,MPEG 正在推动 H.266 / VCC 以及其它两个标准的发展。其中 MPEG-5 第一部分又被称作基础视频编码(EVC),第二部分又被称作低复杂度增强视频编码(LCEVC)。
    H.266多功能视频编码编解码器标准,新的H.266 /VCC编解码器在保持清晰度不变的情况下,数据压缩效率获得极大提高,数据量减少了50%。
    H.266将减少约50%的数据需求。使用之前的HEVC编解码器,传输一段90分钟的超高清(UHD)视频需要大约10GB的数据,而H.266只需5GB就可以做到这一点。H.266主要用于4K和8K流媒体视频,它将允许用户存储更多的高清视频,并减少移动网络的数据量。

    更多相关内容
  • 说明:由于图像存在空域的相关性,所以总是选择距离当前预测块(PU)最近的已编码像素作为当前预测块(PU)内像素的参考像素,在HEVC中就是选择当前PU上面的一行左边的一列。具体可以描述为,当前N * N的预测块...

    整个帧内预测编码如下图所示:

    在这里插入图片描述


    第一步:参考像素准备

    说明:由于图像存在空域的相关性,所以总是选择距离当前预测块(PU)最近的已编码像素作为当前预测块(PU)内像素的参考像素,在HEVC中就是选择当前PU上面的一行和左边的一列。具体可以描述为,当前N * N的预测块(PU)正上方的N个像素,右上方N个像素,左侧N个像素,左下方N个像素,左上角1个像素,共4N+1个像素作为参考像素,示意图如下:

    在这里插入图片描述

    需要注意的是,在某些情况下,在图像的边界或者Tile或Slice边界时某些参考像素不可用,也有可能A和E区域尚未编码,所有其像素不可用,这时就要寻找其他像素对这些区域进行填充,分别存在以下几种情况:

    • 若A区域像素不存在是则用B区域最下方的像素点对该区域进行填充,若E区域不存在则用D区域最右侧的像素点进行填充,如下图所示

    在这里插入图片描述

    • 如果所有区域的像素都不存在,则所有参考像素都用 R=1<<(BitDepth-1)的值来填充,例如对于8比特像素用128填充,10比特像素用512填充

    第二步:参考像素滤波

    在利用参考像素对当前预测块进行预测前,通常要先进行参考像素的滤波,目的是为了更好的利用邻近像素之间的相关性,提高预测的精度,并不是所有的预测块大小和所有的预测模式都要进行参考像素的滤波处理,只有某些块和某些预测模式需要,通常的操作是使用一个3抽头的低通滤波器进行处理,具体的情况如下

    • 非角度模式:对于尺寸大小为4 * 4 的PU不需要进行平滑滤波(角度预测模式同),对于其他尺寸的PU,如果它的预测模式是DC模式,则不需要进行平滑滤波;如果是planar模式则需要平滑滤波
    • 角度模式:
      • 对于8 * 8的PU只对模式2,18,34进行常规平滑滤波
      • 对于16 * 16的PU除了模式9,10,11,25,26,27外,其他所27个角度模式都需要进行常规平滑滤波
      • 对于32 * 32的PU除了模式10,26外其他所有31个角度模式都要进行常规平滑滤波或者强滤波处理

    常规滤波与平滑滤波

    • 常规滤波:3抽头的低通滤波器的抽头系数为[1,2,1]/4
    • 强滤波:强滤波只在32 * 32 PU上进行,且要满足下列条件
      a b s ( R 0 , 0 + R 0 , 2 N − 2 R 0 , N ) < T h r e s h o l d abs\left ( R_{0,0}+R_{0,2N}-2R_{0,N} \right ) < Threshold abs(R0,0+R0,2N2R0,N)<Threshold

    a b s ( R 0 , 0 + R 2 N , 0 − 2 R N , 0 ) < T h r e s h o l d abs\left ( R_{0,0}+R_{2N,0}-2R_{N,0} \right ) < Threshold abs(R0,0+R2N,02RN,0)<Threshold

    其 中 T h r e s h o l d = 1 < < ( B i t D e p t h − 5 ) 其中Threshold = 1 << \left ( BitDepth-5 \right ) Threshold=1<<(BitDepth5)

    ​ 强滤波的计算方法:

    R F x , 0 = ( ( 64 − x ) ∗ R 0 , 0 + x ∗ R 2 N , 0 + 32 ) > > 6 RF_{x,0}=\left ( \left ( 64-x \right )*R_{0,0}+x*R_{2N,0}+32 \right ) >> 6 RFx,0=((64x)R0,0+xR2N,0+32)>>6

    R F 0 , y = ( ( 64 − y ) ∗ R 0 , 0 + y ∗ R 0 , 2 N + 32 ) > > 6 RF_{0,y}=\left ( \left ( 64-y \right )*R_{0,0}+y*R_{0,2N}+32 \right ) >> 6 RF0,y=((64y)R0,0+yR0,2N+32)>>6

    其 中 下 标 为 x , y = 1 , 2 , … … 2 N − 1 的 像 素 点 以 及 R 0 , 0 , R 2 N , 0 , R 0 , 2 N 像 素 点 不 需 要 滤 波 其中下标为x,y=1,2,……2N-1的像素点以及R_{0,0},R_{2N,0},R_{0,2N}像素点不需要滤波 x,y=1,22N1R0,0,R2N,0,R0,2N


    第三步:帧内预测模式的选择

    HEVC中总共有35种帧内预测模式,分别为DC模式,Planar模式和33中角度模式。其中217为水平模式,1934为垂直模式,模式10是水平方向,模式26是垂直方形,这些角度模式中越靠近水平或垂直方向分布越密集,原因在于自然界中物体在水平或垂直方向运动较为普遍,所以这些方向的角度模式更多一些。

    在这里插入图片描述

    根据具体帧内预测模式利用参考像素计算预测值的方法:

    (1)、Planar模式:对于(x,y)位置处的像素P,如果利用Planar模式计算它的预测值,需要用到的参考像素点有正上方、正左方、当前PU右上方第一个和左下方第一个像素,具体计算方式如下(对PU内的每个像素都采用这样的方法计算)
    在这里插入图片描述
    P x , y H = ( N − x ) ⋅ R 0 , y   + x ⋅ R N + 1 , 0 P_{x,y}^{H} = \left ( N-x \right )\cdot R_{0,y}\ +x\cdot R_{N+1,0} Px,yH=(Nx)R0,y +xRN+1,0

    P x , y V = ( N − y ) ⋅ R x , 0   + y ⋅ R 0 , N + 1 P_{x,y}^{V} = \left ( N-y \right )\cdot R_{x,0}\ +y\cdot R_{0,N+1} Px,yV=(Ny)Rx,0 +yR0,N+1

    P x , y = ( P x , y H + P x , y V + N ) > > ( l o g 2 ( N ) + 1 ) P_{x,y} = \left ( P_{x,y}^{H}+P_{x,y}^{V}+N \right )>>\left ( log_{2} \left ( N \right )+1\right ) Px,y=(Px,yH+Px,yV+N)>>(log2(N)+1)

    (2)、DC模式:这种模式下首先由计算当前PU上方和左侧像素的平均值
    在这里插入图片描述

    若当前PU为色度PU或尺寸大于1616的亮度PU,则PU内所有像素预测值都为下面计算出的dcValue
    d c V a l u e = ( ∑ x = 1 N R x , 0 + ∑ y = 1 N R 0 , y + N ) > > ( l o g 2 ( N ) + 1 ) dcValue =\left ( \sum_{x=1}^{N}R_{x,0}+\sum_{y=1}^{N}R_{0,y}+N\right ) >> \left ( log_{2}\left ( N \right )+1 \right ) dcValue=(x=1NRx,0+y=1NR0,y+N)>>(log2(N)+1)
    其他情况预测值的情况(尺寸小于或等于16
    16的亮度预测块),需要按照下面的方法对预测值进行计算:
    左 上 角 的 像 素 : P 1 , 1 = ( R 1 , 0 + R 0 , 1 + 2 ⋅ d c V a l u e + 2 ) > > 2 左上角的像素:P_{1,1}=\left ( R_{1,0}+R_{0,1}+2\cdot dcValue+2 \right )>>2 P1,1=(R1,0+R0,1+2dcValue+2)>>2

    第 一 行 像 素 ( P 1 , 1 除 外 ) : P x , 1 = ( R x , 0 + 3 ⋅ d c V a l u e + 2 ) > > 2 , x = 2 , 3 … N 第一行像素\left ( P_{1,1} 除外\right ):P_{x,1}=\left ( R_{x,0} +3\cdot dcValue+2\right )>>2, x=2,3…N (P1,1)Px,1=(Rx,0+3dcValue+2)>>2,x=2,3N

    第 一 列 像 素 ( P 1 , 1 除 外 ) : P 1 , y = ( R 0 , y + 3 ⋅ d c V a l u e + 2 ) > > 2 , y = 2 , 3 … N 第一列像素\left ( P_{1,1} 除外\right ):P_{1,y}=\left ( R_{0,y} +3\cdot dcValue+2\right )>>2, y=2,3…N (P1,1)P1,y=(R0,y+3dcValue+2)>>2,y=2,3N

    其 他 像 素 : P x , y = d c V a l u e , x , y = 2 , 3 … N 其他像素:P_{x,y}=dcValue,x,y=2,3…N Px,y=dcValue,x,y=2,3N

    (3)、角度模式

    因为角度预测的角度延伸方向即可能涉及到上方的参考像素以及左方参考像素,若将这些像素都投影到一行或者一列就更利于处理。例如对于垂直类的角度模式将左侧的的像素投影到上方。因为每个角度方向都不同,所以每个角度对于垂直方向(模式26)或水平方向都有一个偏移值,具体如下图所示:
    在这里插入图片描述
    以垂直类模式M(对应的偏移值为offset[M])为例构造它的一维参考像素列表Ref[]

    第一种情况:offset[M]<0,即模式18到25,构造参考像素列表的计算方法如下:
    R e f [ x ] = { R x , 0 , x ≥ 0 R 0 , y ( x ) , x < 0 Ref\left [ x \right ]=\left\{\begin{matrix} R_{x,0},x\geq 0 & \\ R_{0,y\left ( x \right )},x< 0 & \end{matrix}\right. Ref[x]={Rx,0,x0R0,y(x),x<0

    y ( x ) = R o u n d ( 32 ⋅ x o f f s e t [ M ] ) , 其 中 R o u n d 表 示 四 舍 五 入 y\left ( x \right )=Round\left ( \frac{32\cdot x}{offset\left [ M \right ]} \right ),其中Round表示四舍五入 y(x)=Round(offset[M]32x),Round

    第二种情况:offset[M] >= 0 ,即模式26到33,构造参考像素列表的计算方法如下:
    R e f [ x ] = R x , 0 , x = 0 , 1 , … 2 N Ref\left [ x \right ]= R_{x,0},x= 0,1,…2N Ref[x]=Rx,0,x=0,1,2N
    下面以4*4大小的PU为例,展示所有预测模式的参考像素投影示例:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    通过上述计算便可以得到当前预测块PU的一个一维的参考像素列表Ref[],

    下面介绍预测块中每一个具体像素(x,y)对应的参考像素在Ref中的位置pos的计算方法:
    p o s = ( y ∗ o f f s e t [ M ] ) > > 5 pos= \left ( y*offset\left [ M \right ] \right )>>5 pos=(yoffset[M])>>5
    像素(x,y)对应的权重因子w的计算方法如下:
    ω w = ( y ∗ o f f s e t [ M ] ) & 31 , 其 中 & 表 示 按 位 与 运 算 \omega w=\left ( y*offset\left [ M \right ] \right )\&31,其中\&表示按位与运算 ωw=(yoffset[M])&31&
    可计算像素(x,y)的预测值为:
    P x , y = ( ( 30 − ω ) ⋅ R e f [ p o s ] + ω ⋅ R e f [ p o s ] + 16 ) > > 5 P_{x,y}=\left ( \left ( 30-\omega \right )\cdot Ref\left [ pos \right ]+\omega \cdot Ref\left [ pos \right ] +16\right )>>5 Px,y=((30ω)Ref[pos]+ωRef[pos]+16)>>5

    注 意 , 对 于 模 式 26 计 算 方 法 如 下 : 注意,对于模式26计算方法如下: 26

    P x , y = R x , 0 + ( ( R 0 , y − R 0 , 0 ) > > 1 ) P_{x,y}=R_{x,0}+\left ( \left ( R_{0,y} -R_{0,0}\right )>>1 \right ) Px,y=Rx,0+((R0,yR0,0)>>1)


    第四步:PU边界值平滑

    目的:去除边界的不连续效应,对于小于32*32的PU,当使用模式1、10、26时,PU预测后的第一行和第一列要进行滤波处理


    第五步:帧内模式编码

    帧内预测模式选定之后,预测模式要被编码送到解码端。因为帧内预测有35中模式需要6比特才能编码。HEVC为当前PU定义了3种最可能的帧内预测模式(Most Probable Modes)MPM[0]、MPM[1]、MPM[2],如果当前帧内预测模式在MPM中,则只需要编码器索引即可,如果不在MPM内而在另外32种模式中只需要5bit即可编码。

    MPM的构造需要利用其左侧和上方相邻已编码PU的模式信息作为参考
    在这里插入图片描述

    构造MPM的方法:

    (1)、ModeAModeB的帧内预测模式相同的情况下:

    • ModeAModeB都为DC模式或Planar模式

      MPM[0]=Planar

      MPM[1]=DC

      MPM[2]=26

    • ModeAModeB都为角度模式

      MPM[0]=ModeA

      MPM[1]和MPM[2]为与ModeA相邻的两个角度模式

    (2)ModeAModeB不相同

    MPM[0]=ModeA

    MPM[1]=ModeB

    • ModeAModeB都不是Planar模式,MPM[2]=planar
    • 当上一条不满足时,若ModeAModeB都不是DC模式,MPM[2]=DC
    • 当上面条件都不满足时,MPM[2]=26

    欢迎关注博主微信公众号,一起学习交流!!!
    在这里插入图片描述

    展开全文
  • HEVC帧内编码的原理实现

    千次阅读 2017-11-27 15:56:57
    HEVC帧内编码的原理实现(上) 【前面N篇博文都讲了一些HEVC帧内预测的代码结构简单的方法,但是尚未对整体的算法实现做一个比较完整的描述。本篇借助参考文献《High Efficiency Video Coding (HEVC)...

    HEVC帧内编码的原理和实现(上)


    【前面N篇博文都讲了一些HEVC帧内预测的代码结构和简单的方法,但是尚未对整体的算法和实现做一个比较完整的描述。本篇借助参考文献《High Efficiency Video Coding (HEVC) -- Algorithms and Architectures》的相关章节的阅读笔记,对HEVC的帧内预测算法做一个比较完整的阐述。】

    【摘要】HEVC的帧内预测的架构分为三个步骤:①构建参考像素数组;②生成预测像素;③后处理操作。HEVC标准将这三个步骤进行了精密设计,以求达到较高的编码效率,同时降低编码和解码端的运算要求。HEVC标准的多种预定义的预测模式构成一个模式集合,可以对包括视频和静态图像中的多种内容进行预测建模的方法。HEVC的角度预测提供了对包含方向性纹理的物体更高的预测精确度,此外平面和DC模式可以高效地表示图像的平滑区域。

    1.引言

    HEVC的帧内预测方法可以分为两大类:第一类为角度预测,用于准确预测角度结构;第二类为平面模式和DC模式,用于估计平滑图像区域。HEVC总计支持35种帧内预测的模式,如下表所示:


    HEVC所有的35种预测模式使用相邻的重建像素块的信息作为参考像素。由于重建像素块在Transform Block级别上实现,执行帧内预测操作的数据同Transform Block大小相同,从4×4到32×32。HEVC支持各种块尺寸上的各种预测模式,因此各种预测组合模式的数量庞大,HEVC对于各种预测模式进行了特别设计以利于对任意块尺寸/模式进行算法的实现。为了提高获得更准确预测的可能性,HEVC在进行实际的帧内预测过程之前,对参考像素进行滤波预处理操作。某些预测模式还包含后处理操作用于优化像素块边缘的连续性,如DC模式,水平模式(Mode 10)和垂直模式(Mode 26)。

    2、生成参考像素

    HEVC帧内预测由重建的参考像素根据预测模式推导而得。相比较H.264,HEVC引入了参考像素替换方法,该方法无论相邻像素是否可得都可以获取完整的参考像素集合。另外,HEVC还定义了自适应的滤波过程,可以根据预测模式、块大小和方向性对参考像素进行预滤波处理。

    (1)参考像素替换

    有时候由于多种原因,帧内预测的时候无法获取部分或全部参考像素。例如,位于图像、slice或ties之外的像素在预测中被认为是不可得的。另外,当constrained intra prediction开启时,来自帧间预测的PU的像素将会被忽略,这是为了防止前面被错误地传输和重建的图像对当前图像造成影响。在H.264中,这些情况都会被当做DC模式进行处理,而在HEVC中,在对无效的参考像素进行替换后可以当做普通的像素块进行处理。

    对于极端的情况,即所有参考像素都不可得的情况下,所有参考点都被设置为一个常量(8bit下为128)。

    在HM10中的方法:


    Void TComPattern::initAdiPattern( TComDataCU* pcCU, UInt uiZorderIdxInPart, UInt uiPartDepth, Int* piAdiBuf, Int iOrgBufStride, Int iOrgBufHeight, Bool& bAbove, Bool& bLeft, Bool bLMmode )  
    {  
        //.......  
        //计算有效相邻点的个数  
        bNeighborFlags[iNumUnitsInCu*2] = isAboveLeftAvailable( pcCU, uiPartIdxLT );  
      iNumIntraNeighbor  += (Int)(bNeighborFlags[iNumUnitsInCu*2]);  
      iNumIntraNeighbor  += isAboveAvailable     ( pcCU, uiPartIdxLT, uiPartIdxRT, bNeighborFlags+(iNumUnitsInCu*2)+1 );  
      iNumIntraNeighbor  += isAboveRightAvailable( pcCU, uiPartIdxLT, uiPartIdxRT, bNeighborFlags+(iNumUnitsInCu*3)+1 );  
      iNumIntraNeighbor  += isLeftAvailable      ( pcCU, uiPartIdxLT, uiPartIdxLB, bNeighborFlags+(iNumUnitsInCu*2)-1 );  
      iNumIntraNeighbor  += isBelowLeftAvailable ( pcCU, uiPartIdxLT, uiPartIdxLB, bNeighborFlags+ iNumUnitsInCu   -1 );  
        //......  
        fillReferenceSamples (g_bitDepthY, piRoiOrigin, piAdiTemp, bNeighborFlags, iNumIntraNeighbor, iUnitSize, iNumUnitsInCu, iTotalUnits, uiCuWidth, uiCuHeight, uiWidth, uiHeight, iPicStride, bLMmode);  
        //......  
    }  
    其中fillReferenceSamples的实现如下:
    Void TComPattern::fillReferenceSamples(Int bitDepth, Pel* piRoiOrigin, Int* piAdiTemp, Bool* bNeighborFlags, Int iNumIntraNeighbor, Int iUnitSize, Int iNumUnitsInCu, Int iTotalUnits, UInt uiCuWidth, UInt uiCuHeight, UInt uiWidth, UInt uiHeight, Int iPicStride, Bool bLMmode )  
    {  
      Pel* piRoiTemp;  
      Int  i, j;  
      Int  iDCValue = 1 << (bitDepth - 1);  
      
      if (iNumIntraNeighbor == 0)  
      {  
        // Fill border with DC value  
        for (i=0; i<uiWidth; i++)  
        {  
          piAdiTemp[i] = iDCValue;  
        }  
        for (i=1; i<uiHeight; i++)  
        {  
          piAdiTemp[i*uiWidth] = iDCValue;  
        }  
      }  
      //......  
    }  

    当左侧和上方的相邻像素均可得时,参考像素集合直接拷贝这些像素。在HM中也在 fillReferenceSamples中实现:
    Void TComPattern::fillReferenceSamples(Int bitDepth, Pel* piRoiOrigin, Int* piAdiTemp, Bool* bNeighborFlags, Int iNumIntraNeighbor, Int iUnitSize, Int iNumUnitsInCu, Int iTotalUnits, UInt uiCuWidth, UInt uiCuHeight, UInt uiWidth, UInt uiHeight, Int iPicStride, Bool bLMmode )  
    {  
      //......  
      else if (iNumIntraNeighbor == iTotalUnits)  
      {  
        // Fill top-left border with rec. samples  
        piRoiTemp = piRoiOrigin - iPicStride - 1;  
        piAdiTemp[0] = piRoiTemp[0];  
      
        // Fill left border with rec. samples  
        piRoiTemp = piRoiOrigin - 1;  
      
        if (bLMmode)  
        {  
          piRoiTemp --; // move to the second left column  
        }  
      
        for (i=0; i<uiCuHeight; i++)  
        {  
          piAdiTemp[(1+i)*uiWidth] = piRoiTemp[0];  
          piRoiTemp += iPicStride;  
        }  
      
        // Fill below left border with rec. samples  
        for (i=0; i<uiCuHeight; i++)  
        {  
          piAdiTemp[(1+uiCuHeight+i)*uiWidth] = piRoiTemp[0];  
          piRoiTemp += iPicStride;  
        }  
      
        // Fill top border with rec. samples  
        piRoiTemp = piRoiOrigin - iPicStride;  
        for (i=0; i<uiCuWidth; i++)  
        {  
          piAdiTemp[1+i] = piRoiTemp[i];  
        }  
          
        // Fill top right border with rec. samples  
        piRoiTemp = piRoiOrigin - iPicStride + uiCuWidth;  
        for (i=0; i<uiCuWidth; i++)  
        {  
          piAdiTemp[1+uiCuWidth+i] = piRoiTemp[i];  
        }  
      }  
      //......  
    }  

    如果至少一个像素为可用数据,其他不可得的像素都将使用该像素按顺时针的顺序进行替换。

    ①当p[-1][2N-1]不可得时,则沿着p[-1][2N-2],p[-1][2N-3].....p[-1][-1],p[0][-1],p[1][-1]......p[2N-1][-1],即先自下而上,后从左向右查找,由找到的第一个有效的点替换。

    ②所有的无效的点p[-1][y], y=2N-2~1,都由p[-1][y+1]替换,即对于垂直方向的参考像素,无效点都由下方的点替换。

    ③所有的无效的点p[x][-1], x=0~2N-1,都由p[x-1][-1]替换,即对于水平方向的参考像素,无效点都由左侧的点替换。

    fillReferenceSamples函数的最后一个选择结构中实现的便是该方法:


    Void TComPattern::fillReferenceSamples(Int bitDepth, Pel* piRoiOrigin, Int* piAdiTemp, Bool* bNeighborFlags, Int iNumIntraNeighbor, Int iUnitSize, Int iNumUnitsInCu, Int iTotalUnits, UInt uiCuWidth, UInt uiCuHeight, UInt uiWidth, UInt uiHeight, Int iPicStride, Bool bLMmode )  
    {  
      //......  
      else // reference samples are partially available  
      {  
        Int  iNumUnits2 = iNumUnitsInCu<<1;  
        Int  iTotalSamples = iTotalUnits*iUnitSize;  
        Pel  piAdiLine[5 * MAX_CU_SIZE];  
        Pel  *piAdiLineTemp;   
        Bool *pbNeighborFlags;  
        Int  iNext, iCurr;  
        Pel  piRef = 0;  
      
        // Initialize  
        for (i=0; i<iTotalSamples; i++)  
        {  
          piAdiLine[i] = iDCValue;  
        }  
          
        // Fill top-left sample  
        piRoiTemp = piRoiOrigin - iPicStride - 1;  
        piAdiLineTemp = piAdiLine + (iNumUnits2*iUnitSize);  
        pbNeighborFlags = bNeighborFlags + iNumUnits2;  
        if (*pbNeighborFlags)  
        {  
          piAdiLineTemp[0] = piRoiTemp[0];  
          for (i=1; i<iUnitSize; i++)  
          {  
            piAdiLineTemp[i] = piAdiLineTemp[0];  
          }  
        }  
      
        // Fill left & below-left samples  
        piRoiTemp += iPicStride;  
        if (bLMmode)  
        {  
          piRoiTemp --; // move the second left column  
        }  
        piAdiLineTemp--;  
        pbNeighborFlags--;  
        for (j=0; j<iNumUnits2; j++)  
        {  
          if (*pbNeighborFlags)  
          {  
            for (i=0; i<iUnitSize; i++)  
            {  
              piAdiLineTemp[-i] = piRoiTemp[i*iPicStride];  
            }  
          }  
          piRoiTemp += iUnitSize*iPicStride;  
          piAdiLineTemp -= iUnitSize;  
          pbNeighborFlags--;  
        }  
      
        // Fill above & above-right samples  
        piRoiTemp = piRoiOrigin - iPicStride;  
        piAdiLineTemp = piAdiLine + ((iNumUnits2+1)*iUnitSize);  
        pbNeighborFlags = bNeighborFlags + iNumUnits2 + 1;  
        for (j=0; j<iNumUnits2; j++)  
        {  
          if (*pbNeighborFlags)  
          {  
            for (i=0; i<iUnitSize; i++)  
            {  
              piAdiLineTemp[i] = piRoiTemp[i];  
            }  
          }  
          piRoiTemp += iUnitSize;  
          piAdiLineTemp += iUnitSize;  
          pbNeighborFlags++;  
        }  
      
        // Pad reference samples when necessary  
        iCurr = 0;  
        iNext = 1;  
        piAdiLineTemp = piAdiLine;  
        while (iCurr < iTotalUnits)  
        {  
          if (!bNeighborFlags[iCurr])  
          {  
            if(iCurr == 0)  
            {  
              while (iNext < iTotalUnits && !bNeighborFlags[iNext])  
              {  
                iNext++;  
              }  
              piRef = piAdiLine[iNext*iUnitSize];  
              // Pad unavailable samples with new value  
              while (iCurr < iNext)  
              {  
                for (i=0; i<iUnitSize; i++)  
                {  
                  piAdiLineTemp[i] = piRef;  
                }  
                piAdiLineTemp += iUnitSize;  
                iCurr++;  
              }  
            }  
            else  
            {  
              piRef = piAdiLine[iCurr*iUnitSize-1];  
              for (i=0; i<iUnitSize; i++)  
              {  
                piAdiLineTemp[i] = piRef;  
              }  
              piAdiLineTemp += iUnitSize;  
              iCurr++;  
            }  
          }  
          else  
          {  
            piAdiLineTemp += iUnitSize;  
            iCurr++;  
          }  
        }  
      
        // Copy processed samples  
        piAdiLineTemp = piAdiLine + uiHeight + iUnitSize - 2;  
        for (i=0; i<uiWidth; i++)  
        {  
          piAdiTemp[i] = piAdiLineTemp[i];  
        }  
        piAdiLineTemp = piAdiLine + uiHeight - 1;  
        for (i=1; i<uiHeight; i++)  
        {  
          piAdiTemp[i*uiWidth] = piAdiLineTemp[-i];  
        }  
      }  
    }  


    (2)参考像素的滤波

    同H264的8×8帧内预测类似,HEVC的帧内预测参考像素都会依据条件进行平滑滤波处理。滤波的目的在于提升帧内预测的像素块的视觉效果,减小边缘可能产生的突变感。是否对参考像素进行滤波取决于帧内预测模式和预测像素块的大小。

    当采用DC模式,或预测像素块为4×4大小时,不需要进行滤波操作。对于其他情况,块的大小和预测的方向决定了是否要进行滤波操作。对于8×8大小的编码像素块,仅仅针对对角线方向的预测模式(即模式2,18,34)进行滤波。对于16×16的像素块,大部分模式都会进行参考点滤波,除了几个近似水平和垂直模式(即模式9,10,11,25,27)。对于32×32的像素块,除了垂直和水平模式(即模式10和26)外所有的模式都要进行滤波。

    对参考像素进行滤波时,共有两种滤波方法可供选择。默认情况下,滤波器采用一种[1,2,1]一维滤波器对参考像素进行处理。另一种方法,如果像素块的大小为32×32,且参考像素的走势足够平坦,那么参考像素将依据起点、终点和拐点三个特殊点(p[-1][63],p[-1][-1],p[63][-1])进行线性插值的方法获得。关于是否“足够平坦”这一问题,则依以下两个准则确定(b取表示一个颜色分量的bit位数):

    |p[-1][-1]+p[2N-1][-1]-2p[N-1][-1]| < (1<<(b-5))

    |p[-1][-1]+p[-1][2N-1]-2p[-1][N-1]| < (1<<(b-5))

    HM中的实现方法如:

    Void TComPattern::initAdiPattern( TComDataCU* pcCU, UInt uiZorderIdxInPart, UInt uiPartDepth, Int* piAdiBuf, Int iOrgBufStride, Int iOrgBufHeight, Bool& bAbove, Bool& bLeft, Bool bLMmode )    
    {    
    //......    
    if (pcCU->getSlice()->getSPS()->getUseStrongIntraSmoothing())    
      {    
        Int blkSize = 32;    
        Int bottomLeft = piFilterBuf[0];    
        Int topLeft = piFilterBuf[uiCuHeight2];    
        Int topRight = piFilterBuf[iBufSize-1];    
        Int threshold = 1 << (g_bitDepthY - 5);    
        Bool bilinearLeft = abs(bottomLeft+topLeft-2*piFilterBuf[uiCuHeight]) < threshold;    
        Bool bilinearAbove  = abs(topLeft+topRight-2*piFilterBuf[uiCuHeight2+uiCuHeight]) < threshold;    
          
        if (uiCuWidth>=blkSize && (bilinearLeft && bilinearAbove))    
        {    
          Int shift = g_aucConvertToBit[uiCuWidth] + 3;  // log2(uiCuHeight2)    
          piFilterBufN[0] = piFilterBuf[0];    
          piFilterBufN[uiCuHeight2] = piFilterBuf[uiCuHeight2];    
          piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];    
          for (i = 1; i < uiCuHeight2; i++)    
          {    
            piFilterBufN[i] = ((uiCuHeight2-i)*bottomLeft + i*topLeft + uiCuHeight) >> shift;    
          }    
          
          for (i = 1; i < uiCuWidth2; i++)    
          {    
            piFilterBufN[uiCuHeight2 + i] = ((uiCuWidth2-i)*topLeft + i*topRight + uiCuWidth) >> shift;    
          }    
        }    
        else     
        {    
          // 1. filtering with [1 2 1]    
          piFilterBufN[0] = piFilterBuf[0];    
          piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];    
          for (i = 1; i < iBufSize - 1; i++)    
          {    
            piFilterBufN[i] = (piFilterBuf[i - 1] + 2 * piFilterBuf[i]+piFilterBuf[i + 1] + 2) >> 2;    
          }    
        }    
      }    
      else     
      {    
        // 1. filtering with [1 2 1]    
        piFilterBufN[0] = piFilterBuf[0];    
        piFilterBufN[iBufSize - 1] = piFilterBuf[iBufSize - 1];    
        for (i = 1; i < iBufSize - 1; i++)    
        {    
          piFilterBufN[i] = (piFilterBuf[i - 1] + 2 * piFilterBuf[i]+piFilterBuf[i + 1] + 2) >> 2;    
        }    
      }    
    //......    
    }    

    HEVC帧内编码的原理和实现(中)


    3、像素块的帧内预测

    为了有效地预测多种不同种类的内容,HEVC支持多种不同的预测方法。角度预测可以模拟多种不同方向的结构,而平面和DC模式适用于平滑和渐变区域。同样对于任何角度预测模式都不能很好地适应的复杂纹理的像素块,DC和平面模式还可以用于在这种情况下生成一种不带有高频信息的“通用”预测块。此外,对于DC和某些角度预测模式,帧内编码还包括一些滤波后处理操作用于在块的边界提升像素之间的连续性以提高预测的质量。

    (1)角度预测

    HEVC中的角度预测方法用于高效地对图像和视频的不同方向性结构进行建模的方法。该方法所选择的预测方向经过设计,可以达到对典型视频内容的编码效率和编码复杂度的平衡。算法对不同的预测块大小和预测方向提出了严格的低复杂度要求,因为HEVC帧内预测所支持的预测模式远远超过H.264等前期标准。在HEVC中,HEVC定义了从4×4到32×32这四种不同大小的帧内预测块尺寸,每种尺寸都支持33种不同的预测方形,所以一个解码器必须支持总共132中组合。

    (1.1)角度的定义

    HEVC定义了33中预测角度的集合,其精度为1/32。根据经验,图像内容中水平和垂直一致通常出现的概率超过其他方向一致。相邻方向之间的角度差越接近这两个方向便越小,越靠近对角线方向便越大,其目的在于在接近水平和垂直模式时可以提供更加精准的预测结果,而在出现机会较低的对角方向减小预测的运算负荷。各个预测方向如下图所示:

    下表定义了各个预测模式与方向角度差之间的一一对应关系。角度差用参数A表示,在生成参考像素时会作为获取参考数据的依据。


    (1.2)参考像素对负角度方向的扩展

    为了简化预测过程,编码器将当前像素块上方的参考像素p[x][-1]和左方的参考像素p[-1][y]置于一个一维数组中。对于正角度(模式26~33和模式2~10),该数组直接拷贝预测方向上的像素值,公式如下:


    对于负角度,左侧和上方的参考像素都会被使用到,此时参考数组中的非负索引的元素依旧如前文所述,负索引值所表示的像素通过映射获得,公式如下:


    其中B与角度参数A的对应关系如下表:


    这部分该如何理解呢?以下两张图分别是正向角度的垂直模式/水平模式的方向示意图:


    对于不同的预测方向,预测块所使用的预测数据时不同的。由于预测像素的组织形式是一个一维数组,以顶点像素为中心向两边扩展。在正向角度预测时,只需要或正方向或负方向的预测数据级就可以为预测块进行赋值。而对于负向角度,情况将有所不同。下图表示负向角度下的预测方向示意图:


    举例,当mode为2时,预测方向为右上方对角线。处理代码如下:

    Void TComPrediction::xPredIntraAng(Int bitDepth, Int* pSrc, Int srcStride, Pel*& rpDst, Int dstStride, UInt width, UInt height, UInt dirMode, Bool blkAboveAvailable, Bool blkLeftAvailable, Bool bFilter )  
    {  
       //......  
      // Map the mode index to main prediction direction and angle  
      assert( dirMode > 0 ); //no planar  
      Bool modeDC        = dirMode < 2;//对于mode2,显然不是DC模式  
      Bool modeHor       = !modeDC && (dirMode < 18);//mode2小于18,因此属于水平类  
      Bool modeVer       = !modeDC && !modeHor;//mode11不属于垂直类  
      Int intraPredAngle = modeVer ? (Int)dirMode - VER_IDX/*26*/ : modeHor ? -((Int)dirMode - HOR_IDX/*10*/) : 0;//计算索引差值,值为8  
      Int absAng         = abs(intraPredAngle);//绝对值为8  
      Int signAng        = intraPredAngle < 0 ? -1 : 1;//符号位正  
      //......  
    }  

    而后,模式的索引差将转换为角度偏移差:


    // Set bitshifts and scale the angle parameter to block size  
    Int angTable[9]    = {0,    2,    5,   9,  13,  17,  21,  26,  32};  
    Int invAngTable[9] = {0, 4096, 1638, 910, 630, 482, 390, 315, 256}; // (256 * 32) / Angle  
    Int invAngle       = invAngTable[absAng];  
    absAng             = angTable[absAng];//将模式索引差值转换为角度偏移差  
    intraPredAngle     = signAng * absAng;  

    ntraPredAngle这个变量中就保存了当前模式同水平/垂直模式映射到边界上的偏移值,精度为1/32像素。如果该参数为正,那么将当前预测块的上方和左方预测像素复制到两个数组中,并依据当前模式的方向分类确定哪一个作为主要参考哪一个作为辅助参考:


    // Initialise the Main and Left reference array.  
    if (intraPredAngle < 0)  
    {  
      // 角度差为负    
      //......        
    }  
    else  
    {  
      // 角度差为正  
      for (k=0;k<2*blkSize+1;k++)  
      {  
        refAbove[k] = pSrc[k-srcStride-1];//复制上方参考像素  
      }  
      for (k=0;k<2*blkSize+1;k++)  
      {  
        refLeft[k] = pSrc[(k-1)*srcStride-1];//复制左侧参考像素  
      }  
      refMain = modeVer ? refAbove : refLeft;//mode2属于水平类,因此refMain为refLeft,refSide为refAbove。  
      refSide = modeVer ? refLeft  : refAbove;  
    }  
    当对于mode11时,情况将有所不同。


    Bool modeDC        = dirMode < 2;//mode11非DC模式  
    Bool modeHor       = !modeDC && (dirMode < 18);//mode11属于水平类  
    Bool modeVer       = !modeDC && !modeHor;  
    Int intraPredAngle = modeVer ? (Int)dirMode - VER_IDX/*26*/ : modeHor ? -((Int)dirMode - HOR_IDX/*10*/) : 0;//模式索引差为-1  
    Int absAng         = abs(intraPredAngle);  
    Int signAng        = intraPredAngle < 0 ? -1 : 1;  
      
    // Set bitshifts and scale the angle parameter to block size  
    Int angTable[9]    = {0,    2,    5,   9,  13,  17,  21,  26,  32};  
    Int invAngTable[9] = {0, 4096, 1638, 910, 630, 482, 390, 315, 256}; // (256 * 32) / Angle  
    Int invAngle       = invAngTable[absAng];  
    absAng             = angTable[absAng];//将模式索引差值转换为角度偏移差  
    intraPredAngle     = signAng * absAng;//最终计算得到的角度差为-2  

    mode11的预测方向为水平向右,并略带向右下方倾斜,其参考的像素大部分为左侧像素,同时也会用到几个上方的像素。具体所需的像素个数为块尺寸×角度差参数A的绝对值÷32,对于64×64的mode11就是64×2÷32=4。这几个值从refSide中每隔M个像素取一个,M的取值为invAngle的取值除以256。实现方法如下:


    if (intraPredAngle < 0)  
    {  
      for (k=0;k<blkSize+1;k++)  
      {  
        refAbove[k+blkSize-1] = pSrc[k-srcStride-1];//赋值上方的参考像素到refAbove[blkSize-1]~refAbove[2*blkSize-1],只复制前半部分  
      }  
      for (k=0;k<blkSize+1;k++)  
      {  
        refLeft[k+blkSize-1] = pSrc[(k-1)*srcStride-1];//赋值左方的参考像素到refLeft[blkSize-1]~refLeft[2*blkSize-1],只复制前半部分  
      }  
      refMain = (modeVer ? refAbove : refLeft) + (blkSize-1);//refMain和refSide指向拷贝的参考点的起始位置  
      refSide = (modeVer ? refLeft : refAbove) + (blkSize-1);  
      
      // Extend the Main reference to the left.  
      Int invAngleSum    = 128;       // rounding for (shift by 8)用于四舍五入  
      for (k=-1; k>blkSize*intraPredAngle>>5; k--)  
      {  
        invAngleSum += invAngle;  
        refMain[k] = refSide[invAngleSum>>8];//挑选某几个参考像素进行拷贝  
      }  
    }  

    (1.3)角度预测模式的像素值预测

    预测像素的值p[x][y]由pel[x][y]的当前位置按照模式规定的方向向参考像素数组上进行映射获取,并按照1/32像素的精度进行差值。差值由最接近的两个像素点按照线性关系生成。对于水平和垂直模式生成预测数据的公式如下:
    水平模式:

    垂直模式:

    公式中的i表示对于垂直模式在y列和水平模式在x行的偏移值的整数部分,按照如下方式计算:

    公式中的f表示偏移的小数部分,计算方式如下:

    i和f这两个常量适用于预测一组数据(垂直模式的一行和水平模式的一列),只有线性插值操作需要对每个像素值进行操作。如果f值为0,那么不进行线性插值,直接将参考数据用作预测数据。
    具体实现如以下代码所示:


    if (intraPredAngle == 0)  
    {//水平或者垂直模式  
      for (k=0;k<blkSize;k++)  
      {  
        for (l=0;l<blkSize;l++)  
        {  
          pDst[k*dstStride+l] = refMain[l+1];//直接复制参考数据中的值  
        }  
      }  
      
      //....  
    }  
    else  
    {//预测模式存在角度差  
      Int deltaPos=0;  
      Int deltaInt;  
      Int deltaFract;  
      Int refMainIndex;  
      
      for (k=0;k<blkSize;k++)  
      {  
        deltaPos += intraPredAngle;  
        deltaInt   = deltaPos >> 5;  
        deltaFract = deltaPos & (32 - 1);  
      
        if (deltaFract)  
        {  
          // Do linear filtering  
          for (l=0;l<blkSize;l++)  
          {  
            refMainIndex        = l+deltaInt+1;  
            pDst[k*dstStride+l] = (Pel) ( ((32-deltaFract)*refMain[refMainIndex]+deltaFract*refMain[refMainIndex+1]+16) >> 5 );//亚像素预测,从两个相邻像素中获取加权均值  
          }  
        }  
        else  
        {  
          // Just copy the integer samples  
          for (l=0;l<blkSize;l++)  
          {  
            pDst[k*dstStride+l] = refMain[l+deltaInt+1];  
          }  
        }  
      }  
    }  

    (2)、DC预测模式

    对于DC预测模式,所有的预测数据采用同一数值,该数值由左方和上方参考数据的平均值生成。对于16×16或更小的DC预测块还需要一个滤波过程来优化左边和上方的边界效果,具体方法第四节详述。


    (3)、平面预测模式

    角度预测可以对方向性结构的像素块进行较为精确的预测,但在光滑的图像区也会产生一些肉眼可见的边界轮廓。类似的是,DC预测模式在中低码率下也可能会产生一些块效应。HEVC定义了平面模式用于处理类似的问题,可以生成一个在边界上没有不连续断层的预测平面。其方法为依据水平和垂直的线性预测方法,公式如下:


    水平方向的预测结果Ph[x][y]和垂直方向上的预测结果Pv[x][y]按照以下方法生成:


    (4)、像素预测值的后处理

    有些预测模式在预测像素块的边界处可能产生不连续的像素值断层,对DC模式和角度预测中的水平和垂直模式尤为明显。在DC模式下,顶部和左侧边界都会产生不连续效应,因为整个预测像素值都由同一个平均值替换。对于垂直模式,左侧边界可能产生不连续边界,因为最左边一列的预测像素值复制了块上方最左侧的参考像素。对于水平模式的最顶行也存在类似的问题。
    为了降低块边界的这种不连续性,预测块内部的边界像素需要考虑块边界的斜率做一次滤波并用结果进行替换。这一步仅仅针对DC、水平和垂直模式,而且预测块的尺寸小于32×32时进行。事实证明这种设置可以在编码效率和运算复杂度上取得一个较好的平衡。另外,由于亮度分量有更为均衡的特性,预测块边界滤波操作仅限于亮度分量。
    如果预测模式为垂直模式,预测像素p[0][y](y∈[0,N-1])由以下公式的结果进行替换:


    对于水平模式,操作类似。
    对于DC模式,需要根据原预测像素的位置分为三种情况:




    HEVC帧内编码的原理和实现(下)


    4、编码帧内预测模式

    大量增加可选择的预测模式可以提供更高的编码效率,同时要求编码预测模式有更加高效的方法降低更多模式带来的负担。与H.264采用一个最可能模式不同的是,对于亮度分量,三个最可能模式用于预测实际的帧内预测模式。同时,也考虑了三个最可能模式中的冗余信息,重复的模式会使用其他模式进行替换。对于亮度分量,HEVC采用了同亮度分量相同的预测模式。在编码亮度和色度帧内预测模式时,各个语法元素的设计也体现了亮度分量更多的最可能候选模式以及亮度分量的统计特性。

    (1)亮度帧内预测模式的预测

    HEVC对每种PU大小共支持总计33种角度模式,外加上DC和平面模式。由于支持的模式更多,类似于H.264的单一最可能模式在HEVC中效率不高。HEVC针对每种PU大小定义了三个最可能模式,其选择依赖于相邻PU所选的模式。同时,由于最可能模式之外的模式概率分布接近平均,这样也可以由一个不经过CABAC的定长编码表示的结构来从剩余32个模式中指定一个模式。
    最可能模式的选择根据左侧和上方的相邻块的模式确定。如果某一个相邻块不是帧内编码或者编码模式为PCM模式,或左边PU处于当前CTU之外,那么该块的模式在这个过程中等同于DC模式。设左侧和上方PU的模式分别为A和B,如果A≠B,那么这两个模式分别设为MPM[0]和MPM[1]。对于MPM[2]的确定需要遵循以下原则:①如果A或B都不是平面模式,那么MPM[2]设为平面模式;②否则,若A或B都不是DC模式,那么MPM[2]设为DC模式;③否则(即AB中有一个平面一个DC模式),MPM[2]设为模式26,即垂直模式。如果A=B,那么确定MPM的方法如下:①如果A和B都不是角度预测模式,那么MPM分别设定为平面、DC和垂直模式;②否则,MPM[0]设为A/B,MPM[1]和MPM[2]选择A的相邻模式,公式如下


    三个最可能模式确定后,会按照模式序号进行排序。如果当前预测模式等同于三个最可能模式之一,那么只有该模式在MPM的索引值会传递给解码器,否则将会传递一个5位且不经过CABAC的语法元素表示在MPM之外所选择的帧内预测模式。

    该部分的实现如下:


    /** Get most probable intra modes 
    *\param   uiAbsPartIdx 
    *\param   uiIntraDirPred  pointer to the array for MPM storage 
    *\param   piMode          it is set with MPM mode in case both MPM are equal. It is used to restrict RD search at encode side. 
    *\returns Number of MPM 
    */  
    Int TComDataCU::getIntraDirLumaPredictor( UInt uiAbsPartIdx, Int* uiIntraDirPred, Int* piMode  )  
    {  
      TComDataCU* pcTempCU;  
      UInt        uiTempPartIdx;  
      Int         iLeftIntraDir, iAboveIntraDir;  
      Int         uiPredNum = 0;  
        
      // Get intra direction of left PU  
      pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx );//获取左方PU  
        
      iLeftIntraDir  = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX;//左方PU为空或非Intra,左方的PU模式则设置为DC,否则设置为左方PU的模式  
        
      // Get intra direction of above PU  
      pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx, true, true );//获取上方PU  
        
      iAboveIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX;//上方PU为空或非Intra,上方的PU模式则设置为DC,否则设置为上方PU的模式  
        
      uiPredNum = 3;  
      if(iLeftIntraDir == iAboveIntraDir)  
      {  
          //模式A和模式B相等的情况  
        if( piMode )  
        {  
          *piMode = 1;  
        }  
          
        if (iLeftIntraDir > 1) // angular modes  
        {  
            //如果二者都是角度预测,那么MPM[0]设置为该角度模式,MPM[1]和MPM[2]设置为该模式的相邻模式  
          uiIntraDirPred[0] = iLeftIntraDir;  
          uiIntraDirPred[1] = ((iLeftIntraDir + 29) % 32) + 2;  
          uiIntraDirPred[2] = ((iLeftIntraDir - 1 ) % 32) + 2;  
        }  
        else //non-angular  
        {  
            //如果二者都不是角度预测,那么三种模式分别设置为平面、DC和垂直模式  
          uiIntraDirPred[0] = PLANAR_IDX;  
          uiIntraDirPred[1] = DC_IDX;  
          uiIntraDirPred[2] = VER_IDX;   
        }  
      }  
      else  
      {  
          //模式A与模式B不等  
        if( piMode )  
        {  
          *piMode = 2;  
        }  
        uiIntraDirPred[0] = iLeftIntraDir;//MPM[0]和MPM[1]分别设置为这两种模式  
        uiIntraDirPred[1] = iAboveIntraDir;  
          
        if (iLeftIntraDir && iAboveIntraDir ) //both modes are non-planar  
        {  
            //当两个模式都不是平面模式时,MPM[2]设置为平面模式  
          uiIntraDirPred[2] = PLANAR_IDX;  
        }  
        else  
        {  
            //至少有一个是平面模式时,如果另一个是DC模式,那么MPM[2]设置为垂直模式;如果另一个不是DC模式,那么MPM[2]设置为DC模式  
          uiIntraDirPred[2] =  (iLeftIntraDir+iAboveIntraDir)<2? VER_IDX : DC_IDX;  
        }  
      }  
        
      return uiPredNum;  
    }  

    (2)色度帧内预测模式的导出

    为了在增加了预测模式的数量的同时降低传输负载,HEVC定义了INTER_DERIVED模式表示该色度PU使用亮度PU相同的预测模式。对于一个PU,只有平面、垂直、水平、DC和导出模式可供选择。如果一个色度PU选择了导出模式,那么帧内预测编码按照对应的亮度PU的模式进行。角度预测模式34用于在推导模式为前四种模式时做替换之用,替换原则如下表:


    (3)帧内预测模式编码的语法结构

    经过排序的三个最可能模式分别为SMPM[0]、SMPM[1]和SMPM[2]。prev_intra_luma_pred_flag表示亮度帧内预测模式等于三者之一,若相等,则定义mpm_idx表示SMPM[mpm_idx]为选定的帧内预测模式;否则,定义语法元素rem_intra_luma_pred_mode直接指定选定的帧内预测模式取值为[0,31]。亮度模式导出方法如下:①设L=rem_intra_luma_pred_mode;②对于i=0,1,2,若L≥SMPM[i],则L++。
    对于亮度帧内预测模式,导出模式出现的概率最高,其余四种的概率基本一致。语法元素intra_chroma_pred_mode二值化的方法如下表:


    5、编码算法

    由于HEVC定义的模式数量较多,在大多数场合下对所有模式进行率失真计算是不现实的。在HEVC参考代码中,SATD用于在进行率失真优化前筛选候选的亮度帧内预测模式。进入Full RDO的预测模式的数量根据对应PU的大小确定:4×4和8×8时8个,其他尺寸时3个。对于这些模式以及MPM中的候选模式,进行预测和变换操作获取所需编码数据量和对应失真。最后率失真最低的模式被选中。对于色度帧内编码,由于模式数量较少,所有可能的预测模式都会基于率失真代价进行评估。
    学术界对HEVC提出了多种快速帧内预测的算法。其中之一就是减少块尺寸的种类,如根据空间相邻块之前的判决的快速CU尺寸和模式判定算法、根据贝叶斯判决准则的CU筛选算法。另一种是减少候选帧内模式的方法,如在率失真计算阶段减少候选模式数量并强制使用最可能模式的方法、根据源图像方向性和相邻块进行模式预筛选的方法等。

    6、HEVC与H.264帧内编码的主要区别

    HEVC和H.264帧内编码都是基于空间图像预测的方法,预测后都会进行变换编码,而HEVC的算法更加复杂。
    第一,为了同HEVC的块分割结构一致,并且更适合于平滑图像区域的编码,HEVC支持的预测块大小最大可到32×32;
    第二,预测的方向从H.264的8种增加到了33种用于提升对方向性结构的预测效果。HEVC可选的所有预测方向适用于亮度和色度,而H.264适用于色度的方向只有水平和垂直两种。并且HEVC针对垂直、水平和DC模式在边界像素上进行了优化;
    第三,HEVC在参考数据部分缺失的情况下可以对其进行补全,并在这种情况下可以使用所有预定的预测模式;
    第四,预测模式编码次用了同H.264不同的方法,使用三个最可能模式进行预测,且选中的模式始终作为色度分量的有效候选模式之一;
    以上区别总结如下表:


    展开全文
  • 比如 H.264(仍然是目前使用最多的编解码规范)以及 H.265/HEVC(部分大厂在使用 优酷 腾讯等),以及国内的 AVS 系列。 h.26x 系列 视频编码标准的发展简史 LoveYFan H.261-视频编奠基者 H.261 设计的目的是能够在带宽...

    在音视频发展的历程中,编解码无疑是其最核心的功能,编解码标准的更新换代也极大促进了音视频技术的发展以及行为模式的变更。从电视到网络视频以及现在的网络直播、点播、音视频会议等等,这些变化的背后都离不开音视频编解码技术的更新迭代。比如 H.264(仍然是目前使用最多的编解码规范)以及 H.265/HEVC(部分大厂在使用 优酷 腾讯等),以及国内的 AVS 系列。

    h.26x 系列

    视频编码标准的发展简史

    img

    LoveYFan

    H.261-视频编奠基者

    H.261 设计的目的是能够在带宽为 64kbps 的倍数的综合业务数字网(ISDN for Integrated Services Digital Network)上传输质量可接受的视频信号。编码程序设计的码率是能够在 40kbps 到 2Mbps 之间工作,能够对CIFQCIF分辨率的视频进行编码,即亮度分辨率分别是 352x288 和 176x144,色度采用4:2:0采样,分辨率分别是 176x144 和 88x72。

    H.261 在图像编码上使用了我们现在比较熟悉的离散余弦变换(DCT)算法, 它在后来的 JPEG 编码中起主要作用。但不止于此,它引入了一系列针对视频的特性,奠定了现代视频编码的基础,其中主要有宏块(Macroblock)和基于宏块的运动补偿(Motion Compensation)。

    H.261 使用 YCbCr 颜色空间,并采用4:2:0色度抽样,每个宏块包括 16x16 的亮度抽样值和两个相应的 8x8 的色度抽样值。YCbCr 又成为 YUV,仍然是现在编解码规范所采用的色彩空间。

    宏块与基于运动补偿的帧间预测

    我们知道,视频是由一帧一帧的图像组成的组合,一般情况下一秒钟的视频中会包含 24、25、30、60 或更多张图片,它们按照一定的时间间隔播放出来,基于视觉残留原理形成了流畅、会动的画面。在连续的几帧之间,实际上存在着大量重复的画面,比如说下面这个例子:

    img

    一个白色台球在绿色桌面上面运动

    img

    用小球运动的方向和距离来描述图像的变化

    如果是以传统的思路对每一帧图像做压缩的话,显然整个视频在压缩过后仍存在大量的冗余。那么怎么办呢?H.261 标准引入了宏块的思维,它将整个画面切分为许多小块,然后再引入基于运动补偿的帧间预测——画面的大部分都是不动的,那么我们将不动部分的区块沿用之前的压缩结果,动的部分用运动方向加距离这样一个矢量来描述不就可以节省出大量的存储空间了吗?

    DCT 算法

    img

    将 8x8 个像素分成一个块

    img

    DCT 算法起源于上世纪 70 年代,到了 80 年代中后期,有研究者开始将其用于图像压缩。这种算法可以将图像从空间域转换到频率域,然后做量化——减少人眼敏感程度较低的高频信息,保留绝大部分低频信息,从而减少图像的体积。最后再用高效的数据编码方式将处理过后的数据进一步压缩,这里使用了 Zig-Zag 扫描和可变长编码。

    在 H.261 及之后基于 H.261 框架的视频编码中,DCT 算法主要针对的是关键帧的压缩,所谓关键帧,就是在运动补偿中作为基准参考的一帧。打个比方,就像 Flash 动画中的关键帧一样,它定义了一个起点,后续的几帧都是基于这个关键帧演算出来的。因为它只做帧内压缩,不涉及其他帧,又被称为 Intra-frame(帧内编码帧),简称 I 帧。

    MPEG-1:引入帧类型概念

    MPEG-1 是为CD光盘介质定制的视频和音频压缩格式。MPEG-1 采用了块方式的运动补偿离散余弦变换DCT)、量化等技术,并为 1.2Mbps 传输速率进行了优化。MPEG-1 随后被Video CD采用作为核心技术。

    音频-MP3

    MPEG-1 音频分三代,其中最著名的第三代协议被称为 MPEG-1 Layer 3,简称MP3,目前仍然是广泛流传的音频压缩技术。

    视频-引入 B 帧以及 GOP

    在 H.261 中其实已经有视频帧的概念了,比如上面的关键帧(就是一张完整的静态图像,可以直接被解码出来),另外的帧则是通过运动补偿算法在关键帧之上计算得到的。

    img

    不过 MPEG-1 真正引入了帧类别的概念,原来的关键帧被称为“I 帧”,基于帧间预测计算得到的帧为 P 帧。在这两种 H.261 已有的帧类型外,它引入了一种新的帧:双向预测帧,也叫作 B 帧。

    img

    不过引入 B 帧的同时,也使编解码的复杂度提高了,MPEG-1 又提出了 GOP(Group of pictures),即 I 画格和 I 画格之间的画格排列。

    图像群组就是一组以 MPEG 编码的影片或视讯串流内部的连续图像。每一个以 MPEG 编码的影片或视讯串流都由连续的图像群组组成。

    下图是 GOP 示例

    img

    MPEG-2:DVD 标准

    对于 MPEG-1,它并没有太大的改动,主要是针对 DVD 应用和数字时代进行了改良。

    支持隔行扫描

    隔行扫描(英语:Interlaced)是一种将图像显示在扫描式的显示设备上的方法相比逐行扫描,隔行扫描占用带、宽比较小。扫描设备交换扫描偶数行和奇数行。

    img

    一个慢速的隔行扫描的示意

    H.263:熟悉的 3GP 视频

    原先的 H.261 和 MPEG-1 都是偏向于低码率应用的,随着互联网和通讯技术的飞速发展,人们对网络视频的需求在提高,在低码率下追求更高质量的视频成为了新的目标,而作为通信业的一大标准制定者,ITU-T 在 1995 年推出了 H.261 的直接继承者——H.263。

    在上世纪 90 年代,3GP 也是风靡一时,它减少了存储空间和较低的带宽需求,让手机上有限的存储空间可以使用。目前在 3GP 中 H.263 仍然占据着主流地位。

    H.264/MPEG-4:到了熟悉的 Part

    H.264/AVC 是一种面向块,基于运动补偿视频编码标准 。到 2014 年,它已经成为高精度视频录制、压缩和发布的最常用格式之一。

    H.264/AVC 包含了一系列新的特征,使得它比起以前的编解码器不但能够更有效的进行编码,还能在各种网络环境下的应用中使用。这些新特性包括:

    • 多参考帧的运动补偿。比起以前的视频编码标准,H.264/AVC 以更灵活的方式使用已编码的更多帧来作为参考帧。在某些情况下,可以使用最多 32 个参考帧(在以前的标准里面,参考帧的数目不是 1 就是对 B 帧来说的 2)。该特性对大多数场景序列都可以带来一定的码率降低或者质量提高,对某些类型的场景序列,例如快速重复的闪光,反复的剪切或者背景遮挡的情况,它能很显著的降低编码的码率。
    • 变块尺寸运动补偿。可使用最大 16x16 至最小 4x4 的块来进行运动估计与运动补偿,能够对图像序列中的运动区域进行更精确的分割。这些类型共有 16×16、16×8、8×16、8×8、8×4、4×8、4×4
    • 为了减少混叠(Aliasing)并得到更锐化的图像,采用六抽头的滤波器(六阶数字滤波器)来产生二分之一像素的亮度分量预测值。
    • 灵活的隔行扫描视频编码(interlaced-scan video coding)。

    H.265/HEVC:尴尬的继任者

    作为 H.264 的继任者,HEVC 被认为不仅提升影像质量,同时也能达到 H.264/MPEG-4 AVC 两倍之压缩率(等同于同样画面质量下比特率减少到了 50%),可支持4K清晰度甚至到超高清电视(UHDTV),最高清晰度可达到 8192×4320(8K清晰度)。

    下图是 H265 与 h264 主观视频性能比较

    img

    从上面的性能比较我们知道 H.265 在各种参数上都要优于 H.264,那为什么说它是尴尬的继任者呢,

    1. 现有大部分音视频还是以 H.264 为主,且 H.264 可以满足大部分的场景
    2. 授权费过于昂贵,国内外音视频服务厂家被 H.264 已经薅了一次羊毛,如果再支持 H.265 又要交授权费用,所以目前只有一部分大厂(腾讯,优酷)再特定的影片上使用。
    3. H.266 已经发布,所以如果确实有需求的可能等着接入 H.266,不太需要的仍然不会接入 H.265,所以它的位置比较尴尬。

    不过 H.266 可能还需要几年的发展,留给 H.265 的时间不多了,不过它仍然有机会。

    H.266/VVC:未来编码

    它来了它来了,它迈着六亲不认的步伐走来了,必将引领新一代音视频世界的发展,它就是 H.266/VVC。

    2020 年 7 月,H.266/VVC 视频编解码标准宣布编辑完成,也是这个时刻为未来 10 年内音视频发展方向指明了方向。

    VVC 全称 Versatile Video Coding(多功能视频编码),也称为 H.266MPEG-I 第 3 部分未来视频编码FVC)。VVC 的设计初衷是为了在同样的视频质量下达到更大的压缩比、更低的码率,为 4k、8k 超清视频、360 全景视频等更多场景赋能。当然 VVC 还有其他特性:

    该标准预期的编码复杂度为 HEVC 的数倍(最多十倍),但具体取决于编码算法的质量。其解码复杂度预期约为 HEVC 的两倍。

    视频标准更新换代/编码效率的更新

    img

    PS

    • VTM = VVC test model, latest version is VTM-10.0 (测试模型参考软件平台)

    • JVET = Joint Video Experts Team of the ITU-T VCEG and ISO/IEC MPEG (VVC 标准委员会)

    H.266/VVC 优点

    降低成本

    现有的 H.264/H.265 已经满足大部分的音视频业务需求,但是在一些业务下已经达到了瓶颈,还有 CDN 的带宽流量也是一比很大的投入,如果能在在同样的视频质量下达到更大的压缩比、更低的码率,那么就意味着能以同样的 CDN 服务器服务更多的客户,降本提效。

    赋能更多场景

    新兴的业务比如 VR(Virtual Reality 虚拟现实),AR(Augmented Reality 增强现实),360 全景等,必须使用 4k 甚至更高的 8k 分辨率才能达到效果,在这个情境下就是如何更快(低延迟)、更好(分辨率)、更少(低码率)的传输数据,现有的编解码方案已经无法满足。国内外 VVC 发展现状

    国内 H.266 的发展

    1. 积极参与 H.266 的标准制定,其中代表的是腾讯、阿里,都在 H.266 制定标准的过程中提交了几百份提案,被采纳率过半。积极参与规则的制定,后面才有发言权,这是血的教训。
    2. 腾讯开源首个 H.266 编解码器https://github.com/TencentCloud/O266player,详情请参看https://www.infoq.cn/article/auuthrzodb8j2k8lmrsz

    AVS 系列

    AVS 发展历史

    img

    国内的 AVS 编解码标准由于起步较晚,大部分专利都在国外,大部分国内企业还是会沦落到任人宰割的境地。另外 AVS 编码体系性能上还是有所不足。根据 IEEE 出具的一份 HEVC/VP9/AVS2 编码效率对比报告,其中在随机访问条件下,HEVC 性能优于 VP9 24.9%,AVS2 6.5%;在延迟条件下,HEVC 优于 VP9 8.7%,AVS2 14.5%。在某些领域,AVS2 对比 HEVC 已经相差不大,但从总体性能和应用规模来看,AVS2 还有很长的路要走。所以即使国家在极力推动 AVS,其应用场景还是比较少,国企里用的比较多。

    Google 系列

    VP8

    从技术角度来说,VP8 采用的技术是类似于 H.264 的。虽然在我们看到的宣传中,VP8 拥有比 H.264 更佳的压缩效率,但在实际应用中,由于它在设计上有一定的瑕疵,表现并不如 H.264,最终它虽然进入了 Web 标准,但也没见有人用它,反而是由它的帧内压缩技术提取而成的 WebP 受到了欢迎。

    VP9

    VP8 的表现并不理想,Google 很快就推出了它的继任者——VP9。这次,他们参考的是 HEVC,设计目标同样是高分辨率下的高效编码。VP9 中的一些设计是受到了 HEVC 的影响的,比如说同样最大为 64x64 的超级块(Super Block)。最终 VP9 达成的结果是提供了比 VP8 高达 50%的效率提升。看起来它能够和 HEVC 比肩了,但是它也遇到了和 VP8 相似的问题,推广不开。VP9 的应用范围实际也局限在 Google 自家的 Youtube 中,只能说是缺少实际应用场景。

    未来音视频发展的思考与展望

    深度学习以及端-端智能赋能未来音视频发展。

    深度学习

    通过模型训练 AI 来智能调整编解码器参数。

    端智能

    建立端-端的通信链路

    展开全文
  • 在许多之前的标准中,VVC有基于块的混合编码结构帧内帧间预测,变换编码和编码。 图的划分,首先对输入的视频分割成块 CTU。一个CTU单元通过四叉树(QT)多种树型结构二叉树(BT),三叉树(TT)将CTU分割为更小的CU...
  • 新一代视频编码标准:VVC、AVS3

    千次阅读 2020-12-29 22:20:32
    本文来自北京大学信息科学技术学院教授马思伟在LiveVideoStackCon 2018大会上的演讲,详细介绍了最新一代VVCAVS3视频编码标准进展,包括关键技术特色以及未来的应用展望。 文 / 马思伟 整理 / ...
  • 长论文ptsd犯病了,这次是一篇35页的AI编解码的综述,犯病了犯病了。 首先还是保命时刻,以下解读与见解均为我的个人理解,要是我有哪里曲解了,造成了不必要的麻烦,可以联系我删除文章,也可以在评论区留言,我...
  • H.266视频编解码标准

    千次阅读 2022-03-31 17:40:14
    H.266多功能视频编码编解码标准,新的H.266 /VCC编解码在保持清晰度不变的情况下,数据压缩效率获得极大提高,数据量减少了50%。 新标准的公告中指出,由于改进了压缩技术,H.266将减少约50%的数据需求。使用...
  • H.266/VVC帧间预测总结

    千次阅读 2021-08-16 21:26:13
    目前,主流视频编码标准中采用的基于块的帧间编码方式,基本原理是通过运动估计(Motion Estimate)从相邻参考重建帧中寻找当前块差别最小的参考块,将其重建值作为当前块的预测块。其中参考块到当前块的位移称为...
  • 新一代H.266 VCC视频编码标准正式发布 ...与简称 H.265 的高效视频编码(HEVC)前身一样,新标准有望将视频文件的比特率大小降低 50% 左右,同时不会在视觉保真度上有明显的差异。支持 VVC 编解码功能的终端软件,亦有
  • VVC编码工具之Inter Prediction

    千次阅读 2019-04-18 11:33:48
    声明:本系列博文均为原创,转载请注明出处,谢谢!...HEVC中,merge候选列表最大值为5(空域4+时域1),候选集为5个空域,2个时域以及候选集总数小于最大值时增加的组合双向预测(只针对B帧)零MV; VTM4中,mer...
  • 编码生态推进 我们在编码生态推进阶段会实现两个编码器,一个由北大Intel合作研发的SVT-AVS3编码器,已经可以实现8K实时编码;我们在研制另外一个不依赖于SVT架构的AVS3编码器叫uAVS3e(“天枢”),预计会在2020...
  • 诸多的方案给视频服务商带来了选择困难症,因为他们需要为自己选择合适的编解码器,确保为用户传送的音画内容能具备尽可能好的质量最低的比特率,同时还要考虑到编码器对计算资源的要求。我们 一、视频编码器的...
  • 视频编解码 2020-比赛开始!

    千次阅读 2020-06-30 08:00:00
    诸多的方案给视频服务商带来了选择困难症,因为他们需要为自己选择合适的编解码器,以确保为用户传送的音画内容能具备尽可能好的质量最低的比特率,同时还要考虑到编码器对计算资源的要求。 多年来,选择视频编...
  • H264MPEG4区别

    千次阅读 2020-12-15 10:00:34
    MPEG-4编码技术 MPEG-4:MPEG-4是一个适用于低传输速率应用的方案,MPEG-4是在MPEG-1、MPEG-2基础上发展而来,是为了播放流式媒体的高质量视频而专门设计的,它可利用很窄的带度,通过帧重建技术,压缩传输数据...
  • 欢迎使用Markdown编辑 你好! 这是你第一次使用 Markdown编辑 所展示的欢迎页。如果你想学习如何使用Markdown编辑, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑...
  • HLS+FMP4方案对H.265+AAC支持要点

    千次阅读 2020-06-09 19:39:01
    2017年的苹果WWDC大会上,苹果宣布HEVC支持HLS,涉及了iOS、MacOStvOS等系统终端。苹果之所以乐意这个事情,首先HLS就是他们家的,近些年一直把HLS致力于推成Web标准,其次苹果手握大量H.265的专利,也不想谷歌的...
  • 带宽要求是指一些编码器会对带宽下降进行要求,例如苹果的编码器会限制视频质量的最低水平,一旦码率过低或质量过差编码器则拒绝编码输出。但对于实时通讯而言,带宽的未知变化使得我们无法准确判断什么时候码率会...
  • 本文从最新的国际视频标准VVC(Versatile Video Coding,多功能影像编码)讲起,分享视频直播行业的全景与阿里的创新,以及达摩院淘宝团队共同开发的VVC编解码相关工作。 国际视频标准简史 上图显示的是两...
  • 本文从最新的国际视频标准VVC(Versatile Video Coding,多功能影像编码)讲起,分享视频直播行业的全景与阿里的创新,以及达摩院淘宝团队共同开发的VVC编解码相关工作。国际视频标准简史上图显示的是两个重量级...
  • 因此,我们在开发实际商用编码器的时候,如何合理选择使用这些编码工具,对编码器的在复杂度性能上的可行性至关重要。另外,从上图我们可以看到在VVC的众多编码工具中,有8个性能增益可以超过1%,其他相对比较小。...
  • 支持MPEG-4, , H.264, H.265/HEVC, VC-1,VP8视频解码; 支持H.264视频编码; 支持2D,3D高性能图形加速; 支持RTC时钟实时保存; 支持百兆有线以太网; 支持CSI摄相头接口; 支持外置USB 3G模块及PCIE...
  • 支持MPEG-4, , H.264, H.265/HEVC, VC-1,VP8视频解码; 支持H.264视频编码; 支持2D,3D高性能图形加速; 支持RTC时钟实时保存; 支持百兆有线以太网; 支持CSI摄相头接口; 支持外置USB 3G模块及PCIE...
  • 新一代视频编解码标准正式公布!

    万次阅读 多人点赞 2020-07-13 17:40:00
    下面笔者将就各模块划一下重点,向各位读者加以解读一下: 编码器框架:(H.266/VVC)基于块的分层编码结构。其参考软件编码结构如下图所示: 分块:在视频编码算法中,分块是堪称是技术底座,其任务是将图像被分成...
  • 我们是来自6个地方的同学,我们在OpenHarmony成长计划啃论文俱乐部里,与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习研究操作系统技术… 文章目录【往期回顾】【本期看点】【技术DNA】【智慧...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

hevc和vcc编码器