TangoImageBuffer中数据字段的大小

时间:2015-07-07 22:59:28

标签: google-project-tango

我正在尝试对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包装类,里面是通过调用具有指定大小的new来分配内存(在这种情况下,我正在尝试memcpy),以及一个jobject引用做env->NewGlobalRef(env->NewDirectByteBuffer(buffer, this->bufferSize));,其中this-> bufferSize等于(buffer->width * buffer->height * 3 * sizeof(uint8_t))

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

如果此信息可能会添加到问题中,我使用常规彩色相机,因此如果我没记错的话,身高应该是1280和宽度720.

编辑:手动查找我可以复制的最大数据量而不会得到段错误,它似乎在1384448(即有效,1384449段错误)上面,这大约是图像像素大小的1.5倍,加剧了我的困惑。

1 个答案:

答案 0 :(得分:0)

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