blob: 6480b051124c59fbfae5dc117d8a3437ed08c515 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef HARDWARE_GOOGLE_CAMERA_HAL_AIDL_SERVICE_AIDL_CAMERA_DEVICE_SESSION_H_
#define HARDWARE_GOOGLE_CAMERA_HAL_AIDL_SERVICE_AIDL_CAMERA_DEVICE_SESSION_H_
#include <aidl/android/hardware/camera/device/BnCameraDeviceSession.h>
#include <aidl/android/hardware/camera/device/ICameraDevice.h>
#include <aidl/android/hardware/camera/device/ICameraDeviceCallback.h>
#include <aidl/android/hardware/thermal/IThermal.h>
#include <android-base/thread_annotations.h>
#include <fmq/AidlMessageQueue.h>
#include <utils/StrongPointer.h>
#include <shared_mutex>
#include "aidl_profiler.h"
#include "aidl_thermal_utils.h"
#include "camera_device_session.h"
namespace android {
namespace hardware {
namespace camera {
namespace device {
namespace implementation {
// AidlCameraDeviceSession implements the AIDL camera device session interface,
// ICameraDeviceSession, that contains the methods to configure and request
// captures from an active camera device.
class AidlCameraDeviceSession
: public aidl::android::hardware::camera::device::BnCameraDeviceSession {
public:
// Create a AidlCameraDeviceSession.
// device_session is a google camera device session that
// AidlCameraDeviceSession is going to manage. Creating a
// AidlCameraDeviceSession will fail if device_session is
// nullptr.
static std::shared_ptr<AidlCameraDeviceSession> Create(
const std::shared_ptr<
aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session,
std::shared_ptr<android::hardware::camera::implementation::AidlProfiler>
aidl_profiler);
virtual ~AidlCameraDeviceSession();
// functions in ICameraDeviceSession
ndk::ScopedAStatus close() override;
ndk::ScopedAStatus configureStreams(
const aidl::android::hardware::camera::device::StreamConfiguration&,
std::vector<aidl::android::hardware::camera::device::HalStream>*) override;
ndk::ScopedAStatus constructDefaultRequestSettings(
aidl::android::hardware::camera::device::RequestTemplate in_type,
aidl::android::hardware::camera::device::CameraMetadata* aidl_return)
override;
ndk::ScopedAStatus flush() override;
ndk::ScopedAStatus getCaptureRequestMetadataQueue(
aidl::android::hardware::common::fmq::MQDescriptor<
int8_t, aidl::android::hardware::common::fmq::SynchronizedReadWrite>*
aidl_return) override;
ndk::ScopedAStatus getCaptureResultMetadataQueue(
aidl::android::hardware::common::fmq::MQDescriptor<
int8_t, aidl::android::hardware::common::fmq::SynchronizedReadWrite>*
aidl_return) override;
ndk::ScopedAStatus isReconfigurationRequired(
const aidl::android::hardware::camera::device::CameraMetadata&
in_oldSessionParams,
const aidl::android::hardware::camera::device::CameraMetadata&
in_newSessionParams,
bool* aidl_return) override;
ndk::ScopedAStatus processCaptureRequest(
const std::vector<aidl::android::hardware::camera::device::CaptureRequest>&
in_requests,
const std::vector<aidl::android::hardware::camera::device::BufferCache>&
in_cachesToRemove,
int32_t* aidl_return) override;
ndk::ScopedAStatus signalStreamFlush(const std::vector<int32_t>& in_streamIds,
int32_t in_streamConfigCounter) override;
ndk::ScopedAStatus switchToOffline(
const std::vector<int32_t>& in_streamsToKeep,
aidl::android::hardware::camera::device::CameraOfflineSessionInfo*
out_offlineSessionInfo,
std::shared_ptr<
aidl::android::hardware::camera::device::ICameraOfflineSession>*
aidl_return) override;
ndk::ScopedAStatus repeatingRequestEnd(
int32_t /*in_frameNumber*/,
const std::vector<int32_t>& /*in_streamIds*/) override {
return ndk::ScopedAStatus::ok();
};
AidlCameraDeviceSession() = default;
protected:
ndk::SpAIBinder createBinder() override;
private:
using MetadataQueue = AidlMessageQueue<
int8_t, aidl::android::hardware::common::fmq::SynchronizedReadWrite>;
static constexpr uint32_t kRequestMetadataQueueSizeBytes = 1 << 20; // 1MB
static constexpr uint32_t kResultMetadataQueueSizeBytes = 1 << 20; // 1MB
// Initialize the latest available gralloc buffer mapper.
status_t InitializeBufferMapper();
// Initialize AidlCameraDeviceSession with a CameraDeviceSession.
status_t Initialize(
const std::shared_ptr<
aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session,
std::shared_ptr<android::hardware::camera::implementation::AidlProfiler>
aidl_profiler);
// Create a metadata queue.
// If override_size_property contains a valid size, it will create a metadata
// queue of that size. If it override_size_property doesn't contain a valid
// size, it will create a metadata queue of the default size.
// default_size_bytes is the default size of the message queue in bytes.
// override_size_property is the name of the system property that contains
// the message queue size.
status_t CreateMetadataQueue(std::unique_ptr<MetadataQueue>* metadata_queue,
uint32_t default_size_bytes,
const char* override_size_property);
// Invoked when receiving a result from HAL.
void ProcessCaptureResult(
std::unique_ptr<google_camera_hal::CaptureResult> hal_result);
// Invoked when receiving a message from HAL.
void NotifyHalMessage(const google_camera_hal::NotifyMessage& hal_message);
// Invoked when requesting stream buffers from HAL.
google_camera_hal::BufferRequestStatus RequestStreamBuffers(
const std::vector<google_camera_hal::BufferRequest>& hal_buffer_requests,
std::vector<google_camera_hal::BufferReturn>* hal_buffer_returns);
// Invoked when returning stream buffers from HAL.
void ReturnStreamBuffers(
const std::vector<google_camera_hal::StreamBuffer>& return_hal_buffers);
// Import a buffer handle.
template <class T, class U>
buffer_handle_t ImportBufferHandle(const sp<T> buffer_mapper_,
const hidl_handle& buffer_hidl_handle);
// Set camera device session callbacks.
void SetSessionCallbacks();
// Register a thermal changed callback.
// notify_throttling will be invoked when thermal status changes.
// If filter_type is false, type will be ignored and all types will be
// monitored.
// If filter_type is true, only type will be monitored.
status_t RegisterThermalChangedCallback(
google_camera_hal::NotifyThrottlingFunc notify_throttling,
bool filter_type, google_camera_hal::TemperatureType type);
// Unregister thermal changed callback.
void UnregisterThermalChangedCallback();
std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session_;
// Metadata queue to read the request metadata from.
std::unique_ptr<MetadataQueue> request_metadata_queue_;
// Metadata queue to write the result metadata to.
std::unique_ptr<MetadataQueue> result_metadata_queue_;
// Assuming callbacks to framework is thread-safe, the shared mutex is only
// used to protect member variable writing and reading.
std::shared_mutex aidl_device_callback_lock_;
// Protected by aidl_device_callback_lock_
std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceCallback>
aidl_device_callback_;
android::sp<android::hardware::graphics::mapper::V2_0::IMapper> buffer_mapper_v2_;
android::sp<android::hardware::graphics::mapper::V3_0::IMapper> buffer_mapper_v3_;
android::sp<android::hardware::graphics::mapper::V4_0::IMapper> buffer_mapper_v4_;
std::mutex aidl_thermal_mutex_;
std::shared_ptr<aidl::android::hardware::thermal::IThermal> thermal_;
// Must be protected by hidl_thermal_mutex_.
std::shared_ptr<aidl::android::hardware::thermal::IThermalChangedCallback>
thermal_changed_callback_ GUARDED_BY(aidl_thermal_mutex_);
// Flag for profiling first frame processing time.
bool first_frame_requested_ = false;
// The frame number of first capture request after configure stream
uint32_t first_request_frame_number_ = 0;
std::mutex pending_first_frame_buffers_mutex_;
// Profiling first frame process time. Stop timer when it become 0.
// Must be protected by pending_first_frame_buffers_mutex_
size_t num_pending_first_frame_buffers_ = 0;
std::shared_ptr<android::hardware::camera::implementation::AidlProfiler>
aidl_profiler_;
};
} // namespace implementation
} // namespace device
} // namespace camera
} // namespace hardware
} // namespace android
#endif // HARDWARE_GOOGLE_CAMERA_HAL_AIDL_SERVICE_AIDL_CAMERA_DEVICE_SESSION_H_