Формат NV21 и нечетные размеры изображения

Я некоторое время работал с образами NV21 в Android и отслеживал ошибку, которая могла быть вызвана неправильной индексацией байтов в образе NV21.

Изображение в ответе на этот вопрос имеет хороший обзор того, как байты Y, U и V расположены в буфере изображения. Не уверен, что это разрешено, но я вставляю его ниже:

Формат YUV420SP NV21

  1. Что происходит, когда изображение имеет нечетные размеры (например, при четности)? Возможно ли это вообще в этом формате?
  2. Есть ли у нас где-нибудь официальная спецификация этого формата?

person silvaren    schedule 19.11.2015    source источник
comment
Графика была неправильной, показывая формат NV12. Я обновил графику (я также прокомментировал проблему в упомянутом ответе).   -  person rics    schedule 23.02.2017


Ответы (1)


В случае изображения с нечетными размерами (т. е. один из W или H в изображении WxH является нечетным), вы ожидаете, что плоскость Y будет полностью дискретизирована, как всегда, с выборками WxH, за которыми следуют 2(W/2 x H/2) образцы цветности, где мы делим каждое измерение изображения на 2, но округляем в большую, а не в меньшую сторону.

Таким образом, некоторые пиксели на самом краю изображения имеют образцы цветности, которые соответствуют только 1 или 2 исходным пикселям, а не 4. Надеюсь, это имеет смысл. По этой ссылке видно, что в нескольких других библиотеках есть ранее были проблемы с обработкой нечетных размеров в изображениях YUV.

Что касается вашего второго вопроса, я не видел официальной спецификации, но я видел некоторый код в структуре Android, который обрабатывает этот формат, я посмотрю, смогу ли я найти ссылку на него и добавить ее к этому ответу.

person jpowell    schedule 20.11.2015
comment
Я уже принял ответ, но если вы можете придумать эту ссылку, было бы очень неплохо проиллюстрировать официальный формат. - person silvaren; 21.11.2015
comment
@silvaren Yuv420SpToJpegEncoder::deinterleave может быть тем, что вы ищете, для полной трассировки стека см. stackoverflow.com/a/36560663/253468 - person TWiStErRob; 14.04.2016