| // Copyright 2019 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_REPROCESS_MANAGER_H_ |
| #define MEDIA_CAPTURE_VIDEO_CHROMEOS_REPROCESS_MANAGER_H_ |
| |
| #include <queue> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/containers/flat_set.h" |
| #include "base/sequenced_task_runner.h" |
| #include "base/task/post_task.h" |
| #include "media/capture/capture_export.h" |
| #include "media/capture/mojom/image_capture.mojom.h" |
| #include "media/capture/video/chromeos/mojo/camera3.mojom.h" |
| #include "media/capture/video/chromeos/mojo/cros_image_capture.mojom.h" |
| #include "mojo/public/cpp/bindings/binding.h" |
| |
| namespace media { |
| |
| struct ReprocessTask { |
| public: |
| ReprocessTask(); |
| ReprocessTask(ReprocessTask&& other); |
| ~ReprocessTask(); |
| cros::mojom::Effect effect; |
| cros::mojom::CrosImageCapture::SetReprocessOptionCallback callback; |
| std::vector<cros::mojom::CameraMetadataEntryPtr> extra_metadata; |
| }; |
| |
| using ReprocessTaskQueue = base::queue<ReprocessTask>; |
| |
| // TODO(shik): Get the keys from VendorTagOps by names instead (b/130774415). |
| constexpr uint32_t kPortraitModeVendorKey = 0x80000000; |
| constexpr uint32_t kPortraitModeSegmentationResultVendorKey = 0x80000001; |
| constexpr int32_t kReprocessSuccess = 0; |
| |
| // ReprocessManager is used to communicate between the reprocess requester and |
| // the consumer. When reprocess is requested, the reprocess information will be |
| // wrapped as a ReprocessTask and stored in the queue. When consumption, all |
| // ReprocessTask in the queue will be dumped and a default NO_EFFECT task will |
| // be added on the top of the result queue. Note that all calls will be |
| // sequentialize to a single sequence. |
| class CAPTURE_EXPORT ReprocessManager { |
| public: |
| using GetStaticMetadataCallback = |
| base::OnceCallback<void(cros::mojom::CameraMetadataPtr static_metadata)>; |
| using UpdateStaticMetadataCallback = |
| base::RepeatingCallback<void(const std::string& device_id)>; |
| |
| class ReprocessManagerImpl { |
| public: |
| ReprocessManagerImpl(UpdateStaticMetadataCallback callback); |
| ~ReprocessManagerImpl(); |
| |
| void SetReprocessOption( |
| const std::string& device_id, |
| cros::mojom::Effect effect, |
| cros::mojom::CrosImageCapture::SetReprocessOptionCallback |
| reprocess_result_callback); |
| |
| void ConsumeReprocessOptions( |
| const std::string& device_id, |
| media::mojom::ImageCapture::TakePhotoCallback take_photo_callback, |
| base::OnceCallback<void(ReprocessTaskQueue)> consumption_callback); |
| |
| void FlushReprocessOptions(const std::string& device_id); |
| |
| void GetStaticMetadata(const std::string& device_id, |
| GetStaticMetadataCallback callback); |
| |
| void UpdateStaticMetadata(const std::string& device_id, |
| cros::mojom::CameraMetadataPtr metadata); |
| |
| private: |
| base::flat_map<std::string, base::queue<ReprocessTask>> |
| reprocess_task_queue_map_; |
| |
| base::flat_map<std::string, cros::mojom::CameraMetadataPtr> |
| static_metadata_map_; |
| |
| base::flat_map<std::string, base::queue<GetStaticMetadataCallback>> |
| get_static_metadata_callback_queue_map_; |
| |
| UpdateStaticMetadataCallback update_static_metadata_callback_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ReprocessManagerImpl); |
| }; |
| |
| static int GetReprocessReturnCode( |
| cros::mojom::Effect effect, |
| const cros::mojom::CameraMetadataPtr* metadata); |
| ReprocessManager(UpdateStaticMetadataCallback callback); |
| ~ReprocessManager(); |
| |
| // Sets the reprocess option for given device id and effect. Each reprocess |
| // option has a corressponding callback. |
| void SetReprocessOption( |
| const std::string& device_id, |
| cros::mojom::Effect effect, |
| cros::mojom::CrosImageCapture::SetReprocessOptionCallback |
| reprocess_result_callback); |
| |
| // Consumes all ReprocessTasks in the queue. A default NO_EFFECT task will be |
| // added on the top of the result queue. |
| void ConsumeReprocessOptions( |
| const std::string& device_id, |
| media::mojom::ImageCapture::TakePhotoCallback take_photo_callback, |
| base::OnceCallback<void(ReprocessTaskQueue)> consumption_callback); |
| |
| // Clears all remaining ReprocessTasks in the queue for given device id. |
| void FlushReprocessOptions(const std::string& device_id); |
| |
| // Gets camera static metadata for current active device. |
| void GetStaticMetadata(const std::string& device_id, |
| GetStaticMetadataCallback callback); |
| |
| // Updates camera static metadata for given device. |
| void UpdateStaticMetadata(const std::string& device_id, |
| const cros::mojom::CameraMetadataPtr& metadata); |
| |
| private: |
| scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; |
| std::unique_ptr<ReprocessManagerImpl> impl; |
| |
| DISALLOW_COPY_AND_ASSIGN(ReprocessManager); |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_CAPTURE_VIDEO_CHROMEOS_REPROCESS_MANAGER_H_ |