上記のフレーミングにfirst_mb_in_sliceスライスヘッダをしています。したがって、標準slice_headerのfirst_mb_in_slice記述子で見、および(v)UEでした。学習UE(V)を展開します。
ゴロム符号
クエリの記述子で定義されました:
- UE(V):符号のない整数指数ゴロム符号化シンタックス要素は、左ビットの第1。
記述子は、新しい用語、コーディング、指数ゴロム、コーディング入門テキストゴロムの後、除去に関する。
符号化ゴロムは可逆データ圧縮方法であって、1960年代の数学ソロモンW.Golombの発明です。幾何分布(幾何分布)は、最適な結果を達成することができる符号化ゴロムを使用して、ゴロムその小さな数字よりも大きいために、より適している符号化する際に非負の整数のみをコードするゴロム符号化されるが、シンボルテーブルシンボルの確率は、行に表示されコード化された数の比較的高い確率が表示されます。これは、より多くのコーディング小さい長符号化されたデジタル短く、より長い長さを使用します。
ブロックが符号化された符号化ゴロムは、正の整数パラメータmを必要とし、以下に示すように、パケットのm個の数で、符号化対象
コードする2つのゴロムに分割されている正の整数Nを、符号化されるべき任意の非負のためセクション:グループの数グループIDと残りの部分をグループ化した後に、グループIDは、実際に数NとパラメータM商を符号化するが、残りの部分は次のように具体的に計算剰余商である:
Q = N / M、
R&LT = N %のM
グループQの数のためには、単項符号化を用いて得られた、Rは、バイナリ符号化を使用して固定された長さの残りの部分です。
符号化(コーディング単項)単項は非負の整数を符号化するための単純な方法で、任意の非負整数NUMのために、それは0に続く1の後ろに単項符号化NUMです。
以上の説明のゴロム符号化と、ゴロム符号化率をさらに分析することができます。
コーディング指数ゴロム
コーディング通常、指数ゴロムに対してコーディングゴロムは、mが2の累乗でなければならないパケットはもはや固定Mサイズとして使用され、グループの大きさが指数関数的に成長してより大きな改善を有し、参照次の図は、
インデックス構造を符号化するシンボルゴロムは:** [Mゼロプレフィックス] [ 1] [オフセット] **、 Mは、グループID、1はセパレータを見ることができるパケットの数は、オフセットグループに付勢されていますシフト量。
指数ゴロムは、K次指数ゴロムと呼ばれるパラメータとして非負整数Kを必要とします。ここで、K = 0は、0次インデックスはゴロムを呼び出したときに、使用する標準我々の必要性をH.264符号化映像は0次指数ゴロムの使用であり、Kは0次EXP-になり、任意の順序することができコーディングゴロム。
表Iは、(表プリアンブル及びデリミタは01である)次の表は0次指数ゴロムの除去を示すために
符号化ゴロムのm個のグループ(グループID)のために、表すことができることをテーブルが示す上記の値を範囲は、
このようにグループ番号、ゴロム符号化のために、n個の非負整数値を導出すること
、グループ番号がM、Nの符号化処理のための値が出て表現することができる持っていました。
-グループ単項符号化の数mは、連続的な書き込み0をmは
シンボル構造のオフセットを計算するために、n型オフセット= - - 2 ^ M
-ビットmは低いオフセットテイクバイナリ
0次指数ゴロム符号化、9.1のマニュアルで説明する復号プロセスの除去を推奨2 * M + 1の符号化された長さ
ビットストリームを読み出す処理が開始さを解析する構文要素は、現在のビット位置で番号が0 leading_bitsなるまで、非ゼロのビットを含みます。次の手順を使用します:
leadingZeroBits = -1;
for(b = 0; !b; leadingZeroBits++)
b = read_bits(1);
CodeNum変数の割り当てを次のように
read_bits(leadingZeroBits)戻り値は、第1の2値符号なし整数のビット。
最適化:
上記の分析を通じて、新しいものかどうかを決定するために決意を介しfirst_mb_in_sliceの値のみ決意のUE(V)が0全体ゴロム符号化を除去する必要性を解消することはできませんです。もっと長い時間を消費します抗分析計算に関与。
したがって、本実施形態の実用化、slice_header動作の最初のバイトは0x80で行うことができます。しかし、その後の拡張のために、ゴロムかどうかを計算し、特定の関数値の調製にbIsZeroパラメータ切り替えを追加します。
以下のように連動、指数ゴロム符号の最終的な調製物です。
unsigned int GolombCode(unsigned char *pbyData, int nBytePosition, bool bIsZero)
{
int nLeadingZeroBits = -1; // 前导零的位数
unsigned int dwCodeNum = 0; // CodeNum值
unsigned int dwTail = 0; // 编码后缀
unsigned int dwOffset = 0; // 移位偏移量
unsigned char byPos = 0x80; // & 变量
unsigned int dwOffsetByte = 0; // 偏移字节数
if (bIsZero)
{
return !(pbyData[nBytePosition+5] & byPos);
}
/* 得到前导零的数量 */
for(int b = 0; !b; nLeadingZeroBits++)
{
if (!((nLeadingZeroBits + 1) % 8) && (nLeadingZeroBits + 1))
{
dwOffsetByte++;
byPos = 0x80;
}
b = pbyData[nBytePosition + 5 + dwOffsetByte] & byPos;
byPos >>= 1;
}
byPos = 0x80;
/* 后缀计算 */
for(int k = nLeadingZeroBits; k >= 0; k--)
{
dwOffset = 2 * nLeadingZeroBits - k + 1;
dwTail += (u32)pow(2.0, k - 1) * (pbyData[nBytePosition + 5 + dwOffset / 8] & (byPos >> ((dwOffset % 8) ? 1 : 0)));
}
/* ue(v)的值计算 */
dwCodeNum = (u32)pow(2.0, (s32)nLeadingZeroBits) - 1 + dwTail;
return dwCodeNum;
}