У кого-нибудь есть простое решение для анализа кодов Exp-Golomb с помощью C ++? - PullRequest
4 голосов
/ 02 марта 2010

Попытка декодировать значения наборов параметров sprop SDP для видеопотока H.264 и найти доступ к некоторым из этих значений будет включать анализ данных, закодированных Exp-Golomb, и мой метод содержит декодированный base64 sprop-параметр- устанавливает данные в байтовом массиве, который я сейчас немного изучил, но подошел к первой части данных, закодированных Exp-Golomb, и ищу подходящий фрагмент кода для разбора этих значений.

Ответы [ 4 ]

5 голосов
/ 12 августа 2012

Эксп. - коды Голомба какого порядка ?? Если вам необходимо проанализировать поток битов H.264 (я имею в виду транспортный уровень), вы можете написать простые функции для доступа к скицифицированным битам в бесконечном потоке битов. Индексирование битов слева направо.

inline u_dword get_bit(const u_byte * const base, u_dword offset)
{
    return ((*(base + (offset >> 0x3))) >> (0x7 - (offset & 0x7))) & 0x1;
}

Эта функция реализует декодирование кодов exp-Golomb нулевого диапазона (используется в 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);

}

u_dword означает 4-байтовое целое число без знака. u_byte означает 1-байтовое целое число без знака.

Обратите внимание, что первый байт каждого блока NAL - это заданная структура с запрещенным битом, ссылкой NAL и типом NAL.

2 голосов
/ 03 марта 2010

Я написал библиотеку сжатия c ++ jpeg-ls, которая использует коды Голомба. Я не знаю, совпадают ли коды Exp-Golomb точно так же. Библиотека с открытым исходным кодом может быть найдена в http://charls.codeplex.com.. Я использую таблицу поиска для декодирования кодов Голомба длиной менее 8 бит Дайте мне знать, если у вас возникнут проблемы с поиском выхода.

1 голос
/ 04 октября 2016

Принятый ответ не является правильной реализацией. Это дает неправильный вывод. Правильная реализация в соответствии с псевдокодом от

«Секция 9.1. Процесс синтаксического анализа для кодов Exp-Golomb», спецификация 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);
}
0 голосов
/ 01 мая 2014

Пересмотрено с функцией получения N битов из потока; работает парсинг H.264 NALs

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);
}
...