From a2bc5061e495aa63d5cc025d6e8fc67d0172f58b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 2 Mar 2025 20:22:06 -0800 Subject: [PATCH] camerad: fix bps flush (#34758) --- system/camerad/cameras/spectra.cc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/system/camerad/cameras/spectra.cc b/system/camerad/cameras/spectra.cc index 7e991755ce..3e5941b13f 100644 --- a/system/camerad/cameras/spectra.cc +++ b/system/camerad/cameras/spectra.cc @@ -249,13 +249,6 @@ SpectraCamera::~SpectraCamera() { } int SpectraCamera::clear_req_queue() { - struct cam_req_mgr_flush_info req_mgr_flush_request = {0}; - req_mgr_flush_request.session_hdl = session_handle; - req_mgr_flush_request.link_hdl = link_handle; - req_mgr_flush_request.flush_type = CAM_REQ_MGR_FLUSH_TYPE_ALL; - int ret = do_cam_control(m->video0_fd, CAM_REQ_MGR_FLUSH_REQ, &req_mgr_flush_request, sizeof(req_mgr_flush_request)); - LOGD("flushed all req: %d", ret); - if (icp_dev_handle > 0) { struct cam_flush_dev_cmd cmd = { .session_handle = session_handle, @@ -264,8 +257,16 @@ int SpectraCamera::clear_req_queue() { }; int err = do_cam_control(m->icp_fd, CAM_FLUSH_REQ, &cmd, sizeof(cmd)); assert(err == 0); + LOGD("flushed bps: %d", err); } + struct cam_req_mgr_flush_info req_mgr_flush_request = {0}; + req_mgr_flush_request.session_hdl = session_handle; + req_mgr_flush_request.link_hdl = link_handle; + req_mgr_flush_request.flush_type = CAM_REQ_MGR_FLUSH_TYPE_ALL; + int ret = do_cam_control(m->video0_fd, CAM_REQ_MGR_FLUSH_REQ, &req_mgr_flush_request, sizeof(req_mgr_flush_request)); + LOGD("flushed all req: %d", ret); + for (int i = 0; i < MAX_IFE_BUFS; ++i) { destroySyncObjectAt(i); } @@ -938,16 +939,15 @@ bool SpectraCamera::enqueue_buffer(int i, uint64_t request_id) { } } - // all good, hand off frame if (ret == 0) { + // all good, hand off frame frame_ready = true; - } - - if (ret != 0) { + destroySyncObjectAt(i); + } else { + // need to start over on sync failures, + // otherwise future frames will tear clear_req_queue(); } - - destroySyncObjectAt(i); } // create output fences @@ -1378,14 +1378,14 @@ bool SpectraCamera::handle_camera_event(const cam_req_mgr_message *event_data) { return false; } - if (!enabled) return false; - // ID from the qcom camera request manager uint64_t request_id = event_data->u.frame_msg.request_id; // raw as opposed to our re-indexed frame ID uint64_t frame_id_raw = event_data->u.frame_msg.frame_id; + //LOGD("handle cam %d, request id %lu -> %lu, frame id raw %lu", cc.camera_num, request_id_last, request_id, frame_id_raw); + if (request_id != 0) { // next ready // check for skipped_last frames if (frame_id_raw > frame_id_raw_last + 1 && !skipped_last) {