数据字段的大小TangoImageBuffer(Size of data field in Tang

2019-10-23 16:33发布

我试图做TangoImageBuffer数据字段,其中,如果图像是YUV的memcpy的,据我应该是(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是一个Java字节缓冲区包装类。我正在使用C ++其中,里面是通过调用新指定的大小(在这种情况下我想memcpy的相同)分配内存,并做了一个jobject参考env->NewGlobalRef(env->NewDirectByteBuffer(buffer, this->bufferSize)); ,其中这- > BUFFERSIZE等于(buffer->width * buffer->height * 3 * sizeof(uint8_t))

我敢肯定它是分配的内存适量,因为我还用它在其他功能memcopying的xyzij缓冲区(用对应的大小差异,因为这些都是浮动)和它工作得很好(可是我也试着overallocating),所以我知道这个问题是不是目标太小。

在这种情况下,信息可能加入到这个问题,我使用的是普通彩色摄像机,所以高度应为1280宽度720,如果我没有记错。

编辑:在手动找我没有得到的段错误复制的最大数据量,现在看来,这顶的1384448(即作品,1384449段错误),这是在图像的像素大约1.5倍的大小,添加到我的混乱。

Answer 1:

像素格式记录为YV12又名YUV420SP 。 它具有以2x2子采样为U和V,从而U和V Y的全分辨率都具有1/4的多的样品,Y.样品的总数,然后width*height*(1 + 1/4 + 1/4) = 1.5*width*height



文章来源: Size of data field in TangoImageBuffer