HM中语法元素二进制化的相关代码分析

本文介绍了H.265标准中语法元素的二进制编码方式,包括截断莱斯编码、k-阶指数哥伦布编码和定长编码。在HM实现中,这些编码在SyntaxElementWriter类中进行,使用如xWriteCode、xWriteUvlc等函数。解码过程则由SyntaxElementParser类处理,通过相应的别名函数实现。

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

H.265的语法元素的二进制化的编码主要有:截断莱斯编码(TR)、k-阶指数哥伦布编码、定长编码(FL)。值得注意的是,除了这三种编码方案外,H.265标准给part_mode、intra_chroma_pred_mode、inter_pred_idc、cu_qp_delta_abs、coeff_abs_level_remaining这五个语法元素提供了专门的二进制化方案。

在HM中,编码端对应的二进制化的代码在类SyntaxElementWriter中(定义在文件SyntaxElementWriter.h和SyntaxElementWriter.cpp中)。

class SyntaxElementWriter
{
protected:
  TComBitIf*    m_pcBitIf;

  SyntaxElementWriter()
  :m_pcBitIf(NULL)
  {};
  virtual ~SyntaxElementWriter() {};

  Void  setBitstream          ( TComBitIf* p )  { m_pcBitIf = p;  }

  Void  xWriteCode            ( UInt uiCode, UInt uiLength );
  Void  xWriteUvlc            ( UInt uiCode );
  Void  xWriteSvlc            ( Int  iCode   );
  Void  xWriteFlag            ( UInt uiCode );
  Void  xWriteRbspTrailingBits();

  UInt  xConvertToUInt        ( Int iValue ) {  return ( iValue <= 0) ? -iValue<<1 : (iValue<<1)-1; }
};

xWriteCode:定制方案如下:
xWriteCode:定长编码(FL)
xWriteUvlc:无符号的0阶指数哥伦布编码
xWriteSvlc:带符号的0阶指数哥伦布编码
xWritFlag:长度为1的定长编码(FL)

为了在调用时可以添加语法元素名的参数以增加程序的可读性,HM定义了四个宏来在调用时替换上面的四个成员函数名:

#define WRITE_CODE( value, length, name)     xWriteCode ( value, length )
#define WRITE_UVLC( value,         name)     xWriteUvlc ( value )
#define WRITE_SVLC( value,         name)     xWriteSvlc ( value )
#define WRITE_FLAG( value,         name)     xWriteFlag ( value )

对应地,在解码端,定义了类SyntaxElementParser(在文件SyntaxElementParser.h和SyntaxElementParser.cpp)来做二进制化的解码。

class SyntaxElementParser
{
protected:
  TComInputBitstream*   m_pcBitstream;

  SyntaxElementParser()
  : m_pcBitstream (NULL)
  {};
  virtual ~SyntaxElementParser() {};

  Void  xReadCode    ( UInt   length, UInt& val );
  Void  xReadUvlc    ( UInt&  val );
  Void  xReadSvlc    ( Int&   val );
  Void  xReadFlag    ( UInt&  val );

public:
  Void  setBitstream ( TComInputBitstream* p )   { m_pcBitstream = p; }
  TComInputBitstream* getBitstream() { return m_pcBitstream; }

protected:
  Void xReadRbspTrailingBits();
};

类似地,也给四个成员函数定义了别名:

#define READ_CODE(length, code, name)     xReadCode ( length, code )
#define READ_UVLC(        code, name)     xReadUvlc (         code )
#define READ_SVLC(        code, name)     xReadSvlc (         code )
#define READ_FLAG(        code, name)     xReadFlag (         code )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值