sigmaplayer/doc/divx3-discuss.txt

58 lines
3.5 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Задача: транскодировать поток дивх3 в мпег4.
Поток состоит из отдельных кадров, каждый из которых транскодируется независимо. Задача сводится к транскодированию кадра.
Чтобы это сделать, надо дать ответы на 2 вопроса:
1) Что именно хранится в кадре
2) Как именно хранится.
Ответ на 1-й вопрос _почти_ одинаков для дивх3 и мпег4.
Ответ на 2-й вопрос - существенные отличия.
Хранятся данные в виде последовательности битов. Суть процесса - прочитать биты кадра дивх3, понять, что именно там хранится, и записать это в виде битов в формате мпег4
Кадр делится на макроблоки размером 16 x 16 пикселей.
Кадр хранит:
- заголовок (хранится тип кадра, индексы в таблицы с данными, необходимые для работы и т.п.)
- данные всех макроблоков.
Т.е. фильм разрешения 640x480 содержит 40*30=1200 макроблоков в каждом кадре.
Каждый макроблок (в дальнейшем - МБ) хранит:
- заголовок МБ
- 6 каналов данных (4 на яркость и 2 на цветность)
МБ может быть двух видов:
- интра (независим от других кадров)
- интер (строится на основе предыдущих кадров)
Кадры I-frame состоят только из интра-макроблоков, а кадры P-frame могут иметь как те, так и другие.
Данные каждого канала МБ зависят от типа МБ:
- для интра-МБ хранится DC-уровень (что-то типа "усреднённого цвета" блока) и AC-коэффициенты (отклонения от этого уровня)
- для интер-МБ хранится вектор движения (т.е. куда мы должны передвинуть старый МБ, чтобы получить нынешний) и AC-коэффициенты (чтобы устранить огрехи при таком передвижении и добавить новые детали картинки)
Т.е. общий принцип хранения данных - базовое значение и данные для его коррекции.
И это справедливо и для дивх3, и для мпег4. Более того, похожий принцип работает и в mpeg1-2.
Стандарт мпег4 умеет больше, но мы это не рассматриваем. Я рассказываю лишь в рамках, необходимых для транскодера.
АС-коэффициенты - это как раз то, где заложен "битрейт". Чем больше этих коэффициентов, тем более качественное видео, и тем больше оно занимает. Эти коэффициенты как бы распределяются между всеми пикселями - каждому пикселю достаётся чуть-чуть. Если захочешь узнать про это побольше, вот ключевые слова:
- дискретное косинусное преобразование (DCT)
- преобразование Фурье
Далее. Основные уровни DC и motion vectors (MV) записываются не напрямую. Для каждого нового МБ по специальному алгоритму определяется "предсказание" - т.е. какое бы там могло бы быть значение DC или MV (на основании соседних МБ и МБ нескольких прошлых кадров). И записывается разница между предсказанным и реальным.
Поэтому, для декодирования, чтобы получить реальное значение этих уровней, нужно параллельно тоже делать предсказания, чтобы прибавить к ним записанную разницу.
Все эти исхищрения делаются только с одной целью - чтобы записанные в файл данные занимали как можно меньше. Достигается это с помощью особого метода кодирования этих всех чисел. Называется оно: "код переменной длины" (VLC), и используется во всех алгоритмах сжатия данных. Смысл в том, что разные числа кодируются разным количеством бит.
Все числа в потоке бит идут одно за другим, но, поскольку каждое занимает разное число бит, нам необходимо читать их все подряд. Если хотя бы в одном числе ошибка - все остальные числа будут прочитаны совершенно другими.
Для работы этого кодирования нужны VLC-таблицы, которые говорят, какие числа какой последовательностью бит кодировать.
Вот вроде бы и всё.
Теперь какие отличия. Отличаются:
- формат записи заголовков кадров и МБ
- методы предсказания DC и MV
- порядок следования AC-коэффициентов
- VLC-таблицы
-------------------------------------