Loading automotive/evs/aidl/impl/default/include/EvsCamera.h +7 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ class EvsCamera : public EvsCameraBase { void closeAllBuffers_unsafe(); // Returns (ID, handle) if succeeds. (static_cast<size_t>(-1), nullptr) otherwise. // Returns (ID, handle) if succeeds. (kInvalidBufferID, nullptr) otherwise. [[nodiscard]] std::pair<std::size_t, buffer_handle_t> useBuffer_unsafe(); void returnBuffer_unsafe(const std::size_t id); Loading Loading @@ -133,6 +133,12 @@ class EvsCamera : public EvsCameraBase { std::size_t mAvailableFrames{0}; std::size_t mFramesInUse{0}; // We use all 1's as a reserved invalid buffer ID. static constexpr std::size_t kInvalidBufferID = ~static_cast<std::size_t>(0); public: static bool IsBufferIDValid(const std::size_t bufferId) { return ~bufferId; } }; } // namespace aidl::android::hardware::automotive::evs::implementation automotive/evs/aidl/impl/default/include/EvsMockCamera.h +28 −56 Original line number Diff line number Diff line Loading @@ -17,29 +17,36 @@ #pragma once #include "ConfigManager.h" #include "EvsCameraBase.h" #include "EvsCamera.h" #include <aidl/android/hardware/automotive/evs/BufferDesc.h> #include <aidl/android/hardware/automotive/evs/CameraDesc.h> #include <aidl/android/hardware/automotive/evs/CameraParam.h> #include <aidl/android/hardware/automotive/evs/EvsResult.h> #include <aidl/android/hardware/automotive/evs/IEvsCameraStream.h> #include <aidl/android/hardware/automotive/evs/IEvsDisplay.h> #include <aidl/android/hardware/automotive/evs/ParameterRange.h> #include <aidl/android/hardware/automotive/evs/Stream.h> // #include <android-base/result.h> #include <android/hardware_buffer.h> #include <ui/GraphicBuffer.h> #include <functional> #include <cstdint> #include <memory> #include <thread> #include <unordered_map> #include <vector> namespace aidl::android::hardware::automotive::evs::implementation { class EvsMockCamera : public EvsCameraBase { class EvsMockCamera : public EvsCamera { private: using Base = EvsCamera; public: EvsMockCamera(Sigil sigil, const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo); EvsMockCamera(const EvsMockCamera&) = delete; EvsMockCamera& operator=(const EvsMockCamera&) = delete; // Methods from ::android::hardware::automotive::evs::IEvsCamera follow. ndk::ScopedAStatus doneWithFrame(const std::vector<evs::BufferDesc>& buffers) override; ndk::ScopedAStatus forcePrimaryClient( const std::shared_ptr<evs::IEvsDisplay>& display) override; ndk::ScopedAStatus getCameraInfo(evs::CameraDesc* _aidl_return) override; Loading @@ -51,49 +58,37 @@ class EvsMockCamera : public EvsCameraBase { ndk::ScopedAStatus getParameterList(std::vector<evs::CameraParam>* _aidl_return) override; ndk::ScopedAStatus getPhysicalCameraInfo(const std::string& deviceId, evs::CameraDesc* _aidl_return) override; ndk::ScopedAStatus importExternalBuffers(const std::vector<evs::BufferDesc>& buffers, int32_t* _aidl_return) override; ndk::ScopedAStatus pauseVideoStream() override; ndk::ScopedAStatus resumeVideoStream() override; ndk::ScopedAStatus setExtendedInfo(int32_t opaqueIdentifier, const std::vector<uint8_t>& opaqueValue) override; ndk::ScopedAStatus setIntParameter(evs::CameraParam id, int32_t value, std::vector<int32_t>* effectiveValue) override; ndk::ScopedAStatus setPrimaryClient() override; ndk::ScopedAStatus setMaxFramesInFlight(int32_t bufferCount) override; ndk::ScopedAStatus startVideoStream( const std::shared_ptr<evs::IEvsCameraStream>& receiver) override; ndk::ScopedAStatus stopVideoStream() override; ndk::ScopedAStatus unsetPrimaryClient() override; const evs::CameraDesc& getDesc() { return mDescription; } static std::shared_ptr<EvsMockCamera> Create(const char* deviceName); static std::shared_ptr<EvsMockCamera> Create( const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo, const evs::Stream* streamCfg = nullptr); EvsMockCamera(const EvsMockCamera&) = delete; EvsMockCamera& operator=(const EvsMockCamera&) = delete; virtual ~EvsMockCamera() override; private: void generateFrames(); void fillMockFrame(buffer_handle_t handle, const AHardwareBuffer_Desc* pDesc); // Methods from EvsCameraBase follow. void shutdown() override; ::android::status_t allocateOneFrame(buffer_handle_t* handle) override; const evs::CameraDesc& getDesc() { return mDescription; } bool startVideoStreamImpl_locked(const std::shared_ptr<evs::IEvsCameraStream>& receiver, ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; // Constructors EvsMockCamera(Sigil sigil, const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo); bool stopVideoStreamImpl_locked(ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; private: // These three functions are expected to be called while mAccessLock is held bool setAvailableFrames_Locked(unsigned bufferCount); unsigned increaseAvailableFrames_Locked(unsigned numToAdd); unsigned decreaseAvailableFrames_Locked(unsigned numToRemove); bool postVideoStreamStop_locked(ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; void generateFrames(); void fillMockFrame(buffer_handle_t handle, const AHardwareBuffer_Desc* pDesc); void returnBufferLocked(const uint32_t bufferId); ndk::ScopedAStatus stopVideoStream_impl(); void initializeParameters(); CameraDesc mDescription = {}; // The properties of this camera Loading @@ -114,28 +109,6 @@ class EvsMockCamera : public EvsCameraBase { // Bytes per line in the buffers uint32_t mStride = 0; struct BufferRecord { buffer_handle_t handle; bool inUse; explicit BufferRecord(buffer_handle_t h) : handle(h), inUse(false){}; }; std::vector<BufferRecord> mBuffers; // Graphics buffers to transfer images unsigned mFramesAllowed; // How many buffers are we currently using unsigned mFramesInUse; // How many buffers are currently outstanding enum StreamStateValues { STOPPED, RUNNING, STOPPING, DEAD, }; StreamStateValues mStreamState; // Synchronization necessary to deconflict mCaptureThread from the main service thread std::mutex mAccessLock; // Static camera module information std::unique_ptr<ConfigManager::CameraInfo>& mCameraInfo; Loading @@ -155,7 +128,6 @@ class EvsMockCamera : public EvsCameraBase { int32_t value; }; std::unordered_map<CameraParam, std::shared_ptr<CameraParameterDesc>> mParams; void initializeParameters(); }; } // namespace aidl::android::hardware::automotive::evs::implementation automotive/evs/aidl/impl/default/src/EvsCamera.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -292,7 +292,7 @@ void EvsCamera::closeAllBuffers_unsafe() { std::pair<std::size_t, buffer_handle_t> EvsCamera::useBuffer_unsafe() { if (mFramesInUse >= mAvailableFrames) { DCHECK_EQ(mFramesInUse, mAvailableFrames); return {static_cast<std::size_t>(-1), nullptr}; return {kInvalidBufferID, nullptr}; } const std::size_t pos = mFramesInUse++; auto& buffer = mBuffers[pos]; Loading automotive/evs/aidl/impl/default/src/EvsMockCamera.cpp +58 −414 File changed.Preview size limit exceeded, changes collapsed. Show changes automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading @@ -160,6 +161,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading Loading @@ -189,6 +191,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading Loading
automotive/evs/aidl/impl/default/include/EvsCamera.h +7 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ class EvsCamera : public EvsCameraBase { void closeAllBuffers_unsafe(); // Returns (ID, handle) if succeeds. (static_cast<size_t>(-1), nullptr) otherwise. // Returns (ID, handle) if succeeds. (kInvalidBufferID, nullptr) otherwise. [[nodiscard]] std::pair<std::size_t, buffer_handle_t> useBuffer_unsafe(); void returnBuffer_unsafe(const std::size_t id); Loading Loading @@ -133,6 +133,12 @@ class EvsCamera : public EvsCameraBase { std::size_t mAvailableFrames{0}; std::size_t mFramesInUse{0}; // We use all 1's as a reserved invalid buffer ID. static constexpr std::size_t kInvalidBufferID = ~static_cast<std::size_t>(0); public: static bool IsBufferIDValid(const std::size_t bufferId) { return ~bufferId; } }; } // namespace aidl::android::hardware::automotive::evs::implementation
automotive/evs/aidl/impl/default/include/EvsMockCamera.h +28 −56 Original line number Diff line number Diff line Loading @@ -17,29 +17,36 @@ #pragma once #include "ConfigManager.h" #include "EvsCameraBase.h" #include "EvsCamera.h" #include <aidl/android/hardware/automotive/evs/BufferDesc.h> #include <aidl/android/hardware/automotive/evs/CameraDesc.h> #include <aidl/android/hardware/automotive/evs/CameraParam.h> #include <aidl/android/hardware/automotive/evs/EvsResult.h> #include <aidl/android/hardware/automotive/evs/IEvsCameraStream.h> #include <aidl/android/hardware/automotive/evs/IEvsDisplay.h> #include <aidl/android/hardware/automotive/evs/ParameterRange.h> #include <aidl/android/hardware/automotive/evs/Stream.h> // #include <android-base/result.h> #include <android/hardware_buffer.h> #include <ui/GraphicBuffer.h> #include <functional> #include <cstdint> #include <memory> #include <thread> #include <unordered_map> #include <vector> namespace aidl::android::hardware::automotive::evs::implementation { class EvsMockCamera : public EvsCameraBase { class EvsMockCamera : public EvsCamera { private: using Base = EvsCamera; public: EvsMockCamera(Sigil sigil, const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo); EvsMockCamera(const EvsMockCamera&) = delete; EvsMockCamera& operator=(const EvsMockCamera&) = delete; // Methods from ::android::hardware::automotive::evs::IEvsCamera follow. ndk::ScopedAStatus doneWithFrame(const std::vector<evs::BufferDesc>& buffers) override; ndk::ScopedAStatus forcePrimaryClient( const std::shared_ptr<evs::IEvsDisplay>& display) override; ndk::ScopedAStatus getCameraInfo(evs::CameraDesc* _aidl_return) override; Loading @@ -51,49 +58,37 @@ class EvsMockCamera : public EvsCameraBase { ndk::ScopedAStatus getParameterList(std::vector<evs::CameraParam>* _aidl_return) override; ndk::ScopedAStatus getPhysicalCameraInfo(const std::string& deviceId, evs::CameraDesc* _aidl_return) override; ndk::ScopedAStatus importExternalBuffers(const std::vector<evs::BufferDesc>& buffers, int32_t* _aidl_return) override; ndk::ScopedAStatus pauseVideoStream() override; ndk::ScopedAStatus resumeVideoStream() override; ndk::ScopedAStatus setExtendedInfo(int32_t opaqueIdentifier, const std::vector<uint8_t>& opaqueValue) override; ndk::ScopedAStatus setIntParameter(evs::CameraParam id, int32_t value, std::vector<int32_t>* effectiveValue) override; ndk::ScopedAStatus setPrimaryClient() override; ndk::ScopedAStatus setMaxFramesInFlight(int32_t bufferCount) override; ndk::ScopedAStatus startVideoStream( const std::shared_ptr<evs::IEvsCameraStream>& receiver) override; ndk::ScopedAStatus stopVideoStream() override; ndk::ScopedAStatus unsetPrimaryClient() override; const evs::CameraDesc& getDesc() { return mDescription; } static std::shared_ptr<EvsMockCamera> Create(const char* deviceName); static std::shared_ptr<EvsMockCamera> Create( const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo, const evs::Stream* streamCfg = nullptr); EvsMockCamera(const EvsMockCamera&) = delete; EvsMockCamera& operator=(const EvsMockCamera&) = delete; virtual ~EvsMockCamera() override; private: void generateFrames(); void fillMockFrame(buffer_handle_t handle, const AHardwareBuffer_Desc* pDesc); // Methods from EvsCameraBase follow. void shutdown() override; ::android::status_t allocateOneFrame(buffer_handle_t* handle) override; const evs::CameraDesc& getDesc() { return mDescription; } bool startVideoStreamImpl_locked(const std::shared_ptr<evs::IEvsCameraStream>& receiver, ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; // Constructors EvsMockCamera(Sigil sigil, const char* deviceName, std::unique_ptr<ConfigManager::CameraInfo>& camInfo); bool stopVideoStreamImpl_locked(ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; private: // These three functions are expected to be called while mAccessLock is held bool setAvailableFrames_Locked(unsigned bufferCount); unsigned increaseAvailableFrames_Locked(unsigned numToAdd); unsigned decreaseAvailableFrames_Locked(unsigned numToRemove); bool postVideoStreamStop_locked(ndk::ScopedAStatus& status, std::unique_lock<std::mutex>& lck) override; void generateFrames(); void fillMockFrame(buffer_handle_t handle, const AHardwareBuffer_Desc* pDesc); void returnBufferLocked(const uint32_t bufferId); ndk::ScopedAStatus stopVideoStream_impl(); void initializeParameters(); CameraDesc mDescription = {}; // The properties of this camera Loading @@ -114,28 +109,6 @@ class EvsMockCamera : public EvsCameraBase { // Bytes per line in the buffers uint32_t mStride = 0; struct BufferRecord { buffer_handle_t handle; bool inUse; explicit BufferRecord(buffer_handle_t h) : handle(h), inUse(false){}; }; std::vector<BufferRecord> mBuffers; // Graphics buffers to transfer images unsigned mFramesAllowed; // How many buffers are we currently using unsigned mFramesInUse; // How many buffers are currently outstanding enum StreamStateValues { STOPPED, RUNNING, STOPPING, DEAD, }; StreamStateValues mStreamState; // Synchronization necessary to deconflict mCaptureThread from the main service thread std::mutex mAccessLock; // Static camera module information std::unique_ptr<ConfigManager::CameraInfo>& mCameraInfo; Loading @@ -155,7 +128,6 @@ class EvsMockCamera : public EvsCameraBase { int32_t value; }; std::unordered_map<CameraParam, std::shared_ptr<CameraParameterDesc>> mParams; void initializeParameters(); }; } // namespace aidl::android::hardware::automotive::evs::implementation
automotive/evs/aidl/impl/default/src/EvsCamera.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -292,7 +292,7 @@ void EvsCamera::closeAllBuffers_unsafe() { std::pair<std::size_t, buffer_handle_t> EvsCamera::useBuffer_unsafe() { if (mFramesInUse >= mAvailableFrames) { DCHECK_EQ(mFramesInUse, mAvailableFrames); return {static_cast<std::size_t>(-1), nullptr}; return {kInvalidBufferID, nullptr}; } const std::size_t pos = mFramesInUse++; auto& buffer = mBuffers[pos]; Loading
automotive/evs/aidl/impl/default/src/EvsMockCamera.cpp +58 −414 File changed.Preview size limit exceeded, changes collapsed. Show changes
automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading @@ -160,6 +161,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading Loading @@ -189,6 +191,7 @@ TEST(EvsCameraBufferTest, UseAndReturn) { for (std::size_t i = 0; i < kNumOfHandles; ++i) { const auto [id, handle] = evsCam->useBuffer_unsafe(); const std::size_t handleInt = reinterpret_cast<std::size_t>(handle); EXPECT_TRUE(EvsCamera::IsBufferIDValid(id)); EXPECT_NE(handle, nullptr); EXPECT_LT(id, kNumOfHandles); Loading