誰もがC ++を使用して指数ゴロムコードを解析する簡単な解決策を持っていますか?
質問
H.264ビデオストリームのためのSDPのspropパラメータセット値をデコードしようとすると、符号化データを指数ゴロムの解析伴われる値の一部にアクセスすることを発見したと、私の方法は、BASE64のデコードが含まのsprop-PARAMETER-今歩行ビットが、指数ゴロムの最初の部分に出ているバイト配列内の組のデータは、データを符号化し、これらの値を解析するための適切なコード抽出物を探します。
解決
Exp.ゴロムコードどのような順序の? それはあなたがH.264のビットストリーム(I平均トランスポート層)を解析する必要がある場合には、無限のビットストリームでscecifiedビットへのアクセスを行うために、単純な関数を書くことができます。左から右にインデックス化ビットます。
inline u_dword get_bit(const u_byte * const base, u_dword offset)
{
return ((*(base + (offset >> 0x3))) >> (0x7 - (offset & 0x7))) & 0x1;
}
この関数は、(H.264で使用される)は、ゼロ範囲の指数ゴロム符号の復号実装
u_dword DecodeUGolomb(const u_byte * const base, u_dword * const offset)
{
u_dword zeros = 0;
// calculate zero bits. Will be optimized.
while (0 == get_bit(base, (*offset)++)) zeros++;
// insert first 1 bit
u_dword info = 1 << zeros;
for (s_dword i = zeros - 1; i >= 0; i--)
{
info |= get_bit(base, (*offset)++) << i;
}
return (info - 1);
}
整数バイト4符号なしu_dword手段。 u_byte手段は、1つのバイトの整数を符号なします。
各NALユニットの最初のバイトが禁止ビット、NAL参照、及びNALタイプで指定された構造であることに注意してください。
他のヒント
私はゴロム・コードを使用するC ++ JPEG-LS圧縮ライブラリを書きました。指数ゴロムコードはまったく同じである場合、私は知りません。ライブラリは、オープンソースは、 http://charls.codeplex.com をで見つけることができています。 Iは、デコードゴロム符号<=長さ8ビットのルックアップテーブルを使用します。あなたの周りにあなたの方法を見つけることに問題があるなら、私に教えてください。
は受け入れ答えは正しい実装ではありません。それは間違った出力を与えています。擬似コードの通り正しい実装
"SEC指数ゴロム符号9.1の解析処理" スペックT-REC-H.264-201304
int32_t getBitByPos(unsigned char *buffer, int32_t pos) {
return (buffer[pos/8] >> (8 - pos%8) & 0x01);
}
uint32_t decodeGolomb(unsigned char *byteStream, uint32_t *index) {
uint32_t leadingZeroBits = -1;
uint32_t codeNum = 0;
uint32_t pos = *index;
if (byteStream == NULL || pos == 0 ) {
printf("Invalid input\n");
return 0;
}
for (int32_t b = 0; !b; leadingZeroBits++)
b = getBitByPos(byteStream, pos++);
for (int32_t b = leadingZeroBits; b > 0; b--)
codeNum = codeNum | (getBitByPos(byteStream, pos++) << (b - 1));
*index = pos;
return ((1 << leadingZeroBits) - 1 + codeNum);
}
ストリームからNビットを取得する機能を改訂。作品の解析H.264 NALの
inline uint32_t get_bit(const uint8_t * const base, uint32_t offset)
{
return ((*(base + (offset >> 0x3))) >> (0x7 - (offset & 0x7))) & 0x1;
}
inline uint32_t get_bits(const uint8_t * const base, uint32_t * const offset, uint8_t bits)
{
uint32_t value = 0;
for (int i = 0; i < bits; i++)
{
value = (value << 1) | (get_bit(base, (*offset)++) ? 1 : 0);
}
return value;
}
// This function implement decoding of exp-Golomb codes of zero range (used in H.264).
uint32_t DecodeUGolomb(const uint8_t * const base, uint32_t * const offset)
{
uint32_t zeros = 0;
// calculate zero bits. Will be optimized.
while (0 == get_bit(base, (*offset)++)) zeros++;
// insert first 1 bit
uint32_t info = 1 << zeros;
for (int32_t i = zeros - 1; i >= 0; i--)
{
info |= get_bit(base, (*offset)++) << i;
}
return (info - 1);
}