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,不作赘述