zobovision随谈H.265编码FPGA&ASIC实现(二)



    谈谈1080P@60 H.265实时编码器的架构设计。

   

    首要考虑1080P@60的实时编码能力,

    即设计的编码器需要具备不小于每秒60帧的编码能力,

    不允许丢帧的前提下,每帧编码时间不能大于16.6ms,

    按照编码主频可以推算出每帧的时钟周期数cycle,或反推,

    一般情况下,可以先根据FPGA/ASIC器件平台的fmax确定主频,

    此处的fmax并非器件理论上的最高主频,

    而是设计RTL代码在器件上能运行的fmax,

    不同设计风格或者不同开发者开发代码,fmax可能会有差别。

   

    对于FPGA而言,如xilinx kintex7系列,

    类似视频编码这种较大型工程,一般fmax可不低于200M,

    速度更快的FPGA器件一般可达300M以上,

    ASIC器件则根据工艺不同,差异较大,

    同样工艺条件下比FPGA要高不少。

   

    如zobovision开发的H.265 1080P@60实时编码器,

    可在xilinx k7325t或ku3p这样的FPGA器件上运行,

    fmax在ku3p器件的fmax约300M,

    实时运行1080P60所需的主频为265M左右。

   

    以主频250M为例,

    每帧平均分配的时钟周期数为4166666,

    按64x64的CTU基本编码单元,

    平均每个CTU分配8170cycle,

    CTU共有4096像素,每个像素2cycle;

   

    对于编码,每个像素大致需要经历几个过程,

    帧内或帧间模式粗选,

    帧内预测或帧间预测数据计算,

    残差数据DCTQ及IDCTQ重建,

    RDO最优选择,

    码流信息编码,

    去块滤波Deblock等。

   

    要完成这么多的功能及选择,

    1pixel 2clk?

    显然是不够的,

    不同功能模块的流水级设计是必须的。

   

    对于H.265/HEVC而言,

    以CTU为流水级基本单元,

    CTU大小可设定,最大64x64,最小16x16,

    一帧编码中只会固定选择一种尺寸,

    常见的有64x64和32x32,

    理论上尺寸越大,计算复杂度会更高,编码效率会好些,

    zobovision编码器固定选择CTU 64x64。

   

    不同的编码功能模块,

    有些是必须合并划分到同一级流水单元的,

    主要看编码数据流的依赖性,

    CTU编码单元又会进一步划分成尺寸更小的TU/PU单元,

    以帧内预测为例,每个PU单元会参考相邻的重建像素,

    即当前PU块的预测数据计算需要等待相邻块重构数据完成,

    也就是说,帧内预测计算、DCTQ、IDCTQ、RDO选择,

    这几个不同功能模块实现了从预测数据到重建数据完成的过程,

    它们需要被设计到同一个级流水中;

   

    至于帧内模式粗选,以及帧间运动估计功能,

    数据的依赖性较少,取决于不同的硬件算法,

    它们可以单独划分为一级流水,或多级流水,

    如运动估计粗选,可以基于整像素,亚像素等进行多级流水设计,

    多级流水可以提供压缩效率,但通常硬件资源也会有所增加。

   

    码流编码和Deblock去块滤波,

    是相对独立的功能模块,

    它们可以单独划分为一级或多级流水。

   

    不同的流水级,

    所需cycle可能有所不同,

    有些是可以通过增加并行处理降低cycle数目,

    有些却很难通过并行加速,因处理数据存在反馈依赖关系,

    如前面所述的帧内预测到DCTQ/IDCTQ重构的过程。

   

   

    从绝对可控的角度,

    一帧视频所需最小cycle数目,

    或,一帧编码所需最长时间,

    取决于最耗时的流水级处理单元;

    当1080P@60的实时主频设定在250M时,

    每级流水处理cycle要控制在8000左右,

    基本1pixel分配2clock(clk),

    对于特定功能模块,

    不同的cycle要求将导致不同的硬件算法选择。

   

    zobovision H.265视频编码器,

    各流水级处理cycle保持一致,均为8400cycle,

    每帧编码所需时钟周期数一致,

    保证绝对可控的帧编码时间。

   

    对于1pixel 2clk处理时间,

    到底是个什么概念,

    下面举例说明。

   

    对于一个64x64的CTU单元,

    共有4096pixel,一个流水级可分配8192clk,

    假设CTU最终都划分为4x4的帧内预测PU单元,

    每个i4x4块分配32clk,

    因为帧内预测,需要参考相邻块重建后数据,

    基本可认为,前面i4x4编完,后面i4x4才可启动,

    即,每个i4x4需要在32clk内完成既定任务,

    共有哪些任务呢,主要包括:

   

    1)i4x4帧内预测数据计算;

    2)4x4 2D-DCT运算;     

    3)Q4/IQ4运算   

    4)4x4 2D IDCT运算

    5)RDO判决

    6)i4x4重建数据生成;

   

    上述只是i4x4帧内编码的基本任务,

    要提高压缩效率,

    还需要类似RDOQ和RDO递归操作,

    计算复杂度更高,

    如何在32clk内实现,

    那只能是各显神通了,

    不同硬件架构及实现方法,

    结果差异化就容易显现。

   

   (转载请勿更改文章标题和内容)





























分享 :