2015-11-19 6 views
3

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

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

YUV420SP NV21 format

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

Графика была неправильной, отображая формат NV12. Я обновил графику (я также прокомментировал проблему в ответе). – rics

ответ

2

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

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

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

+0

Я уже принял ответ, но если вы можете придумать эту ссылку, было бы очень приятно проиллюстрировать «официальный» формат. – silvaren

+1

@silvaren ['Yuv420SpToJpegEncoder :: deinterleave'] (http://code.metager.de/source/xref/android/4.4/frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp#deinterleave) может быть что вы ищете, для полной трассировки стека см. http://stackoverflow.com/a/36560663/253468 – TWiStErRob

+1

@silvaren заметили, что они просто «width >> 1' в коде C++, потому что Android' YuvImage' не поддерживайте изображения с нечетным размером, см. ['YuvImage.adjustRectangle'] (https://github.com/android/platform_frameworks_base/blob/kitkat-mr2.2-release/graphics/java/android/graphics/YuvImage.java#L214). – TWiStErRob