У меня есть некоторые вопросы, которые, я надеюсь, вы сможете прояснить. Я самостоятельно изучил процесс кодирования видео, аналогичный Mpeg2. Процесс выглядит следующим образом:
Разделите изображение RGBA на 4 отдельных блока памяти данных канала. поэтому массив всех значений R, отдельный массив значений G и т. д.
возьмите массив и возьмите блок данных 8x8 пикселей, чтобы преобразовать его с помощью дискретного косинусного преобразования (DCT).
Проквантуйте этот блок 8x8, используя предварительно вычисленную матрицу квантования.
Zigzag кодирует результат шага квантования. Так что я должен получить след последовательных чисел.
Run Length Encode (RLE) результат зигзагообразного алгоритма.
Код Хаффмана данные после этапа RLE. Использование подстановки значений из предварительно вычисленной таблицы Хаффмана.
Вернитесь к шагу 2 и повторяйте до тех пор, пока данные всех каналов не будут закодированы.
Вернитесь к шагу 2 и повторите для каждого канала.
Первый вопрос: нужно ли мне преобразовывать значения RGBA в значения YUV+A (YCbCr+A), чтобы процесс работал, или он может продолжать использовать RGBA? Я спрашиваю, поскольку преобразование RGBA->YUVA — это большая нагрузка, которую я хотел бы избежать, если это возможно.
Следующий вопрос. Мне интересно, должно ли хранилище RLE работать только для 0 или его можно расширить на все значения в массиве? См. примеры ниже:
440000000111 == [2,4][7,0][3,1] // RLE for all values
or
440000000111 == 44[7,0]111 // RLE for 0's only
Последний вопрос: каким будет единый символ в отношении стадии Хаффмана? будет ли символ, подлежащий замене, значением, например, 2 или 4, или, например, символ будет парой уровня выполнения [2,4].
Спасибо, что нашли время, чтобы прочитать и помочь мне здесь. Я прочитал много статей и посмотрел много видео на YouTube, которые помогли мне понять отдельные алгоритмы, но не то, как они все связаны вместе, чтобы сформировать процесс кодирования в коде.