blob: b56000bd4461ca12edd0b1f964a94fd90a134e2e [file] [log] [blame]
/*
* Copyright 2021 The Chromium OS 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 CAMERA_COMMON_STREAM_MANIPULATOR_H_
#define CAMERA_COMMON_STREAM_MANIPULATOR_H_
#include <hardware/camera3.h>
#include <memory>
#include <string>
#include <vector>
#include "common/camera_hal3_helpers.h"
#include "cros-camera/export.h"
namespace cros {
// Interface class that can be used by feature implementations to add hooks into
// the standard camera HAL3 capture pipeline.
class CROS_CAMERA_EXPORT StreamManipulator {
public:
struct Options {
// Used to identify the camera device that the stream manipulators will be
// created for (e.g. USB v.s. vendor camera HAL).
std::string camera_module_name;
// Whether we should attempt to enable ZSL. We might have vendor-specific
// ZSL solution, and in which case we should not try to enable our ZSL.
bool enable_cros_zsl;
// Whether the HDRnet stream manipulator should be enabled. The default is
// disabled because the feature would require per-device tuning.
bool enable_hdrnet = false;
};
// Callback for the StreamManipulator to return capture results to the client
// asynchronously.
using CaptureResultCallback =
base::RepeatingCallback<void(Camera3CaptureDescriptor result)>;
// Gets the set of enabled StreamManipulator instances. The StreamManipulators
// are enabled through platform or device specific settings. This factory
// method is called by CameraDeviceAdapter.
//
// The hooks of the StreamManipulators are called by CameraDeviceAdapter in
// the various HAL3 APIs. See the comments below for details regarding where
// each hook is called and its expected behavior. For
// ProcessCaptureRequest / ProcessCaptureResult and
// ConfigureStreams / OnConfiguredStreams pairs, CameraDeviceAdapter will
// iterate through the list of StreamManipulators with reverse order.
//
// CameraDeviceAdapter will iterate through all the StreamManipulators
// regardless of the return value of each hook call. The return value of the
// hook is mainly used to log the status for each StreamManipulator.
static std::vector<std::unique_ptr<StreamManipulator>>
GetEnabledStreamManipulators(Options options);
virtual ~StreamManipulator() = default;
// The followings are hooks to the camera3_device_ops APIs and will be called
// by CameraDeviceAdapter on the CameraDeviceOpsThread.
// A hook to the camera3_device_ops::initialize(). Will be called by
// CameraDeviceAdapter with the camera device static metadata |static_info|.
virtual bool Initialize(const camera_metadata_t* static_info,
CaptureResultCallback result_callback) = 0;
// A hook to the upper part of camera3_device_ops::configure_streams().
// Will be called by CameraDeviceAdapter with the stream configuration
// |stream_list| requested by the camera client. |streams| carries the set of
// output streams in |stream_list| and can be used to modify the set of output
// streams in |stream_list|.
virtual bool ConfigureStreams(Camera3StreamConfiguration* stream_config) = 0;
// A hook to the lower part of camera3_device_ops::configure_streams().
// Will be called by CameraDeviceAdapter with the updated stream configuration
// |stream_list| returned by the camera HAL implementation.
virtual bool OnConfiguredStreams(
Camera3StreamConfiguration* stream_config) = 0;
// A hook to the camera3_device_ops::construct_default_request_settings().
// Will be called by CameraDeviceAdapter with the default request settings
// |default_request_settings| prepared by the camera HAL implementation for
// type |type|.
virtual bool ConstructDefaultRequestSettings(
android::CameraMetadata* default_request_settings, int type) = 0;
// A hook to the camera3_device_ops::process_capture_request(). Will be called
// by CameraDeviceAdapter for each incoming capture request |request|.
virtual bool ProcessCaptureRequest(Camera3CaptureDescriptor* request) = 0;
// A hook to the camera3_device_ops::flush(). Will be called by
// CameraDeviceAdapter when the camera client requests a flush.
virtual bool Flush() = 0;
// The followings are hooks to the camera3_callback_ops APIs and will be
// called by CameraDeviceAdapter on the CameraCallbackOpsThread.
// A hook to the camera3_callback_ops::process_capture_result(). Will be
// called by CameraDeviceAdapter for each capture result |result| produced by
// the camera HAL implementation.
virtual bool ProcessCaptureResult(Camera3CaptureDescriptor* result) = 0;
// A hook to the camera3_callback_ops::notify(). Will be called by
// CameraDeviceAdapter for each notify message |msg| produced by the camera
// HAL implemnetation.
virtual bool Notify(camera3_notify_msg_t* msg) = 0;
};
} // namespace cros
#endif // CAMERA_COMMON_STREAM_MANIPULATOR_H_