1

私は OpenH264 コーデックを使用しています。OpenH264 は、ヘッダー関連情報に Exp-Golomb Coding を使用しています。いくつかの Web サイトを調べて、Exp-Golomb コーディングに関する情報を少し集めました。OpenH264 では、4 種類の Exp-Golomb コーディング方式が使用されます。彼らです:

  • [数値が非負数のみの場合]
  • Te [値が 1 または 0 のみの場合]
  • Se [値が負と正の両方の数量の場合]
  • Me [値に対して標準コード マップが定義されている場合]

メソッドUeで構築または解析する方法を学びました。

Exp-Golomb(Ue) = [M-Zeros][1][INFO] の構文形式。

構築: Code_Num = 226 があるとし
ます
。M = floor(log2(Code_Num)) = floor(log2(226)) = 7
INFO = Code_Num + 1 - pow(2,M) = 226 + 1 - 128 = 99 = (1100011) in Binary
So,
CodeWord = 0000000 1 1100011 [M-zeros, 1 ignoring bit, INFO]

解析: CodeWord = 000000011100011 があると仮定
Code_Num = pow(2,M) + INFO - 1 = 128 + 99 - 1 = 226

これで、Exp-Golomb(Ue) を計算できます。しかし、Se、Te、Me に関連するすべての理論を学びたいと思っています。しかし、他の方法のリソースを見つけることができません。私を助けてください。

4

1 に答える 1

1

OpenH264 は、H.264/AVC ビデオ コーデックの実装です。

AVC は、さまざまなヘッダーで Exp-Golomb コーディングを使用します。互換性のあるすべてのエンコーダーも同様に使用する必要があります。

また、te(v) は Truncated Exponential-golomb encoding の略です。

いずれにせよ、 wiki ページで符号付き Exponential-Golomb コードの読み取りに関する情報を見つけることができます。

しかし、本当に簡単な tl;dr は、0 = 1、1 = 010、-1 = 011 などです。

この混乱について:

M = floor(log2(Code_Num)) = floor(log2(226)) = 7 INFO = Code_Num + 1 - pow(2,M) = 226 + 1 - 128 = 99 = (1100011) in Binary So, CodeWord = 0000000 1 1100011 [M-zeros, 1 ignoring bit, INFO]

これはまったく正確ではありません。エンコード中に 1 を加算し、デコード中に 1 を減算する必要があります (符号なし Exp-Golomb の場合のみ)。Signed Exp-Golomb はまったく異なるシステムを使用します。

編集:

Mapped Exp-Golomb は、Unsigned Exp-Golomb とまったく同じで、さらにテーブル ルックアップがあります。

Truncated Exp-Golomb は、ストップ ビットが 0 であることを除いて、標準の RICE 別名単項コーディングと同じです。

独自のデコーダー/エンコーダーを作成したくない場合は、私のプロジェクト BitIO を参照してください。特に、ReadRICE/WriteRICE、および ReadExpGolomb/WriteExpGolomb 関数、Github の BitIOを既に作成しているためです。

于 2017-01-09T16:36:15.473 に答える