Хаффман в декодировании JPEG: что такое символы, коды и длина - PullRequest
0 голосов
/ 21 июня 2020

Я слежу за плейлистом Дэниела Хардинга на YouTube «Все, что вам нужно знать о JPEG», чтобы понять, как определяется формат файла JPEG.

В процессе декодирования код выглядит примерно так:

length = getNextSymbol()
...
coefficient = readBits(length)
mcu[0] = coefficient

и функция getNextSymbol делает что-то вроде этого:

currentCode = 0;
for i < 16:
    currentCode = (currentCode << 1) | readNextBit()
    for each huffman_code with length i:
        if currentCode == huffman_code:
            return huffman_symbols[huffman_code]

полный код размещен на github: https://github.com/dannye/jed/blob/master/src/decoder.cpp

Итак, мы сначала получаем символ, который должен быть значением, которое мы хотим проанализировать. Но после этого читаем длину этого символа. Таблица Хаффмана хранит только количество считываемых битов, а не «реальное» значение. Но при декодировании A C мы сохраняем символ непосредственно в наших значениях mcu!

Что я понял:

  • код Хаффмана = битовая последовательность или путь к символу
  • символ Хаффмана = значение, которое мы хотим закодировать с помощью этого кода

Вопрос: Почему мы читаем символ, а затем преобразуем его в длину, считывая эту длину и сохранение прочитанного значения. Но в A C мы храним символ без чтения бита.

Что мне здесь не хватает? Спасибо за помощь, мне это действительно сложно понять!

1 Ответ

2 голосов
/ 21 июня 2020
Компонент

AD C представлен числом битов в кодировке Хаффмана, за которым следует число битов, интерпретируемое как целое число со знаком. Это целое число добавляется к коэффициенту D C последнего блока, чтобы получить коэффициент D C этого блока. (Для первого блока «предыдущий» коэффициент D C принимается равным нулю.)

Компонент A C представлен длиной серии в коде Хаффмана / количеством битов, за которым следует это количество биты интерпретируются как целое число со знаком. Длина серии составляет четыре старших бита декодированного символа, а количество битов - четыре младших бита. Каждый такой компонент приводит к последовательности нулевых коэффициентов, длина которой является длиной серии, за которой следует коэффициент, значение со знаком которого представляет собой биты, следующие за кодом.

В обоих случаях некоторое количество битов выбирается после Хаффмана код для получения значения коэффициента. Так что я не знаю, что вы имеете в виду, говоря «Но при декодировании A C мы сохраняем символ непосредственно в наших значениях mcu!»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...