Index: media/capture/video/linux/v4l2_capture_delegate.cc |
diff --git a/media/capture/video/linux/v4l2_capture_delegate.cc b/media/capture/video/linux/v4l2_capture_delegate.cc |
index a6f47b551ed410f3fa28c5f45b888eee6f97c0b7..ccf63a19e0eb0e7706ba60ec5db08755fd2f4501 100644 |
--- a/media/capture/video/linux/v4l2_capture_delegate.cc |
+++ b/media/capture/video/linux/v4l2_capture_delegate.cc |
@@ -18,6 +18,17 @@ |
#include "media/base/bind_to_current_loop.h" |
#include "media/capture/video/linux/video_capture_device_linux.h" |
+// Until include/uapi/linux/videodev2.h defines V4L2_PIX_FMT_Z16/INVZ, define |
+// them here. |
+#ifndef V4L2_PIX_FMT_Z16 |
+// 16 bit depth, Realsense F200. |
+#define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') |
+#endif |
+#ifndef V4L2_PIX_FMT_INVZ |
+// 16 bit depth, Realsense SR300. |
+#define V4L2_PIX_FMT_INVZ v4l2_fourcc('I', 'N', 'V', 'Z') |
+#endif |
+ |
namespace media { |
// Desired number of video buffers to allocate. The actual number of allocated |
@@ -45,6 +56,10 @@ static struct { |
size_t num_planes; |
} const kSupportedFormatsAndPlanarity[] = { |
{V4L2_PIX_FMT_YUV420, PIXEL_FORMAT_I420, 1}, |
+ {V4L2_PIX_FMT_GREY, PIXEL_FORMAT_Y8, 1}, |
+ {V4L2_PIX_FMT_Y16, PIXEL_FORMAT_Y16, 1}, |
+ {V4L2_PIX_FMT_Z16, PIXEL_FORMAT_Y16, 1}, |
+ {V4L2_PIX_FMT_INVZ, PIXEL_FORMAT_Y16, 1}, |
{V4L2_PIX_FMT_YUYV, PIXEL_FORMAT_YUY2, 1}, |
{V4L2_PIX_FMT_UYVY, PIXEL_FORMAT_UYVY, 1}, |
{V4L2_PIX_FMT_RGB24, PIXEL_FORMAT_RGB24, 1}, |
@@ -397,9 +412,16 @@ void V4L2CaptureDelegate::DoCapture() { |
base::TimeDelta timestamp = |
base::TimeDelta::FromSeconds(buffer.timestamp.tv_sec) + |
base::TimeDelta::FromMicroseconds(buffer.timestamp.tv_usec); |
- client_->OnIncomingCapturedData( |
- buffer_tracker->start(), buffer_tracker->payload_size(), |
- capture_format_, rotation_, base::TimeTicks::Now(), timestamp); |
+#ifdef V4L2_BUF_FLAG_ERROR |
+ if (buffer.flags & V4L2_BUF_FLAG_ERROR) { |
+ LOG(ERROR) << "Dequeued v4l2 buffer contains corrupted data (" |
+ << buffer.bytesused << " bytes)."; |
+ buffer.bytesused = 0; |
+ } else |
+#endif |
+ client_->OnIncomingCapturedData( |
+ buffer_tracker->start(), buffer_tracker->payload_size(), |
+ capture_format_, rotation_, base::TimeTicks::Now(), timestamp); |
if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_QBUF, &buffer)) < 0) { |
SetErrorState(FROM_HERE, "Failed to enqueue capture buffer"); |