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 )