您的位置:首页 > 其它

HEVC语法元素的编解码

2017-08-15 14:13 726 查看
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,不作赘述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: