Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e04a700d authored by Hao Chen's avatar Hao Chen
Browse files

Use EvsCamera as the base of EvsMockCamera

Test: Build and run (mock) evs_app tests
Bug: 300533205
Change-Id: I8e43c5879dee9942c27d69cdfb3012d35b123441
parent 59414af0
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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);
@@ -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
+28 −56
Original line number Diff line number Diff line
@@ -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;
@@ -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

@@ -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;

@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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];
+58 −414

File changed.

Preview size limit exceeded, changes collapsed.

+3 −0
Original line number Diff line number Diff line
@@ -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);

@@ -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);

@@ -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);