BMS/VTM代码学习:解码器端的环路滤波处理

本文探讨了HEVC编码框架中的环路滤波过程,包括去块效应滤波器和像素自适应补偿SAO滤波器。在解码端,环路滤波是图像输出前的重要步骤。`DecLib::executeLoopFilters`作为解码后处理的入口,调用`LoopFilter::loopFilterPic`进行去块滤波,并通过`SampleAdaptiveOffset::SAOProcess`执行SAO处理。文章主要关注代码框架,未来将补充更详细的理论知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来看下环路滤波部分的代码。

环路滤波

为了便于理解,先来看HEVC编码框架。首先就要来说下混合编码框架,以下引自百度百科:

变换编码和预测编码是两类不同的压缩编码方法,如果将这两种方法组合在一起,就构成新的一类所谓混合编码,通常使用DCT等变换进行空间冗余度的压缩,用帧间预测或运动补偿预测进行时间冗余度的压缩,以达到对活动图像的更高的压缩效率。(百度百科)

HEVC框架如下,沿用了混合编码框架,整体可以分为几个模块:预测、变换量化、环路滤波、熵编码。可以看到预测、变换量化形成了一个环路,在反变换量化后进行了一步滤波处理这就是环路滤波。
这里写图片描述

这里所说的环路滤波器包含了去块效应滤波器和像素自适应补偿SAO滤波器,是环内滤波,属于环路后处理。还存在环外滤波,实际可以看做对输出视频再次进行滤波,不属于标准内容,具体技术一般由显示设备厂家自行选择。

在编码端环路滤波后的图像会被作为参考图像用于帧间预测,而在解码端就是最终要输出的图像了。

个人对于这部分内容并不熟悉,目前只需要了解整体代码框架,提取所需的去块前后和SAO前后图像,因此只对整体框架进行学习,具体理论后续补充。

DecLib::executeLoopFilters

DecApp::decode是一个很表层的函数了,其中调用的DecLib::decode是解码一帧图像的入口函数,解码后会调用DecLib::executeLoopFilters对解码得到的重构图像进行环路滤波。从这就可以清晰的理解所谓的环路后处理的含义了。这里立个flag吧,之后有时间好好整理下BMS/VTM解码器端的主要函数调用关系。

DecLib::executeLoopFilter只是一个上层入口函数,其中会调用LoopFilter::loopFilterPicSampleAdaptiveOffset::SAOProcess进行具体的去块滤波和SAO。这里相比HM增加了ALF,不具体说了。

代码分析如下:

//环路滤波
Void DecLib::executeLoopFilters()
{
  if( !m_pcPic )
  {
    return; // nothing to deblock
  }

  CodingStructure& cs = *m_pcPic->cs;   //取cs

  // deblocking filter
  m_cLoopFilter.loopFilterPic( cs );    //去块滤波

  if( cs.sps->getUseSAO() )
  {
    m_cSAO.SAOProcess( cs, cs.picture->getSAO() );      //SAO
  }
#if JEM_TOOLS

  if( cs.sps->getSpsNext().getALFEnabled() )        //JEM o Adaptive loop filter(ALF)
  {
    ALFParam* alfParams = &cs.picture->getALFParam();
    const UInt tidxMAX  = E0104_ALF_MAX_TEMPLAYERID - 1u;
    const UInt tidx     = cs.slice->getTLayer();
    CHECK( tidx >
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值