blob: 82a7a3424c336a64a98e2309bb6bd129230e78c8 [file] [log] [blame]
/*
* Copyright (C) 2023 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 ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSION_H
#define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSION_H
#include <atomic>
#include <memory>
#include <set>
#include "VirtualCameraRenderThread.h"
#include "VirtualCameraSessionContext.h"
#include "aidl/android/companion/virtualcamera/IVirtualCameraCallback.h"
#include "aidl/android/hardware/camera/device/BnCameraDeviceSession.h"
#include "aidl/android/hardware/camera/device/ICameraDeviceCallback.h"
#include "utils/Mutex.h"
namespace android {
template <typename T, typename U>
struct AidlMessageQueue;
namespace companion {
namespace virtualcamera {
class VirtualCameraDevice;
// Implementation of ICameraDeviceSession AIDL interface to allow camera
// framework to read image data from open virtual camera device. This class
// encapsulates possibly several image streams for the same session.
class VirtualCameraSession
: public ::aidl::android::hardware::camera::device::BnCameraDeviceSession {
public:
// Construct new virtual camera session.
// When virtualCameraClientCallback is null, the input surface will be filled
// with test pattern.
VirtualCameraSession(
std::shared_ptr<VirtualCameraDevice> mCameraDevice,
std::shared_ptr<
::aidl::android::hardware::camera::device::ICameraDeviceCallback>
cameraDeviceCallback,
std::shared_ptr<
::aidl::android::companion::virtualcamera::IVirtualCameraCallback>
virtualCameraClientCallback = nullptr);
virtual ~VirtualCameraSession() override = default;
ndk::ScopedAStatus close() override EXCLUDES(mLock);
ndk::ScopedAStatus configureStreams(
const ::aidl::android::hardware::camera::device::StreamConfiguration&
in_requestedConfiguration,
std::vector<::aidl::android::hardware::camera::device::HalStream>*
_aidl_return) override EXCLUDES(mLock);
ndk::ScopedAStatus constructDefaultRequestSettings(
::aidl::android::hardware::camera::device::RequestTemplate in_type,
::aidl::android::hardware::camera::device::CameraMetadata* _aidl_return)
override;
ndk::ScopedAStatus flush() override EXCLUDES(mLock);
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;
std::set<int> getStreamIds() const EXCLUDES(mLock);
private:
ndk::ScopedAStatus processCaptureRequest(
const ::aidl::android::hardware::camera::device::CaptureRequest& request)
EXCLUDES(mLock);
std::weak_ptr<VirtualCameraDevice> mCameraDevice;
mutable std::mutex mLock;
std::shared_ptr<::aidl::android::hardware::camera::device::ICameraDeviceCallback>
mCameraDeviceCallback GUARDED_BY(mLock);
const std::shared_ptr<
::aidl::android::companion::virtualcamera::IVirtualCameraCallback>
mVirtualCameraClientCallback;
VirtualCameraSessionContext mSessionContext;
using RequestMetadataQueue = AidlMessageQueue<
int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>;
std::unique_ptr<RequestMetadataQueue> mRequestMetadataQueue;
using ResultMetadataQueue = AidlMessageQueue<
int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>;
std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue;
std::atomic_bool mFirstRequest{true};
std::unique_ptr<VirtualCameraRenderThread> mRenderThread GUARDED_BY(mLock);
};
} // namespace virtualcamera
} // namespace companion
} // namespace android
#endif // ANDROID_SERVICES_VIRTUAL_CAMERA_VIRTUALCAMERASESSION_H