Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(701)

Unified Diff: media/video/capture/linux/v4l2_capture_delegate_multi_plane.cc

Issue 967793002: Linux Video Capture: Add V4L2VideoCaptureDelegate{Single,Multi}Plane. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: posciak@ comments on PS5. Minor rebase of video_capture_controller_unittest.cc and BUILD.gn Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/video/capture/linux/v4l2_capture_delegate_multi_plane.cc
diff --git a/media/video/capture/linux/v4l2_capture_delegate_multi_plane.cc b/media/video/capture/linux/v4l2_capture_delegate_multi_plane.cc
new file mode 100644
index 0000000000000000000000000000000000000000..52522934548a928047fedde59e68990c4bccd2bd
--- /dev/null
+++ b/media/video/capture/linux/v4l2_capture_delegate_multi_plane.cc
@@ -0,0 +1,86 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/video/capture/linux/v4l2_capture_delegate_multi_plane.h"
+
+#include <sys/mman.h>
+
+namespace media {
+
+V4L2CaptureDelegateMultiPlane::V4L2CaptureDelegateMultiPlane(
+ const VideoCaptureDevice::Name& device_name,
+ const scoped_refptr<base::SingleThreadTaskRunner>& v4l2_task_runner,
+ int power_line_frequency)
+ : V4L2VideoCaptureDelegate(device_name,
+ v4l2_task_runner,
+ power_line_frequency) {
+}
+
+V4L2CaptureDelegateMultiPlane::~V4L2CaptureDelegateMultiPlane() {
+}
+
+scoped_refptr<V4L2VideoCaptureDelegate::BufferTracker>
+V4L2CaptureDelegateMultiPlane::CreateBufferTracker() {
+ return make_scoped_refptr(new BufferTrackerMPlane());
+}
+
+bool V4L2CaptureDelegateMultiPlane::FillV4L2Format(
+ v4l2_format* format,
+ uint32_t width,
+ uint32_t height,
+ uint32_t pixelformat_fourcc) {
+ format->fmt.pix_mp.width = width;
+ format->fmt.pix_mp.height = height;
+ format->fmt.pix_mp.pixelformat = pixelformat_fourcc;
+
+ const size_t num_v4l2_planes =
+ V4L2VideoCaptureDelegate::GetNumPlanesForFourCc(pixelformat_fourcc);
+ if (num_v4l2_planes == 0u)
+ return false;
+ DCHECK_LE(num_v4l2_planes, static_cast<size_t>(VIDEO_MAX_PLANES));
+ format->fmt.pix_mp.num_planes = num_v4l2_planes;
+
+ v4l2_planes_.resize(num_v4l2_planes);
+ return true;
+}
+
+void V4L2CaptureDelegateMultiPlane::FinishFillingV4L2Buffer(
+ v4l2_buffer* buffer) const {
+ buffer->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buffer->length = v4l2_planes_.size();
+ buffer->m.planes = const_cast<struct v4l2_plane*>(v4l2_planes_.data());
Pawel Osciak 2015/03/19 07:52:43 memset to 0 please Also, why do we need this cast?
mcasas 2015/03/19 22:57:00 Done.
Pawel Osciak 2015/03/20 00:56:06 The method should not be const?
+}
+
+void V4L2CaptureDelegateMultiPlane::SendBuffer(
+ const scoped_refptr<BufferTracker>& buffer_tracker) {
+ DCHECK_EQ(capture_format().pixel_format, PIXEL_FORMAT_I420);
+ client()->OnIncomingCapturedYuvData(buffer_tracker->GetPlaneStart(0),
+ buffer_tracker->GetPlaneStart(1),
Pawel Osciak 2015/03/19 07:52:43 This makes me nervous. I'd like to have a check in
mcasas 2015/03/19 22:57:00 Done. DCHECK is good for me, but please speak up o
Pawel Osciak 2015/03/20 00:56:06 I'd prefer something stronger please, better than
+ buffer_tracker->GetPlaneStart(2),
+ buffer_tracker->GetPlaneLength(0),
perkj_chrome 2015/03/19 20:38:17 I think this should be the stride instead of the p
mcasas 2015/03/19 22:57:00 Done.
+ buffer_tracker->GetPlaneLength(1),
+ buffer_tracker->GetPlaneLength(2),
+ capture_format(),
+ rotation(),
+ base::TimeTicks::Now());
+}
+
+bool V4L2CaptureDelegateMultiPlane::BufferTrackerMPlane::Init(
+ int fd,
+ const v4l2_buffer& buffer) {
+ for (size_t p = 0; p < buffer.length; ++p) {
+ void* const start =
+ mmap(NULL, buffer.m.planes[p].length, PROT_READ | PROT_WRITE,
Pawel Osciak 2015/03/19 07:52:43 // Some devices require mmap() to be called with b
mcasas 2015/03/19 22:57:00 Done.
+ MAP_SHARED, fd, buffer.m.planes[p].m.mem_offset);
+ if (start == MAP_FAILED) {
+ DLOG(ERROR) << "Error mmap()ing a V4L2 buffer into userspace";
+ return false;
+ }
+ AddMmapedPlane(start, buffer.m.planes[p].length);
+ DVLOG(3) << "Mmap()ed plane #" << p << " of " << GetPlaneLength(p) << "B";
+ }
+ return true;
+}
+
+} // namespace media

Powered by Google App Engine
This is Rietveld 408576698