Відеокодування 7
Коди VLC (за своїм визначенням) містять змінну кількість біт, проте при транспортуванні даних мережами буває необхідно відобразити послідовності кодів VLC, породжених кодером, в потік байтів або слів. Механізм здійснення цієї операції показано на рис. 7.14. Вхідний регістр R накопичує VLC коди до тих пір, поки не збереться достатній обсяг даних для їх запису в один або кілька вихідних байтів потоку. При кодуванні нових символів значення V відповідних VLC кодів приєднуються до попереднього змісту регістра R (нові коди VLC заносяться в старші розряди). Лічильник числа занесених до R бітів збільшується на число L (довжина нового коду VLC у бітах). Якщо R містить більше S байтів (тут S позначає число байтів, які одночасно записуються у вихідний потік), S молодших байтів з R записуються у вихідний потік, а вміст регістру R зсувається вправо на S байтів.
Мал. 7.14. Блок-схема кодування VLC.
Послідовність кодів VLC (з табл. 3.12, гл. 3) кодується описаним вище методом. Нехай S = 1, тобто. у вихідний потік одночасно записується по одному байти. У табл. 7.1 наведено процес представлення кодів змінної довжини у вихідному потоці на кожній його стадії, причому байт, що записується, виділений жирним шрифтом.
Мал. 7.15. Архітектура кодування змінними кодами VLC.
На рис. 7.15 показано основну архітектуру виконання процесу кодування кодами змінної довжини. Нові символи даних та контекстні покажчики (вибрана таблиця) надходять у модуль табличного пошуку, який повертає значення V та довжину L відповідного кодового слова. Модуль укладача вибудовує коди VLC один за одним і подає на вихід S байтів за один крок (як описано в попередньомуприкладі).

Мал. 7.16. Блок-схема декодування VLC
При практичній розробці ентропійних кодерів змінної довжини слід звертати увагу на обчислювальну ефективність алгоритмів та обсяг пошукових таблиць. На програмному рівні процедури ентропійного кодування можуть сильно навантажувати процесор через частого використання побитих операцій, що використовуються для укладання та зсуву кодів. Побудова хороших таблиць пошуку також є певною проблемою через нерегулярну структуру таблиці кодів VLC. Наприклад, таблиця TCOEF MPEG-4 Visual (див. гл. 3) індексується за трьома параметрами: «серія» (довжина попередньої серії нулів), «значення» (величина наступного за цими нулями ненульового коефіцієнта) і «кінець» (прапор останнього) ненульового коефіцієнта у блоці). Усього є лише 102 доступні коди VLC і понад 16 ТОВ допустимих комбінацій трійок («серія», «значення», «кінець»), яким ставиться у відповідність або код LVC змінної довжини до 13 біт, або фіксований 20 бітовий escape-код. Тому збереження відповідної пошукової таблиці вимагатиме значного обсягу пам'яті. У стандарті Н.264 використовується схема кодів змінної довжини, у якій багато символів представляються «універсальними» експоненційними кодами Голомба, які безпосередньо обчислюються за значенням символу даних (отже, не потрібно будувати таблиці пошуку) (див. гл. 6).
7.2.6.2. Декодування кодів змінної довжини
Декодування кодів VLC засноване на «скануванні» прийнятого бітового потоку з метою поділу його на дозволені кодові слова, яким ставляться у відповідність відповідні синтаксичні елементи. Як і під час кодування, необхідно знати поточний контекст для правильного вибору таблиці кодових слів. На рис. 7.16 зображений простийметод декодування одного кодового слова VLC Декодер зчитує послідовні біти вхідного потоку до виявлення (типова ситуація) допустимого коду VLC або до виявлення неприпустимого VLC коду (тобто коду, який відсутній в поточному контексті). Наприклад, код, що починається дев'ятьма або більше нулями, не допустимо, якщо декодер очікує коефіцієнт перетворення MPEG-4. Декодер повертає на виході відповідний синтаксичний елемент, якщо виявлено припустимий код, та індикатор помилки, якщо виявлено неприпустимий код VLC.
Таблиця 7.2. Приклад декодування кодів VLC MPEG-4 Visual TCOEF.