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

Commit b14e4295 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Add logical camera related metadata in dumpsys" into qt-dev

parents 432e0fd4 c2cba125
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -89,12 +89,27 @@ void FrameProcessorBase::dump(int fd, const Vector<String16>& /*args*/) {
    write(fd, result.string(), result.size());

    CameraMetadata lastFrame;
    std::map<std::string, CameraMetadata> lastPhysicalFrames;
    {
        // Don't race while dumping metadata
        Mutex::Autolock al(mLastFrameMutex);
        lastFrame = CameraMetadata(mLastFrame);

        for (const auto& physicalFrame : mLastPhysicalFrames) {
            lastPhysicalFrames.emplace(String8(physicalFrame.mPhysicalCameraId),
                    physicalFrame.mPhysicalCameraMetadata);
        }
    }
    lastFrame.dump(fd, /*verbosity*/2, /*indentation*/6);

    for (const auto& physicalFrame : lastPhysicalFrames) {
        result = String8::format("   Latest received frame for physical camera %s:\n",
                physicalFrame.first.c_str());
        write(fd, result.string(), result.size());
        CameraMetadata lastPhysicalMetadata = CameraMetadata(physicalFrame.second);
        lastPhysicalMetadata.sort();
        lastPhysicalMetadata.dump(fd, /*verbosity*/2, /*indentation*/6);
    }
    lastFrame.dump(fd, 2, 6);
}

bool FrameProcessorBase::threadLoop() {
@@ -145,6 +160,8 @@ void FrameProcessorBase::processNewFrames(const sp<CameraDeviceBase> &device) {
        if (!result.mMetadata.isEmpty()) {
            Mutex::Autolock al(mLastFrameMutex);
            mLastFrame.acquire(result.mMetadata);

            mLastPhysicalFrames = std::move(result.mPhysicalMetadatas);
        }
    }
    if (res != NOT_ENOUGH_DATA) {
+2 −0
Original line number Diff line number Diff line
@@ -83,6 +83,8 @@ class FrameProcessorBase: public Thread {
                              const sp<CameraDeviceBase> &device);

    CameraMetadata mLastFrame;
    std::vector<PhysicalCaptureResultInfo> mLastPhysicalFrames;

};


+60 −52
Original line number Diff line number Diff line
@@ -1306,7 +1306,7 @@ status_t Camera3Device::readOneCameraMetadataLocked(
void Camera3Device::processOneCaptureResultLocked(
        const hardware::camera::device::V3_2::CaptureResult& result,
        const hardware::hidl_vec<
                hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadatas) {
                hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata) {
    camera3_capture_result r;
    status_t res;
    r.frame_number = result.frameNumber;
@@ -1322,21 +1322,21 @@ void Camera3Device::processOneCaptureResultLocked(
    r.result = reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());

    // Read and validate physical camera metadata
    size_t physResultCount = physicalCameraMetadatas.size();
    size_t physResultCount = physicalCameraMetadata.size();
    std::vector<const char*> physCamIds(physResultCount);
    std::vector<const camera_metadata_t *> phyCamMetadatas(physResultCount);
    std::vector<hardware::camera::device::V3_2::CameraMetadata> physResultMetadata;
    physResultMetadata.resize(physResultCount);
    for (size_t i = 0; i < physicalCameraMetadatas.size(); i++) {
        res = readOneCameraMetadataLocked(physicalCameraMetadatas[i].fmqMetadataSize,
                physResultMetadata[i], physicalCameraMetadatas[i].metadata);
    for (size_t i = 0; i < physicalCameraMetadata.size(); i++) {
        res = readOneCameraMetadataLocked(physicalCameraMetadata[i].fmqMetadataSize,
                physResultMetadata[i], physicalCameraMetadata[i].metadata);
        if (res != OK) {
            ALOGE("%s: Frame %d: Failed to read capture result metadata for camera %s",
                    __FUNCTION__, result.frameNumber,
                    physicalCameraMetadatas[i].physicalCameraId.c_str());
                    physicalCameraMetadata[i].physicalCameraId.c_str());
            return;
        }
        physCamIds[i] = physicalCameraMetadatas[i].physicalCameraId.c_str();
        physCamIds[i] = physicalCameraMetadata[i].physicalCameraId.c_str();
        phyCamMetadatas[i] = reinterpret_cast<const camera_metadata_t*>(
                physResultMetadata[i].data());
    }
@@ -3419,6 +3419,14 @@ void Camera3Device::insertResultLocked(CaptureResult *result,
        return;
    }

    // Update vendor tag id for physical metadata
    for (auto& physicalMetadata : result->mPhysicalMetadatas) {
        camera_metadata_t *pmeta = const_cast<camera_metadata_t *>(
                physicalMetadata.mPhysicalCameraMetadata.getAndLock());
        set_camera_metadata_vendor_id(pmeta, mVendorTagId);
        physicalMetadata.mPhysicalCameraMetadata.unlock(pmeta);
    }

    // Valid result, insert into queue
    List<CaptureResult>::iterator queuedResult =
            mResultQueue.insert(mResultQueue.end(), CaptureResult(*result));
@@ -3550,8 +3558,14 @@ void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata,
        }
    }

    std::unordered_map<std::string, CameraMetadata> monitoredPhysicalMetadata;
    for (auto& m : physicalMetadatas) {
        monitoredPhysicalMetadata.emplace(String8(m.mPhysicalCameraId).string(),
                CameraMetadata(m.mPhysicalCameraMetadata));
    }
    mTagMonitor.monitorMetadata(TagMonitor::RESULT,
            frameNumber, timestamp.data.i64[0], captureResult.mMetadata);
            frameNumber, timestamp.data.i64[0], captureResult.mMetadata,
            monitoredPhysicalMetadata);

    insertResultLocked(&captureResult, frameNumber);
}
@@ -3965,8 +3979,11 @@ CameraMetadata Camera3Device::getLatestRequestLocked() {


void Camera3Device::monitorMetadata(TagMonitor::eventSource source,
        int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata) {
    mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata);
        int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata,
        const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) {

    mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata,
            physicalMetadata);
}

/**
@@ -5122,28 +5139,7 @@ bool Camera3Device::RequestThread::sendRequestsBatch() {
        NextRequest& nextRequest = mNextRequests.editItemAt(i);
        nextRequest.submitted = true;


        // Update the latest request sent to HAL
        if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
            Mutex::Autolock al(mLatestRequestMutex);

            camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
            mLatestRequest.acquire(cloned);

            sp<Camera3Device> parent = mParent.promote();
            if (parent != NULL) {
                parent->monitorMetadata(TagMonitor::REQUEST,
                        nextRequest.halRequest.frame_number,
                        0, mLatestRequest);
            }
        }

        if (nextRequest.halRequest.settings != NULL) {
            nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
                    nextRequest.halRequest.settings);
        }

        cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
        updateNextRequest(nextRequest);

        if (!triggerRemoveFailed) {
            // Remove any previously queued triggers (after unlock)
@@ -5198,26 +5194,7 @@ bool Camera3Device::RequestThread::sendRequestsOneByOne() {
        // Mark that the request has be submitted successfully.
        nextRequest.submitted = true;

        // Update the latest request sent to HAL
        if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
            Mutex::Autolock al(mLatestRequestMutex);

            camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
            mLatestRequest.acquire(cloned);

            sp<Camera3Device> parent = mParent.promote();
            if (parent != NULL) {
                parent->monitorMetadata(TagMonitor::REQUEST, nextRequest.halRequest.frame_number,
                        0, mLatestRequest);
            }
        }

        if (nextRequest.halRequest.settings != NULL) {
            nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
                    nextRequest.halRequest.settings);
        }

        cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
        updateNextRequest(nextRequest);

        // Remove any previously queued triggers (after unlock)
        res = removeTriggers(mPrevRequest);
@@ -5279,6 +5256,37 @@ bool Camera3Device::RequestThread::skipHFRTargetFPSUpdate(int32_t tag,
    return false;
}

void Camera3Device::RequestThread::updateNextRequest(NextRequest& nextRequest) {
    // Update the latest request sent to HAL
    if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
        Mutex::Autolock al(mLatestRequestMutex);

        camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
        mLatestRequest.acquire(cloned);

        mLatestPhysicalRequest.clear();
        for (uint32_t i = 0; i < nextRequest.halRequest.num_physcam_settings; i++) {
            cloned = clone_camera_metadata(nextRequest.halRequest.physcam_settings[i]);
            mLatestPhysicalRequest.emplace(nextRequest.halRequest.physcam_id[i],
                    CameraMetadata(cloned));
        }

        sp<Camera3Device> parent = mParent.promote();
        if (parent != NULL) {
            parent->monitorMetadata(TagMonitor::REQUEST,
                    nextRequest.halRequest.frame_number,
                    0, mLatestRequest, mLatestPhysicalRequest);
        }
    }

    if (nextRequest.halRequest.settings != NULL) {
        nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
                nextRequest.halRequest.settings);
    }

    cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
}

bool Camera3Device::RequestThread::updateSessionParameters(const CameraMetadata& settings) {
    ATRACE_CALL();
    bool updatesDetected = false;
+6 −4
Original line number Diff line number Diff line
@@ -556,7 +556,7 @@ class Camera3Device :
    void processOneCaptureResultLocked(
            const hardware::camera::device::V3_2::CaptureResult& result,
            const hardware::hidl_vec<
            hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadatas);
            hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata);
    status_t readOneCameraMetadataLocked(uint64_t fmqResultSize,
            hardware::camera::device::V3_2::CameraMetadata& resultMetadata,
            const hardware::camera::device::V3_2::CameraMetadata& result);
@@ -912,8 +912,8 @@ class Camera3Device :
        bool skipHFRTargetFPSUpdate(int32_t tag, const camera_metadata_ro_entry_t& newEntry,
                const camera_metadata_entry_t& currentEntry);

        // Re-configure camera using the latest session parameters.
        bool reconfigureCamera();
        // Update next request sent to HAL
        void updateNextRequest(NextRequest& nextRequest);

        wp<Camera3Device>  mParent;
        wp<camera3::StatusTracker>  mStatusTracker;
@@ -957,6 +957,7 @@ class Camera3Device :
        // android.request.id for latest process_capture_request
        int32_t            mLatestRequestId;
        CameraMetadata     mLatestRequest;
        std::unordered_map<std::string, CameraMetadata> mLatestPhysicalRequest;

        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
        Mutex              mTriggerMutex;
@@ -1265,7 +1266,8 @@ class Camera3Device :
    TagMonitor mTagMonitor;

    void monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber,
            nsecs_t timestamp, const CameraMetadata& metadata);
            nsecs_t timestamp, const CameraMetadata& metadata,
            const std::unordered_map<std::string, CameraMetadata>& physicalMetadata);

    metadata_vendor_id_t mVendorTagId;

+3 −0
Original line number Diff line number Diff line
@@ -82,6 +82,9 @@ void Camera3IOStreamBase::dump(int fd, const Vector<String16> &args) const {
    lines.appendFormat("      Max size: %zu\n", mMaxSize);
    lines.appendFormat("      Combined usage: %" PRIu64 ", max HAL buffers: %d\n",
            mUsage | consumerUsage, camera3_stream::max_buffers);
    if (strlen(camera3_stream::physical_camera_id) > 0) {
        lines.appendFormat("      Physical camera id: %s\n", camera3_stream::physical_camera_id);
    }
    lines.appendFormat("      Frames produced: %d, last timestamp: %" PRId64 " ns\n",
            mFrameCount, mLastTimestamp);
    lines.appendFormat("      Total buffers: %zu, currently dequeued: %zu\n",
Loading