HEVC構文要素のコーディング

2551 ワード

H.265のシンタックス要素のバイナリ化符号化は主に,カットオフライス符号化(TR),k次指数コロンブス符号化,定長符号化(FL)である.注目すべきは、この3つの符号化スキームに加えて、H.265規格がpart_に与えられることである.mode、intra_chroma_pred_mode、inter_pred_idc、cu_qp_delta_abs、coeff_abs_level_remainingの5つの構文要素は、専門的なバイナリ化スキームを提供します.
構文の記述子:
ビット列: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で定義された4つのマクロは、呼び出し時に上記の4つの関数名を置き換える:
#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が定義されており、説明は省略する