0

在我的 Android 应用程序中,我以 NV21 格式将相机输出作为字节数组。在本机方面,我需要使用 libyuv 的 NV21ToI420 函数将此数组转换为 I420 格式。这是它的定义:

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 并没有找到任何示例。问候。

4

1 回答 1

0

src_stride_y通常是帧的宽度,src_stride_uv是帧宽度的一半(因为对于任何 YUV42x 格式都有水平维度的下采样)。在某些情况下,宽度是一个时髦的数字,使用它会导致内存排列效率低下,例如,如果您使用的宽度为 135。在这种情况下,处理器/编译器/库/操作系统会用零/一/垃圾填充每一行,直到这个大小对计算更友好——4/64 字节或类似字节的倍数。这个推理适用于dst_stride_y(~width) 和dst_stride_u/ dst_stride_v(~width/2)。IIRC,如果您选择 Android 中相机提供的捕获尺寸,您的步幅不应与 width 和 width/2 不同,因此您应该很高兴。

于 2014-06-09T22:50:46.810 回答