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

Commit 9eee6a9f authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by Android (Google) Code Review
Browse files

Merge "Camera: plumb external camera API1 support"

parents 47d271ff 1798249b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -44,9 +44,10 @@ const std::array<uint32_t, /*size*/1> kSupportedFourCCs {{

} // anonymous namespace

ExternalCameraDevice::ExternalCameraDevice(const std::string& cameraId) :
ExternalCameraDevice::ExternalCameraDevice(
            const std::string& cameraId, const ExternalCameraConfig& cfg) :
        mCameraId(cameraId),
        mCfg(ExternalCameraDeviceConfig::loadFromCfg()) {
        mCfg(cfg) {

    status_t ret = initCameraCharacteristics();
    if (ret != OK) {
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ HandleImporter ExternalCameraDeviceSession::sHandleImporter;

ExternalCameraDeviceSession::ExternalCameraDeviceSession(
        const sp<ICameraDeviceCallback>& callback,
        const ExternalCameraDeviceConfig& cfg,
        const ExternalCameraConfig& cfg,
        const std::vector<SupportedV4L2Format>& sortedFormats,
        const CroppingType& croppingType,
        const common::V1_0::helper::CameraMetadata& chars,
+51 −21
Original line number Diff line number Diff line
@@ -30,14 +30,6 @@ namespace device {
namespace V3_4 {
namespace implementation {

namespace {
    const int  kDefaultJpegBufSize = 5 << 20; // 5MB
    const int  kDefaultNumVideoBuffer = 4;
    const int  kDefaultNumStillBuffer = 2;
} // anonymous namespace

const char* ExternalCameraDeviceConfig::kDefaultCfgPath = "/vendor/etc/external_camera_config.xml";

V4L2Frame::V4L2Frame(
        uint32_t w, uint32_t h, uint32_t fourcc,
        int bufIdx, int fd, uint32_t dataSize, uint64_t offset) :
@@ -148,10 +140,32 @@ int AllocatedFrame::getCroppedLayout(const IMapper::Rect& rect, YCbCrLayout* out
    return 0;
}

bool isAspectRatioClose(float ar1, float ar2) {
    const float kAspectRatioMatchThres = 0.025f; // This threshold is good enough to distinguish
                                                // 4:3/16:9/20:9
                                                // 1.33 / 1.78 / 2
    return (std::abs(ar1 - ar2) < kAspectRatioMatchThres);
}

}  // namespace implementation
}  // namespace V3_4
}  // namespace device


namespace external {
namespace common {

namespace {
    const int  kDefaultJpegBufSize = 5 << 20; // 5MB
    const int  kDefaultNumVideoBuffer = 4;
    const int  kDefaultNumStillBuffer = 2;
} // anonymous namespace

const char* ExternalCameraConfig::kDefaultCfgPath = "/vendor/etc/external_camera_config.xml";

ExternalCameraDeviceConfig ExternalCameraDeviceConfig::loadFromCfg(const char* cfgPath) {
ExternalCameraConfig ExternalCameraConfig::loadFromCfg(const char* cfgPath) {
    using namespace tinyxml2;
    ExternalCameraDeviceConfig ret;
    ExternalCameraConfig ret;

    XMLDocument configXml;
    XMLError err = configXml.LoadFile(cfgPath);
@@ -169,6 +183,29 @@ ExternalCameraDeviceConfig ExternalCameraDeviceConfig::loadFromCfg(const char* c
        return ret;
    }

    XMLElement *providerCfg = extCam->FirstChildElement("Provider");
    if (providerCfg == nullptr) {
        ALOGI("%s: no external camera provider config specified", __FUNCTION__);
        return ret;
    }

    XMLElement *ignore = providerCfg->FirstChildElement("ignore");
    if (ignore == nullptr) {
        ALOGI("%s: no internal ignored device specified", __FUNCTION__);
        return ret;
    }

    XMLElement *id = ignore->FirstChildElement("id");
    while (id != nullptr) {
        const char* text = id->GetText();
        if (text != nullptr) {
            ret.mInternalDevices.insert(text);
            ALOGI("%s: device %s will be ignored by external camera provider",
                    __FUNCTION__, text);
        }
        id = id->NextSiblingElement("id");
    }

    XMLElement *deviceCfg = extCam->FirstChildElement("Device");
    if (deviceCfg == nullptr) {
        ALOGI("%s: no external camera device config specified", __FUNCTION__);
@@ -226,7 +263,7 @@ ExternalCameraDeviceConfig ExternalCameraDeviceConfig::loadFromCfg(const char* c
        ret.fpsLimits = limits;
    }

    ALOGI("%s: external camera cfd loaded: maxJpgBufSize %d,"
    ALOGI("%s: external camera cfg loaded: maxJpgBufSize %d,"
            " num video buffers %d, num still buffers %d",
            __FUNCTION__, ret.maxJpegBufSize,
            ret.numVideoBuffers, ret.numStillBuffers);
@@ -237,7 +274,7 @@ ExternalCameraDeviceConfig ExternalCameraDeviceConfig::loadFromCfg(const char* c
    return ret;
}

ExternalCameraDeviceConfig::ExternalCameraDeviceConfig() :
ExternalCameraConfig::ExternalCameraConfig() :
        maxJpegBufSize(kDefaultJpegBufSize),
        numVideoBuffers(kDefaultNumVideoBuffer),
        numStillBuffers(kDefaultNumStillBuffer) {
@@ -247,16 +284,9 @@ ExternalCameraDeviceConfig::ExternalCameraDeviceConfig() :
    fpsLimits.push_back({/*Size*/{4096, 3072}, /*FPS upper bound*/5.0});
}

bool isAspectRatioClose(float ar1, float ar2) {
    const float kAspectRatioMatchThres = 0.025f; // This threshold is good enough to distinguish
                                                // 4:3/16:9/20:9
                                                // 1.33 / 1.78 / 2
    return (std::abs(ar1 - ar2) < kAspectRatioMatchThres);
}

}  // namespace implementation
}  // namespace V3_4
}  // namespace device
}  // namespace common
}  // namespace external
}  // namespace camera
}  // namespace hardware
}  // namespace android
+6 −3
Original line number Diff line number Diff line
@@ -67,6 +67,9 @@ using ::android::hardware::camera::device::V3_4::ICameraDeviceSession;
using ::android::hardware::camera::common::V1_0::Status;
using ::android::hardware::camera::common::V1_0::helper::HandleImporter;
using ::android::hardware::camera::common::V1_0::helper::ExifUtils;
using ::android::hardware::camera::external::common::ExternalCameraConfig;
using ::android::hardware::camera::external::common::Size;
using ::android::hardware::camera::external::common::SizeHasher;
using ::android::hardware::graphics::common::V1_0::BufferUsage;
using ::android::hardware::graphics::common::V1_0::Dataspace;
using ::android::hardware::graphics::common::V1_0::PixelFormat;
@@ -84,7 +87,7 @@ using ::android::base::unique_fd;
struct ExternalCameraDeviceSession : public virtual RefBase {

    ExternalCameraDeviceSession(const sp<ICameraDeviceCallback>&,
            const ExternalCameraDeviceConfig& cfg,
            const ExternalCameraConfig& cfg,
            const std::vector<SupportedV4L2Format>& sortedFormats,
            const CroppingType& croppingType,
            const common::V1_0::helper::CameraMetadata& chars,
@@ -273,7 +276,7 @@ protected:

    mutable Mutex mLock; // Protect all private members except otherwise noted
    const sp<ICameraDeviceCallback> mCallback;
    const ExternalCameraDeviceConfig mCfg;
    const ExternalCameraConfig& mCfg;
    const common::V1_0::helper::CameraMetadata mCameraCharacteristics;
    const std::vector<SupportedV4L2Format> mSupportedFormats;
    const CroppingType mCroppingType;
@@ -289,7 +292,7 @@ protected:

    bool mV4l2Streaming = false;
    SupportedV4L2Format mV4l2StreamingFmt;
    size_t mV4L2BufferCount;
    size_t mV4L2BufferCount = 0;

    static const int kBufferWaitTimeoutSec = 3; // TODO: handle long exposure (or not allowing)
    std::mutex mV4l2BufferLock; // protect the buffer count and condition below
+4 −2
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ using ::android::hardware::camera::device::V3_2::ICameraDeviceCallback;
using ::android::hardware::camera::common::V1_0::CameraResourceCost;
using ::android::hardware::camera::common::V1_0::TorchMode;
using ::android::hardware::camera::common::V1_0::Status;
using ::android::hardware::camera::external::common::ExternalCameraConfig;
using ::android::hardware::camera::external::common::Size;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
@@ -54,7 +56,7 @@ struct ExternalCameraDevice : public ICameraDevice {
    // be multiple CameraDevice trying to access the same physical camera.  Also, provider will have
    // to keep track of all CameraDevice objects in order to notify CameraDevice when the underlying
    // camera is detached.
    ExternalCameraDevice(const std::string& cameraId);
    ExternalCameraDevice(const std::string& cameraId, const ExternalCameraConfig& cfg);
    ~ExternalCameraDevice();

    // Caller must use this method to check if CameraDevice ctor failed
@@ -95,7 +97,7 @@ protected:
    Mutex mLock;
    bool mInitFailed = false;
    std::string mCameraId;
    const ExternalCameraDeviceConfig mCfg;
    const ExternalCameraConfig& mCfg;
    std::vector<SupportedV4L2Format> mSupportedFormats;
    CroppingType mCroppingType;

Loading