Chromium Code Reviews| Index: media/capture/video/chromeos/camera_device_context.h |
| diff --git a/media/capture/video/chromeos/camera_device_context.h b/media/capture/video/chromeos/camera_device_context.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d96ab755ca1e90d1896a4e7a31b51c399c265a35 |
| --- /dev/null |
| +++ b/media/capture/video/chromeos/camera_device_context.h |
| @@ -0,0 +1,135 @@ |
| +// 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_CONTEXT_H_ |
| +#define MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_DEVICE_CONTEXT_H_ |
| + |
| +#include <memory> |
| +#include <string> |
| + |
| +#include "base/sequence_checker.h" |
| +#include "media/capture/video/video_capture_device.h" |
| + |
| +namespace media { |
| + |
| +// A class storing the context of a running CameraDeviceDelegate. |
| +class CAPTURE_EXPORT CameraDeviceContext { |
| + public: |
| + // The internal state of the running CameraDeviceDelegate. The state |
| + // transition happens when the corresponding methods are called inside |
| + // CameraDeviceDelegate. |
| + enum State { |
|
Pawel Osciak
2017/06/13 08:40:15
could this be enum class?
jcliang
2017/06/14 04:46:05
Done.
|
| + // The camera device is completely stopped. This is the initial state, and |
| + // is also set in OnClosed(). |
| + kStopped, |
| + |
| + // The camera device is starting and waiting to be initialized. |
| + // |
| + // The kStarting state is set in AllocateAndStart(). |
| + kStarting, |
| + |
| + // The camera device is initialized and can accept stream configuration |
| + // requests. |
| + // |
| + // The state is transitioned to kInitialized through: |
| + // |
| + // |hal_delegate_|->GetCameraInfo() -> OnGotCameraInfo() -> |
| + // |hal_delegate_|->OpenDevice() -> OnOpenedDevice() -> |
| + // Initialize() -> OnInitialized() |
| + kInitialized, |
| + |
| + // The various capture streams are configured and the camera device is ready |
| + // to process capture requests. |
| + // |
| + // The state is transitioned to kStreamConfigured through: |
| + // |
| + // ConfigureStreams() -> OnConfiguredStreams() |
| + kStreamConfigured, |
| + |
| + // The camera device is capturing video streams. |
| + // |
| + // The state is transitioned to kCapturing through: |
| + // |
| + // ConstructDefaultRequestSettings() -> |
| + // OnConstructedDefaultRequestSettings() -> |
| + // |stream_buffer_manager_|->StartCapture() |
| + // |
| + // In the kCapturing state the |stream_buffer_manager_| runs the capture |
| + // loop to send capture requests and process capture results. |
| + kCapturing, |
| + |
| + // When the camera device is in the kCapturing state, a capture loop is |
| + // constantly running in |stream_buffer_manager_|: |
| + // |
| + // On the StreamBufferManager side, we register and submit a capture |
| + // request whenever a free buffer is available: |
| + // |
| + // RegisterBuffer() -> OnRegisteredBuffer() -> |
| + // ProcessCaptureRequest() -> OnProcessedCaptureRequest() |
| + // |
| + // We get various capture metadata and error notifications from the camera |
| + // HAL through the following callbacks: |
| + // |
| + // ProcessCaptureResult() |
| + // Notify() |
| + |
| + // The camera device is going through the shut down process; in order to |
| + // avoid race conditions, no new Mojo messages may be sent to camera HAL in |
| + // the kStopping state. |
| + // |
| + // The kStopping state is set in StopAndDeAllocate(). |
| + kStopping, |
| + |
| + // The camera device encountered an unrecoverable error and needs to be |
| + // StopAndDeAllocate()'d. |
| + // |
| + // The kError state is set in SetErrorState(). |
| + kError, |
| + }; |
| + |
| + explicit CameraDeviceContext( |
| + std::unique_ptr<VideoCaptureDevice::Client> client); |
| + |
| + ~CameraDeviceContext(); |
| + |
| + void SetState(State state); |
| + |
| + State GetState(); |
| + |
| + // Sets state to kError and call |client_->OnError| to tear down the |
| + // VideoCaptureDevice. |
| + void SetErrorState(const tracked_objects::Location& from_here, |
| + const std::string& reason); |
| + |
| + // Logs |message| to |client_|. |
| + void LogToClient(std::string message); |
| + |
| + // Submits the capture data to |client_->OnIncomingCapturedData|. |
| + void SubmitCapturedData(const uint8_t* data, |
| + int length, |
|
Pawel Osciak
2017/06/13 08:40:15
size_t perhaps?
jcliang
2017/06/14 04:46:05
I'm using int here because it's what VideoCaptureD
|
| + const VideoCaptureFormat& frame_format, |
| + base::TimeTicks reference_time, |
| + base::TimeDelta timestamp); |
| + |
| + void SetRotation(int rotation); |
| + |
| + private: |
| + friend class StreamBufferManagerTest; |
| + |
| + SEQUENCE_CHECKER(sequence_checker_); |
| + |
| + // The state the CameraDeviceDelegate currently is in. |
| + State state_; |
| + |
| + // Clockwise rotation in degrees. This value should be 0, 90, 180, or 270. |
| + int rotation_; |
| + |
| + std::unique_ptr<VideoCaptureDevice::Client> client_; |
| + |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(CameraDeviceContext); |
| +}; |
| + |
| +} // namespace media |
| + |
| +#endif // MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_DEVICE_CONTEXT_H_ |