TangoImageBuffer RAW/YUV 无法匹配帧
TangoImageBuffer RAW/YUV failed to match frame
我使用 OnFrameAvailable 回调将 rgb 与深度数据同步。如果我只渲染 rgb 点云,一切都很好。
但是如果我进行一些图像处理,相机会抛出以下异常:
E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 RAW failed to match frame
或
E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 YUV failed to match frame
并且 TangoImageBuffer 具有完整的垃圾值。有时黑色像素,或缓冲区新旧像素数据各一半。
我试着用线程解决了。每次我得到一个新的点云,额外的图像处理线程需要大约 1 秒 cpu 时间。这有点帮助。几秒钟后,同样的行为发生了。
问题是我无法正确调试本地代码。 android studio 的监控显示 cpu 和 gpu 使用正常。
我看到用户 guppy 有这个 problem with the Leipniz tango version,但没有发布解决方案。所以我希望也许其他人已经解决了这个问题?或者有什么建议?
编辑
使用 tango_support 库复制 xyz 和 yuv 缓冲区后,该行为消失了。
"YUV failed to match frame" 很可能是回调线程执行时间过长造成的。简而言之,您不应该在 OnFrameAvailable
回调中进行繁重的处理。这也适用于所有其他 Tango 回调,即姿势或深度回调。
这个问题的解决方案是复制字节缓冲区数据并在另一个线程(可能是渲染线程)中处理它。在 tango-example-c video-overlay-jni-example, the application does a memcpy to copy the data from callback thread to the render thread, so the processing of the data would not block the callbacks keep coming. See this line 中。
我使用 OnFrameAvailable 回调将 rgb 与深度数据同步。如果我只渲染 rgb 点云,一切都很好。
但是如果我进行一些图像处理,相机会抛出以下异常:
E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 RAW failed to match frame
或
E/camera-metadata: /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/src/camera-metadata.cc:56 YUV failed to match frame
并且 TangoImageBuffer 具有完整的垃圾值。有时黑色像素,或缓冲区新旧像素数据各一半。
我试着用线程解决了。每次我得到一个新的点云,额外的图像处理线程需要大约 1 秒 cpu 时间。这有点帮助。几秒钟后,同样的行为发生了。
问题是我无法正确调试本地代码。 android studio 的监控显示 cpu 和 gpu 使用正常。
我看到用户 guppy 有这个 problem with the Leipniz tango version,但没有发布解决方案。所以我希望也许其他人已经解决了这个问题?或者有什么建议?
编辑
使用 tango_support 库复制 xyz 和 yuv 缓冲区后,该行为消失了。
"YUV failed to match frame" 很可能是回调线程执行时间过长造成的。简而言之,您不应该在 OnFrameAvailable
回调中进行繁重的处理。这也适用于所有其他 Tango 回调,即姿势或深度回调。
这个问题的解决方案是复制字节缓冲区数据并在另一个线程(可能是渲染线程)中处理它。在 tango-example-c video-overlay-jni-example, the application does a memcpy to copy the data from callback thread to the render thread, so the processing of the data would not block the callbacks keep coming. See this line 中。