Форматы изображений Хранение NV12 в памяти

Я полностью понимаю размер формата NV12, как описано в вопросе

Формат NV12 и плоскость UV

Теперь я читаю из двух источников о хранении UV-плоскости в этом формате: один - это https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx

NV12

Все образцы Y появляются сначала в памяти как массив значений char без знака с четным числом строк. За плоскостью Y сразу следует массив значений символов без знака, который содержит упакованные выборки U (Cb) и V (Cr). Когда объединенный массив U-V адресуется как массив значений WORD с прямым порядком байтов, младшие биты содержат значения U, а старшие биты содержат значения V. NV12 является предпочтительным форматом пикселей 4: 2: 0 для DirectX VA. Ожидается, что это будет промежуточным требованием для ускорителей DirectX VA, поддерживающих видео 4: 2: 0. На следующем рисунке показана плоскость Y и массив, содержащий упакованные отсчеты U и V.

Что я понимаю: в плоскости UV каждый U и V хранятся в одном байте.

Когда я прочитал об этом в Википедии: https://wiki.videolan.org/YUV#NV12

Он говорит:

NV12

Связанный с I420, NV12 имеет одну плоскость Y яркости и одну плоскость с чередующимися значениями U и V. В NV12 плоскости цветности (синяя и красная) подвергаются субдискретизации как по горизонтали, так и по вертикали с коэффициентом 2. Для группы пикселей 2x2 у вас есть 4 отсчета Y и 1 отсчет U и 1 V. Может быть полезно думать о NV12 как о I420 с чередующимися плоскостями U и V. Вот графическое изображение NV12. Каждая буква представляет один бит: Для 1 пикселя NV12: YYYYYYYY UVUV Для 2-пиксельного кадра NV12: YYYYYYYYYYYYYYYY UVUVUVUV Для 50-пиксельного кадра NV12: Y * 8 * 50 (UV) * 2 * 50 Для n-пиксельного кадра NV12 : Y * 8 * n (УФ) * 2 * n

Я понимаю здесь следующее: каждый U и V чередуются побитно в каждом байте. Таким образом, каждый байт UV-плоскости будет содержать перемеженные биты 4U и биты 4V.

Кто-нибудь может прояснить мои сомнения?


person Manish Kumar    schedule 15.07.2015    source источник
comment
Нет чередования битов, (только) чередование байтов.   -  person Rotem    schedule 27.06.2016


Ответы (1)


TL; DR: MSDN правильный

Чтобы проверить это (или хотя бы убедиться, что нет чередования на уровне битов), можно использовать ffmpeg, который является широко используемым видеоинструментом. Я провел следующий эксперимент:

  1. Создайте файл, содержащий текст (я взял в качестве примера текст Lorem Ipsum)
  2. Скажите ffmpeg прочитать его как I420 видеокадр небольшого размера
  3. Скажите ffmpeg преобразовать его в формат NV12
  4. Распечатайте это

Вот пример командной строки для (2) и (3):

ffmpeg -s 96x4 -i example_i420.yuv -pix_fmt nv12 example_nv12.yuv

Вот что я получил в результате:

Lorem ipsum dolor sit amet, conctetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip ex ea Commodo Conquat. Duis aute irure dolor в репрехендерит в сладострастном velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, s utnett uirn acduilppias cqiunig oeflfiitc, i as edde sdeor uenitu smmooldl itte mapnoirm iindc iedsitd ulnatb ourtu ml.a bLoorree me ti pdsoulim. cUotn seenci

Я выделил образцы цветности (U и V) жирным шрифтом. Очевидно, что это одни и те же значения (буквы ASCII), только в зашифрованном порядке. Если бы было выполнено какое-либо перемежение битов, я бы получил другие значения.

Таким образом, описание в вики VLC (кстати, это не Википедия) неверно. Кто-то по имени «Эдвардв» добавил «иллюстрацию» с упоминанием пикселей здесь и позже. изменил его на "биты" здесь. Я надеюсь, что кто-то изменит его, чтобы он не вводил в заблуждение (вики требуется регистрация, поэтому я не могу ее редактировать).

person anatolyg    schedule 19.07.2015