VTM1.0代码阅读:coding_tree_unit和coding_tree函数

本文深入解析VTM1.0中的coding_tree_unit函数,该函数负责CTU信息的编码。coding_tree_unit在EncSlice::encodeCtus和EncSlice::encodeSlice中被调用,前者用于更新上下文模型参数,后者则生成二进制码流。编码过程中,通过cs对象获取CTU信息,并依据skipSao参数决定是否进行SAO。coding_tree函数递归处理CTU中的每个CU,调用coding_unit进行编码操作。
摘要由CSDN通过智能技术生成

coding_tree_unit函数进行一个CTU的信息的编码,将CTU的信息编码为二进制码
coding_tree_unit函数在两个地方会被调用:
第一个地方是EncSlice::encodeCtus,这里调用coding_tree_unit仅仅是为了更新各个上下文模型的参数,并没有真的编码传输。
第二个地方是EncSlice::encodeSlice,这里是真正的编码端将CTU信息编码为二进制码流的地方。

入口参数cs是picture即当前帧的cs,该cs.area为整个picture的区域大小,cs中包含有当前帧所有CTU的所有信息。入口参数area即当前需要编码的CTU区域,ctuRsAddr为CTU的rs扫描地址。
EncSlice::encodeCtus中调用该函数时skipSao为true,需要进行SAO,因为encodeCtus函数进行的是CTU的编码,compress完一个CTU之后还需要对它的重建像素进行SAO,以便下一个CTU的帧内预测。
EncSlice::encodeSlice真正编码时的skipSao为false,无需SAO,这时只需要考虑编码就行。

void CABACWriter::coding_tree_unit( CodingStructure& cs, const UnitArea& area, int (&qps)[2], unsigned ctuRsAddr, bool skipSao /* = false */ )
{
   
  CUCtx cuCtx( qps[CH_L] );
  Partitioner *partitioner = PartitionerFactory::get( *cs.slice );

  partitioner->initCtu( area, CH_L, *cs.slice );	//partitioner用来记录CTU到各个cu的划分路径

  if( !skipSao )
  {
   
    sao( *cs.slice, ctuRsAddr );				//SAO
  }
  coding_tree( cs, *partitioner, cuCtx );		//CTU编码
  qps[CH_L] = cuCtx.qp;
  if( CS::isDualITree( cs ) && cs.pcv->chrFormat != CHROMA_400 )	//DualITree,I帧,coding_tree编码帧内色度模式的信息
  {
   
    CUCtx cuCtxChroma( qps[CH_C] );
    partitioner->initCtu( area, CH_C, 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值