HEVC语法元素的编解码

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


语法的描述符:

比特串:
b(8):任意形式的8比特字节(就是为了说明语法元素是为8个比特,没有语法上的含义)
f(n):n位固定模式比特串(其值固定,如forbidden_zero_bit的值恒为0)
i(n):使用n比特的有符号整数(语法中没有采用此格式)
u(n):n位无符号整数,如果在语法表中n的值为'v'其比特数由其他元素值确定。解析过程由read_bits(n)的返回值决定


指数哥伦布编码:
ue(v):无符号整数指数哥伦布码编码的语法元素
se(v):有符号整数指数哥伦布编码的语法元素,左位在先
te(v):舍位指数哥伦布码编码语法元素,左位在先


ce(v):CAVLC
ae(v):CABAC

在HM中,编码端对应的二进制化的编码在类SyntaxElementWriter

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 );
#if ENC_DEC_TRACE
  Void  xWriteCodeTr          ( UInt value, UInt  length, const TChar *pSymbolName);
  Void  xWriteUvlcTr          ( UInt value,               const TChar *pSymbolName);
  Void  xWriteSvlcTr          ( Int  value,               const TChar *pSymbolName);
  Void  xWriteFlagTr          ( UInt value,               const TChar *pSymbolName);
#endif
  Void xWriteRbspTrailingBits();

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

//! \}
其中,对应关系如下

xWriteCode:定长编码(FL) 
xWriteUvlc:无符号的0阶指数哥伦布编码 
xWriteSvlc:带符号的0阶指数哥伦布编码 
xWritFlag:长度为1的定长编码(FL)
在HM中定义了四个宏在调用时替换上面的四个函数名:

#if ENC_DEC_TRACE

#define WRITE_CODE( value, length, name)    xWriteCodeTr ( value, length, name )
#define WRITE_UVLC( value,         name)    xWriteUvlcTr ( value,         name )
#define WRITE_SVLC( value,         name)    xWriteSvlcTr ( value,         name )
#define WRITE_FLAG( value,         name)    xWriteFlagTr ( value,         name )

#else

#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 )

#endif
对应地,在解码端,定义了类SyntaxElementParser,不作赘述


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值