TangoImageBuffer 中数据字段的大小

Size of data field in TangoImageBuffer

我正在尝试对 TangoImageBuffer 数据字段进行 memcpy,如果图像是 YUV,根据我的说法应该是 (buffer->width * buffer->height * 3 * sizeof(uint8_t))(sizeof 只是为了好玩,我知道它是 1),但是这使它成为段错误。如果我只是复制 height*width 个字节,并且 height*width*2,我似乎正在获取有效数据,我只是不知道该字段的大小。

我的(相关)代码:

void onImageCallback(void *context, TangoCameraId id, const TangoImageBuffer *buffer)
{
  memcpy(img_struct->image_buffer->getBuffer(), buffer->data, buffer->width * buffer->height * 3 * sizeof(uint8_t)));
}

其中 image_buffer 是我在 C++ 中使用的 java ByteBuffer 包装 class,在它内部通过调用指定大小的 new 来分配内存(在本例中是我正在尝试 memcpy) 和通过执行 env->NewGlobalRef(env->NewDirectByteBuffer(buffer, this->bufferSize)); 的 jobject 引用,其中 this->bufferSize 等于 (buffer->width * buffer->height * 3 * sizeof(uint8_t))

我很确定它分配了正确数量的内存,因为我也用它来内存复制其他函数中的 xyzij 缓冲区(具有相应的大小差异,因为它们是浮点数)并且它工作得很好(但我也尝试过过度分配),所以我知道问题不在于目的地太小。

如果此信息可能会增加问题,我使用的是普通彩色相机,所以如果我没记错的话,高度应该是 1280,宽度应该是 720。

编辑:在手动查找我可以在不出现段错误的情况下复制的最大数据量后,它似乎在 1384448 上排在首位(即有效,1384449 段错误),大约是像素大小的 1.5 倍图片,增加了我的困惑。

像素格式为documented as YV12 aka YUV420SP。它对 Y 具有全分辨率,对 U 和 V 进行 2x2 子采样,因此 U 和 V 的样本数都是 Y 的 1/4。样本总数为 width*height*(1 + 1/4 + 1/4) = 1.5*width*height.