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

Commit b5edda79 authored by Hao Chen's avatar Hao Chen Committed by Android (Google) Code Review
Browse files

Merge "Use EvsCamera as the base of EvsMockCamera" into main

parents ccf96925 e04a700d
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);