我尝试使用USING_IO_INPUT标志创建的分配来从相机获取图像。我按照以下方式设置
Type.Builder yuvType = new Type.Builder(mRS, Element.YUV(mRS));
yuvType.setYuvFormat(imageReaderFormat);
yuvType.setX(mCameraWidth).setY(mCameraHeight);
mAllocation = Allocation.createTyped(mRS, yuvType.create(), Allocation
.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_IO_INPUT | Allocation.USAGE_SCRIPT);
mAllocation.setOnBufferAvailableListener(mOnBufferAllocationAvailable);
我将分配表面添加到预览会话,并将回调添加到我非常简单的功能
public void onBufferAvailable(Allocation allocation) {
allocation.ioReceive();
//mPixels is properly initialised
allocation.copyTo(mPixels);
}
此设置适用于Nexus 5X,但在运行5.1.1的Nexus 4上失败。当我在回调中调用allocation.ioReceive()
时,我从驱动程序中打印出一些警告,从Allocation复制到字节数组会导致垃圾被复制。
W/Adreno-RS: <rsdVendorAllocationUnMapQCOM:394>: NOT Found allocation map for alloc 0xa1761000
W/Adreno-GSL: <gsl_ldd_control:427>: ioctl fd 25 code 0xc01c0915 (IOCTL_KGSL_MAP_USER_MEM) failed: errno 22 Invalid argument
W/Adreno-RS: <rsdVendorAllocationMapQCOM:288>: gsl_memory_map_fd failed -5 hostptr: 0xa0112000 sz: 0 offset: 0 flags: 0x10c0b00 alloc: 0xa1761000
我在后台线程中运行相机,虽然在#34; RSMessageThread&#34;中调用onBufferAvailable
。
这个问题与我设置分配和摄像头预览的方式有关,还是驱动程序中的错误?
答案 0 :(得分:0)
我在三星Galaxy S4(智能手机),Android版5.0(API 21)上看到相同的错误消息,但不要使用相同的应用程序使用camera2和renderscript,在三星Galaxy Tab 5(平板电脑),android版本5.1.1(API 22)。我假设它是设备供应商部分的早期实施问题。
答案 1 :(得分:0)
您是否尝试过官方HDR-viewfinder example?如果这适用于Nexus 4,那么您可以研究该示例。
如果没有,您可以尝试使用不同方法的实现YUV_420_888 to Bitmap,而不是通过YUV分配,而是使用来自三个图像平面的信息进行字节分配。