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

Unified Diff: media/capture/video/chromeos/camera_device_delegate.h

Issue 2837273004: media: add video capture device for ARC++ camera HAL v3 (Closed)
Patch Set: RELAND: media: add video capture device for ARC++ camera HAL v3 Created 3 years, 6 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/capture/video/chromeos/camera_device_delegate.h
diff --git a/media/capture/video/chromeos/camera_device_delegate.h b/media/capture/video/chromeos/camera_device_delegate.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69727aa34ded0b0fc7707644c92c0c18db83e17
--- /dev/null
+++ b/media/capture/video/chromeos/camera_device_delegate.h
@@ -0,0 +1,173 @@
+// Copyright 2017 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.
+
+#ifndef MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_DEVICE_DELEGATE_H_
+#define MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_DEVICE_DELEGATE_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "media/capture/video/chromeos/mojo/arc_camera3.mojom.h"
+#include "media/capture/video/video_capture_device.h"
+#include "media/capture/video_capture_types.h"
+
+namespace media {
+
+class CameraHalDelegate;
+class CameraDeviceContext;
+class StreamBufferManager;
+
+// The interface to register buffer with and send capture request to the
+// camera HAL.
+class CAPTURE_EXPORT StreamCaptureInterface {
+ public:
+ struct Plane {
+ Plane();
+ ~Plane();
+ mojo::ScopedHandle fd;
+ uint32_t stride;
+ uint32_t offset;
+ };
+
+ virtual ~StreamCaptureInterface() {}
+
+ // Registers a buffer to the camera HAL.
+ virtual void RegisterBuffer(uint64_t buffer_id,
+ arc::mojom::Camera3DeviceOps::BufferType type,
+ uint32_t drm_format,
+ arc::mojom::HalPixelFormat hal_pixel_format,
+ uint32_t width,
+ uint32_t height,
+ std::vector<Plane> planes,
+ base::OnceCallback<void(int32_t)> callback) = 0;
+
+ // Sends a capture request to the camera HAL.
+ virtual void ProcessCaptureRequest(
+ arc::mojom::Camera3CaptureRequestPtr request,
+ base::OnceCallback<void(int32_t)> callback) = 0;
+};
+
+// CameraDeviceDelegate is instantiated on the capture thread where
+// AllocateAndStart of VideoCaptureDeviceArcChromeOS runs on. All the methods
+// in CameraDeviceDelegate run on |ipc_task_runner_| and hence all the
+// access to member variables is sequenced.
+class CAPTURE_EXPORT CameraDeviceDelegate final {
+ public:
+ CameraDeviceDelegate(
+ VideoCaptureDeviceDescriptor device_descriptor,
+ scoped_refptr<CameraHalDelegate> camera_hal_delegate,
+ scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner);
+
+ ~CameraDeviceDelegate();
+
+ // Delegation methods for the VideoCaptureDevice interface.
+ void AllocateAndStart(const VideoCaptureParams& params,
+ std::unique_ptr<VideoCaptureDevice::Client> client);
+ void StopAndDeAllocate(base::Closure device_close_callback);
+ void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback);
+ void GetPhotoState(VideoCaptureDevice::GetPhotoStateCallback callback);
+ void SetPhotoOptions(mojom::PhotoSettingsPtr settings,
+ VideoCaptureDevice::SetPhotoOptionsCallback callback);
+
+ // Sets the frame rotation angle in |rotation_|. |rotation_| is clockwise
+ // rotation in degrees, and is passed to |client_| along with the captured
+ // frames.
+ void SetRotation(int rotation);
+
+ base::WeakPtr<CameraDeviceDelegate> GetWeakPtr();
+
+ private:
+ class StreamCaptureInterfaceImpl;
+
+ friend class CameraDeviceDelegateTest;
+
+ // Mojo connection error handler.
+ void OnMojoConnectionError();
+
+ // Callback method for the Close Mojo IPC call. This method resets the Mojo
+ // connection and closes the camera device.
+ void OnClosed(int32_t result);
+
+ // Resets the Mojo interface and bindings.
+ void ResetMojoInterface();
+
+ // Sets |static_metadata_| from |camera_info|.
+ void OnGotCameraInfo(int32_t result, arc::mojom::CameraInfoPtr camera_info);
+
+ // Creates the Mojo connection to the camera device.
+ void OnOpenedDevice(int32_t result);
+
+ // Initializes the camera HAL. Initialize sets up the Camera3CallbackOps with
+ // the camera HAL. OnInitialized continues to ConfigureStreams if the
+ // Initialize call succeeds.
+ void Initialize();
+ void OnInitialized(int32_t result);
+
+ // ConfigureStreams sets up stream context in |streams_| and configure the
+ // streams with the camera HAL. OnConfiguredStreams updates |streams_| with
+ // the stream config returned, and allocates buffers as per |updated_config|
+ // indicates. If there's no error OnConfiguredStreams notifies
+ // |client_| the capture has started by calling OnStarted, and proceeds to
+ // ConstructDefaultRequestSettings.
+ void ConfigureStreams();
+ void OnConfiguredStreams(
+ int32_t result,
+ arc::mojom::Camera3StreamConfigurationPtr updated_config);
+
+ // ConstructDefaultRequestSettings asks the camera HAL for the default request
+ // settings of the stream in |stream_context_|.
+ // OnConstructedDefaultRequestSettings sets the request settings in
+ // |streams_context_|. If there's no error
+ // OnConstructedDefaultRequestSettings calls StartCapture to start the video
+ // capture loop.
+ void ConstructDefaultRequestSettings();
+ void OnConstructedDefaultRequestSettings(
+ arc::mojom::CameraMetadataPtr settings);
+
+ // StreamCaptureInterface implementations. These methods are called by
+ // |stream_buffer_manager_| on |ipc_task_runner_|.
+ void RegisterBuffer(uint64_t buffer_id,
+ arc::mojom::Camera3DeviceOps::BufferType type,
+ uint32_t drm_format,
+ arc::mojom::HalPixelFormat hal_pixel_format,
+ uint32_t width,
+ uint32_t height,
+ std::vector<StreamCaptureInterface::Plane> planes,
+ base::OnceCallback<void(int32_t)> callback);
+ void ProcessCaptureRequest(arc::mojom::Camera3CaptureRequestPtr request,
+ base::OnceCallback<void(int32_t)> callback);
+
+ const VideoCaptureDeviceDescriptor device_descriptor_;
+
+ int32_t camera_id_;
+
+ const scoped_refptr<CameraHalDelegate> camera_hal_delegate_;
+
+ VideoCaptureParams chrome_capture_params_;
+
+ std::unique_ptr<CameraDeviceContext> device_context_;
+
+ std::unique_ptr<StreamBufferManager> stream_buffer_manager_;
+
+ // Stores the static camera characteristics of the camera device. E.g. the
+ // supported formats and resolution, various available exposure and apeture
+ // settings, etc.
+ arc::mojom::CameraMetadataPtr static_metadata_;
+
+ arc::mojom::Camera3DeviceOpsPtr device_ops_;
+
+ // Where all the Mojo IPC calls takes place.
+ const scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_;
+
+ base::Closure device_close_callback_;
+
+ base::WeakPtrFactory<CameraDeviceDelegate> weak_ptr_factory_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(CameraDeviceDelegate);
+};
+
+} // namespace media
+
+#endif // MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_DEVICE_DELEGATE_H_
« no previous file with comments | « media/capture/video/chromeos/camera_device_context.cc ('k') | media/capture/video/chromeos/camera_device_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698