Строительные параметры для ливюва NV21ToI420

В моем приложении для Android я получаю вывод камеры в формате NV21 в виде байтового массива. На родной стороне мне нужно преобразовать этот массив в формат I420, используя функцию libyuv NV21ToI420. Вот его определение:

LIBYUV_API
int NV21ToI420(const uint8* src_y, int src_stride_y,
           const uint8* src_vu, int src_stride_vu,
           uint8* dst_y, int dst_stride_y,
           uint8* dst_u, int dst_stride_u,
           uint8* dst_v, int dst_stride_v,
           int width, int height);

Все, что у меня есть, это указатель на данные NV21, ширину и высоту. Мне интересно, как можно вычислить значения для src_stride_y, src_stride_vu и т. Д. Оцените это, если кто-то может поделиться некоторым примером кода о том, как правильно использовать эту функцию. Поиск в сети для NV21ToI420 не привел ни к какому примеру. С уважением.

1 ответ

Решение

src_stride_y обычно ширина рамки и src_stride_uv составляет половину ширины кадра (поскольку для любого формата YUV42x существует горизонтальная дискретизация по горизонтали). В некоторых случаях ширина - это странное число, и его использование приведет к большой неэффективности в расположении памяти, например, если вы используете ширину, скажем, 135. В этом случае процессор / компилятор / библиотека / ОС будет дополняйте нулями / единицами / мусором каждую строку до тех пор, пока этот размер не станет более удобным для вычислений - кратным 4/64 байта или подобным. Это рассуждение относится к dst_stride_y (~ ширина) и dst_stride_u/dst_stride_v (~ Ширина /2). IIRC, если вы выберете размеры захвата, предлагаемые камерой в Android, у вас не должно быть шагов, которые отличаются от ширины и ширины /2, поэтому вам следует идти вперед.

Другие вопросы по тегам