166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCamera2HWI" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// To remove 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <cutils/properties.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System definitions 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <dlfcn.h> 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdio.h> 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "gralloc_priv.h" 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "native_handle.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera definitions 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "android/QCamera2External.h" 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h" 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraBufferMaps.h" 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraFlash.h" 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h" 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MAP_TO_DRIVER_COORDINATE(val, base, scale, offset) \ 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((int32_t)val * (int32_t)scale / (int32_t)base + (int32_t)offset) 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_STREAMING_BUFFERS 3 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define EXTRA_ZSL_PREVIEW_STREAM_BUF 2 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_JPEG_ENCODING_BUFFERS 2 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_VIDEO_BUFFERS 9 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_CALLBACK_BUFFERS 5 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_LONGSHOT_STAGES 4 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_CAMERA_BATCH_BUFFERS 6 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_ISP_PING_PONG_BUFFERS 2 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MIN_UNDEQUEUED_BUFFERS 1 // This is required if preview window is not set 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define HDR_CONFIDENCE_THRESHOLD 0.4 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_OPEN_PERF_TIME_OUT 500 // 500 milliseconds 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Very long wait, just to be sure we don't deadlock 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_DEFERRED_THREAD_TIMEOUT 5000000000 // 5 seconds 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_DEFERRED_MAP_BUF_TIMEOUT 2000000000 // 2 seconds 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_MIN_METADATA_BUFFERS 10 // Need at least 10 for ZSL snapshot 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define CAMERA_INITIAL_MAPPABLE_PREVIEW_BUFFERS 5 75d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch#define CAMERA_MAX_PARAM_APPLY_DELAY 3 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern cam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern pthread_mutex_t gCamLock; 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvolatile uint32_t gCamHalLogLevel = 1; 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern uint8_t gNumCameraSessions; 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::sNextJobId = 1; 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincamera_device_ops_t QCamera2HardwareInterface::mCameraOps = { 861687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .set_preview_window = QCamera2HardwareInterface::set_preview_window, 871687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .set_callbacks = QCamera2HardwareInterface::set_CallBacks, 881687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .enable_msg_type = QCamera2HardwareInterface::enable_msg_type, 891687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .disable_msg_type = QCamera2HardwareInterface::disable_msg_type, 901687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .msg_type_enabled = QCamera2HardwareInterface::msg_type_enabled, 911687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 921687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .start_preview = QCamera2HardwareInterface::start_preview, 931687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .stop_preview = QCamera2HardwareInterface::stop_preview, 941687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .preview_enabled = QCamera2HardwareInterface::preview_enabled, 951687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .store_meta_data_in_buffers= QCamera2HardwareInterface::store_meta_data_in_buffers, 961687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 971687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .start_recording = QCamera2HardwareInterface::start_recording, 981687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .stop_recording = QCamera2HardwareInterface::stop_recording, 991687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .recording_enabled = QCamera2HardwareInterface::recording_enabled, 1001687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .release_recording_frame = QCamera2HardwareInterface::release_recording_frame, 1011687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 1021687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .auto_focus = QCamera2HardwareInterface::auto_focus, 1031687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .cancel_auto_focus = QCamera2HardwareInterface::cancel_auto_focus, 1041687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 1051687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .take_picture = QCamera2HardwareInterface::take_picture, 1061687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .cancel_picture = QCamera2HardwareInterface::cancel_picture, 1071687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 1081687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .set_parameters = QCamera2HardwareInterface::set_parameters, 1091687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .get_parameters = QCamera2HardwareInterface::get_parameters, 1101687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .put_parameters = QCamera2HardwareInterface::put_parameters, 1111687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .send_command = QCamera2HardwareInterface::send_command, 1121687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan 1131687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .release = QCamera2HardwareInterface::release, 1141687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .dump = QCamera2HardwareInterface::dump, 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_preview_window 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set preview window. 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @window : window ops table 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::set_preview_window(struct camera_device *device, 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct preview_stream_ops *window) 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d window = %p", hw->getCameraId(), window); 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->processAPI(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW, (void *)window); 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW, &apiResult); 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = apiResult.status; 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_CallBacks 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callbacks for notify and data 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @notify_cb : notify cb 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data_cb : data cb 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data_cb_timestamp : video data cd with timestamp 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @get_memory : ops table for request gralloc memory 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user : user data ptr 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::set_CallBacks(struct camera_device *device, 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_notify_callback notify_cb, 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_callback data_cb, 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_timestamp_callback data_cb_timestamp, 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_request_memory get_memory, 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *user) 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_setcb_payload_t payload; 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.notify_cb = notify_cb; 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.data_cb = data_cb; 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.data_cb_timestamp = data_cb_timestamp; 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.get_memory = get_memory; 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.user = user; 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = hw->processAPI(QCAMERA_SM_EVT_SET_CALLBACKS, (void *)&payload); 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_CALLBACKS, &apiResult); 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : enable_msg_type 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enable certain msg type 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::enable_msg_type(struct camera_device *device, int32_t msg_type) 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = hw->processAPI(QCAMERA_SM_EVT_ENABLE_MSG_TYPE, (void *)&msg_type); 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_ENABLE_MSG_TYPE, &apiResult); 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : disable_msg_type 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: disable certain msg type 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::disable_msg_type(struct camera_device *device, int32_t msg_type) 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = hw->processAPI(QCAMERA_SM_EVT_DISABLE_MSG_TYPE, (void *)&msg_type); 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_DISABLE_MSG_TYPE, &apiResult); 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : msg_type_enabled 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if certain msg type is enabled 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 1 -- enabled 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- not enabled 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::msg_type_enabled(struct camera_device *device, int32_t msg_type) 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_MSG_TYPE_ENABLED, (void *)&msg_type); 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_MSG_TYPE_ENABLED, &apiResult); 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.enabled; 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : prepare_preview 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: prepare preview 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::prepare_preview(struct camera_device *device) 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E PROFILE_PREPARE_PREVIEW camera id %d", 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_enum_t evt = QCAMERA_SM_EVT_PREPARE_PREVIEW; 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(evt, NULL); 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(evt, &apiResult); 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : start_preview 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start preview 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::start_preview(struct camera_device *device) 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_START_PREVIEW camera id %d", 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Release the timed perf lock acquired in openCamera 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_perfLock.lock_rel_timed(); 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_perfLock.lock_acq(); 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_enum_t evt = QCAMERA_SM_EVT_START_PREVIEW; 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->isNoDisplayMode()) { 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin evt = QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW; 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(evt, NULL); 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(evt, &apiResult); 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_bPreviewStarted = true; 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X ret = %d", ret); 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop_preview 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop preview 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::stop_preview(struct camera_device *device) 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_STOP_PREVIEW camera id %d", 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable power Hint for preview 4151687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan hw->m_perfLock.powerHint(POWER_HINT_VIDEO_ENCODE, false); 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_perfLock.lock_acq(); 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_PREVIEW, NULL); 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_STOP_PREVIEW, &apiResult); 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X ret = %d", ret); 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preview_enabled 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if preview is running 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 1 -- running 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- not running 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::preview_enabled(struct camera_device *device) 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_PREVIEW_ENABLED, NULL); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_PREVIEW_ENABLED, &apiResult); 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.enabled; 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //if preview enabled, can enable preview callback send 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(apiResult.enabled) { 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_stateMachine.setPreviewCallbackNeeded(true); 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : store_meta_data_in_buffers 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if need to store meta data in buffers for video frame 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @enable : flag if enable 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::store_meta_data_in_buffers( 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct camera_device *device, int enable) 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS, (void *)&enable); 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS, &apiResult); 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : restart_start_preview 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start preview as part of the restart preview 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::restart_start_preview(struct camera_device *device) 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E camera id %d", hw->getCameraId()); 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_RESTART_START_PREVIEW, NULL); 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_RESTART_START_PREVIEW, &apiResult); 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("This function is not supposed to be called in single-camera mode"); 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = INVALID_OPERATION; 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Preview restart done, update the mPreviewRestartNeeded flag to false. 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->mPreviewRestartNeeded = false; 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X camera id %d", hw->getCameraId()); 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : restart_stop_preview 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop preview as part of the restart preview 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::restart_stop_preview(struct camera_device *device) 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E camera id %d", hw->getCameraId()); 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_RESTART_STOP_PREVIEW, NULL); 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_RESTART_STOP_PREVIEW, &apiResult); 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("This function is not supposed to be called in single-camera mode"); 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = INVALID_OPERATION; 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X camera id %d", hw->getCameraId()); 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : pre_start_recording 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: prepare for the start recording 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::pre_start_recording(struct camera_device *device) 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E PROFILE_PRE_START_RECORDING camera id %d", 61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_PRE_START_RECORDING, NULL); 62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_PRE_START_RECORDING, &apiResult); 62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : start_recording 63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start recording 63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::start_recording(struct camera_device *device) 64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_START_RECORDING camera id %d", 65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to call pre_start_recording in single camera mode. 65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // In dual-cam mode, this control belongs to muxer. 65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pre_start_recording(device); 65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("pre_start_recording failed with ret = %d", ret); 66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_START_RECORDING, NULL); 66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_START_RECORDING, &apiResult); 66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_bRecordStarted = true; 67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X ret = %d", ret); 67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop_recording 68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop recording 68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::stop_recording(struct camera_device *device) 68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_STOP_RECORDING camera id %d", 69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_RECORDING, NULL); 70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_STOP_RECORDING, &apiResult); 70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X ret = %d", ret); 70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : recording_enabled 71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if recording is running 71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 1 -- running 71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- not running 72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::recording_enabled(struct camera_device *device) 72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_RECORDING_ENABLED, NULL); 73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_RECORDING_ENABLED, &apiResult); 73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.enabled; 73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : release_recording_frame 74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return recording frame back 74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @opaque : ptr to frame to be returned 75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::release_recording_frame( 75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct camera_device *device, const void *opaque) 75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!opaque) { 76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! Frame info is NULL"); 76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME, (void *)opaque); 77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME, &apiResult); 77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : auto_focus 78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start auto focus 78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::auto_focus(struct camera_device *device) 79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_INT("Camera:AutoFocus", 1); 79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : E PROFILE_AUTO_FOCUS camera id %d", 80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_START_AUTO_FOCUS, NULL); 80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_START_AUTO_FOCUS, &apiResult); 81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : X ret = %d", ret); 81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancel_auto_focus 82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel auto focus 82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::cancel_auto_focus(struct camera_device *device) 83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : E PROFILE_CANCEL_AUTO_FOCUS camera id %d", 84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_STOP_AUTO_FOCUS, NULL); 84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_STOP_AUTO_FOCUS, &apiResult); 84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : X ret = %d", ret); 85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : pre_take_picture 85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: pre take picture, restart preview if necessary. 85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::pre_take_picture(struct camera_device *device) 86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E PROFILE_PRE_TAKE_PICTURE camera id %d", 87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_PRE_TAKE_PICTURE, NULL); 88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_PRE_TAKE_PICTURE, &apiResult); 88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : take_picture 89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take picture 89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::take_picture(struct camera_device *device) 90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_TAKE_PICTURE camera id %d", 91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw->mLongshotEnabled) { 91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_perfLock.lock_acq(); 91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /** Added support for Retro-active Frames: 92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * takePicture() is called before preparing Snapshot to indicate the 92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-camera-channel to pick up legacy frames even 92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * before LED estimation is triggered. 92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("isLiveSnap %d, isZSL %d, isHDR %d longshot = %d", 92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->isLiveSnapshot(), hw->isZSLMode(), hw->isHDRMode(), 92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->isLongshotEnabled()); 92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check for Retro-active Frames 93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((hw->mParameters.getNumOfRetroSnapshots() > 0) && 93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !hw->isLiveSnapshot() && hw->isZSLMode() && 93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !hw->isHDRMode() && !hw->isLongshotEnabled()) { 93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set Retro Picture Mode 93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->setRetroPicture(1); 93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->m_bLedAfAecLock = 0; 93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Retro Enabled"); 93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to call pre_take_picture in single camera mode. 93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // In dual-cam mode, this control belongs to muxer. 94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pre_take_picture(device); 94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("pre_take_picture failed with ret = %d",ret); 94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Call take Picture for total number of snapshots required. 94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin This includes the number of retro frames and normal frames */ 95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_TAKE_PICTURE, NULL); 95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Wait for retro frames, before calling prepare snapshot 95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Wait for Retro frames to be done"); 95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_TAKE_PICTURE, &apiResult); 95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Unlock API since it is acquired in prepare snapshot seperately */ 95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Prepare snapshot in case LED needs to be flashed */ 96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Start Prepare Snapshot"); 96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->prepare_snapshot(device); 96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->setRetroPicture(0); 96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if prepare snapshot is done 96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw->mPrepSnapRun) { 96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Ignore the status from prepare_snapshot 97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->prepare_snapshot(device); 97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to call pre_take_picture in single camera mode. 97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // In dual-cam mode, this control belongs to muxer. 97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pre_take_picture(device); 97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("pre_take_picture failed with ret = %d",ret); 97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Regardless what the result value for prepare_snapshot, 98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // go ahead with capture anyway. Just like the way autofocus 98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // is handled in capture case 98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* capture */ 98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Capturing normal frames"); 98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_TAKE_PICTURE, NULL); 99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_TAKE_PICTURE, &apiResult); 99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw->isLongshotEnabled()){ 99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // For longshot mode, we prepare snapshot only once 99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->mPrepSnapRun = false; 99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X ret = %d", ret); 100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancel_picture 100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel current take picture request 100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::cancel_picture(struct camera_device *device) 101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_CANCEL_PICTURE camera id %d", 102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_CANCEL_PICTURE, NULL); 103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_CANCEL_PICTURE, &apiResult); 103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X camera id %d ret = %d", hw->getCameraId(), ret); 103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_parameters 104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set camera parameters 104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parms : string of packed parameters 104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::set_parameters(struct camera_device *device, 105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const char *parms) 105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS, (void *)parms); 106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS, &apiResult); 107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to restart (if necessary) after set params 107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // in single camera mode. In dual-cam mode, this control belongs to muxer. 107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ret == NO_ERROR) && hw->getNeedRestart()) { 107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("stopping after param change"); 107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_STOP, NULL); 108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_STOP, &apiResult); 108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("committing param change"); 108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_COMMIT, NULL); 108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_COMMIT, &apiResult); 109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ret == NO_ERROR) && hw->getNeedRestart()) { 109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("restarting after param change"); 109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_RESTART, NULL); 109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_RESTART, &apiResult); 110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d ret %d", hw->getCameraId(), ret); 110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop_after_set_params 111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop after a set param call, if necessary 111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::stop_after_set_params(struct camera_device *device) 112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_STOP, NULL); 113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_STOP, &apiResult); 114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("is not supposed to be called in single-camera mode"); 114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = INVALID_OPERATION; 114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : commit_params 115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: commit after a set param call 115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::commit_params(struct camera_device *device) 116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_COMMIT, NULL); 118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_COMMIT, &apiResult); 118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("is not supposed to be called in single-camera mode"); 118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = INVALID_OPERATION; 118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : restart_after_set_params 119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: restart after a set param call, if necessary 120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::restart_after_set_params(struct camera_device *device) 121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS_RESTART, NULL); 122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS_RESTART, &apiResult); 122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("is not supposed to be called in single-camera mode"); 123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = INVALID_OPERATION; 123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X camera id %d", hw->getCameraId()); 123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : get_parameters 124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera parameters 124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : packed parameters in a string 124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinchar* QCamera2HardwareInterface::get_parameters(struct camera_device *device) 125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char *ret = NULL; 125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = hw->processAPI(QCAMERA_SM_EVT_GET_PARAMS, NULL); 126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_GET_PARAMS, &apiResult); 126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.params; 126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : put_parameters 127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return camera parameters string back to HAL 127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parm : ptr to parameter string to be returned 128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::put_parameters(struct camera_device *device, 128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char *parm) 128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = hw->processAPI(QCAMERA_SM_EVT_PUT_PARAMS, (void *)parm); 129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_PUT_PARAMS, &apiResult); 130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : send_command 130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: command to be executed 130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cmd : cmd to be executed 131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg1 : ptr to optional argument1 131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg2 : ptr to optional argument2 131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::send_command(struct camera_device *device, 132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cmd, 132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t arg1, 132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t arg2) 132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_command_payload_t payload; 133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&payload, 0, sizeof(qcamera_sm_evt_command_payload_t)); 133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.cmd = cmd; 133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.arg1 = arg1; 133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.arg2 = arg2; 134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SEND_COMMAND, (void *)&payload); 134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SEND_COMMAND, &apiResult); 134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : send_command_restart 135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: restart if necessary after a send_command 135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cmd : cmd to be executed 136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg1 : ptr to optional argument1 136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg2 : ptr to optional argument2 136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::send_command_restart(struct camera_device *device, 136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cmd, 137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t arg1, 137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t arg2) 137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_command_payload_t payload; 138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&payload, 0, sizeof(qcamera_sm_evt_command_payload_t)); 138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.cmd = cmd; 138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.arg1 = arg1; 138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.arg2 = arg2; 138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_SEND_COMMAND_RESTART, (void *)&payload); 139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_SEND_COMMAND_RESTART, &apiResult); 139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : release 140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release camera resource 140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::release(struct camera_device *device) 141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE, NULL); 142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE, &apiResult); 142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dump 143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: dump camera status 143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @fd : fd for status to be dumped to 143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::dump(struct camera_device *device, int fd) 144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Log level property is read when "adb shell dumpsys media.camera" is 144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //called so that the log level can be controlled without restarting 144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //media server 145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getLogLevel(); 145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_DUMP, (void *)&fd); 146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_DUMP, &apiResult); 146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : close_camera_device 147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: close camera device 147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::close_camera_device(hw_device_t *hw_dev) 148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>( 149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<camera_device_t *>(hw_dev)->priv); 149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E camera id %d", hw->getCameraId()); 149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X"); 149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : register_face_image 150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: register a face image into imaging lib for face authenticatio/ 150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * face recognition 150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @img_ptr : ptr to image buffer 151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @config : ptr to config about input image, i.e., format, dimension, and etc. 151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : >=0 unique ID of face registerd. 151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * <0 failure. 151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::register_face_image(struct camera_device *device, 151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *img_ptr, 151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_offline_src_config_t *config) 151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_evt_reg_face_payload_t payload; 152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&payload, 0, sizeof(qcamera_sm_evt_reg_face_payload_t)); 153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.img_ptr = img_ptr; 153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload.config = config; 153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_REG_FACE_IMAGE, (void *)&payload); 153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_REG_FACE_IMAGE, &apiResult); 153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.handle; 153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E camera id %d", hw->getCameraId()); 154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : prepare_snapshot 154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: prepares hardware for snapshot 154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @device : ptr to camera device struct 155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::prepare_snapshot(struct camera_device *device) 155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL camera device"); 156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->isLongshotEnabled() && hw->mPrepSnapRun == true) { 156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // For longshot mode, we prepare snapshot only once 156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("prepare snapshot only once "); 157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E PROFILE_PREPARE_SNAPSHOT camera id %d", 157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->getCameraId()); 157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->lockAPI(); 157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Prepare snapshot in case LED needs to be flashed */ 157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw->mFlashNeeded || hw->mParameters.isChromaFlashEnabled()) { 157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Prepare snapshot in case LED needs to be flashed */ 158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = hw->processAPI(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, NULL); 158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->waitAPIResult(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, &apiResult); 158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = apiResult.status; 158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->mPrepSnapRun = true; 158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->unlockAPI(); 158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X, ret: %d", ret); 158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCamera2HardwareInterface 159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera2HardwareInterface 159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cameraId : camera ID 159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 160266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2HardwareInterface::QCamera2HardwareInterface(uint32_t cameraId) 160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin : mCameraId(cameraId), 160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle(NULL), 160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraOpened(false), 160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bRelCamCalibValid(false), 160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewWindow(NULL), 160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMsgEnabled(0), 160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStoreMetaDataInFrame(0), 161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCb(NULL), 161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie(NULL), 161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCallbackCookie(NULL), 161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bMpoEnabled(TRUE), 161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_stateMachine(this), 161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_smThreadActive(true), 161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor(this), 161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_thermalAdapter(QCameraThermalAdapter::getInstance()), 161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier(this), 161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bPreviewStarted(false), 162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bRecordStarted(false), 162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_currentFocusState(CAM_AF_STATE_INACTIVE), 162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpFrmCnt(0U), 162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpSkipCnt(0U), 162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mThermalLevel(QCAMERA_THERMAL_NO_ADJUSTMENT), 162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF(false), 162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_HDRSceneEnabled(false), 162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLongshotEnabled(false), 162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLiveSnapshotThread(0), 162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIntPicThread(0), 163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mFlashNeeded(false), 163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeviceRotation(0U), 163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCaptureRotation(0U), 163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegExifRotation(0U), 163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mUseJpegExifRotation(false), 163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIs3ALocked(false), 163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPrepSnapRun(false), 163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mZoomLevel(0), 163866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewRestartNeeded(false), 163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVFrameCount(0), 164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVLastFrameCount(0), 164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVLastFpsTime(0), 164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVFps(0), 164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPFrameCount(0), 164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPLastFrameCount(0), 164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPLastFpsTime(0), 164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPFps(0), 1647d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mInstantAecFrameCount(0), 164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIntJpegEvtPending(false), 164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIntRawEvtPending(false), 165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mReprocJob(0), 165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegJob(0), 165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMetadataAllocJob(0), 165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mInitPProcJob(0), 165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParamAllocJob(0), 165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParamInitJob(0), 165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOutputCount(0), 165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mInputCount(0), 165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mAdvancedCaptureConfigured(false), 165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHDRBracketingEnabled(false), 166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumPreviewFaces(-1), 166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle(0), 166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegHandleOwner(false), 166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMetadataMem(NULL), 166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCACDoneReceived(false), 1665d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_bNeedRestart(false) 166666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mFaceRect, -1, sizeof(mFaceRect)); 166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getLogLevel(); 167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraDevice.common.version = HARDWARE_DEVICE_API_VERSION(1, 0); 167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraDevice.common.close = close_camera_device; 167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraDevice.ops = &mCameraOps; 167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraDevice.priv = this; 167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&m_lock, NULL); 167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_init(&m_cond, NULL); 168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_apiResultList = NULL; 168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&m_evtLock, NULL); 168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_init(&m_evtCond, NULL); 168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&m_evtResult, 0, sizeof(qcamera_api_result_t)); 168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&m_int_lock, NULL); 168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_init(&m_int_cond, NULL); 169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(m_channels, 0, sizeof(m_channels)); 169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mExifParams, 0, sizeof(mm_jpeg_exif_params_t)); 169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(m_BackendFileName, 0, QCAMERA_MAX_FILEPATH_LENGTH); 169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(mDefOngoingJobs, 0, sizeof(mDefOngoingJobs)); 169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegMetadata, 0, sizeof(mJpegMetadata)); 169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegMpoHandle, 0, sizeof(mJpegMpoHandle)); 170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeferredWorkThread.launch(deferredWorkRoutine, this); 170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeferredWorkThread.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, FALSE); 170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_init(); 170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&mGrallocLock, NULL); 170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mEnqueuedBuffers = 0; 1708d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipStart = 0; 1709d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipEnd = 0; 1710d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mLastPreviewFrameID = 0; 171166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 171266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Load and read GPU library. 171366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lib_surface_utils = NULL; 171466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LINK_get_surface_pixel_alignment = NULL; 171566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mSurfaceStridePadding = CAM_PAD_TO_32; 171666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lib_surface_utils = dlopen("libadreno_utils.so", RTLD_NOW); 171766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (lib_surface_utils) { 171866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *(void **)&LINK_get_surface_pixel_alignment = 171966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dlsym(lib_surface_utils, "get_gpu_pixel_alignment"); 172066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (LINK_get_surface_pixel_alignment) { 172166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mSurfaceStridePadding = LINK_get_surface_pixel_alignment(); 172266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 172366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dlclose(lib_surface_utils); 172466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 172566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 172666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 172766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 172866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCamera2HardwareInterface 172966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 173066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera2HardwareInterface 173166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 173266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 173366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 173466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 173566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 173666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2HardwareInterface::~QCamera2HardwareInterface() 173766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 173866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 173966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeferredWorkThread.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, TRUE, TRUE); 174166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeferredWorkThread.exit(); 174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mMetadataMem != NULL) { 174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mMetadataMem; 174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMetadataMem = NULL; 174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_acq(); 174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_smThreadActive = false; 175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_stateMachine.releaseThread(); 175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin closeCamera(); 175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_deinit(); 175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&m_lock); 175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_destroy(&m_cond); 175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&m_evtLock); 175966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_destroy(&m_evtCond); 176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&m_int_lock); 176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_destroy(&m_int_cond); 176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&mGrallocLock); 176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X"); 176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : deferPPInit 176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Queue postproc init task to deferred thread 177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : uint32_t job id of pproc init job 177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- failure 177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::deferPPInit() 177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // init pproc 177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferPProcInitArgs pprocInitArgs; 178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(DeferWorkArgs)); 178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&pprocInitArgs, 0, sizeof(DeferPProcInitArgs)); 178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pprocInitArgs.jpeg_cb = jpegEvtHandle; 178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pprocInitArgs.user_data = this; 178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args.pprocInitArgs = pprocInitArgs; 178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return queueDeferredWork(CMD_DEF_PPROC_INIT, 179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args); 179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : openCamera 179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open camera 179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : double ptr for camera device struct 180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device) 180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCameraOpened) { 181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *hw_device = NULL; 181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Permission Denied"); 181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return PERMISSION_DENIED; 181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_OPEN_CAMERA camera id %d", 181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId); 181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_acq_timed(CAMERA_OPEN_PERF_TIME_OUT); 181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = openCamera(); 181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR){ 181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *hw_device = &mCameraDevice.common; 182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_thermalAdapter.init(this) != 0) { 182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Init thermal adapter failed"); 182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *hw_device = NULL; 182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X PROFILE_OPEN_CAMERA camera id %d, rc: %d", 182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId, rc); 182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : openCamera 183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open camera 183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::openCamera() 184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCameraHandle) { 185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failure: Camera already opened"); 185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ALREADY_EXISTS; 185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCameraFlash::getInstance().reserveFlashForCamera(mCameraId); 185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to reserve flash for camera id: %d", 185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId); 185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // alloc param buffer 186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(args)); 186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParamAllocJob = queueDeferredWork(CMD_DEF_PARAM_ALLOC, args); 186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParamAllocJob == 0) { 186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed queueing PARAM_ALLOC job"); 186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (gCamCapability[mCameraId] != NULL) { 187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // allocate metadata buffers 187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferMetadataAllocArgs metadataAllocArgs; 187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(args)); 187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&metadataAllocArgs, 0, sizeof(metadataAllocArgs)); 187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t padding = 187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[mCameraId]->padding_info.plane_padding; 188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadataAllocArgs.size = PAD_TO_SIZE(sizeof(metadata_buffer_t), 188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding); 188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadataAllocArgs.bufferCnt = CAMERA_MIN_METADATA_BUFFERS; 188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args.metadataAllocArgs = metadataAllocArgs; 188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMetadataAllocJob = queueDeferredWork(CMD_DEF_METADATA_ALLOC, args); 188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mMetadataAllocJob == 0) { 188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate metadata buffer"); 188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -ENOMEM; 188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto error_exit1; 189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = camera_open((uint8_t)mCameraId, &mCameraHandle); 189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc) { 189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera_open failed. rc = %d, mCameraHandle = %p", 189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc, mCameraHandle); 189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto error_exit2; 189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle, 190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camEvtHandle, 190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *) this); 190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Capabilities not inited, initializing now."); 190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = camera_open((uint8_t)mCameraId, &mCameraHandle); 190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc) { 190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera_open failed. rc = %d, mCameraHandle = %p", 190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc, mCameraHandle); 190966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto error_exit2; 191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(NO_ERROR != initCapabilities(mCameraId,mCameraHandle)) { 191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("initCapabilities failed."); 191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = UNKNOWN_ERROR; 191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto error_exit3; 191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle, 191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camEvtHandle, 192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *) this); 192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Init params in the background 192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 1. It's safe to queue init job, even if alloc job is not yet complete. 192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // It will be queued to the same thread, so the alloc is guaranteed to 192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // finish first. 192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 2. However, it is not safe to begin param init until after camera is 192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // open. That is why we wait until after camera open completes to schedule 192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // this task. 193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(args)); 193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParamInitJob = queueDeferredWork(CMD_DEF_PARAM_INIT, args); 193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParamInitJob == 0) { 193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed queuing PARAM_INIT job"); 193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -ENOMEM; 193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto error_exit3; 193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraOpened = true; 193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Notify display HAL that a camera session is active. 194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //But avoid calling the same during bootup because camera service might open/close 194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //cameras at boot time during its initialization and display service will also internally 194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //wait for camera service to initialize first while calling this display API, resulting in a 194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //deadlock situation. Since boot time camera open/close calls are made only to fetch 194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //capabilities, no need of this display bw optimization. 194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Use "service.bootanim.exit" property to know boot status. 194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("service.bootanim.exit", value, "0"); 194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (atoi(value) == 1) { 194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&gCamLock); 195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (gNumCameraSessions++ == 0) { 195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setCameraLaunchStatus(true); 195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&gCamLock); 195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror_exit3: 195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mJpegClientHandle) { 196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin deinitJpegHandle(); 196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle = NULL; 196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror_exit2: 196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mMetadataAllocJob); 196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinerror_exit1: 196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mParamAllocJob); 196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : bundleRelatedCameras 197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: bundle cameras to enable syncing of cameras 197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @sync :indicates whether syncing is On or Off 197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @sessionid :session id for other camera session 198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 198266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::bundleRelatedCameras(bool syncOn, 198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t sessionid) 198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("bundleRelatedCameras sync %d with sessionid %d", 198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin syncOn, sessionid); 199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = mParameters.bundleRelatedCameras(syncOn, sessionid); 199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("bundleRelatedCameras failed %d", rc); 199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getCameraSessionId 200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: gets the backend session Id of this HWI instance 200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @sessionid : pointer to the output session id 200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::getCameraSessionId(uint32_t* session_id) 201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 201566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(session_id != NULL) { 201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mCameraHandle->ops->get_session_id(mCameraHandle->camera_handle, 201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin session_id); 201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Getting Camera Session Id %d", *session_id); 201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Session Id is Null"); 202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getRelatedCamSyncInfo 202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:returns the related cam sync info for this HWI instance 203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :none 203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : const pointer to cam_sync_related_sensors_event_info_t 203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinconst cam_sync_related_sensors_event_info_t* 203666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface::getRelatedCamSyncInfo(void) 203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.getRelatedCamSyncInfo(); 203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setRelatedCamSyncInfo 204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:sets the related cam sync info for this HWI instance 204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : ptr to related cam info parameters 204866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 204966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 205066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 205166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 205266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 205366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setRelatedCamSyncInfo( 205466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sync_related_sensors_event_info_t* info) 205566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 205666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(info) { 205766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.setRelatedCamSyncInfo(info); 205866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 205966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_TYPE; 206066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 206166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 206266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 206366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 206466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getMpoComposition 206566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 206666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:function to retrieve whether Mpo composition should be enabled 206766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * or not 206866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 206966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :none 207066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 207166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool indicates whether mpo composition is enabled or not 207266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 207366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::getMpoComposition(void) 207466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 207566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MpoComposition:%d ", m_bMpoEnabled); 207666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_bMpoEnabled; 207766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 207866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 207966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 208066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setMpoComposition 208166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 208266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:set if Mpo composition should be enabled for this HWI instance 208366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 208466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 208566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @enable : indicates whether Mpo composition enabled or not 208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setMpoComposition(bool enable) 209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // By default set Mpo composition to disable 209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bMpoEnabled = false; 209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Enable Mpo composition only if 209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 1) frame sync is ON between two cameras and 209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 2) any advanced features are not enabled (AOST features) and 209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 3) not in recording mode (for liveshot case) 210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 4) flash is not needed 210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) && 210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.isAdvCamFeaturesEnabled() && 210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.getRecordingHintValue() && 210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mFlashNeeded && 210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !isLongshotEnabled()) { 210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bMpoEnabled = enable; 210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MpoComposition:%d ", m_bMpoEnabled); 210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_TYPE; 211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getRecordingHintValue 211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:function to retrieve recording hint value 211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :none 212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool indicates whether recording hint is enabled or not 212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::getRecordingHintValue(void) 212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.getRecordingHintValue(); 212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setRecordingHintValue 213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:set recording hint value 213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @enable : video hint value 213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setRecordingHintValue(int32_t value) 214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.updateRecordingHintValue(value); 214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : closeCamera 214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: close camera 214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::closeCamera() 215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i; 216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E"); 216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mCameraOpened) { 216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: E PROFILE_CLOSE_CAMERA camera id %d", 216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId); 216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // set open flag to false 216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraOpened = false; 217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Reset Stream config info 217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setStreamConfigure(false, false, true); 217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // deinit Parameters 217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.deinit(); 217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // exit notifier 217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier.exit(); 217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop and deinit postprocessor 218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mReprocJob); 218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Close the JPEG session 218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mJpegJob); 218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin deinitJpegHandle(); 218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.deinit(); 218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mInitPProcJob = 0; // reset job id, so pproc can be reinited later 218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_thermalAdapter.deinit(); 219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // delete all channels if not already deleted 219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[i] != NULL) { 219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[i]->stop(); 219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[i]; 219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[i] = NULL; 219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //free all pending api results here 220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(m_apiResultList != NULL) { 220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResultList = m_apiResultList; 220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResultListNext; 220466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (apiResultList != NULL) { 220566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultListNext = apiResultList->next; 220666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(apiResultList); 220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultList = apiResultListNext; 220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle = NULL; 221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Notify display HAL that there is no active camera session 221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //but avoid calling the same during bootup. Refer to openCamera 221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //for more details. 221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("service.bootanim.exit", value, "0"); 221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (atoi(value) == 1) { 221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&gCamLock); 222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (--gNumCameraSessions == 0) { 222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setCameraLaunchStatus(false); 222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&gCamLock); 222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mExifParams.debug_params) { 222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(mExifParams.debug_params); 222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mExifParams.debug_params = NULL; 222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (QCameraFlash::getInstance().releaseFlashFromCamera(mCameraId) != 0) { 223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Failed to release flash for camera id: %d", 223366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId); 223466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: X PROFILE_CLOSE_CAMERA camera id %d, rc: %d", 223766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId, rc); 223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : initCapabilities 224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialize camera capabilities in static data struct 224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cameraId : camera Id 225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 225466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::initCapabilities(uint32_t cameraId, 225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_vtbl_t *cameraHandle) 225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 226166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *capabilityHeap = NULL; 226266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Allocate memory for capability buffer */ 226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin capabilityHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE); 226566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), NON_SECURE); 226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc != OK) { 226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for cappability"); 226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto allocate_failed; 226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Map memory for capability buffer */ 227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type_list bufMapList; 227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCameraBufferMaps::makeSingletonBufMapList( 227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_MAPPING_BUF_TYPE_CAPABILITY, 227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0 /*stream id*/, 0 /*buffer index*/, -1 /*plane index*/, 227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0 /*cookie*/, capabilityHeap->getFd(0), sizeof(cam_capability_t), 227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufMapList); 228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = cameraHandle->ops->map_bufs(cameraHandle->camera_handle, 228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &bufMapList); 228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc < 0) { 228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to map capability buffer"); 228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto map_failed; 228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Query Capability */ 229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc < 0) { 229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to query capability"); 229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto query_failed; 229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[cameraId] = 229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_capability_t *)malloc(sizeof(cam_capability_t)); 229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gCamCapability[cameraId]) { 230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("out of memory"); 230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto query_failed; 230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(cam_capability_t)); 230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[cameraId]->analysis_padding_info.offset_info.offset_x = 0; 230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[cameraId]->analysis_padding_info.offset_info.offset_y = 0; 230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_ERROR; 231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinquery_failed: 231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_MAPPING_BUF_TYPE_CAPABILITY); 231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmap_failed: 231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin capabilityHeap->deallocate(); 231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete capabilityHeap; 231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinallocate_failed: 231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getCapabilities 232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera capabilities 232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cameraId : camera Id 232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : camera info struct to be filled in with camera capabilities 232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int type of status 233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::getCapabilities(uint32_t cameraId, 233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct camera_info *info, cam_sync_type_t *p_cam_type) 233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct camera_info *p_info = NULL; 234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&gCamLock); 234166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin p_info = get_cam_info(cameraId, p_cam_type); 234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin p_info->device_version = CAMERA_DEVICE_API_VERSION_1_0; 234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin p_info->static_camera_characteristics = NULL; 234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(info, p_info, sizeof (struct camera_info)); 234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&gCamLock); 234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getCamHalCapabilities 235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the HAL capabilities structure 235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cameraId : camera Id 235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : capability structure of respective camera 235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincam_capability_t* QCamera2HardwareInterface::getCamHalCapabilities() 236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return gCamCapability[mCameraId]; 236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getBufNumRequired 236766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return number of stream buffers needed for given stream type 236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : type of stream 237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : number of buffers needed 237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_type) 237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int bufferCnt = 0; 237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minCaptureBuffers = mParameters.getNumOfSnapshots(); 237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool raw_yuv = false; 238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int persist_cnt = 0; 238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int zslQBuffers = mParameters.getZSLQueueDepth(); 238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minCircularBufNum = mParameters.getMaxUnmatchedFramesInQueue() + 238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_MIN_JPEG_ENCODING_BUFFERS; 238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int maxStreamBuf = minCaptureBuffers + mParameters.getMaxUnmatchedFramesInQueue() + 238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc() + 239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXTRA_ZSL_PREVIEW_STREAM_BUF; 239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minUndequeCount = 0; 239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!isNoDisplayMode()) { 239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mPreviewWindow != NULL) { 239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPreviewWindow->get_min_undequeued_buffer_count(mPreviewWindow,&minUndequeCount) 239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin != 0) { 239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("get_min_undequeued_buffer_count failed"); 240066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //TODO: hardcoded because MIN_UNDEQUEUED_BUFFERS not defined 240166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //minUndequeCount = BufferQueue::MIN_UNDEQUEUED_BUFFERS; 240266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minUndequeCount = MIN_UNDEQUEUED_BUFFERS; 240366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 240466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 240566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //preview window might not be set at this point. So, query directly 240666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //from BufferQueue implementation of gralloc buffers. 240766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //minUndequeCount = BufferQueue::MIN_UNDEQUEUED_BUFFERS; 240866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //hardcoded because MIN_UNDEQUEUED_BUFFERS not defined. REVISIT 240966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minUndequeCount = MIN_UNDEQUEUED_BUFFERS; 241066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 241166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (minUndequeCount != MIN_UNDEQUEUED_BUFFERS) { 241266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // minUndequeCount from valid preview window != hardcoded MIN_UNDEQUEUED_BUFFERS 241366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // and so change the MACRO as per minUndequeCount 241466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("WARNING : minUndequeCount(%d) != hardcoded value(%d)", 241566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minUndequeCount, MIN_UNDEQUEUED_BUFFERS); 241666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 241766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 241866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 241966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("minCaptureBuffers = %d zslQBuffers = %d minCircularBufNum = %d" 242066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "maxStreamBuf = %d minUndequeCount = %d", 242166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minCaptureBuffers, zslQBuffers, minCircularBufNum, 242266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxStreamBuf, minUndequeCount); 242366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Get buffer count for the particular stream type 242466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (stream_type) { 242566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_PREVIEW: 242666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 242766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode()) { 242866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // We need to add two extra streming buffers to add 242966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flexibility in forming matched super buf in ZSL queue. 243066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // with number being 'zslQBuffers + minCircularBufNum' 243166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we see preview buffers sometimes get dropped at CPP 243266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // and super buf is not forming in ZSL Q for long time. 243366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 243466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum + 243566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc() + 243666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForPreview() + 243766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded(); 243866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 243966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_STREAMING_BUFFERS + 244066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getMaxUnmatchedFramesInQueue() + 244166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForPreview(); 244266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 244366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ISP allocates native preview buffers and so reducing same from HAL allocation 244466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > CAMERA_ISP_PING_PONG_BUFFERS ) 244566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt -= CAMERA_ISP_PING_PONG_BUFFERS; 244666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2447d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mParameters.getRecordingHintValue() == true) 2448d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bufferCnt += EXTRA_ZSL_PREVIEW_STREAM_BUF; 2449d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Add the display minUndequeCount count on top of camera requirement 245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt += minUndequeCount; 245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.preview_yuv", value, "0"); 245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin persist_cnt = atoi(value); 245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((persist_cnt < CAM_MAX_NUM_BUFS_PER_STREAM) 245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (bufferCnt < persist_cnt)) { 245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = persist_cnt; 245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_POSTVIEW: 246266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 246366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = minCaptureBuffers + 246466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getMaxUnmatchedFramesInQueue() + 246566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 246666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 246766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > maxStreamBuf) { 247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = maxStreamBuf; 247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt += minUndequeCount; 247366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_SNAPSHOT: 247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode() || mLongshotEnabled) { 247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((minCaptureBuffers == 1 || mParameters.isUbiRefocus()) && 247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mLongshotEnabled) { 248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Single ZSL snapshot case 248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + CAMERA_MIN_STREAMING_BUFFERS + 248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ZSL Burst or Longshot case 248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum + 248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 248966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getSensorType() == CAM_SENSOR_YUV && bufferCnt > CAMERA_ISP_PING_PONG_BUFFERS) { 249066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //ISP allocates native buffers in YUV case 249166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt -= CAMERA_ISP_PING_PONG_BUFFERS; 249266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 249366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 249466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = minCaptureBuffers + 249566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 249666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 249766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 249866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 249966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > maxStreamBuf) { 250066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = maxStreamBuf; 250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_RAW: 250666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw_yuv", value, "0"); 250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_yuv = atoi(value) > 0 ? true : false; 250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isRdiMode() || raw_yuv) { 251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum; 251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isZSLMode()) { 251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum; 251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getSensorType() == CAM_SENSOR_YUV && bufferCnt > CAMERA_ISP_PING_PONG_BUFFERS) { 251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //ISP allocates native buffers in YUV case 251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt -= CAMERA_ISP_PING_PONG_BUFFERS; 251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = minCaptureBuffers + 252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > maxStreamBuf) { 252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = maxStreamBuf; 252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.preview_raw", value, "0"); 253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin persist_cnt = atoi(value); 253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((persist_cnt < CAM_MAX_NUM_BUFS_PER_STREAM) 253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (bufferCnt < persist_cnt)) { 253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = persist_cnt; 253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.video_raw", value, "0"); 253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin persist_cnt = atoi(value); 253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((persist_cnt < CAM_MAX_NUM_BUFS_PER_STREAM) 253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (bufferCnt < persist_cnt)) { 253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = persist_cnt; 254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_VIDEO: 254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getBufBatchCount()) { 254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Video Buffer in case of HFR or camera batching.. 254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_CAMERA_BATCH_BUFFERS; 254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.getVideoBatchSize()) { 254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Video Buffer count only for HAL to HAL batching. 255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = (CAMERA_MIN_VIDEO_BATCH_BUFFERS 255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mParameters.getVideoBatchSize()); 255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt < CAMERA_MIN_VIDEO_BUFFERS) { 255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_VIDEO_BUFFERS; 255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // No batching enabled. 255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_VIDEO_BUFFERS; 255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt += mParameters.getNumOfExtraBuffersForVideo(); 256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //if its 4K encoding usecase, then add extra buffer 256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_VIDEO, dim); 256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is4k2kResolution(&dim)) { 256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //get additional buffer count 256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("vidc.enc.dcvs.extra-buff-count", value, "0"); 256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt += atoi(value); 256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_METADATA: 257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode()) { 257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // MetaData buffers should be >= (Preview buffers-minUndequeCount) 257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum + 257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc() + 257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXTRA_ZSL_PREVIEW_STREAM_BUF; 258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = minCaptureBuffers + 258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDRInBufsIfNeeded() - 258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraHDROutBufsIfNeeded() + 258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getMaxUnmatchedFramesInQueue() + 258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_MIN_STREAMING_BUFFERS + 258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getNumOfExtraBuffersForImageProc(); 258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > zslQBuffers + minCircularBufNum) { 258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = zslQBuffers + minCircularBufNum; 259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAMERA_MIN_METADATA_BUFFERS > bufferCnt) { 259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_METADATA_BUFFERS; 259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_OFFLINE_PROC: 259866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 259966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = minCaptureBuffers; 260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // One of the ubifocus buffers is miscellaneous buffer 260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUbiRefocus()) { 260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt -= 1; 260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mLongshotEnabled) { 260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = mParameters.getLongshotStages(); 260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_CALLBACK: 261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = CAMERA_MIN_CALLBACK_BUFFERS; 261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_ANALYSIS: 261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_DEFAULT: 261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_MAX: 261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = 0; 261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Buffer count = %d for stream type = %d", bufferCnt, stream_type); 262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAM_MAX_NUM_BUFS_PER_STREAM < bufferCnt) { 262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Buffer count %d for stream type %d exceeds limit %d", 262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt, stream_type, CAM_MAX_NUM_BUFS_PER_STREAM); 262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return CAM_MAX_NUM_BUFS_PER_STREAM; 262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (uint8_t)bufferCnt; 262866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 263166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : allocateStreamBuf 263266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 263366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: alocate stream buffers 263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : type of stream 263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @size : size of buffer 263866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stride : stride of buffer 263966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @scanline : scanline of buffer 264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bufferCnt : [IN/OUT] minimum num of buffers to be allocated. 264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * could be modified during allocation if more buffers needed 264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a memory obj that holds stream buffers. 264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NULL if failed 264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 264666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraMemory *QCamera2HardwareInterface::allocateStreamBuf( 264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type, size_t size, int stride, int scanline, 264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t &bufferCnt) 264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *mem = NULL; 265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bCachedMem = QCAMERA_ION_USE_CACHE; 265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bPoolMem = false; 265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.mem.usepool", value, "1"); 265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (atoi(value) == 1) { 265766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bPoolMem = true; 265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Allocate stream buffer memory object 266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (stream_type) { 266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_PREVIEW: 266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isNoDisplayMode()) { 266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = new QCameraStreamMemory(mGetMemory, 266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bCachedMem, 266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (bPoolMem) ? &m_memoryPool : NULL, 266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type); 266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minFPS, maxFPS; 267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *grallocMemory = 267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new QCameraGrallocMemory(mGetMemory); 267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(stream_type, dim); 267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* we are interested only in maxfps here */ 267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPreviewFpsRange(&minFPS, &maxFPS); 267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int usage = 0; 267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUBWCEnabled()) { 268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt); 268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) { 268366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin usage = GRALLOC_USAGE_PRIVATE_ALLOC_UBWC ; 268466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 268566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 268666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (grallocMemory) { 268766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin grallocMemory->setMappable( 268866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_INITIAL_MAPPABLE_PREVIEW_BUFFERS); 268966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin grallocMemory->setWindowInfo(mPreviewWindow, 269066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dim.width,dim.height, stride, scanline, 269166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPreviewHalPixelFormat(), 269266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxFPS, usage); 269366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&mGrallocLock); 269466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > CAMERA_INITIAL_MAPPABLE_PREVIEW_BUFFERS) { 269566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mEnqueuedBuffers = (bufferCnt - 269666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_INITIAL_MAPPABLE_PREVIEW_BUFFERS); 269766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 269866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mEnqueuedBuffers = 0; 269966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&mGrallocLock); 270166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = grallocMemory; 270366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 270666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_POSTVIEW: 270766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 270866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isNoDisplayMode() || isPreviewRestartEnabled()) { 270966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = new QCameraStreamMemory(mGetMemory, bCachedMem); 271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minFPS, maxFPS; 271366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *grallocMemory = 271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new QCameraGrallocMemory(mGetMemory); 271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(stream_type, dim); 271766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* we are interested only in maxfps here */ 271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPreviewFpsRange(&minFPS, &maxFPS); 271966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (grallocMemory) { 272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin grallocMemory->setWindowInfo(mPreviewWindow, dim.width, 272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dim.height, stride, scanline, 272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPreviewHalPixelFormat(), maxFPS); 272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = grallocMemory; 272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_ANALYSIS: 272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_SNAPSHOT: 273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_RAW: 273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_OFFLINE_PROC: 273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = new QCameraStreamMemory(mGetMemory, 273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bCachedMem, 273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (bPoolMem) ? &m_memoryPool : NULL, 273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type); 273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_METADATA: 273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mMetadataMem == NULL) { 274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = new QCameraMetadataStreamMemory(QCAMERA_ION_USE_CACHE); 274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = mMetadataMem; 274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMetadataMem = NULL; 274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t numAdditionalBuffers = bufferCnt - mem->getCnt(); 274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (numAdditionalBuffers > 0) { 274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mem->allocateMore(numAdditionalBuffers, size); 274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate additional buffers, " 275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "but attempting to proceed."); 275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = mem->getCnt(); 275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // The memory is already allocated and initialized, so 275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply return here. 275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mem; 275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 276066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_VIDEO: 276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Use uncached allocation by default 276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isVideoBuffersCached() || mParameters.isSeeMoreEnabled() || 276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isHighQualityNoiseReductionMode()) { 276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bCachedMem = QCAMERA_ION_USE_CACHE; 276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bCachedMem = QCAMERA_ION_USE_NOCACHE; 276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoMemory *videoMemory = NULL; 277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getVideoBatchSize()) { 277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin videoMemory = new QCameraVideoMemory( 277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mGetMemory, FALSE, QCAMERA_MEM_TYPE_BATCH); 277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (videoMemory == NULL) { 277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Out of memory for video batching obj"); 277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* 278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * numFDs = BATCH size 278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * numInts = 5 // OFFSET, SIZE, USAGE, TIMESTAMP, FORMAT 278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = videoMemory->allocateMeta( 278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_MIN_VIDEO_BATCH_BUFFERS, 278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getVideoBatchSize(), 278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin VIDEO_METADATA_NUM_INTS); 278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 278866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete videoMemory; 278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 279066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 279266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin videoMemory = 279366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new QCameraVideoMemory(mGetMemory, bCachedMem); 279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (videoMemory == NULL) { 279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Out of memory for video obj"); 279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int usage = 0; 280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_VIDEO,fmt); 280366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUBWCEnabled() && (fmt == CAM_FORMAT_YUV_420_NV12_UBWC)) { 280466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin usage = private_handle_t::PRIV_FLAGS_UBWC_ALIGNED; 280566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 280666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin videoMemory->setVideoInfo(usage, fmt); 280766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = videoMemory; 280866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 280966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 281066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_CALLBACK: 281166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = new QCameraStreamMemory(mGetMemory, 281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bCachedMem, 281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (bPoolMem) ? &m_memoryPool : NULL, 281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type); 281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_DEFAULT: 281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_MAX: 281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mem) { 282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > 0) { 282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isSecureMode() && 282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (stream_type == CAM_STREAM_TYPE_RAW) && 282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mParameters.isRdiMode())) { 282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Allocating %d secure buffers of size %d ", bufferCnt, size); 283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mem->allocate(bufferCnt, size, SECURE); 283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mem->allocate(bufferCnt, size, NON_SECURE); 283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mem; 283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = mem->getCnt(); 283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("rc = %d type = %d count = %d size = %d cache = %d, pool = %d", 284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc, stream_type, bufferCnt, size, bCachedMem, bPoolMem); 284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mem; 284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : allocateMoreStreamBuf 284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: alocate more stream buffers from the memory object 284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mem_obj : memory object ptr 285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @size : size of buffer 285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bufferCnt : [IN/OUT] additional number of buffers to be allocated. 285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * output will be the number of total buffers 285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::allocateMoreStreamBuf( 286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *mem_obj, size_t size, uint8_t &bufferCnt) 286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 286466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufferCnt > 0) { 286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mem_obj->allocateMore(bufferCnt, size); 286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufferCnt = mem_obj->getCnt(); 286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : allocateMiscBuf 287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: alocate miscellaneous buffer 287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamInfo : stream info 287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a memory obj that holds stream info buffer. 288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NULL if failed 288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 288366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraHeapMemory *QCamera2HardwareInterface::allocateMiscBuf( 288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfo) 288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t bufNum = 0; 288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t bufSize = 0; 288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *miscBuf = NULL; 289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t feature_mask = 289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask; 289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (streamInfo->stream_type) { 289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_OFFLINE_PROC: 289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAM_QCOM_FEATURE_TRUEPORTRAIT & feature_mask) { 289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufNum = 1; 289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufSize = mParameters.getTPMaxMetaSize(); 289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (CAM_QCOM_FEATURE_REFOCUS & feature_mask) { 289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufNum = 1; 290066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufSize = mParameters.getRefocusMaxMetaSize(); 290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bufNum && bufSize) { 290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin miscBuf = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE); 290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!miscBuf) { 291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to allocate miscBuf object"); 291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = miscBuf->allocate(bufNum, bufSize, NON_SECURE); 291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 291766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate misc buffer memory"); 291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete miscBuf; 291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return miscBuf; 292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : allocateStreamInfoBuf 292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: alocate stream info buffer 293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : type of stream 293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a memory obj that holds stream info buffer. 293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NULL if failed 293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 293766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraHeapMemory *QCamera2HardwareInterface::allocateStreamInfoBuf( 293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type) 293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool raw_yuv = false; 294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *streamInfoBuf = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE); 294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!streamInfoBuf) { 294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("allocateStreamInfoBuf: Unable to allocate streamInfo object"); 294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = streamInfoBuf->allocate(1, sizeof(cam_stream_info_t), NON_SECURE); 295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("allocateStreamInfoBuf: Failed to allocate stream info memory"); 295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete streamInfoBuf; 295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfo = (cam_stream_info_t *)streamInfoBuf->getPtr(0); 295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(streamInfo, 0, sizeof(cam_stream_info_t)); 295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->stream_type = stream_type; 296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getStreamFormat(stream_type, streamInfo->fmt); 296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getStreamDimension(stream_type, streamInfo->dim); 296266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getStreamRotation(stream_type, streamInfo->pp_config, streamInfo->dim); 296366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_bufs = getBufNumRequired(stream_type); 296466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_secure = NON_SECURE; 296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (stream_type) { 296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_SNAPSHOT: 296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mParameters.isZSLMode() && mParameters.getRecordingHintValue() != true) || 297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLongshotEnabled) { 297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_of_burst = (uint8_t) 297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mParameters.getNumOfSnapshots() 297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + mParameters.getNumOfExtraHDRInBufsIfNeeded() 297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin - mParameters.getNumOfExtraHDROutBufsIfNeeded() 297866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + mParameters.getNumOfExtraBuffersForImageProc()); 297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_RAW: 298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw_yuv", value, "0"); 298366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_yuv = atoi(value) > 0 ? true : false; 298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mParameters.isZSLMode()) || (isRdiMode()) || (raw_yuv)) { 298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 298766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 298866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_of_burst = mParameters.getNumOfSnapshots(); 298966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 299066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isSecureMode() && mParameters.isRdiMode()) { 299166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_secure = SECURE; 299266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 299366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_secure = NON_SECURE; 299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_POSTVIEW: 299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mLongshotEnabled) { 299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_of_burst = (uint8_t)(mParameters.getNumOfSnapshots() 300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + mParameters.getNumOfExtraHDRInBufsIfNeeded() 300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin - mParameters.getNumOfExtraHDROutBufsIfNeeded() 300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + mParameters.getNumOfExtraBuffersForImageProc()); 300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_VIDEO: 300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dis_enable = mParameters.isDISEnabled(); 300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getBufBatchCount()) { 301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Update stream info structure with batch mode info 301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_BATCH; 301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->user_buf_info.frame_buf_cnt = mParameters.getBufBatchCount(); 301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->user_buf_info.size = 301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(sizeof(struct msm_camera_user_buf_cont_t)); 301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_fps_range_t pFpsRange; 301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getHfrFps(pFpsRange); 301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->user_buf_info.frameInterval = 301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (long)((1000/pFpsRange.video_max_fps) * 1000); 301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Video Batch Count = %d, interval = %d", 302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->user_buf_info.frame_buf_cnt, 302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->user_buf_info.frameInterval); 302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_PREVIEW: 302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getRecordingHintValue()) { 302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isDISEnabled()) { 302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_type = mParameters.getISType(); 302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_type = IS_TYPE_NONE; 302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isSecureMode()) { 303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->is_secure = SECURE; 303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_ANALYSIS: 303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->noFrameExpected = 1; 303766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Update feature mask 304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updatePpFeatureMask(stream_type); 304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Get feature mask 304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamPpMask(stream_type, streamInfo->pp_config.feature_mask); 304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Update pp config 304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->pp_config.feature_mask & CAM_QCOM_FEATURE_FLIP) { 305066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int flipMode = mParameters.getFlipMode(stream_type); 305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (flipMode > 0) { 305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.flip = (uint32_t)flipMode; 305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->pp_config.feature_mask & CAM_QCOM_FEATURE_SHARPNESS) { 305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.sharpness = mParameters.getSharpness(); 305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->pp_config.feature_mask & CAM_QCOM_FEATURE_EFFECT) { 305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.effect = mParameters.getEffectValue(); 306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->pp_config.feature_mask & CAM_QCOM_FEATURE_DENOISE2D) { 306366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.denoise2d.denoise_enable = 1; 306466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.denoise2d.process_plates = 306566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getDenoiseProcessPlate(CAM_INTF_PARM_WAVELET_DENOISE); 306666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!((needReprocess()) && (CAM_STREAM_TYPE_SNAPSHOT == stream_type || 306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_STREAM_TYPE_RAW == stream_type))) { 307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (gCamCapability[mCameraId]->qcom_supported_feature_mask & 307166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_CROP) 307266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_CROP; 307366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (gCamCapability[mCameraId]->qcom_supported_feature_mask & 307466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_SCALE) 307566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_SCALE; 307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("type %d, fmt %d, dim %dx%d, num_bufs %d mask = 0x%x\n", 307966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type, streamInfo->fmt, streamInfo->dim.width, 308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim.height, streamInfo->num_bufs, 308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config.feature_mask); 308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return streamInfoBuf; 308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : allocateStreamUserBuf 308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: allocate user ptr for stream buffers 309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamInfo : stream info structure 309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a memory obj that holds stream info buffer. 309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NULL if failed 309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 309866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraMemory *QCamera2HardwareInterface::allocateStreamUserBuf( 309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfo) 310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 310266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *mem = NULL; 310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int size = 0; 310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 310566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->streaming_mode != CAM_STREAMING_MODE_BATCH) { 310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Stream is not in BATCH mode. Invalid Stream"); 310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Allocate stream user buffer memory object 311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (streamInfo->stream_type) { 311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_VIDEO: { 311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoMemory *video_mem = new QCameraVideoMemory( 311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mGetMemory, FALSE, QCAMERA_MEM_TYPE_BATCH); 311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (video_mem == NULL) { 311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Out of memory for video obj"); 311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* 312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * numFDs = BATCH size 312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * numInts = 5 // OFFSET, SIZE, USAGE, TIMESTAMP, FORMAT 312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = video_mem->allocateMeta(streamInfo->num_bufs, 312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getBufBatchCount(), VIDEO_METADATA_NUM_INTS); 312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("allocateMeta failed"); 312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete video_mem; 312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int usage = 0; 313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_VIDEO, fmt); 313366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUBWCEnabled() && (fmt == CAM_FORMAT_YUV_420_NV12_UBWC)) { 313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin usage = private_handle_t::PRIV_FLAGS_UBWC_ALIGNED; 313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem->setVideoInfo(usage, fmt); 313766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem = static_cast<QCameraMemory *>(video_mem); 313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_PREVIEW: 314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_POSTVIEW: 314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_ANALYSIS: 314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_SNAPSHOT: 314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_RAW: 314666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_METADATA: 314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_OFFLINE_PROC: 314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_CALLBACK: 314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Stream type Not supported.for BATCH processing"); 315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_DEFAULT: 315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_STREAM_TYPE_MAX: 315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mem) { 315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate mem"); 315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Size of this buffer will be number of batch buffer */ 316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size = PAD_TO_SIZE((streamInfo->num_bufs * streamInfo->user_buf_info.size), 316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_PAD_TO_4K); 316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Allocating BATCH Buffer count = %d", streamInfo->num_bufs); 316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (size > 0) { 316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Allocating one buffer for all batch buffers 317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mem->allocate(1, size, NON_SECURE); 317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mem; 317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mem; 317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : waitForDeferredAlloc 318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Wait for deferred allocation, if applicable 318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * (applicable only for metadata buffers so far) 318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : type of stream to (possibly) wait for 318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::waitForDeferredAlloc(cam_stream_type_t stream_type) 319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_type == CAM_STREAM_TYPE_METADATA) { 319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mMetadataAllocJob); 319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setPreviewWindow 320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set preview window impl 320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @window : ptr to window ops table struct 320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::setPreviewWindow( 321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct preview_stream_ops *window) 321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewWindow = window; 321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 321666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setCallBacks 322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callbacks impl 322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @notify_cb : notify cb 322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data_cb : data cb 322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data_cb_timestamp : data cb with time stamp 322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @get_memory : request memory ops table 322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user : user data ptr 322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::setCallBacks(camera_notify_callback notify_cb, 323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_callback data_cb, 323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_timestamp_callback data_cb_timestamp, 323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_request_memory get_memory, 323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *user) 323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNotifyCb = notify_cb; 324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDataCb = data_cb; 324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDataCbTimestamp = data_cb_timestamp; 324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mGetMemory = get_memory; 324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie = user; 324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier.setCallbacks(notify_cb, data_cb, data_cb_timestamp, user); 324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setJpegCallBacks 325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set JPEG callbacks impl 325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpegCb : Jpeg callback method 325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbackCookie : callback cookie 325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::setJpegCallBacks(jpeg_data_callback jpegCb, 326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *callbackCookie) 326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("camera id %d", getCameraId()); 326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCb = jpegCb; 326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCallbackCookie = callbackCookie; 326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier.setJpegCallBacks(mJpegCb, mJpegCallbackCookie); 326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : enableMsgType 327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enable msg type impl 327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask to be enabled 327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::enableMsgType(int32_t msg_type) 328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUBWCEnabled()) { 328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Need Special CALLBACK stream incase application requesting for 328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Preview callback in UBWC case*/ 329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!(msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) && 329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (msg_type & CAMERA_MSG_PREVIEW_FRAME)) { 329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_CALLBACK] != NULL) { 329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_CALLBACK); 329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("START Callback Channel failed"); 329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMsgEnabled |= msg_type; 330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("(0x%x) : mMsgEnabled = 0x%x rc = %d", msg_type , mMsgEnabled, rc); 330266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 330366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 330466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 330666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : disableMsgType 330766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 330866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: disable msg type impl 330966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 331066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 331166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask to be disabled 331266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 331366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 331466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 331566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 331666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 331766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::disableMsgType(int32_t msg_type) 331866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 331966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 332066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 332166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUBWCEnabled()) { 332266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*STOP CALLBACK STREAM*/ 332366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) && 332466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (msg_type & CAMERA_MSG_PREVIEW_FRAME)) { 332566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_CALLBACK] != NULL) { 332666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = stopChannel(QCAMERA_CH_TYPE_CALLBACK); 332766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 332866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("STOP Callback Channel failed"); 332966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMsgEnabled &= ~msg_type; 333466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("(0x%x) : mMsgEnabled = 0x%x rc = %d", msg_type , mMsgEnabled, rc); 333566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 333666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 333766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 333866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 333966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : msgTypeEnabled 334066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 334166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: impl to determine if certain msg_type is enabled 334266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 334366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 334466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask 334566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 334666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- not enabled 334766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none 0 -- enabled 334866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 334966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::msgTypeEnabled(int32_t msg_type) 335066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 335166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (mMsgEnabled & msg_type); 335266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 335366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 335466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 335566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : msgTypeEnabledWithLock 335666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: impl to determine if certain msg_type is enabled with lock 335866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 336066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type : msg type mask 336166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- not enabled 336366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none 0 -- enabled 336466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 336566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::msgTypeEnabledWithLock(int32_t msg_type) 336666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 336766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int enabled = 0; 336866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 336966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enabled = mMsgEnabled & msg_type; 337066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 337166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return enabled; 337266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 337366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 337466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 337566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startPreview 337666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start preview impl 337866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 338066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 338166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 338266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 338366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 338466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 338566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::startPreview() 338666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 338766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 338866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 338966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E ZSL = %d Recording Hint = %d", mParameters.isZSLMode(), 339166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getRecordingHintValue()); 339266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_acq(); 339466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin updateThermalLevel((void *)&mThermalLevel); 3396d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 3397d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplayFrameSkip(); 3398d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 339966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start preview stream 340066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() != true) { 340166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_ZSL); 340266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 340366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_PREVIEW); 340466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 340566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 340666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 340766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to start channels"); 340866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 340966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 341066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 341166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 341266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) 341366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (m_channels[QCAMERA_CH_TYPE_CALLBACK] != NULL)) { 341466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_CALLBACK); 341566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 341666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to start callback stream"); 341766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_ZSL); 341866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_PREVIEW); 341966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 342066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 342166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 342266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 342366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 342466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin updatePostPreviewParameters(); 342566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_stateMachine.setPreviewCallbackNeeded(true); 342666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 342766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if job id is non-zero, that means the postproc init job is already 342866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // pending or complete 342966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mInitPProcJob == 0) { 343066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mInitPProcJob = deferPPInit(); 343166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mInitPProcJob == 0) { 343266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to initialize postprocessor, mCameraHandle = %p", 343366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle); 343466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -ENOMEM; 343566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 343666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 343766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 344066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 344166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 344266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set power Hint for preview 34431687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan m_perfLock.powerHint(POWER_HINT_VIDEO_ENCODE, true); 344466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 344566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 344666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X rc = %d", rc); 344766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 344866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 344966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 345066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::updatePostPreviewParameters() { 345166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Enable OIS only in Camera mode and 4k2k camcoder mode 345266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 345366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.updateOisValue(1); 345466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 345566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 345666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 345766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 345866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopPreview 345966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 346066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop preview impl 346166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 346266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 346366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 346466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 346566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 346666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 346766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 346866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::stopPreview() 346966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 347066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 347166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E"); 347266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumPreviewFaces = -1; 347366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; 347466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 347566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable power Hint for preview 34761687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan m_perfLock.powerHint(POWER_HINT_VIDEO_ENCODE, false); 347766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 347866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_acq(); 347966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 348066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop preview stream 348166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_CALLBACK); 348266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_ZSL); 348366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_PREVIEW); 348466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_RAW); 348566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 348666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier.flushPreviewNotifications(); 348766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //add for ts makeup 348866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 348966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ts_makeup_finish(); 349066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 349166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // delete all channels from preparePreview 349266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unpreparePreview(); 349366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 349466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 349566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 349666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X"); 349766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 349866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 349966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 350066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 350166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : storeMetaDataInBuffers 350266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enable store meta data in buffers for video frames impl 350466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 350666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @enable : flag if need enable 350766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 350966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 351066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 351166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 351266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::storeMetaDataInBuffers(int enable) 351366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 351466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStoreMetaDataInFrame = enable; 351566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 351666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 351766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 351866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 351966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preStartRecording 352066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Prepare start recording impl 352266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 352466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 352666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 352766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 352866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 352966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::preStartRecording() 353066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 353166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 353266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 353366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getRecordingHintValue() == false) { 353466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 353566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to restart preview only in single camera mode. 353666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // In dual-cam mode, this control belongs to muxer. 353766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 353866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("start recording when hint is false, stop preview first"); 353966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopPreview(); 354066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 354166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set recording hint to TRUE 354266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateRecordingHintValue(TRUE); 354366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = preparePreview(); 354466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 354566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startPreview(); 354666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 354766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 354866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 354966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 355066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // For dual cam mode, update the flag mPreviewRestartNeeded to true 355166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Restart control will be handled by muxer. 355266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewRestartNeeded = true; 355366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 355466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 355566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 355666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 355766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 355866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 355966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 356066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 356166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startRecording 356266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 356366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start recording impl 356466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 356566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 356666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 356766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 356866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 356966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 357066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 357166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::startRecording() 357266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 357366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 357466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 357566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E"); 357666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //link meta stream with video channel if low power mode. 357766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isLowPowerMode()) { 357866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Find and try to link a metadata stream from preview channel 357966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pMetaChannel = NULL; 358066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pMetaStream = NULL; 358166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pVideoChannel = m_channels[QCAMERA_CH_TYPE_VIDEO]; 358266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 358366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) { 358466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaChannel = m_channels[QCAMERA_CH_TYPE_PREVIEW]; 358566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t streamNum = pMetaChannel->getNumOfStreams(); 358666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 358766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < streamNum ; i++ ) { 358866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pMetaChannel->getStreamByIndex(i); 358966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pStream) && 359066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAM_STREAM_TYPE_METADATA == pStream->getMyType())) { 359166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaStream = pStream; 359266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 359366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 359466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 359566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 359666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 359766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pMetaChannel) && (NULL != pMetaStream)) { 359866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pVideoChannel->linkStream(pMetaChannel, pMetaStream); 359966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 360066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Metadata stream link failed %d", rc); 360166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 360566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 360666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_VIDEO); 360766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 360966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isTNRSnapshotEnabled() && !isLowPowerMode()) { 361066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 361166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.is4k2kVideoResolution()) { 361266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Find and try to link a metadata stream from preview channel 361366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pMetaChannel = NULL; 361466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pMetaStream = NULL; 361566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 361666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) { 361766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaChannel = m_channels[QCAMERA_CH_TYPE_PREVIEW]; 361866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t streamNum = pMetaChannel->getNumOfStreams(); 361966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 362066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < streamNum ; i++ ) { 362166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pMetaChannel->getStreamByIndex(i); 362266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pStream) && 362366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAM_STREAM_TYPE_METADATA == 362466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getMyType())) { 362566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaStream = pStream; 362666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 362766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 363166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pMetaChannel) && (NULL != pMetaStream)) { 363266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->linkStream(pMetaChannel, pMetaStream); 363366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 363466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Metadata stream link failed %d", rc); 363566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("START snapshot Channel for TNR processing"); 363966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->start(); 364066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 364166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3642d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (rc == NO_ERROR) { 3643d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Set power Hint for video encoding 3644d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_perfLock.powerHint(POWER_HINT_VIDEO_ENCODE, true); 3645d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 3646d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 364766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X rc = %d", rc); 364866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 364966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 365066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 365166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 365266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopRecording 365366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 365466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop recording impl 365566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 365666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 365766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 365866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 365966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 366066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 366166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 366266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::stopRecording() 366366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 366466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E"); 366566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop snapshot channel 366666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isTNRSnapshotEnabled()) { 366766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("STOP snapshot Channel for TNR processing"); 366866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_SNAPSHOT); 366966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 367066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = stopChannel(QCAMERA_CH_TYPE_VIDEO); 367166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3672d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Disable power hint for video encoding 3673d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_perfLock.powerHint(POWER_HINT_VIDEO_ENCODE, false); 3674d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 367566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X rc = %d", rc); 367666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 367766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 367866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 367966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 368066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseRecordingFrame 368166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 368266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return video frame impl 368366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 368466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 368566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @opaque : ptr to video frame to be returned 368666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 368766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 368866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 368966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 369066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 369166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::releaseRecordingFrame(const void * opaque) 369266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 369366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = UNKNOWN_ERROR; 369466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoChannel *pChannel = 369566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (QCameraVideoChannel *)m_channels[QCAMERA_CH_TYPE_VIDEO]; 369666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("opaque data = %p",opaque); 369766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pChannel != NULL) { 369866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->releaseFrame(opaque, mStoreMetaDataInFrame > 0); 369966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 370066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 370166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 370266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 370366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 370466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : autoFocus 370566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 370666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start auto focus impl 370766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 370866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 370966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 371066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 371166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 371266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 371366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 371466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::autoFocus() 371566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 371666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 371766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_focus_mode_type focusMode = mParameters.getFocusMode(); 371866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 371966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 372066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_currentFocusState = CAM_AF_STATE_INACTIVE; 372166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 372266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (focusMode) { 372366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_AUTO: 372466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_MACRO: 372566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 372666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 372766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = true; 372866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Send AUTO FOCUS event. focusMode=%d, m_currentFocusState=%d", 372966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin focusMode, m_currentFocusState); 373066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mCameraHandle->ops->do_auto_focus(mCameraHandle->camera_handle); 373166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 373266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_INFINITY: 373366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_FIXED: 373466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_EDOF: 373566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 373666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("No ops in focusMode (%d)", focusMode); 373766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendEvtNotify(CAMERA_MSG_FOCUS, true, 0); 373866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 373966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 374066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 374166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 374266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; 374366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 374466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 374566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 374666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 374766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 374866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 374966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancelAutoFocus 375066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 375166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel auto focus impl 375266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 375366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 375466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 375566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 375666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 375766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 375866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 375966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::cancelAutoFocus() 376066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 376166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 376266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_focus_mode_type focusMode = mParameters.getFocusMode(); 376366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 376466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (focusMode) { 376566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_AUTO: 376666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_MACRO: 376766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 376866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 376966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; 377066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mCameraHandle->ops->cancel_auto_focus(mCameraHandle->camera_handle); 377166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 377266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_INFINITY: 377366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_FIXED: 377466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_EDOF: 377566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 377666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("No ops in focusMode (%d)", focusMode); 377766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 377866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 377966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 378066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 378166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 378266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 378366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processUFDumps 378466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 378566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process UF jpeg dumps for refocus support 378666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 378766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 378866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : payload of jpeg event, including information about jpeg encoding 378966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * status, jpeg size and so on. 379066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 379166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 379266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 379366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 379466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 379566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : none 379666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 379766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::processUFDumps(qcamera_jpeg_evt_payload_t *evt) 379866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 379966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool ret = true; 380066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUbiRefocus()) { 380166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int index = (int)getOutputImageCount(); 380266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool allFocusImage = (index == ((int)mParameters.getRefocusOutputCount() - 1)); 380366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char name[FILENAME_MAX]; 380466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 380566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *jpeg_mem = NULL; 380666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin omx_jpeg_ouput_buf_t *jpeg_out = NULL; 380766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t dataLen; 380866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t *dataPtr; 380966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mInitPProcJob)) { 381066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Init PProc Deferred work failed"); 381166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 381266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 381366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_postprocessor.getJpegMemOpt()) { 381466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataLen = evt->out_data.buf_filled_len; 381566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataPtr = evt->out_data.buf_vaddr; 381666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 381766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_out = (omx_jpeg_ouput_buf_t*) evt->out_data.buf_vaddr; 381866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!jpeg_out) { 381966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Null pointer detected"); 382066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 382166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 382266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = (camera_memory_t *)jpeg_out->mem_hdl; 382366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!jpeg_mem) { 382466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Null pointer detected"); 382566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 382666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 382766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataPtr = (uint8_t *)jpeg_mem->data; 382866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataLen = jpeg_mem->size; 382966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 383066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 383166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (allFocusImage) { 383266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(name, sizeof(name), "AllFocusImage"); 383366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = -1; 383466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 383566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(name, sizeof(name), "%d", 0); 383666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 383766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_DUMP_TO_FILE(QCAMERA_DUMP_FRM_LOCATION"ubifocus", name, index, "jpg", 383866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataPtr, dataLen); 383966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Dump the image %d %d allFocusImage %d", 384066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getOutputImageCount(), index, allFocusImage); 384166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setOutputImageCount(getOutputImageCount() + 1); 384266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!allFocusImage) { 384366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = false; 384466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 384566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 384666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 384766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 384866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 384966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 385066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : unconfigureAdvancedCapture 385166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 385266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: unconfigure Advanced Capture. 385366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 385466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 385566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 385666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 385766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 385866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 385966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 386066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::unconfigureAdvancedCapture() 386166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 386266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 386366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 386466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mAdvancedCaptureConfigured) { 386566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 386666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mAdvancedCaptureConfigured = false; 386766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 386866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mIs3ALocked) { 386966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.set3ALock(false); 387066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIs3ALocked = false; 387166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 387266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isHDREnabled() || mParameters.isAEBracketEnabled()) { 387366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setToneMapMode(true, true); 387466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 387566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Failed to enable tone map during HDR/AEBracketing"); 387666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 387766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHDRBracketingEnabled = false; 387866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.stopAEBracket(); 387966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((mParameters.isChromaFlashEnabled()) 388066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mFlashNeeded && !mLongshotEnabled) 388166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getLowLightLevel() != CAM_LOW_LIGHT_OFF) 388266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2)) { 388366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.resetFrameCapture(TRUE); 388466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isUbiFocusEnabled() || mParameters.isUbiRefocus()) { 388566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureAFBracketing(false); 388666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isOptiZoomEnabled()) { 388766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setAndCommitZoom(mZoomLevel); 3888d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplaySkip(FALSE, CAMERA_MAX_PARAM_APPLY_DELAY); 388966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isStillMoreEnabled()) { 389066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_still_more_t stillmore_config = mParameters.getStillMoreSettings(); 389166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stillmore_config.burst_count = 0; 389266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setStillMoreSettings(stillmore_config); 389366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 389466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* If SeeMore is running, it will handle re-enabling tone map */ 389566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isSeeMoreEnabled() && !mParameters.isLTMForSeeMoreEnabled()) { 389666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setToneMapMode(true, true); 389766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 389866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Failed to enable tone map during StillMore"); 389966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 390066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 390166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 390266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Re-enable Tintless */ 390366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setTintless(true); 390466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 390566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("No Advanced Capture feature enabled!!"); 390666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = BAD_VALUE; 390766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 390866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 390966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 391066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 391166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 391266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 391366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 391466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureAdvancedCapture 391566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 391666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure Advanced Capture. 391766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 391866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 391966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 392066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 392166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 392266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 392366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 392466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureAdvancedCapture() 392566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 392666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 392766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 392866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 392966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.checkFeatureConcurrency(); 393066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 393166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Cannot support Advanced capture modes"); 393266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 393366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 393466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 393566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setOutputImageCount(0); 393666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mInputCount = 0; 393766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mAdvancedCaptureConfigured = true; 393866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Display should be disabled for advanced modes */ 3939d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bool bSkipDisplay = true; 394066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 394166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->mode == CAM_MODE_SECONDARY) { 394266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // no Advance capture settings for Aux camera 394366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X Secondary Camera, no need to process!! "); 394466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 394566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 394666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 394766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Do not stop display if in stillmore livesnapshot */ 394866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isStillMoreEnabled() && 394966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isSeeMoreEnabled()) { 3950d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bSkipDisplay = false; 395166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 395266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUbiFocusEnabled() || mParameters.isUbiRefocus()) { 395366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureAFBracketing(); 395466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isOptiZoomEnabled()) { 395566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureOptiZoom(); 395666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if(mParameters.isHDREnabled()) { 395766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureHDRBracketing(); 395866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mHDRBracketingEnabled) { 395966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setToneMapMode(false, true); 396066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 396166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Failed to disable tone map during HDR"); 396266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 396366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 396466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isAEBracketEnabled()) { 396566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setToneMapMode(false, true); 396666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 396766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Failed to disable tone map during AEBracketing"); 396866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 396966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureAEBracketing(); 397066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isStillMoreEnabled()) { 397166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureStillMore(); 397266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((mParameters.isChromaFlashEnabled()) 397366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getLowLightLevel() != CAM_LOW_LIGHT_OFF) 397466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2)) { 397566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.configFrameCapture(TRUE); 397666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mFlashNeeded && !mLongshotEnabled) { 397766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.configFrameCapture(TRUE); 3978d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bSkipDisplay = false; 397966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 398066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Advanced Capture feature not enabled!! "); 398166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mAdvancedCaptureConfigured = false; 3982d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bSkipDisplay = false; 398366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 398466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 398566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Stop preview temporarily for advanced captures"); 3986d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplaySkip(bSkipDisplay); 398766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 398866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 398966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 399066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 399166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 399266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 399366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureAFBracketing 399466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 399566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure AF Bracketing. 399666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 399766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 399866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 399966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 400066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 400166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 400266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 400366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureAFBracketing(bool enable) 400466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 400566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 400666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 400766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_af_bracketing_t *af_bracketing_need; 400866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 400966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUbiRefocus()) { 401066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin af_bracketing_need = 401166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &gCamCapability[mCameraId]->refocus_af_bracketing_need; 401266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 401366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin af_bracketing_need = 401466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &gCamCapability[mCameraId]->ubifocus_af_bracketing_need; 401566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 401666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 401766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Enable AF Bracketing. 401866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_af_bracketing_t afBracket; 401966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&afBracket, 0, sizeof(cam_af_bracketing_t)); 402066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin afBracket.enable = enable; 402166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin afBracket.burst_count = af_bracketing_need->burst_count; 402266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 402366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for(int8_t i = 0; i < MAX_AF_BRACKETING_VALUES; i++) { 402466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin afBracket.focus_steps[i] = af_bracketing_need->focus_steps[i]; 402566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("focus_step[%d] = %d", i, afBracket.focus_steps[i]); 402666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 402766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Send cmd to backend to set AF Bracketing for Ubi Focus. 402866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.commitAFBracket(afBracket); 402966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NO_ERROR != rc ) { 403066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot configure AF bracketing"); 403166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 403266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 403366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enable) { 403466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.set3ALock(true); 403566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIs3ALocked = true; 403666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 403766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 403866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 403966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 404066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 404166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 404266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureHDRBracketing 404366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 404466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure HDR Bracketing. 404566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 404666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 404766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 404866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 404966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 405066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 405166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 405266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureHDRBracketing() 405366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 405466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 405566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 405666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 405766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_hdr_bracketing_info_t& hdrBracketingSetting = 405866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[mCameraId]->hdr_bracketing_setting; 405966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 406066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 'values' should be in "idx1,idx2,idx3,..." format 406166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t hdrFrameCount = 406266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdrBracketingSetting.num_frames; 406366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("HDR values %d, %d frame count: %u", 406466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (int8_t) hdrBracketingSetting.exp_val.values[0], 406566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (int8_t) hdrBracketingSetting.exp_val.values[1], 406666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdrFrameCount); 406766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 406866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Enable AE Bracketing for HDR 406966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_exp_bracketing_t aeBracket; 407066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&aeBracket, 0, sizeof(cam_exp_bracketing_t)); 407166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin aeBracket.mode = 407266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdrBracketingSetting.exp_val.mode; 407366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 407466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (aeBracket.mode == CAM_EXP_BRACKETING_ON) { 407566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHDRBracketingEnabled = true; 407666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 407766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 407866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 tmp; 407966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < hdrFrameCount; i++) { 408066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tmp.appendFormat("%d", 408166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (int8_t) hdrBracketingSetting.exp_val.values[i]); 408266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tmp.append(","); 408366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 408466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isHDR1xFrameEnabled() 408566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && mParameters.isHDR1xExtraBufferNeeded()) { 408666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tmp.appendFormat("%d", 0); 408766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tmp.append(","); 408866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 408966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 409066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if( !tmp.isEmpty() && 409166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( MAX_EXP_BRACKETING_LENGTH > tmp.length() ) ) { 409266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Trim last comma 409366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(aeBracket.values, '\0', MAX_EXP_BRACKETING_LENGTH); 409466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(aeBracket.values, tmp.string(), tmp.length() - 1); 409566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 409666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 409766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("HDR config values %s", 409866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin aeBracket.values); 409966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setHDRAEBracket(aeBracket); 410066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NO_ERROR != rc ) { 410166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot configure HDR bracketing"); 410266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 410366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 410466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 410566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 410666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 410766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 410866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 410966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureAEBracketing 411066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 411166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure AE Bracketing. 411266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 411366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 411466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 411566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 411666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 411766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 411866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 411966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureAEBracketing() 412066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 412166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 412266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 412366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 412466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setAEBracketing(); 412566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NO_ERROR != rc ) { 412666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot configure AE bracketing"); 412766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 412866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 412966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 413066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 413166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 413266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 413366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 413466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureOptiZoom 413566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 413666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure Opti Zoom. 413766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 413866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 413966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 414066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 414166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 414266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 414366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 414466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureOptiZoom() 414566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 414666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 414766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 414866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //store current zoom level. 414966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mZoomLevel = mParameters.getParmZoomLevel(); 415066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 415166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //set zoom level to 1x; 415266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setAndCommitZoom(0); 415366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 415466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.set3ALock(true); 415566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIs3ALocked = true; 415666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 415766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 415866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 415966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 416066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 416166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureStillMore 416266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 416366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure StillMore. 416466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 416566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 416666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 416766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 416866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 416966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 417066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 417166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureStillMore() 417266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 417366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 417466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t burst_cnt = 0; 417566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_still_more_t stillmore_config; 417666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_still_more_t stillmore_cap; 417766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 417866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Disable Tone Map. If seemore is enabled, it will handle disabling it. */ 417966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isSeeMoreEnabled() && !mParameters.isLTMForSeeMoreEnabled()) { 418066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setToneMapMode(false, true); 418166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 418266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Failed to disable tone map during StillMore"); 418366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 418466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 418566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 418666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Lock 3A */ 418766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.set3ALock(true); 418866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mIs3ALocked = true; 418966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 419066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Disable Tintless */ 419166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setTintless(false); 419266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 419366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Initialize burst count from capability */ 419466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stillmore_cap = mParameters.getStillMoreCapability(); 419566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = stillmore_cap.max_burst_count; 419666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 419766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Reconfigure burst count from dynamic scene data */ 419866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dyn_img_data_t dynamic_img_data = mParameters.getDynamicImgData(); 419966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dynamic_img_data.input_count >= stillmore_cap.min_burst_count && 420066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dynamic_img_data.input_count <= stillmore_cap.max_burst_count) { 420166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = dynamic_img_data.input_count; 420266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 420366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 420466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Reconfigure burst count in the case of liveshot */ 420566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isSeeMoreEnabled()) { 420666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = 1; 420766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 420866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 420966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Reconfigure burst count from user input */ 421066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 421166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.imglib.stillmore", prop, "0"); 421266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t burst_setprop = (uint32_t)atoi(prop); 421366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (burst_setprop != 0) { 421466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((burst_setprop < stillmore_cap.min_burst_count) || 421566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (burst_setprop > stillmore_cap.max_burst_count)) { 421666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = stillmore_cap.max_burst_count; 421766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 421866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = burst_setprop; 421966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 422066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 422166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 422266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&stillmore_config, 0, sizeof(cam_still_more_t)); 422366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stillmore_config.burst_count = burst_cnt; 422466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setStillMoreSettings(stillmore_config); 422566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 422666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Stillmore burst %d", burst_cnt); 422766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 422866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 422966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 423066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 423166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 423266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopAdvancedCapture 423366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 423466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stops advanced capture based on capture type 423566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 423666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 423766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pChannel : channel. 423866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 423966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 424066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 424166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 424266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 424366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::stopAdvancedCapture( 424466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pChannel) 424566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 424666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stop bracketig"); 424766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 424866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 424966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUbiFocusEnabled() || mParameters.isUbiRefocus()) { 425066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->stopAdvancedCapture(MM_CAMERA_AF_BRACKETING); 425166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isChromaFlashEnabled() 425266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mFlashNeeded && !mLongshotEnabled) 425366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getLowLightLevel() != CAM_LOW_LIGHT_OFF) 425466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2)) { 425566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->stopAdvancedCapture(MM_CAMERA_FRAME_CAPTURE); 425666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if(mParameters.isHDREnabled() 425766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || mParameters.isAEBracketEnabled()) { 425866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->stopAdvancedCapture(MM_CAMERA_AE_BRACKETING); 425966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isOptiZoomEnabled()) { 426066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->stopAdvancedCapture(MM_CAMERA_ZOOM_1X); 426166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isStillMoreEnabled()) { 426266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stopAdvancedCapture not needed for StillMore"); 426366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 426466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("No Advanced Capture feature enabled!"); 426566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = BAD_VALUE; 426666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 426766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 426866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 426966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 427066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 427166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startAdvancedCapture 427266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 427366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: starts advanced capture based on capture type 427466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 427566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 427666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pChannel : channel. 427766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 427866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 427966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 428066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 428166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 428266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::startAdvancedCapture( 428366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pChannel) 428466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 428566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Start bracketing"); 428666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 428766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 428866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUbiFocusEnabled() || mParameters.isUbiRefocus()) { 428966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->startAdvancedCapture(MM_CAMERA_AF_BRACKETING); 429066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isOptiZoomEnabled()) { 429166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->startAdvancedCapture(MM_CAMERA_ZOOM_1X); 429266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isStillMoreEnabled()) { 429366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("startAdvancedCapture not needed for StillMore"); 429466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isHDREnabled() 429566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || mParameters.isAEBracketEnabled()) { 429666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->startAdvancedCapture(MM_CAMERA_AE_BRACKETING); 429766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mParameters.isChromaFlashEnabled() 429866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mFlashNeeded && !mLongshotEnabled) 429966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getLowLightLevel() != CAM_LOW_LIGHT_OFF) 430066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2)) { 430166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capture_frame_config_t config = mParameters.getCaptureFrameConfig(); 430266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->startAdvancedCapture(MM_CAMERA_FRAME_CAPTURE, &config); 430366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 430466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No Advanced Capture feature enabled!"); 430566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = BAD_VALUE; 430666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 430766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 430866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 430966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 431066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 431166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preTakePicture 431266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 431366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Prepare take picture impl, Restarts preview if necessary 431466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 431566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 431666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 431766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 431866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 431966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 432066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 432166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::preTakePicture() 432266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 432366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 432466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 432566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getRecordingHintValue() == true) { 432666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 432766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Give HWI control to restart preview only in single camera mode. 432866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // In dual-cam mode, this control belongs to muxer. 432966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->sync_control != CAM_SYNC_RELATED_SENSORS_ON) { 433066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("restart preview if rec hint is true and preview is running"); 433166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopPreview(); 433266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateRecordingHintValue(FALSE); 433366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start preview again 433466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = preparePreview(); 433566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 433666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startPreview(); 433766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 433866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unpreparePreview(); 433966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 434066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 434166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 434266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 434366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 434466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // For dual cam mode, update the flag mPreviewRestartNeeded to true 434566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Restart control will be handled by muxer. 434666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewRestartNeeded = true; 434766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 434866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 434966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 435066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 435166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 435266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 435366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 435466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 435566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takePicture 435666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 435766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take picture impl 435866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 435966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 436066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 436166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 436266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 436366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 436466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 436566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::takePicture() 436666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 436766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 436866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 436966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Get total number for snapshots (retro + regular) 437066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t numSnapshots = mParameters.getNumOfSnapshots(); 437166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Get number of retro-active snapshots 437266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t numRetroSnapshots = mParameters.getNumOfRetroSnapshots(); 437366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 437466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 437566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Set rotation value from user settings as Jpeg rotation 437666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //to configure back-end modules. 437766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setJpegRotation(mParameters.getRotation()); 437866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 437966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if retro-active snapshots are not enabled 438066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!isRetroPicture() || !mParameters.isZSLMode()) { 438166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numRetroSnapshots = 0; 438266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Reset retro snaphot count to zero"); 438366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 438466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 438566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Do special configure for advanced capture modes. 438666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureAdvancedCapture(); 438766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 438866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unsupported capture call"); 438966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 439066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 439166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 439266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mAdvancedCaptureConfigured) { 439366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numSnapshots = mParameters.getBurstCountForAdvancedCapture(); 439466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 439566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("snap count = %d zsl = %d advanced = %d", 439666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numSnapshots, mParameters.isZSLMode(), mAdvancedCaptureConfigured); 439766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 439866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode()) { 439966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_channels[QCAMERA_CH_TYPE_ZSL]; 440066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pPicChannel = (QCameraPicChannel *)pChannel; 440166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pPicChannel) { 440266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 440366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 440466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin startRAWChannel(pPicChannel); 440566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPicChannel = (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_RAW]; 440666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pPicChannel == NULL) { 440766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("RAW Channel is NULL in Manual capture mode"); 440866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopRAWChannel(); 440966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 441066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 441166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 441266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 441366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureOnlineRotation(*pPicChannel); 441466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 441566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("online rotation failed"); 441666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 441766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 441866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 441966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start postprocessor 442066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 442166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(DeferWorkArgs)); 442266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 442366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args.pprocArgs = pPicChannel; 442466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 442566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // No need to wait for mInitPProcJob here, because it was 442666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // queued in startPreview, and will definitely be processed before 442766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // mReprocJob can begin. 442866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mReprocJob = queueDeferredWork(CMD_DEF_PPROC_START, 442966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args); 443066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mReprocJob == 0) { 443166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failure: Unable to start pproc"); 443266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 443366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 443466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 443566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if all preview buffers are mapped before creating 443666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // a jpeg session as preview stream buffers are queried during the same 443766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t numStreams = pChannel->getNumOfStreams(); 443866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 443966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pPreviewStream = NULL; 444066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0 ; i < numStreams ; i++ ) { 444166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByIndex(i); 444266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pStream) 444366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 444466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAM_STREAM_TYPE_PREVIEW == pStream->getMyType()) { 444566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPreviewStream = pStream; 444666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 444766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 444866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 444966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pPreviewStream != NULL) { 445066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(mMapLock); 445166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *pMemory = pStream->getStreamBufs(); 445266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pMemory) { 445366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! pMemory is NULL"); 445466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 445566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 445666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 445766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t waitCnt = 2; 445866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (!pMemory->checkIfAllBuffersMapped() && (waitCnt > 0)) { 445966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL(" Waiting for preview buffers to be mapped"); 446066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMapCond.waitRelative( 446166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mMapLock, CAMERA_DEFERRED_MAP_BUF_TIMEOUT); 446266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Wait completed!!"); 446366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitCnt--; 446466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 446566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If all buffers are not mapped after retries, assert 446666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin assert(pMemory->checkIfAllBuffersMapped()); 446766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 446866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin assert(pPreviewStream); 446966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 447066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 447166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Create JPEG session 447266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegJob = queueDeferredWork(CMD_DEF_CREATE_JPEG_SESSION, 447366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args); 447466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegJob == 0) { 4475d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Failed to queue CREATE_JPEG_SESSION"); 4476d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != waitDeferredWork(mReprocJob)) { 4477d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Reprocess Deferred work was failed"); 4478d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 4479d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_postprocessor.stop(); 448066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 448166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 448266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 448366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mAdvancedCaptureConfigured) { 448466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startAdvancedCapture(pPicChannel); 448566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 448666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start zsl advanced capture"); 448766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 448866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 448966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 449066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mLongshotEnabled && mPrepSnapRun) { 449166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops->start_zsl_snapshot( 449266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->camera_handle, 449366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPicChannel->getMyHandle()); 449466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 449566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If frame sync is ON and it is a SECONDARY camera, 449666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we do not need to send the take picture command to interface 449766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // It will be handled along with PRIMARY camera takePicture request 449866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t buf; 449966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&buf, 0x0, sizeof(buf)); 450066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((!mParameters.isAdvCamFeaturesEnabled() && 450166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mFlashNeeded && 450266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !isLongshotEnabled() && 450366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getRelatedCamSyncInfo()->is_frame_sync_enabled) && 450466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (getRelatedCamSyncInfo()->sync_control == 450566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_SYNC_RELATED_SENSORS_ON)) { 450666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->mode == CAM_MODE_PRIMARY) { 450766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.type = MM_CAMERA_REQ_FRAME_SYNC_BUF; 450866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_buf_requested = numSnapshots; 450966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pPicChannel->takePicture(&buf); 451066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 451166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("FS_DBG cannot take ZSL picture, stop pproc"); 451266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mReprocJob)) { 451366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 451466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 451566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 451666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mJpegJob)) { 451766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Jpeg Deferred work failed"); 451866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 451966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 452066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 452166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 452266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 452366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("PRIMARY camera: send frame sync takePicture!!"); 452466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 452566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 452666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.type = MM_CAMERA_REQ_SUPER_BUF; 452766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_buf_requested = numSnapshots; 452866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_retro_buf_requested = numRetroSnapshots; 452966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pPicChannel->takePicture(&buf); 453066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 453166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot take ZSL picture, stop pproc"); 453266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mReprocJob)) { 453366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 453466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 453566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 453666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mJpegJob)) { 453766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Jpeg Deferred work failed"); 453866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 453966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 454066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 454166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 454266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 454366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 454466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 454566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("ZSL channel is NULL"); 454666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 454766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 454866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 454966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 455066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start snapshot 455166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isJpegPictureFormat() || 455266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV16PictureFormat() || 455366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV21PictureFormat()) { 455466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 455566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //STOP Preview for Non ZSL use case 455666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopPreview(); 455766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 455866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Config CAPTURE channels 455966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = declareSnapshotStreams(); 456066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 456166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 456266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 456366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 456466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addCaptureChannel(); 456566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((rc == NO_ERROR) && 456666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (NULL != m_channels[QCAMERA_CH_TYPE_CAPTURE])) { 456766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 456866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.getofflineRAW()) { 456966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureOnlineRotation( 457066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *m_channels[QCAMERA_CH_TYPE_CAPTURE]); 457166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 457266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("online rotation failed"); 457366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CAPTURE); 457466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 457566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 457666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 457766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 457866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 457966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(DeferWorkArgs)); 458066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 458166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args.pprocArgs = m_channels[QCAMERA_CH_TYPE_CAPTURE]; 458266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 458366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // No need to wait for mInitPProcJob here, because it was 458466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // queued in startPreview, and will definitely be processed before 458566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // mReprocJob can begin. 458666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mReprocJob = queueDeferredWork(CMD_DEF_PPROC_START, 458766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args); 458866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mReprocJob == 0) { 458966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failure: Unable to start pproc"); 459066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 459166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 459266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 459366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Create JPEG session 459466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegJob = queueDeferredWork(CMD_DEF_CREATE_JPEG_SESSION, 459566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args); 459666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegJob == 0) { 459766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to queue CREATE_JPEG_SESSION"); 4598d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != waitDeferredWork(mReprocJob)) { 4599d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Reprocess Deferred work was failed"); 4600d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 4601d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_postprocessor.stop(); 460266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENOMEM; 460366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 460466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 460566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start catpure channel 460666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_channels[QCAMERA_CH_TYPE_CAPTURE]->start(); 460766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 460866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start capture channel"); 460966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mReprocJob)) { 461066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 461166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 461266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 461366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mJpegJob)) { 461466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Jpeg Deferred work failed"); 461566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 461666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 461766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CAPTURE); 461866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 461966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 462066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 462166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pCapChannel = 462266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_CAPTURE]; 462366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pCapChannel) { 462466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUbiFocusEnabled() || 462566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isUbiRefocus() || 462666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isChromaFlashEnabled()) { 462766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startAdvancedCapture(pCapChannel); 462866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 462966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start advanced capture"); 463066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 463166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 463266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 463366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 463466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mLongshotEnabled ) { 463566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = longShot(); 463666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 463766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mReprocJob)) { 463866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 463966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 464066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 464166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mJpegJob)) { 464266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Jpeg Deferred work failed"); 464366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 464466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 464566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CAPTURE); 464666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 464766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 464866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 464966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 465066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot add capture channel"); 465166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CAPTURE); 465266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 465366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 465466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 465566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Stop Preview before taking NZSL snapshot 465666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopPreview(); 465766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 465866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.updateRAW(gCamCapability[mCameraId]->raw_dim[0]); 465966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 466066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Raw dimension update failed %d", rc); 466166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 466266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 466366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 466466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = declareSnapshotStreams(); 466566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 466666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("RAW stream info configuration failed %d", rc); 466766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 466866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 466966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 467066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_RAW); 467166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 467266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start postprocessor 467366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mInitPProcJob)) { 467466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 467566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 467666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 467766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 467866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_RAW]); 467966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 468066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start postprocessor"); 468166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 468266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 468366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 468466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 468566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_RAW); 468666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 468766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start raw channel"); 468866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 468966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 469066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 469166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 469266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 469366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot add raw channel"); 469466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 469566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 469666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 469766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 469866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 469966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //When take picture, stop sending preview callbacks to APP 470066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_stateMachine.setPreviewCallbackNeeded(false); 470166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("X rc = %d", rc); 470266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 470366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 470466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 470566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 470666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : configureOnlineRotation 470766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 470866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Configure backend with expected rotation for snapshot stream 470966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 471066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 471166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch : Channel containing a snapshot stream 471266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 471366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 471466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 471566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 471666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 471766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::configureOnlineRotation(QCameraChannel &ch) 471866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 471966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 472066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t streamId = 0; 472166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 472266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 472366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0; i < ch.getNumOfStreams(); i++) { 472466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream = ch.getStreamByIndex(i); 472566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != stream) && 472666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((CAM_STREAM_TYPE_SNAPSHOT == stream->getMyType()) 472766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (CAM_STREAM_TYPE_RAW == stream->getMyType()))) { 472866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = stream; 472966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 473066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 473166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 473266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 473366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pStream) { 473466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No snapshot stream found!"); 473566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 473666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 473766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 473866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamId = pStream->getMyServerID(); 473966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Update online rotation configuration 474066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.addOnlineRotation(mParameters.getJpegRotation(), streamId, 474166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getDeviceRotation()); 474266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 474366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("addOnlineRotation failed %d", rc); 474466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 474566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 474666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 474766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 474866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 474966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 475066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 475166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : declareSnapshotStreams 475266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 475366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Configure backend with expected snapshot streams 475466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 475566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 475666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 475766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 475866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 475966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 476066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 476166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::declareSnapshotStreams() 476266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 476366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 476466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 476566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Update stream info configuration 476666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setStreamConfigure(true, mLongshotEnabled, false); 476766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 476866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("setStreamConfigure failed %d", rc); 476966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 477066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 477166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 477266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 477366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 477466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 477566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 477666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : longShot 477766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 477866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Queue one more ZSL frame 477966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in the longshot pipe. 478066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 478166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 478266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 478366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 478466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 478566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 478666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 478766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::longShot() 478866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 478966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 479066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t numSnapshots = mParameters.getNumOfSnapshots(); 479166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pChannel = NULL; 479266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 479366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode()) { 479466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 479566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 479666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_CAPTURE]; 479766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 479866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 479966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pChannel) { 480066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t buf; 480166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&buf, 0x0, sizeof(buf)); 480266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.type = MM_CAMERA_REQ_SUPER_BUF; 480366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_buf_requested = numSnapshots; 480466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->takePicture(&buf); 480566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 480666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Capture channel not initialized!"); 480766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_INIT; 480866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 480966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 481066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 481166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 481266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 481366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 481466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 481566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 481666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopCaptureChannel 481766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 481866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Stops capture channel 481966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 482066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 482166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @destroy : Set to true to stop and delete camera channel. 482266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Set to false to only stop capture channel. 482366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 482466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 482566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 482666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 482766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 482866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::stopCaptureChannel(bool destroy) 482966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 483066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 483166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isJpegPictureFormat() || 483266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV16PictureFormat() || 483366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV21PictureFormat()) { 483466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = stopChannel(QCAMERA_CH_TYPE_CAPTURE); 483566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (destroy && (NO_ERROR == rc)) { 483666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Destroy camera channel but dont release context 483766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mJpegJob); 483866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = delChannel(QCAMERA_CH_TYPE_CAPTURE, false); 483966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 484066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 484166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 484266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 484366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 484466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 484566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 484666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancelPicture 484766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 484866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel picture impl 484966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 485066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 485166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 485266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 485366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 485466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 485566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 485666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::cancelPicture() 485766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 485866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mReprocJob); 485966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitDeferredWork(mJpegJob); 486066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 486166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //stop post processor 486266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 486366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 486466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unconfigureAdvancedCapture(); 486566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Enable display frames again"); 4866d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplaySkip(FALSE); 486766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 486866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mLongshotEnabled) { 486966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 487066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 487166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 487266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode()) { 487366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pPicChannel = NULL; 487466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 487566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPicChannel = (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_RAW]; 487666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 487766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPicChannel = (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 487866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 487966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pPicChannel) { 488066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pPicChannel->cancelPicture(); 488166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopRAWChannel(); 488266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopAdvancedCapture(pPicChannel); 488366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 488466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 488566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 488666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // normal capture case 488766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isJpegPictureFormat() || 488866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV16PictureFormat() || 488966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isNV21PictureFormat()) { 489066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_CAPTURE); 489166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CAPTURE); 489266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 489366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_RAW); 489466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 489566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 489666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 489766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 489866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 489966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 490066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 490166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 490266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : captureDone 490366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 490466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function called when the capture is completed before encoding 490566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 490666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 490766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 490866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 490966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 491066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::captureDone() 491166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 491266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 491366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 491466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 491566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 491666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 491766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE; 491866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 491966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 492066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("processEvt ZSL capture done failed"); 492166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 492266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 492366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 492466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 492566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for ZSL capture done event"); 492666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 492766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 492866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 492966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 493066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : Live_Snapshot_thread 493166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 493266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Seperate thread for taking live snapshot during recording 493366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 493466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : @data - pointer to QCamera2HardwareInterface class object 493566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 493666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 493766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 493866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid* Live_Snapshot_thread (void* data) 493966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 494066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 494166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = reinterpret_cast<QCamera2HardwareInterface *>(data); 494266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 494366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("take_picture_thread: NULL camera device"); 494466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (void *)BAD_VALUE; 494566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 494666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->takeLiveSnapshot_internal(); 494766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (void* )NULL; 494866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 494966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 495066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 495166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : Int_Pic_thread 495266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 495366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Seperate thread for taking snapshot triggered by camera backend 495466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 495566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : @data - pointer to QCamera2HardwareInterface class object 495666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 495766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 495866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 495966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid* Int_Pic_thread (void* data) 496066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 496166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 496266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 496366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = reinterpret_cast<QCamera2HardwareInterface *>(data); 496466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 496566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 496666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("take_picture_thread: NULL camera device"); 496766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (void *)BAD_VALUE; 496866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 496966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 497066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool JpegMemOpt = false; 497166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char raw_format[PROPERTY_VALUE_MAX]; 497266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 497366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(raw_format, 0, sizeof(raw_format)); 497466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 497566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->takeBackendPic_internal(&JpegMemOpt, &raw_format[0]); 497666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 497766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->checkIntPicPending(JpegMemOpt, &raw_format[0]); 497866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 497966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Snapshot attempt not successful, we need to do cleanup here 498066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hw->clearIntPendingEvents(); 498166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 498266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 498366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (void* )NULL; 498466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 498566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 498666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 498766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takeLiveSnapshot 498866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 498966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take live snapshot during recording 499066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 499166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 499266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 499366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 499466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 499566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 499666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 499766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::takeLiveSnapshot() 499866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 499966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 500066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc= pthread_create(&mLiveSnapshotThread, NULL, Live_Snapshot_thread, (void *) this); 500166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!rc) { 500266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_setname_np(mLiveSnapshotThread, "CAM_liveSnap"); 500366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 500466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 500566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 500666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 500766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 500866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takePictureInternal 500966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 501066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take snapshot triggered by backend 501166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 501266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 501366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 501466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 501566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 501666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 501766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 501866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::takePictureInternal() 501966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 502066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 502166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc= pthread_create(&mIntPicThread, NULL, Int_Pic_thread, (void *) this); 502266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!rc) { 502366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_setname_np(mIntPicThread, "CAM_IntPic"); 502466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 502566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 502666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 502766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 502866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 502966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : checkIntPicPending 503066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 503166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: timed wait for jpeg completion event, and send 503266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * back completion event to backend 503366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 503466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 503566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 503666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 503766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 503866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::checkIntPicPending(bool JpegMemOpt, char *raw_format) 503966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 504066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bSendToBackend = true; 504166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_int_evt_params_t params; 504266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 504366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 504466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct timespec ts; 504566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct timeval tp; 504666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gettimeofday(&tp, NULL); 504766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ts.tv_sec = tp.tv_sec + 5; 504866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ts.tv_nsec = tp.tv_usec * 1000; 504966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 505066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending || 505166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (true == m_bIntRawEvtPending)) { 505266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Waiting in HAL for snapshot taken notification 505366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_int_lock); 505466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pthread_cond_timedwait(&m_int_cond, &m_int_lock, &ts); 505566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ETIMEDOUT == rc || 0x0 == m_BackendFileName[0]) { 505666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Hit a timeout, or some spurious activity 505766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bSendToBackend = false; 505866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 505966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 506066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 506166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin params.event_type = 0; 506266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT, params.picture_format); 506366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (true == m_bIntRawEvtPending) { 506466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin params.event_type = 1; 506566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_RAW, params.picture_format); 506666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 506766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_int_lock); 506866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 506966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 507066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Attempting to restart preview after taking JPEG snapshot 507166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 507266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processAPI(QCAMERA_SM_EVT_SNAPSHOT_DONE, NULL); 507366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 507466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.setJpegMemOpt(JpegMemOpt); 507566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (true == m_bIntRawEvtPending) { 507666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Attempting to restart preview after taking RAW snapshot 507766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel(QCAMERA_CH_TYPE_RAW); 507866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 507966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //restoring the old raw format 508066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_set("persist.camera.raw.format", raw_format); 508166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 508266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 508366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == bSendToBackend) { 508466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //send event back to server with the file path 508566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin params.dim = m_postprocessor.m_dst_dim; 508666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(¶ms.path[0], &m_BackendFileName[0], QCAMERA_MAX_FILEPATH_LENGTH); 508766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&m_BackendFileName[0], 0x0, QCAMERA_MAX_FILEPATH_LENGTH); 508866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin params.size = mBackendFileSize; 508966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setIntEvent(params); 509066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 509166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 509266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin clearIntPendingEvents(); 509366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 509466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 509566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 509666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 509766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 509866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 509966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takeBackendPic_internal 510066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 510166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take snapshot triggered by backend 510266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 510366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 510466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 510566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 510666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 510766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 510866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 510966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::takeBackendPic_internal(bool *JpegMemOpt, char *raw_format) 511066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 511166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 511266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t apiResult; 511366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 511466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 511566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Set rotation value from user settings as Jpeg rotation 511666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //to configure back-end modules. 511766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setJpegRotation(mParameters.getRotation()); 511866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 511966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setRetroPicture(0); 512066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Prepare snapshot in case LED needs to be flashed */ 512166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mFlashNeeded == 1 || mParameters.isChromaFlashEnabled()) { 512266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Start Preparing for normal Frames 512366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Start Prepare Snapshot"); 512466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Prepare snapshot in case LED needs to be flashed */ 512566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processAPI(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, NULL); 512666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 512766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitAPIResult(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, &apiResult); 512866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = apiResult.status; 512966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 513066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Prep Snapshot done rc = %d", rc); 513166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPrepSnapRun = true; 513266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 513366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 513466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 513566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 513666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Attempting to take JPEG snapshot 513766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mInitPProcJob)) { 513866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Init PProc Deferred work failed"); 513966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 514066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 514166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *JpegMemOpt = m_postprocessor.getJpegMemOpt(); 514266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.setJpegMemOpt(false); 514366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 514466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* capture */ 514566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 514666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Capturing internal snapshot"); 514766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processAPI(QCAMERA_SM_EVT_TAKE_PICTURE, NULL); 514866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 514966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin waitAPIResult(QCAMERA_SM_EVT_TAKE_PICTURE, &apiResult); 515066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = apiResult.status; 515166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 515266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 515366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (true == m_bIntRawEvtPending) { 515466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Attempting to take RAW snapshot 515566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void)JpegMemOpt; 515666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopPreview(); 515766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 515866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //getting the existing raw format type 515966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw.format", raw_format, "17"); 516066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //setting it to a default know value for this task 516166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_set("persist.camera.raw.format", "18"); 516266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 516366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_RAW); 516466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 516566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start postprocessor 516666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mInitPProcJob)) { 516766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Init PProc Deferred work failed"); 516866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 516966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 517066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_RAW]); 517166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 517266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start postprocessor"); 517366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 517466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 517566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 517666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 517766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = startChannel(QCAMERA_CH_TYPE_RAW); 517866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 517966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start raw channel"); 518066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 518166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 518266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 518366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 518466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 518566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot add raw channel"); 518666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 518766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 518866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 518966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 519066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 519166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 519266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 519366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 519466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : clearIntPendingEvents 519566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 519666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: clear internal pending events pertaining to backend 519766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * snapshot requests 519866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 519966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 520066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 520166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 520266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 520366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 520466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 520566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::clearIntPendingEvents() 520666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 520766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 520866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 520966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntRawEvtPending) { 521066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preparePreview(); 521166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin startPreview(); 521266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 521366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 521466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == mParameters.isZSLMode()) { 521566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lockAPI(); 521666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processAPI(QCAMERA_SM_EVT_START_PREVIEW, NULL); 521766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unlockAPI(); 521866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 521966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 522066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 522166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_int_lock); 522266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 522366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIntJpegEvtPending = false; 522466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (true == m_bIntRawEvtPending) { 522566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIntRawEvtPending = false; 522666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 522766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_int_lock); 522866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 522966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 523066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 523166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 523266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takeLiveSnapshot_internal 523366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 523466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: take live snapshot during recording 523566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 523666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 523766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 523866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 523966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 524066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 524166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 524266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::takeLiveSnapshot_internal() 524366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 524466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 524566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 524666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 524766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 524866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Set rotation value from user settings as Jpeg rotation 524966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //to configure back-end modules. 525066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setJpegRotation(mParameters.getRotation()); 525166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 525266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Configure advanced capture 525366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureAdvancedCapture(); 525466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 525566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unsupported capture call"); 525666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 525766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 525866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 525966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isLowPowerMode()) { 526066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_channels[QCAMERA_CH_TYPE_VIDEO]; 526166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 526266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 526366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 526466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 526566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 526666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Snapshot/Video channel not initialized"); 526766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_INIT; 526866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 526966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 527066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5271d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch DeferWorkArgs args; 5272d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memset(&args, 0, sizeof(DeferWorkArgs)); 5273d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 5274d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch args.pprocArgs = pChannel; 5275d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 5276d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // No need to wait for mInitPProcJob here, because it was 5277d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // queued in startPreview, and will definitely be processed before 5278d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // mReprocJob can begin. 5279d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mReprocJob = queueDeferredWork(CMD_DEF_PPROC_START, 5280d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch args); 5281d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mReprocJob == 0) { 5282d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Failed to queue CMD_DEF_PPROC_START"); 5283d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch rc = -ENOMEM; 5284d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch goto end; 528566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 5286d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 5287d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Create JPEG session 5288d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mJpegJob = queueDeferredWork(CMD_DEF_CREATE_JPEG_SESSION, 5289d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch args); 5290d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mJpegJob == 0) { 5291d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Failed to queue CREATE_JPEG_SESSION"); 5292d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != waitDeferredWork(mReprocJob)) { 5293d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Reprocess Deferred work was failed"); 5294d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 5295d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch m_postprocessor.stop(); 5296d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch rc = -ENOMEM; 529766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 529866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 529966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 530066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isLowPowerMode()) { 530166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t buf; 530266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&buf, 0x0, sizeof(buf)); 530366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.type = MM_CAMERA_REQ_SUPER_BUF; 530466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_buf_requested = 1; 530566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = ((QCameraVideoChannel*)pChannel)->takePicture(&buf); 530666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 530766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 530866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 530966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Disable reprocess for 4K liveshot case 531066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.is4k2kVideoResolution()) { 531166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = configureOnlineRotation(*m_channels[QCAMERA_CH_TYPE_SNAPSHOT]); 531266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 531366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("online rotation failed"); 5314d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != waitDeferredWork(mReprocJob)) { 5315d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Reprocess Deferred work was failed"); 5316d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 5317d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != waitDeferredWork(mJpegJob)) { 5318d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Jpeg Deferred work was failed"); 5319d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 532066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 532166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 532266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 532366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 532466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 532566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pChannel) && (mParameters.isTNRSnapshotEnabled())) { 532666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 532766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < pChannel->getNumOfStreams(); i++ ) { 532866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByIndex(i); 532966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pStream) && 533066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAM_STREAM_TYPE_SNAPSHOT == pStream->getMyType())) { 533166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 533266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 533366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 533466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 533566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("REQUEST_FRAMES event for TNR snapshot"); 533666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 533766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 533866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_REQUEST_FRAMES; 533966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.frameRequest.enableStream = 1; 534066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->setParameter(param); 534166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 534266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Stream Event REQUEST_FRAMES failed"); 534366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 534466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 534566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 534666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 534766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 534866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // start snapshot channel 534966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((rc == NO_ERROR) && (NULL != pChannel)) { 535066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Do not link metadata stream for 4K2k resolution 535166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // as CPP processing would be done on snapshot stream and not 535266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // reprocess stream 535366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.is4k2kVideoResolution()) { 535466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Find and try to link a metadata stream from preview channel 535566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pMetaChannel = NULL; 535666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pMetaStream = NULL; 5357d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch QCameraStream *pPreviewStream = NULL; 535866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 535966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) { 536066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaChannel = m_channels[QCAMERA_CH_TYPE_PREVIEW]; 536166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t streamNum = pMetaChannel->getNumOfStreams(); 536266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 536366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < streamNum ; i++ ) { 536466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pMetaChannel->getStreamByIndex(i); 5365d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NULL != pStream) { 5366d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (CAM_STREAM_TYPE_METADATA == pStream->getMyType()) { 5367d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch pMetaStream = pStream; 5368d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else if (CAM_STREAM_TYPE_PREVIEW == pStream->getMyType()) { 5369d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch pPreviewStream = pStream; 5370d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 537166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 537266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 537366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 537466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 537566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pMetaChannel) && (NULL != pMetaStream)) { 537666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->linkStream(pMetaChannel, pMetaStream); 537766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 537866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Metadata stream link failed %d", rc); 537966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 538066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 5381d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if ((NULL != pMetaChannel) && (NULL != pPreviewStream)) { 5382d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch rc = pChannel->linkStream(pMetaChannel, pPreviewStream); 5383d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (NO_ERROR != rc) { 5384d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Preview stream link failed %d", rc); 5385d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 5386d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 538766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 538866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->start(); 538966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 539066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 539166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 539266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 539366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processAPI(QCAMERA_SM_EVT_CANCEL_PICTURE, NULL); 539466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 539566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 539666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 539766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 539866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 539966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 540066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancelLiveSnapshot 540166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 540266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel current live snapshot request 540366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 540466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 540566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 540666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 540766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 540866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 540966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 541066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::cancelLiveSnapshot() 541166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 541266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 541366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 541466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unconfigureAdvancedCapture(); 541566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Enable display frames again"); 5416d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplaySkip(FALSE); 541766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 541866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mLongshotEnabled) { 541966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 542066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 542166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 542266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mLiveSnapshotThread != 0) { 542366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_join(mLiveSnapshotThread,NULL); 542466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLiveSnapshotThread = 0; 542566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 542666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 542766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //stop post processor 542866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_postprocessor.stop(); 542966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 543066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop snapshot channel 543166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isTNRSnapshotEnabled()) { 543266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = stopChannel(QCAMERA_CH_TYPE_SNAPSHOT); 543366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 543466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 543566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pChannel) { 543666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 543766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < pChannel->getNumOfStreams(); i++ ) { 543866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByIndex(i); 543966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pStream) && 544066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAM_STREAM_TYPE_SNAPSHOT == 544166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getMyType())) { 544266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 544366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 544466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 544566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 544666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("REQUEST_FRAMES event for TNR snapshot"); 544766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 544866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 544966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_REQUEST_FRAMES; 545066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.frameRequest.enableStream = 0; 545166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->setParameter(param); 545266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 545366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Stream Event REQUEST_FRAMES failed"); 545466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 545566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 545666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 545766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 545866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 545966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 546066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 546166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 546266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 546366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : putParameters 546466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 546566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: put parameters string impl 546666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 546766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 546866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parms : parameters string to be released 546966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 547066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 547166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 547266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 547366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 547466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::putParameters(char *parms) 547566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 547666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(parms); 547766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 547866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 547966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 548066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 548166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : sendCommand 548266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 548366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send command impl 548466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 548566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 548666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @command : command to be executed 548766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg1 : optional argument 1 548866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @arg2 : optional argument 2 548966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 549066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 549166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 549266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 549366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 549466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::sendCommand(int32_t command, 54951687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan __unused int32_t &arg1, __unused int32_t &arg2) 549666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 549766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 549866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 549966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (command) { 550066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 550166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_LONGSHOT_ON: 550266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_acq(); 550366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin arg1 = arg2 = 0; 550466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Longshot can only be enabled when image capture 550566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // is not active. 550666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( !m_stateMachine.isCaptureRunning() ) { 550766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Longshot Enabled"); 550866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLongshotEnabled = true; 550966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setLongshotEnable(mLongshotEnabled); 551066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 551166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Due to recent buffer count optimizations 551266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ZSL might run with considerably less buffers 551366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // when not in longshot mode. Preview needs to 551466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // restart in this case. 551566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isZSLMode() && m_stateMachine.isPreviewRunning()) { 551666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 551766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pSnapStream = NULL; 551866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_channels[QCAMERA_CH_TYPE_ZSL]; 551966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pChannel) { 552066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 552166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < pChannel->getNumOfStreams(); i++) { 552266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByIndex(i); 552366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 552466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 552566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSnapStream = pStream; 552666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 552766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 552866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 552966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 553066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pSnapStream) { 553166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t required = 0; 553266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin required = getBufNumRequired(CAM_STREAM_TYPE_SNAPSHOT); 553366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pSnapStream->getBufferCount() < required) { 553466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // We restart here, to reset the FPS and no 553566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // of buffers as per the requirement of longshot usecase. 553666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin arg1 = QCAMERA_SM_EVT_RESTART_PERVIEW; 553766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->sync_control == 553866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_SYNC_RELATED_SENSORS_ON) { 553966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin arg2 = QCAMERA_SM_EVT_DELAYED_RESTART; 554066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 554166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 554266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 554366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 554466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 554566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 554666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPrepSnapRun = false; 554766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCACDoneReceived = FALSE; 554866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 554966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_INIT; 555066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 555166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 555266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_LONGSHOT_OFF: 555366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_perfLock.lock_rel(); 555466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mLongshotEnabled && m_stateMachine.isCaptureRunning() ) { 555566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cancelPicture(); 555666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin processEvt(QCAMERA_SM_EVT_SNAPSHOT_DONE, NULL); 555766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pZSLChannel = m_channels[QCAMERA_CH_TYPE_ZSL]; 555866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isZSLMode() && (NULL != pZSLChannel) && mPrepSnapRun) { 555966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops->stop_zsl_snapshot( 556066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->camera_handle, 556166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pZSLChannel->getMyHandle()); 556266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 556366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 556466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPrepSnapRun = false; 556566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Longshot Disabled"); 556666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLongshotEnabled = false; 556766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setLongshotEnable(mLongshotEnabled); 556866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCACDoneReceived = FALSE; 556966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 557066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_HISTOGRAM_ON: 557166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_HISTOGRAM_OFF: 557266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = setHistogram(command == CAMERA_CMD_HISTOGRAM_ON? true : false); 557366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Histogram -> %s", 557466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isHistogramEnabled() ? "Enabled" : "Disabled"); 557566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 557666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 557766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_START_FACE_DETECTION: 557866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_STOP_FACE_DETECTION: 557966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setFaceDetectionOption(command == CAMERA_CMD_START_FACE_DETECTION? true : false); 558066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = setFaceDetection(command == CAMERA_CMD_START_FACE_DETECTION? true : false); 558166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("FaceDetection -> %s", 558266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isFaceDetectionEnabled() ? "Enabled" : "Disabled"); 558366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 558466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 558566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_HISTOGRAM_SEND_DATA: 558666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 558766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 558866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_ERROR; 558966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 559066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 559166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 559266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 559366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 559466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 559566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : registerFaceImage 559666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 559766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: register face image impl 559866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 559966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 560066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @img_ptr : ptr to image buffer 560166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @config : ptr to config struct about input image info 560266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @faceID : [OUT] face ID to uniquely identifiy the registered face image 560366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 560466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 560566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 560666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 560766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 560866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::registerFaceImage(void *img_ptr, 560966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_offline_src_config_t *config, 561066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t &faceID) 561166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 561266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 561366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceID = -1; 561466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 561566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (img_ptr == NULL || config == NULL) { 561666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("img_ptr or config is NULL"); 561766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 561866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 561966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 562066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // allocate ion memory for source image 562166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *imgBuf = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE); 562266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (imgBuf == NULL) { 562366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to new heap memory obj for image buf"); 562466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 562566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 562666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 562766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = imgBuf->allocate(1, config->input_buf_planes.plane_info.frame_len, NON_SECURE); 562866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 562966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to allocate heap memory for image buf"); 563066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete imgBuf; 563166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 563266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 563366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 563466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *pBufPtr = imgBuf->getPtr(0); 563566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pBufPtr == NULL) { 563666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("image buf is NULL"); 563766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgBuf->deallocate(); 563866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete imgBuf; 563966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 564066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 564166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(pBufPtr, img_ptr, config->input_buf_planes.plane_info.frame_len); 564266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 564366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_feature_config_t pp_feature; 564466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&pp_feature, 0, sizeof(cam_pp_feature_config_t)); 564566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_feature.feature_mask = CAM_QCOM_FEATURE_REGISTER_FACE; 564666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *pChannel = 564766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin addOfflineReprocChannel(*config, pp_feature, NULL, NULL); 564866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 564966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 565066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail to add offline reprocess channel"); 565166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgBuf->deallocate(); 565266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete imgBuf; 565366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 565466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 565566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 565666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->start(); 565766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 565866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Cannot start reprocess channel"); 565966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgBuf->deallocate(); 566066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete imgBuf; 566166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 566266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 566366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 566466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 566566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ssize_t bufSize = imgBuf->getSize(0); 566666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (BAD_INDEX != bufSize) { 566766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->doReprocess(imgBuf->getFd(0), (size_t)bufSize, faceID); 566866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 566966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to retrieve buffer size (bad index)"); 567066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 567166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 567266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 567366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // done with register face image, free imgbuf and delete reprocess channel 567466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgBuf->deallocate(); 567566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete imgBuf; 567666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgBuf = NULL; 567766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->stop(); 567866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 567966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = NULL; 568066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 568166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 568266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 568366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 568466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 568566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : release 568666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 568766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release camera resource impl 568866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 568966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 569066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 569166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 569266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 569366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 569466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 569566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::release() 569666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 569766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop and delete all channels 569866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i <QCAMERA_CH_TYPE_MAX ; i++) { 569966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[i] != NULL) { 570066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stopChannel((qcamera_ch_type_enum_t)i); 570166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel((qcamera_ch_type_enum_t)i); 570266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 570366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 570466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 570566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 570666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 570766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 570866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 570966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dump 571066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 571166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: camera status dump impl 571266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 571366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 571466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @fd : fd for the buffer to be dumped with camera status 571566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 571666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 571766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 571866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 571966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 572066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::dump(int fd) 572166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 572266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "\n Camera HAL information Begin \n"); 572366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "Camera ID: %d \n", mCameraId); 572466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "StoreMetaDataInFrame: %d \n", mStoreMetaDataInFrame); 572566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "\n Configuration: %s", mParameters.dump().string()); 572666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "\n State Information: %s", m_stateMachine.dump().string()); 572766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dprintf(fd, "\n Camera HAL information End \n"); 572866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 572966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* send UPDATE_DEBUG_LEVEL to the backend so that they can read the 573066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin debug level property */ 573166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateDebugLevel(); 573266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 573366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 573466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 573566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 573666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processAPI 573766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 573866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process API calls from upper layer 573966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 574066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 574166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @api : API to be processed 574266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @api_payload : ptr to API payload if any 574366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 574466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 574566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 574666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 574766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 574866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::processAPI(qcamera_sm_evt_enum_t api, void *api_payload) 574966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 575066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = DEAD_OBJECT; 575166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 575266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_smThreadActive) { 575366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = m_stateMachine.procAPI(api, api_payload); 575466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 575566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 575666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 575766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 575866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 575966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 576066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processEvt 576166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 576266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process Evt from backend via mm-camera-interface 576366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 576466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 576566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : event type to be processed 576666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt_payload : ptr to event payload if any 576766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 576866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 576966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 577066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 577166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 577266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload) 577366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 577466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_stateMachine.procEvt(evt, evt_payload); 577566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 577666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 577766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 577866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processSyncEvt 577966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 578066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process synchronous Evt from backend 578166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 578266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 578366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : event type to be processed 578466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt_payload : ptr to event payload if any 578566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 578666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 578766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 578866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 578966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 579066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload) 579166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 579266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 579366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 579466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_evtLock); 579566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = processEvt(evt, evt_payload); 579666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 579766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&m_evtResult, 0, sizeof(qcamera_api_result_t)); 579866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (m_evtResult.request_api != evt) { 579966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_wait(&m_evtCond, &m_evtLock); 580066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 580166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_evtResult.status; 580266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 580366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_evtLock); 580466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 580566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 580666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 580766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 580866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 580966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : evtHandle 581066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 581166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function registerd to mm-camera-interface to handle backend events 581266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 581366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 581466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_handle : event type to be processed 581566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : ptr to event 581666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr 581766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 581866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 581966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 582066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::camEvtHandle(uint32_t /*camera_handle*/, 582166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_event_t *evt, 582266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *user_data) 582366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 582466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)user_data; 582566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (obj && evt) { 582666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_event_t *payload = 582766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_event_t *)malloc(sizeof(mm_camera_event_t)); 582866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 582966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *payload = *evt; 583066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //peek into the event, if this is an eztune event from server, 583166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //then we don't need to post it to the SM Qs, we shud directly 583266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //spawn a thread and get the job done (jpeg or raw snapshot) 583366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (payload->server_event_type) { 583466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_EVENT_TYPE_INT_TAKE_JPEG: 583566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Received JPEG trigger from eztune 583666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == obj->m_bIntJpegEvtPending) { 583766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&obj->m_int_lock); 583866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->m_bIntJpegEvtPending = true; 583966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&obj->m_int_lock); 584066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->takePictureInternal(); 584166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 584266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 584366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 584466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_EVENT_TYPE_INT_TAKE_RAW: 584566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Received RAW trigger from eztune 584666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == obj->m_bIntRawEvtPending) { 584766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&obj->m_int_lock); 584866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->m_bIntRawEvtPending = true; 584966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&obj->m_int_lock); 585066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->takePictureInternal(); 585166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 585266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 585366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 585466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_EVENT_TYPE_DAEMON_DIED: 585566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 585666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(obj->mDefLock); 585766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->mDefCond.broadcast(); 585866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("broadcast mDefCond signal\n"); 585966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 586066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 586166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->processEvt(QCAMERA_SM_EVT_EVT_NOTIFY, payload); 586266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 586366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 586466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 586566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 586666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL user_data"); 586766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 586866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 586966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 587066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 587166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : jpegEvtHandle 587266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 587366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events 587466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 587566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 587666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @status : status of jpeg job 587766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @client_hdl: jpeg client handle 587866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jobId : jpeg job Id 587966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @p_ouput : ptr to jpeg output result struct 588066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 588166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 588266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 588366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 588466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::jpegEvtHandle(jpeg_job_status_t status, 588566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t /*client_hdl*/, 588666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t jobId, 588766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_output_t *p_output, 588866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 588966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 589066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)userdata; 589166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (obj) { 589266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_evt_payload_t *payload = 589366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_evt_payload_t *)malloc(sizeof(qcamera_jpeg_evt_payload_t)); 589466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 589566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_jpeg_evt_payload_t)); 589666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->status = status; 589766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->jobId = jobId; 589866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (p_output != NULL) { 589966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->out_data = *p_output; 590066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 590166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin obj->processEvt(QCAMERA_SM_EVT_JPEG_EVT_NOTIFY, payload); 590266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 590366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 590466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL user_data"); 590566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 590666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 590766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 590866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 590966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : thermalEvtHandle 591066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 591166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: routine to handle thermal event notification 591266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 591366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 591466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @level : thermal level 591566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : userdata passed in during registration 591666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : opaque data from thermal client 591766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 591866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 591966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 592066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 592166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 592266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::thermalEvtHandle( 592366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_thermal_level_enum_t *level, void *userdata, void *data) 592466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 592566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mCameraOpened) { 592666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Camera is not opened, no need to handle thermal evt"); 592766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 592866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 592966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 593066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Make sure thermal events are logged 593166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("level = %d, userdata = %p, data = %p", 593266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *level, userdata, data); 593366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //We don't need to lockAPI, waitAPI here. QCAMERA_SM_EVT_THERMAL_NOTIFY 593466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // becomes an aync call. This also means we can only pass payload 593566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // by value, not by address. 593666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return processAPI(QCAMERA_SM_EVT_THERMAL_NOTIFY, (void *)level); 593766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 593866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 593966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 594066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : sendEvtNotify 594166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 594266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send event notify to notify thread 594366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 594466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 594566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type: msg type to be sent 594666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ext1 : optional extension1 594766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ext2 : optional extension2 594866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 594966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 595066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 595166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 595266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 595366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::sendEvtNotify(int32_t msg_type, 595466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ext1, 595566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ext2) 595666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 595766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 595866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 595966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 596066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = msg_type; 596166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext1 = ext1; 596266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext2 = ext2; 596366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_cbNotifier.notifyCallback(cbArg); 596466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 596566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 596666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 596766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processAEInfo 596866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 596966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process AE updates 597066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 597166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 597266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ae_params: current AE parameters 597366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 597466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 597566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 597666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processAEInfo(cam_3a_params_t &ae_params) 597766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 597866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateAEInfo(ae_params); 5979d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mParameters.isInstantAECEnabled()) { 5980d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Reset Instant AEC info only if instant aec enabled. 5981d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bool bResetInstantAec = false; 5982d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (ae_params.settled) { 5983d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // If AEC settled, reset instant AEC 5984d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bResetInstantAec = true; 5985d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else if ((mParameters.isInstantCaptureEnabled()) && 5986d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (mInstantAecFrameCount >= mParameters.getAecFrameBoundValue())) { 5987d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // if AEC not settled, and instant capture enabled, 5988d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // reset instant AEC only when frame count is 5989d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // more or equal to AEC frame bound value. 5990d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bResetInstantAec = true; 5991d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else if ((mParameters.isInstantAECEnabled()) && 5992d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (mInstantAecFrameCount >= mParameters.getAecSkipDisplayFrameBound())) { 5993d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // if AEC not settled, and only instant AEC enabled, 5994d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // reset instant AEC only when frame count is 5995d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // more or equal to AEC skip display frame bound value. 5996d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch bResetInstantAec = true; 5997d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 5998d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 5999d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (bResetInstantAec) { 6000d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGD("setting instant AEC to false"); 6001d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mParameters.setInstantAEC(false, true); 6002d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mInstantAecFrameCount = 0; 6003d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 6004d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 600566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 600666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 600766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 600866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 600966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processFocusPositionInfo 601066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 601166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process AF updates 601266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 601366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 601466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cur_pos_info: current lens position 601566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 601666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 601766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 601866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processFocusPositionInfo(cam_focus_pos_info_t &cur_pos_info) 601966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 602066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateCurrentFocusPosition(cur_pos_info); 602166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 602266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 602366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 602466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 602566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processAutoFocusEvent 602666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 602766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process auto focus event 602866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 602966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 603066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @focus_data: struct containing auto focus result info 603166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 603266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 603366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 603466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 603566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 603666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processAutoFocusEvent(cam_auto_focus_data_t &focus_data) 603766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 603866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 603966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 604066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 604166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->mode == CAM_MODE_SECONDARY) { 604266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Ignore focus updates 604366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X Secondary Camera, no need to process!! "); 604466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 604566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 604666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_focus_mode_type focusMode = mParameters.getFocusMode(); 604766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[AF_DBG] focusMode=%d, focusState=%d", 604866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin focusMode, focus_data.focus_state); 604966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 605066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (focusMode) { 605166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_AUTO: 605266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_MACRO: 605366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ignore AF event if AF was already cancelled meanwhile 605466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mActiveAF) { 605566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 605666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 605766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If the HAL focus mode is different from AF INFINITY focus mode, send event to app 605866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_mode == CAM_FOCUS_MODE_INFINITY) && 605966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_INACTIVE)) { 606066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = sendEvtNotify(CAMERA_MSG_FOCUS, true, 0); 606166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; // reset the mActiveAF in this special case 606266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 606366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 606466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 606566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //while transitioning from CAF->Auto/Macro, we might receive CAF related 606666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //events (PASSIVE_*) due to timing. Ignore such events if any. 606766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_state == CAM_AF_STATE_PASSIVE_SCAN) || 606866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_FOCUSED) || 606966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_UNFOCUSED)) { 607066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 607166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 607266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 607366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //This is just an intermediate update to HAL indicating focus is in progress. No need 607466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //to send this event to app. Same applies to INACTIVE state as well. 607566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_state == CAM_AF_STATE_ACTIVE_SCAN) || 607666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_INACTIVE)) { 607766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 607866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 607966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // update focus distance 608066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateFocusDistances(&focus_data.focus_dist); 608166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 608266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //flush any old snapshot frames in ZSL Q which are not focused. 60831687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan if (mParameters.isZSLMode() && focus_data.flush_info.needFlush ) { 608466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pZSLChannel = 608566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 608666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pZSLChannel) { 608766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //flush the zsl-buffer 60881687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan uint32_t flush_frame_idx = focus_data.flush_info.focused_frame_idx; 608966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("flush the zsl-buffer before frame = %u.", flush_frame_idx); 609066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pZSLChannel->flushSuperbuffer(flush_frame_idx); 609166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 609266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 609366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 609466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //send event to app finally 609566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Send AF DOne event to app"); 609666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = sendEvtNotify(CAMERA_MSG_FOCUS, 609766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_FOCUSED_LOCKED), 0); 609866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 609966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 610066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 610166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 610266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If the HAL focus mode is different from AF INFINITY focus mode, send event to app 610366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_mode == CAM_FOCUS_MODE_INFINITY) && 610466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_INACTIVE)) { 610566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = sendEvtNotify(CAMERA_MSG_FOCUS, false, 0); 610666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; // reset the mActiveAF in this special case 610766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 610866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 610966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 611066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //If AutoFocus() is triggered while in CAF mode, ignore all CAF events (PASSIVE_*) and 611166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //process/wait for only ACTIVE_* events. 611266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((focus_data.focus_state == CAM_AF_STATE_PASSIVE_FOCUSED) || 611366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_UNFOCUSED) || 611466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_SCAN)) && mActiveAF) { 611566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 611666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 611766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 611866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //These are the AF states for which we need to send notification to app in CAF mode. 611966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //This includes both regular CAF (PASSIVE) events as well as ACTIVE events ( in case 612066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //AF is triggered while in CAF mode) 612166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_state == CAM_AF_STATE_PASSIVE_FOCUSED) || 612266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_UNFOCUSED) || 612366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_FOCUSED_LOCKED) || 612466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_NOT_FOCUSED_LOCKED)) { 612566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 612666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // update focus distance 612766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateFocusDistances(&focus_data.focus_dist); 612866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 61291687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan if (mParameters.isZSLMode() && focus_data.flush_info.needFlush ) { 613066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pZSLChannel = 613166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 613266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pZSLChannel) { 613366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //flush the zsl-buffer 61341687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan uint32_t flush_frame_idx = focus_data.flush_info.focused_frame_idx; 613566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("flush the zsl-buffer before frame = %u.", flush_frame_idx); 613666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pZSLChannel->flushSuperbuffer(flush_frame_idx); 613766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 613866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 613966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 614066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mActiveAF) { 614166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Send AF Done event to app"); 614266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 614366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = sendEvtNotify(CAMERA_MSG_FOCUS, 614466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((focus_data.focus_state == CAM_AF_STATE_PASSIVE_FOCUSED) || 614566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_FOCUSED_LOCKED)), 0); 614666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 614766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = sendEvtNotify(CAMERA_MSG_FOCUS_MOVE, 614866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_PASSIVE_SCAN), 0); 614966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 615066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_INFINITY: 615166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_FIXED: 615266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FOCUS_MODE_EDOF: 615366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 615466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("no ops for autofocus event in focusmode %d", focusMode); 615566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 615666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 615766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 615866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Reset mActiveAF once we receive focus done event 615966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((focus_data.focus_state == CAM_AF_STATE_FOCUSED_LOCKED) || 616066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (focus_data.focus_state == CAM_AF_STATE_NOT_FOCUSED_LOCKED)) { 616166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActiveAF = false; 616266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 616366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 616466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X"); 616566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 616666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 616766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 616866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 616966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processZoomEvent 617066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 617166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process zoom event 617266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 617366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 617466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @crop_info : crop info as a result of zoom operation 617566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 617666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 617766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 617866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 617966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 618066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processZoomEvent(cam_crop_data_t &crop_info) 618166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 618266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 618366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 618466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 618566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[i] != NULL) { 618666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = m_channels[i]->processZoomDone(mPreviewWindow, crop_info); 618766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 618866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 618966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 619066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 619166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 619266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 619366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processZSLCaptureDone 619466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 619566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process ZSL capture done events 619666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 619766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 619866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 619966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 620066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 620166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 620266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 620366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processZSLCaptureDone() 620466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 620566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 620666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 620766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (++mInputCount >= mParameters.getBurstCountForAdvancedCapture()) { 620866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = unconfigureAdvancedCapture(); 620966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 621066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 621166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 621266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 621366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 621466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 621566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processRetroAECUnlock 621666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 621766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process retro burst AEC unlock events 621866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 621966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 622066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 622166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 622266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 622366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 622466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 622566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processRetroAECUnlock() 622666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 622766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 622866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 622966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("LED assisted AF Release AEC Lock"); 623066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setAecLock("false"); 623166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 623266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error setting AEC lock"); 623366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 623466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 623566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 623666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.commitParameters(); 623766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 623866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error during camera parameter commit"); 623966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 624066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bLedAfAecLock = FALSE; 624166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 624266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 624366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 624466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 624566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 624666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 624766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processHDRData 624866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 624966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process HDR scene events 625066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 625166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 625266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hdr_scene : HDR scene event data 625366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 625466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 625566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 625666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 625766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 62581687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajanint32_t QCamera2HardwareInterface::processHDRData( 62591687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan __unused cam_asd_hdr_scene_data_t hdr_scene) 626066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 626166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 626266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 626366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 626466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hdr_scene.is_hdr_scene && 626566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (hdr_scene.hdr_confidence > HDR_CONFIDENCE_THRESHOLD) && 626666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isAutoHDREnabled()) { 626766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_HDRSceneEnabled = true; 626866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 626966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_HDRSceneEnabled = false; 627066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 627166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setHDRSceneEnable(m_HDRSceneEnabled); 627266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 627366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( msgTypeEnabled(CAMERA_MSG_META_DATA) ) { 627466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 627566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t data_len = sizeof(int); 627666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t buffer_len = 1 *sizeof(int) //meta type 627766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + 1 *sizeof(int) //data len 627866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + 1 *sizeof(int); //data 627966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *hdrBuffer = mGetMemory(-1, 628066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buffer_len, 628166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 628266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie); 628366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == hdrBuffer ) { 628466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough memory for auto HDR data"); 628566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 628666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 628766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 628866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int *pHDRData = (int *)hdrBuffer->data; 628966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pHDRData == NULL) { 629066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("memory data ptr is NULL"); 629166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 629266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 629366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 629466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pHDRData[0] = CAMERA_META_DATA_HDR; 629566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pHDRData[1] = (int)data_len; 629666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pHDRData[2] = m_HDRSceneEnabled; 629766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 629866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 629966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 630066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 630166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_META_DATA; 630266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = hdrBuffer; 630366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = hdrBuffer; 630466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 630566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 630666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_cbNotifier.notifyCallback(cbArg); 630766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 630866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending auto HDR notification"); 630966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdrBuffer->release(hdrBuffer); 631066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 631166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 631266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 631366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("hdr_scene_data: processHDRData: %d %f", 631466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdr_scene.is_hdr_scene, 631566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdr_scene.hdr_confidence); 631666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 631766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 631866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 631966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 632066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 632166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 632266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : transAwbMetaToParams 632366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 632466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: translate awb params from metadata callback to QCameraParametersIntf 632566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 632666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 632766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @awb_params : awb params from metadata callback 632866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 632966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 633066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 633166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 633266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 633366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::transAwbMetaToParams(cam_awb_params_t &awb_params) 633466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 633566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.updateAWBParams(awb_params); 633666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 633766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 633866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 633966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 634066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processPrepSnapshotDone 634166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 634266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process prep snapshot done event 634366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 634466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 634566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @prep_snapshot_state : state of prepare snapshot done. In other words, 634666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * i.e. whether need future frames for capture. 634766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 634866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 634966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 635066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 635166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 635266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processPrepSnapshotDoneEvent( 635366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_prep_snapshot_state_t prep_snapshot_state) 635466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 635566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 635666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: Received PREPARE SANSPHOT Done event state = %d", 635766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin prep_snapshot_state); 635866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_ZSL] && 635966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin prep_snapshot_state == NEED_FUTURE_FRAME) { 636066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("already handled in mm-camera-intf, no ops here"); 636166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isRetroPicture()) { 636266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setAecLock("true"); 636366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.commitParameters(); 636466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bLedAfAecLock = TRUE; 636566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 636666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 636766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 636866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 636966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 637066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 637166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processASDUpdate 637266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 637366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process ASD update event 637466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 637566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 637666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @scene: selected scene mode 637766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 637866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 637966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 638066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 638166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 63821687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajanint32_t QCamera2HardwareInterface::processASDUpdate( 6383d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch __unused cam_asd_decision_t asd_decision) 638466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 638566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t data_len = sizeof(cam_auto_scene_t); 638666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t buffer_len = 1 *sizeof(int) //meta type 638766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + 1 *sizeof(int) //data len 638866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + data_len; //data 638966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *asdBuffer = mGetMemory(-1, 639066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buffer_len, 639166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 639266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie); 639366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == asdBuffer ) { 639466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough memory for histogram data"); 639566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 639666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 639766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 639866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int *pASDData = (int *)asdBuffer->data; 639966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pASDData == NULL) { 640066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("memory data ptr is NULL"); 640166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 640266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 640366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 640466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 640566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pASDData[0] = CAMERA_META_DATA_ASD; 640666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pASDData[1] = (int)data_len; 6407d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch pASDData[2] = asd_decision.detected_scene; 640866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 640966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 641066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 641166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 641266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_META_DATA; 641366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = asdBuffer; 641466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = asdBuffer; 641566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 641666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 641766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_cbNotifier.notifyCallback(cbArg); 641866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 641966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending notification"); 642066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin asdBuffer->release(asdBuffer); 642166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 642266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 642366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 642466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 642566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 642666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 642766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 642866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processJpegNotify 642966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 643066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process jpeg event 643166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 643266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 643366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpeg_evt: ptr to jpeg event payload 643466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 643566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 643666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 643766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 643866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 643966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_evt) 644066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 644166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_postprocessor.processJpegEvt(jpeg_evt); 644266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 644366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 644466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 644566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lockAPI 644666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 644766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: lock to process API 644866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 644966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 645066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 645166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 645266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 645366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::lockAPI() 645466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 645566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 645666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 645766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 645866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 645966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : waitAPIResult 646066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 646166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: wait for API result coming back. This is a blocking call, it will 646266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * return only cerntain API event type arrives 646366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 646466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 646566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @api_evt : API event type 646666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 646766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 646866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 646966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::waitAPIResult(qcamera_sm_evt_enum_t api_evt, 647066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_api_result_t *apiResult) 647166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 647266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("wait for API result of evt (%d)", api_evt); 647366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int resultReceived = 0; 647466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (!resultReceived) { 647566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_wait(&m_cond, &m_lock); 647666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_apiResultList != NULL) { 647766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResultList = m_apiResultList; 647866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResultListPrevious = m_apiResultList; 647966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (apiResultList != NULL) { 648066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (apiResultList->result.request_api == api_evt) { 648166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin resultReceived = 1; 648266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *apiResult = apiResultList->result; 648366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultListPrevious->next = apiResultList->next; 648466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (apiResultList == m_apiResultList) { 648566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_apiResultList = apiResultList->next; 648666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 648766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(apiResultList); 648866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 648966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 649066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 649166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultListPrevious = apiResultList; 649266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultList = apiResultList->next; 649366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 649466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 649566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 649666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 649766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("return (%d) from API result wait for evt (%d)", 649866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResult->status, api_evt); 649966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 650066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 650166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 650266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 650366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : unlockAPI 650466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 650566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: API processing is done, unlock 650666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 650766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 650866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 650966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 651066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 651166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::unlockAPI() 651266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 651366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 651466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 651566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 651666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 651766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : signalAPIResult 651866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 651966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: signal condition viarable that cerntain API event type arrives 652066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 652166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 652266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @result : API result 652366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 652466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 652566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 652666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::signalAPIResult(qcamera_api_result_t *result) 652766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 652866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 652966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 653066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResult = (api_result_list *)malloc(sizeof(api_result_list)); 653166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (apiResult == NULL) { 653266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("ERROR: malloc for api result failed, Result will not be sent"); 653366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto malloc_failed; 653466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 653566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResult->result = *result; 653666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResult->next = NULL; 653766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_apiResultList == NULL) m_apiResultList = apiResult; 653866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 653966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin api_result_list *apiResultList = m_apiResultList; 654066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while(apiResultList->next != NULL) apiResultList = apiResultList->next; 654166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin apiResultList->next = apiResult; 654266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 654366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmalloc_failed: 654466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_broadcast(&m_cond); 654566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 654666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 654766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 654866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 654966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : signalEvtResult 655066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 655166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: signal condition variable that certain event was processed 655266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 655366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 655466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @result : Event result 655566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 655666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 655766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 655866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::signalEvtResult(qcamera_api_result_t *result) 655966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 656066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_evtLock); 656166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_evtResult = *result; 656266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_signal(&m_evtCond); 656366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_evtLock); 656466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 656566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 656666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::prepareRawStream(QCameraChannel *curChannel) 656766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 656866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 656966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t str_dim,max_dim; 657066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel; 657166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 657266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.width = 0; 657366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.height = 0; 657466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 657566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int j = 0; j < QCAMERA_CH_TYPE_MAX; j++) { 657666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[j] != NULL) { 657766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_channels[j]; 657866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0; i < pChannel->getNumOfStreams(); i++) { 657966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByIndex(i); 658066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 658166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 658266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW))) { 658366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 658466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 658566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(str_dim); 658666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (str_dim.width > max_dim.width) { 658766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.width = str_dim.width; 658866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 658966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (str_dim.height > max_dim.height) { 659066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.height = str_dim.height; 659166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 659266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 659366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 659466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 659566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 659666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 659766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0; i < curChannel->getNumOfStreams(); i++) { 659866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = curChannel->getStreamByIndex(i); 659966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 660066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 660166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW))) { 660266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 660366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 660466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(str_dim); 660566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (str_dim.width > max_dim.width) { 660666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.width = str_dim.width; 660766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 660866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (str_dim.height > max_dim.height) { 660966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_dim.height = str_dim.height; 661066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 661166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 661266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 661366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.updateRAW(max_dim); 661466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 661566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 661666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 661766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addStreamToChannel 661866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 661966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a stream into a channel 662066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 662166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 662266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pChannel : ptr to channel obj 662366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamType : type of stream to be added 662466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamCB : callback of stream 662566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userData : user data ptr to callback 662666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 662766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 662866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 662966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 663066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 663166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addStreamToChannel(QCameraChannel *pChannel, 663266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t streamType, 663366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb_routine streamCB, 663466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userData) 663566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 663666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 663766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 663866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamType == CAM_STREAM_TYPE_RAW) { 663966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin prepareRawStream(pChannel); 664066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 664166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(streamType); 664266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStreamInfo == NULL) { 664366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for stream info buf"); 664466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 664566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 664666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t minStreamBufNum = getBufNumRequired(streamType); 664766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bDynAllocBuf = false; 664866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isZSLMode() && streamType == CAM_STREAM_TYPE_SNAPSHOT) { 664966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bDynAllocBuf = true; 665066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 665166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 665266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t padding_info; 665366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamType == CAM_STREAM_TYPE_ANALYSIS) { 665466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info = 665566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[mCameraId]->analysis_padding_info; 665666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 665766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info = 665866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[mCameraId]->padding_info; 665966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamType == CAM_STREAM_TYPE_PREVIEW) { 666066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.width_padding = mSurfaceStridePadding; 666166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.height_padding = CAM_PAD_TO_2; 666266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 666366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((!needReprocess()) 666466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (streamType != CAM_STREAM_TYPE_SNAPSHOT) 666566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (!mParameters.isLLNoiseEnabled())) { 666666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_x = 0; 666766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_y = 0; 666866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 666966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 667066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 667166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool deferAllocation = needDeferred(streamType); 667266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("deferAllocation = %d bDynAllocBuf = %d, stream type = %d", 667366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin deferAllocation, bDynAllocBuf, streamType); 667466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->addStream(*this, 667566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStreamInfo, 667666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 667766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum, 667866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &padding_info, 667966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamCB, userData, 668066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bDynAllocBuf, 668166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin deferAllocation); 668266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 668366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 668466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add stream type (%d) failed, ret = %d", 668566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamType, rc); 668666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 668766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 668866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 668966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 669066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 669166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 669266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 669366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addPreviewChannel 669466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 669566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a preview channel that contains a preview stream 669666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 669766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 669866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 669966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 670066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 670166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 670266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 670366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addPreviewChannel() 670466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 670566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 670666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 670766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 670866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool raw_yuv = false; 670966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 671066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 671166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) { 671266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if we had preview channel before, delete it first 671366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_PREVIEW]; 671466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_PREVIEW] = NULL; 671566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 671666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 671766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 671866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 671966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 672066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for preview channel"); 672166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 672266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 672366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 672466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // preview only channel, don't need bundle attr and cb 672566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, NULL); 672666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 672766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init preview channel failed, ret = %d", rc); 672866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 672966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 673066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 673166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // meta data stream always coexists with preview if applicable 673266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 673366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_stream_cb_routine, this); 673466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 673566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add metadata stream failed, ret = %d", rc); 673666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 673766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 673866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 673966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isRdiMode()) { 674066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_RAW, 674166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rdi_mode_stream_cb_routine, this); 674266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 674366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isNoDisplayMode()) { 674466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 674566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nodisplay_preview_stream_cb_routine, this); 674666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 674766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 674866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_stream_cb_routine, this); 674966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setStreamSyncCB(CAM_STREAM_TYPE_PREVIEW, 675066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin synchronous_stream_cb_routine); 675166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 675266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 675366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6754d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (((mParameters.fdModeInVideo()) 675566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getDcrf() == true) 675666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (mParameters.getRecordingHintValue() != true)) 675766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (!mParameters.isSecureMode())) { 675866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_ANALYSIS, 675966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 676066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 676166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add Analysis stream failed, ret = %d", rc); 676266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 676366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 676466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 676566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 676666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw_yuv", value, "0"); 676766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_yuv = atoi(value) > 0 ? true : false; 676866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( raw_yuv ) { 676966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel,CAM_STREAM_TYPE_RAW, 677066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_raw_stream_cb_routine,this); 677166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( rc != NO_ERROR ) { 677266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add raw stream failed, ret = %d", __FUNCTION__, rc); 677366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 677466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 677566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 677666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 677766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 677866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 677966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add preview stream failed, ret = %d", rc); 678066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 678166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 678266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 678366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 678466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_PREVIEW] = pChannel; 678566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 678666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 678766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 678866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 678966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addVideoChannel 679066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 679166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a video channel that contains a video stream 679266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 679366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 679466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 679566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 679666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 679766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 679866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 679966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addVideoChannel() 680066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 680166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 680266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoChannel *pChannel = NULL; 680366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 680466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_VIDEO] != NULL) { 680566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if we had video channel before, delete it first 680666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_VIDEO]; 680766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_VIDEO] = NULL; 680866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 680966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 681066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraVideoChannel(mCameraHandle->camera_handle, 681166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 681266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 681366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for video channel"); 681466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 681566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 681666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 681766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isLowPowerMode()) { 681866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 681966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 682066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 682166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.look_back = 0; //wait for future frame for liveshot 682266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.post_frame_skip = mParameters.getZSLBurstInterval(); 682366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.water_mark = 1; //hold min buffers possible in Q 682466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 682566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, snapshot_channel_cb_routine, this); 682666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 682766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // preview only channel, don't need bundle attr and cb 682866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, NULL); 682966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 683066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 683166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 683266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init video channel failed, ret = %d", rc); 683366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 683466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 683566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 683666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 683766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_VIDEO, 683866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_stream_cb_routine, this); 683966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 684066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add video stream failed, ret = %d", rc); 684166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 684266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 684366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 684466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 684566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_VIDEO] = pChannel; 684666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 684766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 684866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 684966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 685066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addSnapshotChannel 685166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 685266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a snapshot channel that contains a snapshot stream 685366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 685466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 685566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 685666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 685766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 685866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 685966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Add this channel for live snapshot usecase. Regular capture will 686066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * use addCaptureChannel. 686166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 686266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addSnapshotChannel() 686366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 686466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 686566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 686666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 686766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_SNAPSHOT] != NULL) { 686866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if we had ZSL channel before, delete it first 686966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 687066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = NULL; 687166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 687266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 687366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 687466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 687566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 687666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for snapshot channel"); 687766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 687866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 687966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 688066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 688166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 688266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 6883d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch attr.look_back = 0; //wait for future frame for liveshot 688466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.post_frame_skip = mParameters.getZSLBurstInterval(); 6885d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch attr.water_mark = 1; //hold min buffers possible in Q 688666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 688766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.priority = MM_CAMERA_SUPER_BUF_PRIORITY_LOW; 688866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, snapshot_channel_cb_routine, this); 688966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 689066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init snapshot channel failed, ret = %d", rc); 689166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 689266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 689366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 689466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 689566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 689666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, NULL); 689766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 689866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add snapshot stream failed, ret = %d", rc); 689966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 690066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 690166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 690266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 690366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = pChannel; 690466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 690566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 690666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 690766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 690866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addRawChannel 690966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 691066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a raw channel that contains a raw image stream 691166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 691266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 691366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 691466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 691566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 691666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 691766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 691866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addRawChannel() 691966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 692066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 692166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 692266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 692366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_RAW] != NULL) { 692466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if we had raw channel before, delete it first 692566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_RAW]; 692666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_RAW] = NULL; 692766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 692866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 692966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 693066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 693166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 693266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for raw channel"); 693366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 693466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 693566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 693666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 693766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 693866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 693966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 694066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.look_back = mParameters.getZSLBackLookCount(); 694166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.post_frame_skip = mParameters.getZSLBurstInterval(); 694266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.water_mark = 1; 694366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 694466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, raw_channel_cb_routine, this); 694566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 694666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init RAW channel failed, ret = %d", rc); 694766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 694866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 694966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 695066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 695166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, NULL); 695266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 695366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init raw channel failed, ret = %d", rc); 695466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 695566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 695666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 695766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 695866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 695966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isZSLMode()) { 696066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // meta data stream always coexists with snapshot in regular RAW capture case 696166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 696266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_stream_cb_routine, this); 696366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 696466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add metadata stream failed, ret = %d", rc); 696566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 696666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 696766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 696866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 696966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 697066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 697166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_RAW, 697266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 697366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 697466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_RAW, 697566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_stream_cb_routine, this); 697666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 697766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 697866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add snapshot stream failed, ret = %d", rc); 697966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 698066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 698166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 698266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_RAW] = pChannel; 698366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 698466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 698566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 698666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 698766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addZSLChannel 698866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 698966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a ZSL channel that contains a preview stream and 699066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * a snapshot stream 699166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 699266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 699366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 699466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 699566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 699666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 699766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 699866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addZSLChannel() 699966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 700066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 700166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pChannel = NULL; 700266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 700366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool raw_yuv = false; 700466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 700566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_ZSL] != NULL) { 700666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if we had ZSL channel before, delete it first 700766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_ZSL]; 700866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_ZSL] = NULL; 700966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 701066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 701166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraPicChannel(mCameraHandle->camera_handle, 701266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 701366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 701466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for ZSL channel"); 701566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 701666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 701766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 701866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ZSL channel, init with bundle attr and cb 701966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 702066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 702166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isSceneSelectionEnabled()) { 702266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 702366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 702466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 702566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 702666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.look_back = mParameters.getZSLBackLookCount(); 702766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.post_frame_skip = mParameters.getZSLBurstInterval(); 702866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isOEMFeatEnabled()) { 702966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.post_frame_skip++; 703066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 703166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.water_mark = mParameters.getZSLQueueDepth(); 703266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 7033d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch attr.user_expected_frame_id = 7034d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mParameters.isInstantCaptureEnabled() ? (uint8_t)mParameters.getAecFrameBoundValue() : 0; 703566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 703666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Enabled matched queue 703766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->is_frame_sync_enabled) { 703866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Enabling frame sync for dual camera, camera Id: %d", 703966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraId); 704066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.enable_frame_sync = 1; 704166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 704266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, 704366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin zsl_channel_cb, 704466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin this); 704566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 704666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init ZSL channel failed, ret = %d", rc); 704766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 704866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 704966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 705066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 705166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // meta data stream always coexists with preview if applicable 705266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 705366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_stream_cb_routine, this); 705466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 705566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add metadata stream failed, ret = %d", rc); 705666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 705766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 705866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 705966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 706066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isNoDisplayMode()) { 706166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 706266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nodisplay_preview_stream_cb_routine, this); 706366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 706466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 706566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_stream_cb_routine, this); 706666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setStreamSyncCB(CAM_STREAM_TYPE_PREVIEW, 706766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin synchronous_stream_cb_routine); 706866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 706966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 707066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add preview stream failed, ret = %d", rc); 707166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 707266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 707366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 707466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 707566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 707666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 707766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 707866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add snapshot stream failed, ret = %d", rc); 707966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 708066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 708166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 708266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 708366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isSecureMode()) { 708466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_ANALYSIS, 708566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 708666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 708766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add Analysis stream failed, ret = %d", rc); 708866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 708966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 709066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 709166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 709266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 709366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw_yuv", value, "0"); 709466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_yuv = atoi(value) > 0 ? true : false; 709566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (raw_yuv) { 709666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, 709766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_STREAM_TYPE_RAW, 709866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 709966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin this); 710066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 710166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add raw stream failed, ret = %d", rc); 710266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 710366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 710466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 710566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 710666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 710766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_ZSL] = pChannel; 710866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 710966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 711066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 711166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 711266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addCaptureChannel 711366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 711466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a capture channel that contains a snapshot stream 711566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * and a postview stream 711666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 711766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 711866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 711966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 712066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 712166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 712266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Add this channel for regular capture usecase. 712366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * For Live snapshot usecase, use addSnapshotChannel. 712466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 712566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addCaptureChannel() 712666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 712766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 712866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPicChannel *pChannel = NULL; 712966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 713066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool raw_yuv = false; 713166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 713266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_CAPTURE] != NULL) { 713366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_CAPTURE]; 713466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_CAPTURE] = NULL; 713566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 713666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 713766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraPicChannel(mCameraHandle->camera_handle, 713866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 713966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 714066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for capture channel"); 714166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 714266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 714366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 714466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Capture channel, only need snapshot and postview streams start together 714566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 714666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 714766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mLongshotEnabled ) { 714866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 714966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.look_back = mParameters.getZSLBackLookCount(); 715066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.water_mark = mParameters.getZSLQueueDepth(); 715166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 715266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 715366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 715466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 715566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 715666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, 715766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin capture_channel_cb_routine, 715866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin this); 715966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 716066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init capture channel failed, ret = %d", rc); 716166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 716266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 716366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 716466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // meta data stream always coexists with snapshot in regular capture case 716566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 716666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_stream_cb_routine, this); 716766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 716866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add metadata stream failed, ret = %d", rc); 716966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 717066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 717166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 717266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mLongshotEnabled) { 717366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_POSTVIEW, 717466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 717566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 717666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 717766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add postview stream failed, ret = %d", rc); 717866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 717966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 718066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 718166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 718266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_stream_cb_routine, this); 718366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 718466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 718566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add preview stream failed, ret = %d", rc); 718666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 718766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 718866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setStreamSyncCB(CAM_STREAM_TYPE_PREVIEW, 718966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin synchronous_stream_cb_routine); 719066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 719166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 719266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.getofflineRAW()) { 719366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 719466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 719566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 719666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add snapshot stream failed, ret = %d", rc); 719766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 719866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 719966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 720066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 720166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb_routine stream_cb = NULL; 720266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.raw_yuv", value, "0"); 720366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_yuv = atoi(value) > 0 ? true : false; 720466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 720566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (raw_yuv) { 720666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb = snapshot_raw_stream_cb_routine; 720766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 720866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 720966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((raw_yuv) || (mParameters.getofflineRAW())) { 721066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, 721166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_STREAM_TYPE_RAW, stream_cb, this); 721266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 721366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add raw stream failed, ret = %d", rc); 721466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 721566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 721666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 721766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 721866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_CAPTURE] = pChannel; 721966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 722066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 722166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 722266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 722366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addMetaDataChannel 722466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 722566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a meta data channel that contains a metadata stream 722666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 722766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 722866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 722966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 723066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 723166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 723266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 723366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addMetaDataChannel() 723466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 723566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 723666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 723766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 723866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_METADATA] != NULL) { 723966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_METADATA]; 724066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_METADATA] = NULL; 724166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 724266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 724366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 724466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 724566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 724666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for metadata channel"); 724766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 724866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 724966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 725066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, 725166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 725266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 725366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 725466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init metadata channel failed, ret = %d", rc); 725566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 725666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 725766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 725866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 725966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 726066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_stream_cb_routine, this); 726166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 726266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add metadata stream failed, ret = %d", rc); 726366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 726466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 726566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 726666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 726766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_METADATA] = pChannel; 726866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 726966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 727066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 727166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 727266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addCallbackChannel 727366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 727466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a callback channel that contains a callback stream 727566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 727666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 727766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 727866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 727966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 728066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 728166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 728266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addCallbackChannel() 728366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 728466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 728566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 728666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 728766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_CALLBACK] != NULL) { 728866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_CALLBACK]; 728966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_CALLBACK] = NULL; 729066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 729166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 729266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 729366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 729466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 729566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for callback channel"); 729666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 729766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 729866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 729966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, this); 730066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 730166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init callback channel failed, ret = %d", 730266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc); 730366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 730466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 730566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 730666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 730766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_CALLBACK, 730866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin callback_stream_cb_routine, this); 730966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 731066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add callback stream failed, ret = %d", rc); 731166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 731266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 731366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 731466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 731566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_CALLBACK] = pChannel; 731666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 731766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 731866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 731966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 732066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 732166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addAnalysisChannel 732266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 732366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a analysis channel that contains a analysis stream 732466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 732566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 732666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 732766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 732866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 732966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 733066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 733166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addAnalysisChannel() 733266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 733366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 733466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 733566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 733666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[QCAMERA_CH_TYPE_ANALYSIS] != NULL) { 733766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[QCAMERA_CH_TYPE_ANALYSIS]; 733866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_ANALYSIS] = NULL; 733966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 734066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 734166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraChannel(mCameraHandle->camera_handle, 734266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 734366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 734466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for metadata channel"); 734566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 734666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 734766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 734866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, this); 734966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 735066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init Analysis channel failed, ret = %d", rc); 735166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 735266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 735366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 735466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 735566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_ANALYSIS, 735666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, this); 735766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 735866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add Analysis stream failed, ret = %d", rc); 735966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 736066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 736166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 736266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 736366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[QCAMERA_CH_TYPE_ANALYSIS] = pChannel; 736466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 736566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 736666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 736766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 736866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 736966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getPPConfig 737066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 737166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get Post processing configaration data 737266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 737366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 737466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pp config: pp config structure pointer, 737566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @curIndex: current pp channel index 737666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @multipass: Flag if multipass prcessing enabled. 737766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 737866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 737966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 738066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 738166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 738266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::getPPConfig(cam_pp_feature_config_t &pp_config, 738366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t curIndex, bool multipass) 738466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 738566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 738666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 738766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (multipass) { 738866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Multi pass enabled. Total Pass = %d, cur index = %d", 738966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getReprocCount(), curIndex); 739066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 739166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 739266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Supported pproc feature mask = %x", 739366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[mCameraId]->qcom_supported_feature_mask); 739466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t feature_mask = gCamCapability[mCameraId]->qcom_supported_feature_mask; 739566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t zoomLevel = mParameters.getParmZoomLevel(); 739666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t rotation = mParameters.getJpegRotation(); 739766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t effect = mParameters.getEffectValue(); 739866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 739966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.cur_reproc_count = curIndex + 1; 740066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.total_reproc_count = mParameters.getReprocCount(); 740166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 740266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch(curIndex) { 740366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 0: 740466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Configure feature mask for first pass of reprocessing 740566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if any effects are enabled 740666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((CAM_EFFECT_MODE_OFF != effect) && 740766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (feature_mask & CAM_QCOM_FEATURE_EFFECT)) { 740866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_EFFECT; 740966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.effect = effect; 741066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 741166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 741266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check for features that need to be enabled by default like sharpness 741366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //(if supported by hw). 741466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((feature_mask & CAM_QCOM_FEATURE_SHARPNESS) && 741566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.isOptiZoomEnabled()) { 741666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 741766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.sharpness = mParameters.getSharpness(); 741866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 741966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 742066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if zoom is enabled 742166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((zoomLevel > 0) && (feature_mask & CAM_QCOM_FEATURE_CROP)) { 742266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CROP; 742366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 742466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 742566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isWNREnabled() && 742666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (feature_mask & CAM_QCOM_FEATURE_DENOISE2D)) { 742766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 742866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.denoise2d.denoise_enable = 1; 742966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.denoise2d.process_plates = 743066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getDenoiseProcessPlate(CAM_INTF_PARM_WAVELET_DENOISE); 743166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 743266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 743366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isCACEnabled()) { 743466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CAC; 743566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 743666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 743766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if rotation is required 743866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((feature_mask & CAM_QCOM_FEATURE_ROTATION) && (rotation > 0)) { 743966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 744066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rotation == 0) { 744166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_0; 744266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 90) { 744366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_90; 744466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 180) { 744566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_180; 744666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 270) { 744766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_270; 744866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 744966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 745066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 745166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isHDREnabled()){ 745266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_HDR; 745366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.hdr_param.hdr_enable = 1; 745466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.hdr_param.hdr_need_1x = mParameters.isHDR1xFrameEnabled(); 745566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.hdr_param.hdr_mode = CAM_HDR_MODE_MULTIFRAME; 745666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 745766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_HDR; 745866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.hdr_param.hdr_enable = 0; 745966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 746066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 746166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if scaling is enabled 746266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((feature_mask & CAM_QCOM_FEATURE_SCALE) && 746366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isReprocScaleEnabled() && 746466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isUnderReprocScaling()){ 746566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_SCALE; 746666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPicSizeFromAPK( 746766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.scale_param.output_width, 746866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.scale_param.output_height); 746966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 747066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 747166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUbiFocusEnabled()) { 747266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_UBIFOCUS; 747366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 747466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_UBIFOCUS; 747566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 747666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 747766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isUbiRefocus()) { 747866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_REFOCUS; 747966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.misc_buf_param.misc_buffer_index = 0; 748066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 748166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_REFOCUS; 748266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 748366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 748466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isChromaFlashEnabled()) { 748566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CHROMA_FLASH; 748666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.flash_value = CAM_FLASH_ON; 748766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 748866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_CHROMA_FLASH; 748966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 749066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 749166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isOptiZoomEnabled() && (0 <= zoomLevel)) { 749266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_OPTIZOOM; 749366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.zoom_level = (uint8_t) zoomLevel; 749466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 749566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_OPTIZOOM; 749666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 749766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 749866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 749966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_RAW_PROCESSING; 750066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 750166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 750266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isTruePortraitEnabled()) { 750366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_TRUEPORTRAIT; 750466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.misc_buf_param.misc_buffer_index = 0; 750566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 750666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_TRUEPORTRAIT; 750766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 750866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 750966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isStillMoreEnabled()) { 751066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_STILLMORE; 751166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 751266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_STILLMORE; 751366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 751466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 751566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isOEMFeatEnabled()) { 751666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_OEM_FEATURE_1; 751766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 751866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 751966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getCDSMode() != CAM_CDS_MODE_OFF) { 752066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (feature_mask & CAM_QCOM_FEATURE_DSDN) { 752166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_DSDN; 752266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 752366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CDS; 752466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 752566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 752666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 752766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((multipass) && 752866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_postprocessor.getPPChannelCount() > 1)) { 752966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_PP_PASS_2; 753066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_ROTATION; 753166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_CDS; 753266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_DSDN; 753366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CROP; 753466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 753566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_SCALE; 753666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 753766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 753866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t thumb_src_dim; 753966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t thumb_dst_dim; 754066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getThumbnailSize(&(thumb_dst_dim.width), &(thumb_dst_dim.height)); 754166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_POSTVIEW,thumb_src_dim); 754266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((thumb_dst_dim.width != thumb_src_dim.width) || 754366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (thumb_dst_dim.height != thumb_src_dim.height)) { 754466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_dst_dim.width != 0 && thumb_dst_dim.height != 0) { 754566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CROP; 754666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 754766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 754866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 754966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 755066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 755166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 1: 755266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Configure feature mask for second pass of reprocessing 755366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_PP_PASS_2; 755466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((feature_mask & CAM_QCOM_FEATURE_ROTATION) && (rotation > 0)) { 755566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 755666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rotation == 0) { 755766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_0; 755866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 90) { 755966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_90; 756066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 180) { 756166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_180; 756266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (rotation == 270) { 756366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.rotation = ROTATE_270; 756466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 756566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 756666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getCDSMode() != CAM_CDS_MODE_OFF) { 756766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (feature_mask & CAM_QCOM_FEATURE_DSDN) { 756866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_DSDN; 756966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 757066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask |= CAM_QCOM_FEATURE_CDS; 757166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 757266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 757366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_RAW_PROCESSING; 757466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~CAM_QCOM_FEATURE_METADATA_PROCESSING; 757566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 757666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 757766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 757866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pproc feature mask set = %x pass count = %d", 757966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask, curIndex); 758066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 758166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 758266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 758366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 758466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addReprocChannel 758566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 758666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a reprocess channel that will do reprocess on frames 758766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * coming from input channel 758866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 758966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 759066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pInputChannel : ptr to input channel whose frames will be post-processed 759166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cur_channel_index : Current channel index in multipass 759266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 759366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : Ptr to the newly created channel obj. NULL if failed. 759466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 759566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel *QCamera2HardwareInterface::addReprocChannel( 759666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pInputChannel, int8_t cur_channel_index) 759766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 759866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 759966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *pChannel = NULL; 760066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t burst_cnt = mParameters.getNumOfSnapshots(); 760166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 760266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pInputChannel == NULL) { 760366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("input channel obj is NULL"); 760466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 760566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 760666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 760766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle, 760866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 760966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 761066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for reprocess channel"); 761166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 761266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 761366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 761466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Capture channel, only need snapshot and postview streams start together 761566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t attr; 761666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 761766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 761866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 761966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(&attr, 762066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin postproc_channel_cb_routine, 762166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin this); 762266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 762366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init reprocess channel failed, ret = %d", rc); 762466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 762566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 762666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 762766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 762866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // pp feature config 762966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_feature_config_t pp_config; 763066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 763166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 763266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = getPPConfig(pp_config, cur_channel_index, 763366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((mParameters.getReprocCount() > 1) ? TRUE : FALSE)); 763466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR){ 763566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error while creating PP config"); 763666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 763766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 763866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 763966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 764066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t minStreamBufNum = getBufNumRequired(CAM_STREAM_TYPE_OFFLINE_PROC); 764166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 764266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //WNR and HDR happen inline. No extra buffers needed. 764366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t temp_feature_mask = pp_config.feature_mask; 764466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin temp_feature_mask &= ~CAM_QCOM_FEATURE_HDR; 764566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (temp_feature_mask && mParameters.isHDREnabled()) { 764666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum = (uint8_t)(1 + mParameters.getNumOfExtraHDRInBufsIfNeeded()); 764766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 764866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 764966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isStillMoreEnabled()) { 765066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_still_more_t stillmore_config = mParameters.getStillMoreSettings(); 765166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.burst_cnt = stillmore_config.burst_count; 765266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Stillmore burst %d", pp_config.burst_cnt); 765366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 765466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // getNumOfExtraBuffersForImageProc returns 1 less buffer assuming 765566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // number of capture is already added. In the case of liveshot, 765666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stillmore burst is 1. This is to account for the premature decrement 765766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getNumOfExtraBuffersForImageProc() == 0) { 765866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum += 1; 765966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 766066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 766166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 766266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_3) { 766366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum += mParameters.getReprocCount() - 1; 766466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt = mParameters.getReprocCount(); 766566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cur_channel_index == 0) { 766666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setReprocCount(2); 766766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 766866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setReprocCount(1); 766966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 767066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 767166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->setReprocCount(1); 767266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 767366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 767466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Add non inplace image lib buffers only when ppproc is present, 767566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // becuase pproc is non inplace and input buffers for img lib 767666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // are output for pproc and this number of extra buffers is required 767766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If pproc is not there, input buffers for imglib are from snapshot stream 767866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t imglib_extra_bufs = mParameters.getNumOfExtraBuffersForImageProc(); 767966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (temp_feature_mask && imglib_extra_bufs) { 768066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 1 is added because getNumOfExtraBuffersForImageProc returns extra 768166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // buffers assuming number of capture is already added 768266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum = (uint8_t)(minStreamBufNum + imglib_extra_bufs + 1); 768366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 768466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 768566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Mask out features that are already processed in snapshot stream. 768666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t snapshot_feature_mask = 0; 768766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamPpMask(CAM_STREAM_TYPE_SNAPSHOT, snapshot_feature_mask); 768866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 768966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config.feature_mask &= ~snapshot_feature_mask; 769066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Snapshot feature mask: 0x%x, reproc feature mask: 0x%x", 769166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snapshot_feature_mask, pp_config.feature_mask); 769266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 769366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool offlineReproc = isRegularCapture(); 769466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_postprocessor.mOfflineDataBufs != NULL) { 769566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin offlineReproc = TRUE; 769666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 769766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 769866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t paddingInfo = gCamCapability[mCameraId]->padding_info; 769966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin paddingInfo.offset_info.offset_x = 0; 770066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin paddingInfo.offset_info.offset_y = 0; 770166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->addReprocStreamsFromSource(*this, 770266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_config, 770366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pInputChannel, 770466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum, 770566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin burst_cnt, 770666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &paddingInfo, 770766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters, 770866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mLongshotEnabled, 770966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin offlineReproc); 771066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 771166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 771266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 771366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 771466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 771566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return pChannel; 771666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 771766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 771866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 771966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addOfflineReprocChannel 772066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 772166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a offline reprocess channel contains one reproc stream, 772266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * that will do reprocess on frames coming from external images 772366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 772466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 772566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @img_config : offline reporcess image info 772666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pp_feature : pp feature config 772766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 772866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 772966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 773066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 773166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 773266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel *QCamera2HardwareInterface::addOfflineReprocChannel( 773366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_offline_src_config_t &img_config, 773466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_feature_config_t &pp_feature, 773566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb_routine stream_cb, 773666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 773766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 773866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 773966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *pChannel = NULL; 774066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 774166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle, 774266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCameraHandle->ops); 774366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pChannel) { 774466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for reprocess channel"); 774566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 774666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 774766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 774866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->init(NULL, NULL, NULL); 774966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 775066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("init reprocess channel failed, ret = %d", rc); 775166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 775266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 775366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 775466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 775566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC); 775666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStreamInfo == NULL) { 775766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for stream info buf"); 775866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 775966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 776066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 776166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 776266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfoBuf = (cam_stream_info_t *)pStreamInfo->getPtr(0); 776366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(streamInfoBuf, 0, sizeof(cam_stream_info_t)); 776466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 776566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->fmt = img_config.input_fmt; 776666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->dim = img_config.input_dim; 776766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->buf_planes = img_config.input_buf_planes; 776866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->streaming_mode = CAM_STREAMING_MODE_BURST; 776966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->num_of_burst = img_config.num_of_bufs; 777066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 777166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->reprocess_config.pp_type = CAM_OFFLINE_REPROCESS_TYPE; 777266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->reprocess_config.offline = img_config; 777366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->reprocess_config.pp_feature_config = pp_feature; 777466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 777566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->addStream(*this, 777666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStreamInfo, NULL, img_config.num_of_bufs, 777766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &gCamCapability[mCameraId]->padding_info, 777866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb, userdata, false); 777966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 778066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 778166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add reprocess stream failed, ret = %d", rc); 778266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 778366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 778466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 778566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 778666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return pChannel; 778766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 778866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 778966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 779066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addChannel 779166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 779266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a channel by its type 779366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 779466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 779566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_type : channel type 779666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 779766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 779866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 779966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 780066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 780166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::addChannel(qcamera_ch_type_enum_t ch_type) 780266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 780366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = UNKNOWN_ERROR; 780466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (ch_type) { 780566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_ZSL: 780666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addZSLChannel(); 780766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 780866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_CAPTURE: 780966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addCaptureChannel(); 781066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 781166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_PREVIEW: 781266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addPreviewChannel(); 781366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 781466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_VIDEO: 781566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addVideoChannel(); 781666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 781766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_SNAPSHOT: 781866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addSnapshotChannel(); 781966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 782066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_RAW: 782166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addRawChannel(); 782266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 782366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_METADATA: 782466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addMetaDataChannel(); 782566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 782666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_CALLBACK: 782766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addCallbackChannel(); 782866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 782966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_CH_TYPE_ANALYSIS: 783066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addAnalysisChannel(); 783166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 783266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 783366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 783466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 783566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 783666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 783766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 783866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 783966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : delChannel 784066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 784166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: delete a channel by its type 784266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 784366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 784466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_type : channel type 784566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @destroy : delete context as well 784666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 784766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 784866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 784966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 785066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 785166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::delChannel(qcamera_ch_type_enum_t ch_type, 785266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool destroy) 785366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 785466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[ch_type] != NULL) { 785566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (destroy) { 785666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_channels[ch_type]; 785766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[ch_type] = NULL; 785866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 785966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[ch_type]->deleteChannel(); 786066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 786166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 786266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 786366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 786466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 786566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 786666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 786766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startChannel 786866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 786966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start a channel by its type 787066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 787166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 787266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_type : channel type 787366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 787466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 787566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 787666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 787766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 787866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::startChannel(qcamera_ch_type_enum_t ch_type) 787966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 788066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = UNKNOWN_ERROR; 788166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[ch_type] != NULL) { 788266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_channels[ch_type]->start(); 788366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 788466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 788566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 788666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 788766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 788866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopChannel 788966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 789066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop a channel by its type 789166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 789266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 789366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_type : channel type 789466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 789566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 789666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 789766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 789866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 789966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::stopChannel(qcamera_ch_type_enum_t ch_type) 790066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 790166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = UNKNOWN_ERROR; 790266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[ch_type] != NULL) { 790366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_channels[ch_type]->stop(); 790466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 790566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 790666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 790766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 790866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 790966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 791066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preparePreview 791166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 791266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add channels needed for preview 791366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 791466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 791566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 791666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 791766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 791866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 791966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 792066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::preparePreview() 792166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 792266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 792366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 792466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 792566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E"); 792666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setStreamConfigure(false, false, false); 792766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 792866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("setStreamConfigure failed %d", rc); 792966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 793066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 793166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 793266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() != true) { 793366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_ZSL); 793466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 793566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed!! rc = %d", rc); 793666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 793766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 793866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 793966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUBWCEnabled()) { 794066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 794166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_PREVIEW, fmt); 794266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) { 794366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_CALLBACK); 794466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 794566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_ZSL); 794666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed!! rc = %d", rc); 794766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 794866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 794966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 795066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 795166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 795266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getofflineRAW()) { 795366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin addChannel(QCAMERA_CH_TYPE_RAW); 795466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 795566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 795666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool recordingHint = mParameters.getRecordingHintValue(); 795766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!isRdiMode() && recordingHint) { 795866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //stop face detection,longshot,etc if turned ON in Camera mode 795966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 79601687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan int32_t arg; //dummy arg 796166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isLongshotEnabled()) { 796266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendCommand(CAMERA_CMD_LONGSHOT_OFF, arg, arg); 796366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 796466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isFaceDetectionEnabled() 7965d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch && (!mParameters.fdModeInVideo())) { 796666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendCommand(CAMERA_CMD_STOP_FACE_DETECTION, arg, arg); 796766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 796866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isHistogramEnabled()) { 796966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendCommand(CAMERA_CMD_HISTOGRAM_OFF, arg, arg); 797066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 797166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 797266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Don't create snapshot channel for liveshot, if low power mode is set. 797366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Use video stream instead. 797466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!isLowPowerMode()) { 797566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_SNAPSHOT); 797666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 797766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 797866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 797966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 798066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 798166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_VIDEO); 798266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 798366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_SNAPSHOT); 798466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed!! rc = %d", rc); 798566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 798666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 798766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 798866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 798966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_PREVIEW); 799066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!isRdiMode() && (rc != NO_ERROR)) { 799166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recordingHint) { 799266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_SNAPSHOT); 799366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_VIDEO); 799466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 799566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 799666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 799766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isUBWCEnabled() && !recordingHint) { 799866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 799966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamFormat(CAM_STREAM_TYPE_PREVIEW, fmt); 800066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) { 800166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addChannel(QCAMERA_CH_TYPE_CALLBACK); 800266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 800366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_PREVIEW); 800466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!isRdiMode()) { 800566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_SNAPSHOT); 800666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_VIDEO); 800766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 800866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed!! rc = %d", rc); 800966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 801066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 801166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 801266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 801366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 801466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 801566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_PREVIEW); 801666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed!! rc = %d", rc); 801766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 801866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 801966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 802066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("E rc = %d", rc); 802166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 802266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 802366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 802466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 802566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : unpreparePreview 802666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 802766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: delete channels for preview 802866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 802966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 803066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 803166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 803266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 803366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::unpreparePreview() 803466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 803566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_ZSL); 803666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_PREVIEW); 803766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_VIDEO); 803866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_SNAPSHOT); 803966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_CALLBACK); 804066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delChannel(QCAMERA_CH_TYPE_RAW); 804166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 804266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 804366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 804466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : playShutter 804566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 804666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send request to play shutter sound 804766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 804866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 804966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 805066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 805166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 805266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::playShutter(){ 805366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mNotifyCb == NULL || 805466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin msgTypeEnabledWithLock(CAMERA_MSG_SHUTTER) == 0){ 805566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("shutter msg not enabled or NULL cb"); 805666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 805766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 805866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("CAMERA_MSG_SHUTTER "); 805966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 806066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 806166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 806266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_SHUTTER; 806366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext1 = 0; 806466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext2 = false; 806566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_cbNotifier.notifyCallback(cbArg); 806666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 806766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 806866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 806966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getChannelByHandle 807066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 807166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return a channel by its handle 807266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 807366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 807466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @channelHandle : channel handle 807566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 807666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : a channel obj if found, NULL if not found 807766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 807866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel *QCamera2HardwareInterface::getChannelByHandle(uint32_t channelHandle) 807966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 808066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for(int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 808166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[i] != NULL && 808266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[i]->getMyHandle() == channelHandle) { 808366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_channels[i]; 808466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 808566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 808666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 808766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 808866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 808966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 809066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needPreviewFDCallback 809166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 809266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: decides if needPreviewFDCallback 809366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 809466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 809566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @num_faces : number of faces 809666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 809766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool type of status 809866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * true -- success 809966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * fale -- failure code 810066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 810166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needPreviewFDCallback(uint8_t num_faces) 810266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 810366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (num_faces == 0 && mNumPreviewFaces == 0) { 810466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 810566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 810666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 810766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return true; 810866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 810966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 811066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 811166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processFaceDetectionReuslt 811266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 811366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process face detection reuslt 811466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 811566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 811666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @faces_data : ptr to face processing result struct 811766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 811866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 811966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 812066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 812166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 812266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::processFaceDetectionResult(cam_faces_data_t *faces_data) 812366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 812466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isFaceDetectionEnabled()) { 812566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("FaceDetection not enabled, no ops here"); 812666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 812766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 812866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 812966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_face_detect_type_t fd_type = faces_data->detection_data.fd_type; 813066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_face_detection_data_t *detect_data = &(faces_data->detection_data); 813166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL == mDataCb) || 813266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (fd_type == QCAMERA_FD_PREVIEW && !msgTypeEnabled(CAMERA_MSG_PREVIEW_METADATA)) || 813366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (!needPreviewFDCallback(detect_data->num_faces_detected)) 813466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 813566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (fd_type == QCAMERA_FD_SNAPSHOT && !msgTypeEnabled(CAMERA_MSG_META_DATA)) 813666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 813766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ) { 813866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("metadata msgtype not enabled, no ops here"); 813966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 814066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 814166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 814266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((fd_type == QCAMERA_FD_PREVIEW) && (detect_data->update_flag == FALSE)) { 814366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Don't send callback to app if this is skipped by fd at backend 814466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 814566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 814666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 814766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t display_dim; 814866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_PREVIEW, display_dim); 814966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (display_dim.width <= 0 || display_dim.height <= 0) { 815066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid preview width or height (%d x %d)", 815166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, display_dim.height); 815266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 815366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 815466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 815566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // process face detection result 815666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // need separate face detection in preview or snapshot type 815766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t faceResultSize = 0; 815866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t data_len = 0; 815966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(fd_type == QCAMERA_FD_PREVIEW){ 816066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //fd for preview frames 816166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultSize = sizeof(camera_frame_metadata_t); 816266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultSize += sizeof(camera_face_t) * MAX_ROI; 816366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }else if(fd_type == QCAMERA_FD_SNAPSHOT){ 816466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 816566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // fd for snapshot frames 816666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if face is detected in this frame 816766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(detect_data->num_faces_detected > 0){ 816866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_len = sizeof(camera_frame_metadata_t) + 816966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(camera_face_t) * detect_data->num_faces_detected; 817066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }else{ 817166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //no face 817266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_len = 0; 817366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 817466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 817566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultSize = 1 *sizeof(int) //meta data type 817666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + 1 *sizeof(int) // meta data len 817766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + data_len; //data 817866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 817966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 818066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *faceResultBuffer = mGetMemory(-1, 818166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultSize, 818266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 818366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie); 818466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == faceResultBuffer ) { 818566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough memory for face result data"); 818666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 818766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 818866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 818966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *pFaceResult = ( unsigned char * ) faceResultBuffer->data; 819066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(pFaceResult, 0, faceResultSize); 819166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *faceData = NULL; 819266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(fd_type == QCAMERA_FD_PREVIEW){ 819366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceData = pFaceResult; 819466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumPreviewFaces = detect_data->num_faces_detected; 819566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }else if(fd_type == QCAMERA_FD_SNAPSHOT){ 819666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 819766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //need fill meta type and meta data len first 819866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int *data_header = (int* )pFaceResult; 819966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_header[0] = CAMERA_META_DATA_FD; 820066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_header[1] = (int)data_len; 820166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 820266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(data_len <= 0){ 820366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //if face is not valid or do not have face, return 820466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 820566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 820666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 820766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_META_DATA; 820866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = faceResultBuffer; 820966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = faceResultBuffer; 821066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 821166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 821266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_cbNotifier.notifyCallback(cbArg); 821366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 821466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending notification"); 821566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultBuffer->release(faceResultBuffer); 821666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 821766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 821866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 821966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 822066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceData = pFaceResult + 2 *sizeof(int); //skip two int length 822166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 822266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 822366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_frame_metadata_t *roiData = (camera_frame_metadata_t * ) faceData; 822466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_face_t *faces = (camera_face_t *) ( faceData + sizeof(camera_frame_metadata_t) ); 822566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 822666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin roiData->number_of_faces = detect_data->num_faces_detected; 822766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin roiData->faces = faces; 822866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (roiData->number_of_faces > 0) { 822966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < roiData->number_of_faces; i++) { 823066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].id = detect_data->faces[i].face_id; 823166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].score = detect_data->faces[i].score; 823266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 823366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // left 823466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].rect[0] = MAP_TO_DRIVER_COORDINATE( 823566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin detect_data->faces[i].face_boundary.left, 823666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, 2000, -1000); 823766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 823866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // top 823966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].rect[1] = MAP_TO_DRIVER_COORDINATE( 824066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin detect_data->faces[i].face_boundary.top, 824166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.height, 2000, -1000); 824266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 824366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // right 824466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].rect[2] = faces[i].rect[0] + 824566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MAP_TO_DRIVER_COORDINATE( 824666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin detect_data->faces[i].face_boundary.width, 824766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, 2000, 0); 824866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 824966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // bottom 825066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].rect[3] = faces[i].rect[1] + 825166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MAP_TO_DRIVER_COORDINATE( 825266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin detect_data->faces[i].face_boundary.height, 825366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.height, 2000, 0); 825466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 825566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data->landmark_valid) { 825666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Center of left eye 825766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].left_eye[0] = MAP_TO_DRIVER_COORDINATE( 825866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].left_eye_center.x, 825966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, 2000, -1000); 826066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].left_eye[1] = MAP_TO_DRIVER_COORDINATE( 826166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].left_eye_center.y, 826266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.height, 2000, -1000); 826366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 826466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Center of right eye 826566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].right_eye[0] = MAP_TO_DRIVER_COORDINATE( 826666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].right_eye_center.x, 826766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, 2000, -1000); 826866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].right_eye[1] = MAP_TO_DRIVER_COORDINATE( 826966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].right_eye_center.y, 827066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.height, 2000, -1000); 827166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 827266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Center of mouth 827366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].mouth[0] = MAP_TO_DRIVER_COORDINATE( 827466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].mouth_center.x, 827566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.width, 2000, -1000); 827666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].mouth[1] = MAP_TO_DRIVER_COORDINATE( 827766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data->landmark_data.face_landmarks[i].mouth_center.y, 827866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin display_dim.height, 2000, -1000); 827966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 828066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // return -2000 if invalid 828166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].left_eye[0] = -2000; 828266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].left_eye[1] = -2000; 828366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 828466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].right_eye[0] = -2000; 828566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].right_eye[1] = -2000; 828666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 828766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].mouth[0] = -2000; 828866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].mouth[1] = -2000; 828966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 829066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 829166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 829266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 829366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mFaceRect.left = detect_data->faces[i].face_boundary.left; 829466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mFaceRect.top = detect_data->faces[i].face_boundary.top; 829566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mFaceRect.right = detect_data->faces[i].face_boundary.width+mFaceRect.left; 829666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mFaceRect.bottom = detect_data->faces[i].face_boundary.height+mFaceRect.top; 829766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 829866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data->smile_valid) { 829966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].smile_degree = faces_data->smile_data.smile[i].smile_degree; 830066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].smile_score = faces_data->smile_data.smile[i].smile_confidence; 830166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 830266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data->blink_valid) { 830366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].blink_detected = faces_data->blink_data.blink[i].blink_detected; 830466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].leye_blink = faces_data->blink_data.blink[i].left_blink; 830566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].reye_blink = faces_data->blink_data.blink[i].right_blink; 830666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 830766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data->recog_valid) { 830866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].face_recognised = faces_data->recog_data.face_rec[i].face_recognised; 830966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 831066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data->gaze_valid) { 831166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].gaze_angle = faces_data->gaze_data.gaze[i].gaze_angle; 831266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].updown_dir = faces_data->gaze_data.gaze[i].updown_dir; 831366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].leftright_dir = faces_data->gaze_data.gaze[i].leftright_dir; 831466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].roll_dir = faces_data->gaze_data.gaze[i].roll_dir; 831566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].left_right_gaze = faces_data->gaze_data.gaze[i].left_right_gaze; 831666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces[i].top_bottom_gaze = faces_data->gaze_data.gaze[i].top_bottom_gaze; 831766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 831866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 831966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 832066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 832166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 832266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else{ 832366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 832466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mFaceRect,-1,sizeof(mFaceRect)); 832566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 832666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 832766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 832866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 832966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 833066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(fd_type == QCAMERA_FD_PREVIEW){ 833166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_PREVIEW_METADATA; 833266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 833366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 833466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else if(fd_type == QCAMERA_FD_SNAPSHOT){ 833566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_META_DATA; 833666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 833766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 833866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = faceResultBuffer; 833966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.metadata = roiData; 834066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = faceResultBuffer; 834166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 834266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 834366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_cbNotifier.notifyCallback(cbArg); 834466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 834566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending notification"); 834666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceResultBuffer->release(faceResultBuffer); 834766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 834866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 834966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 835066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 835166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 835266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 835366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseCameraMemory 835466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 835566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: releases camera memory objects 835666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 835766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 835866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : buffer to be released 835966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cookie : context data 836066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cbStatus: callback status 836166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 836266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 836366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 836466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::releaseCameraMemory(void *data, 836566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void */*cookie*/, 836666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t /*cbStatus*/) 836766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 836866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *mem = ( camera_memory_t * ) data; 836966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != mem ) { 837066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mem->release(mem); 837166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 837266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 837366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 837466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 837566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : returnStreamBuffer 837666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 837766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: returns back a stream buffer 837866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 837966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 838066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : buffer to be released 838166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cookie : context data 838266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cbStatus: callback status 838366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 838466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 838566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 838666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::returnStreamBuffer(void *data, 838766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *cookie, 838866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t /*cbStatus*/) 838966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 839066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream = ( QCameraStream * ) cookie; 839166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int idx = *((int *)data); 839266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != stream) && (0 <= idx)) { 839366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone((uint32_t)idx); 839466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 839566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Cannot return buffer %d %p", idx, cookie); 839666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 839766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 839866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 839966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 840066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processHistogramStats 840166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 840266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process histogram stats 840366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 840466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 840566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hist_data : ptr to histogram stats struct 840666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 840766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 840866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 840966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 841066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 84111687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajanint32_t QCamera2HardwareInterface::processHistogramStats( 84121687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan __unused cam_hist_stats_t &stats_data) 841366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 841466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 841566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isHistogramEnabled()) { 841666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Histogram not enabled, no ops here"); 841766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 841866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 841966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 842066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *histBuffer = mGetMemory(-1, 842166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(cam_histogram_data_t), 842266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 842366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie); 842466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == histBuffer ) { 842566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough memory for histogram data"); 842666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 842766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 842866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 842966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_histogram_data_t *pHistData = (cam_histogram_data_t *)histBuffer->data; 843066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pHistData == NULL) { 843166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("memory data ptr is NULL"); 843266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 843366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 843466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 843566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (stats_data.type) { 843666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_HISTOGRAM_TYPE_BAYER: 843766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *pHistData = stats_data.bayer_stats.gb_stats; 843866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 843966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_HISTOGRAM_TYPE_YUV: 844066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *pHistData = stats_data.yuv_stats; 844166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 844266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 844366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 844466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 844566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 844666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 844766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_STATS_DATA; 844866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = histBuffer; 844966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = histBuffer; 845066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 845166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 845266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_cbNotifier.notifyCallback(cbArg); 845366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 845466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending notification"); 845566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin histBuffer->release(histBuffer); 845666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 845766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 845866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 845966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 846066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 846166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 846266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : calcThermalLevel 846366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 846466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Calculates the target fps range depending on 846566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * the thermal level. 846666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Note that this function can be called from QCameraParametersIntf 846766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * while mutex is held. So it should not call back into 846866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * QCameraParametersIntf causing deadlock. 846966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 847066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 847166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @level : received thermal level 847266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minFPS : minimum configured fps range 847366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @maxFPS : maximum configured fps range 847466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minVideoFps: minimum configured fps range 847566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @maxVideoFps: maximum configured fps range 847666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @adjustedRange : target fps range 847766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @skipPattern : target skip pattern 847866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 847966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 848066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 848166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 848266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 848366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::calcThermalLevel( 848466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_thermal_level_enum_t level, 848566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const int minFPSi, 848666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const int maxFPSi, 848766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const float &minVideoFps, 848866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const float &maxVideoFps, 848966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_fps_range_t &adjustedRange, 849066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enum msm_vfe_frame_skip_pattern &skipPattern) 849166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 849266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const float minFPS = (float)minFPSi; 849366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const float maxFPS = (float)maxFPSi; 849466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 849566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("level: %d, preview minfps %f, preview maxfpS %f, " 849666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "video minfps %f, video maxfpS %f", 849766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin level, minFPS, maxFPS, minVideoFps, maxVideoFps); 849866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 849966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch(level) { 850066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_THERMAL_NO_ADJUSTMENT: 850166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 850266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = minFPS / 1000.0f; 850366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = maxFPS / 1000.0f; 850466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = minVideoFps / 1000.0f; 850566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = maxVideoFps / 1000.0f; 850666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skipPattern = NO_SKIP; 850766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 850866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 850966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_THERMAL_SLIGHT_ADJUSTMENT: 851066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 851166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = minFPS / 1000.0f; 851266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = maxFPS / 1000.0f; 851366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps -= 0.1f * adjustedRange.min_fps; 851466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps -= 0.1f * adjustedRange.max_fps; 851566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = minVideoFps / 1000.0f; 851666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = maxVideoFps / 1000.0f; 851766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps -= 0.1f * adjustedRange.video_min_fps; 851866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps -= 0.1f * adjustedRange.video_max_fps; 851966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.min_fps < 1 ) { 852066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = 1; 852166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 852266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.max_fps < 1 ) { 852366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = 1; 852466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 852566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.video_min_fps < 1 ) { 852666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = 1; 852766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 852866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.video_max_fps < 1 ) { 852966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = 1; 853066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 853166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skipPattern = EVERY_2FRAME; 853266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 853366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 853466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_THERMAL_BIG_ADJUSTMENT: 853566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 853666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = minFPS / 1000.0f; 853766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = maxFPS / 1000.0f; 853866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps -= 0.2f * adjustedRange.min_fps; 853966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps -= 0.2f * adjustedRange.max_fps; 854066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = minVideoFps / 1000.0f; 854166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = maxVideoFps / 1000.0f; 854266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps -= 0.2f * adjustedRange.video_min_fps; 854366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps -= 0.2f * adjustedRange.video_max_fps; 854466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.min_fps < 1 ) { 854566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = 1; 854666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 854766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.max_fps < 1 ) { 854866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = 1; 854966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 855066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.video_min_fps < 1 ) { 855166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = 1; 855266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 855366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( adjustedRange.video_max_fps < 1 ) { 855466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = 1; 855566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 855666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skipPattern = EVERY_4FRAME; 855766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 855866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 855966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_THERMAL_MAX_ADJUSTMENT: 856066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 856166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Stop Preview? 856266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set lowest min FPS for now 856366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = minFPS/1000.0f; 856466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = minFPS/1000.0f; 856566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_t *capability = gCamCapability[mCameraId]; 856666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; 856766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i < capability->fps_ranges_tbl_cnt; 856866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i++) { 856966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (capability->fps_ranges_tbl[i].min_fps < 857066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps) { 857166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.min_fps = 857266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin capability->fps_ranges_tbl[i].min_fps; 857366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.max_fps = adjustedRange.min_fps; 857466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 857566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 857666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skipPattern = MAX_SKIP; 857766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_min_fps = adjustedRange.min_fps; 857866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange.video_max_fps = adjustedRange.max_fps; 857966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 858066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 858166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_THERMAL_SHUTDOWN: 858266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 858366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send error notify 858466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Received shutdown thermal level. Closing camera"); 858566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendEvtNotify(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); 858666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 858766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 858866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 858966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 859066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Invalid thermal level %d", level); 859166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 859266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 859366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 859466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 859566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 859666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 859766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 859866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 859966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 860066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : recalcFPSRange 860166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 860266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: adjust the configured fps range regarding 860366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * the last thermal level. 860466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 860566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 860666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minFPS : minimum configured fps range 860766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @maxFPS : maximum configured fps range 860866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minVideoFPS : minimum configured video fps 860966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @maxVideoFPS : maximum configured video fps 861066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @adjustedRange : target fps range 861166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 861266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 861366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 861466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 861566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 861666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::recalcFPSRange(int &minFPS, int &maxFPS, 861766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const float &minVideoFPS, const float &maxVideoFPS, 861866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_fps_range_t &adjustedRange) 861966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 862066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enum msm_vfe_frame_skip_pattern skipPattern; 862166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin calcThermalLevel(mThermalLevel, 862266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minFPS, 862366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxFPS, 862466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minVideoFPS, 862566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxVideoFPS, 862666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange, 862766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skipPattern); 862866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 862966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 863066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 863166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 863266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : updateThermalLevel 863366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 863466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: update thermal level depending on thermal events 863566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 863666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 863766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @level : thermal level 863866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 863966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 864066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 864166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 864266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 864366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::updateThermalLevel(void *thermal_level) 864466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 864566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = NO_ERROR; 864666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_fps_range_t adjustedRange; 864766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int minFPS, maxFPS; 864866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin float minVideoFPS, maxVideoFPS; 864966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enum msm_vfe_frame_skip_pattern skipPattern; 865066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_thermal_level_enum_t level = *(qcamera_thermal_level_enum_t *)thermal_level; 865166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 865266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 865366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mCameraOpened) { 865466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Camera is not opened, no need to update camera parameters"); 865566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 865666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 865766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.getRecordingHintValue()) { 865866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Thermal mitigation isn't enabled in camcorder mode"); 865966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 866066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 866166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 866266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getPreviewFpsRange(&minFPS, &maxFPS); 866366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_thermal_mode thermalMode = mParameters.getThermalMode(); 866466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isHfrMode()) { 866566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_fps_range_t hfrFpsRange; 866666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getHfrFps(hfrFpsRange); 866766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minVideoFPS = hfrFpsRange.video_min_fps; 866866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxVideoFPS = hfrFpsRange.video_max_fps; 866966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 867066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minVideoFPS = minFPS; 867166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin maxVideoFPS = maxFPS; 867266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 867366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 867466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin calcThermalLevel(level, minFPS, maxFPS, minVideoFPS, maxVideoFPS, 867566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin adjustedRange, skipPattern); 867666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mThermalLevel = level; 867766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 867866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thermalMode == QCAMERA_THERMAL_ADJUST_FPS) 867966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mParameters.adjustPreviewFpsRange(&adjustedRange); 868066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else if (thermalMode == QCAMERA_THERMAL_ADJUST_FRAMESKIP) 868166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mParameters.setFrameSkip(skipPattern); 868266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 868366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Incorrect thermal mode %d", thermalMode); 868466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 868566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 868666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 868766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 868866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 868966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 869066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : updateParameters 869166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 869266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: update parameters 869366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 869466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 869566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parms : input parameters string 869666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @needRestart : output, flag to indicate if preview restart is needed 869766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 869866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 869966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 870066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 870166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 870266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::updateParameters(const char *parms, bool &needRestart) 870366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 870466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 870566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 870666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 str = String8(parms); 870766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.updateParameters(str, needRestart); 870866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setNeedRestart(needRestart); 870966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 871066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // update stream based parameter settings 871166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 871266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_channels[i] != NULL) { 871366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_channels[i]->UpdateStreamBasedParameters(mParameters); 871466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 871566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 871666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 871766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 871866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 871966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 872066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 872166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : commitParameterChanges 872266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 872366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: commit parameter changes to the backend to take effect 872466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 872566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 872666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 872766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 872866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 872966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 873066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : This function must be called after updateParameters. 873166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Otherwise, no change will be passed to backend to take effect. 873266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 873366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2HardwareInterface::commitParameterChanges() 873466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 873566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 873666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.commitParameters(); 873766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 873866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // update number of snapshot based on committed parameters setting 873966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.setNumOfSnapshot(); 874066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 874166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 874266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 874366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 874466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 874566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needDebugFps 874666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 874766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if fps log info need to be printed out 874866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 874966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 875066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 875166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: need print out fps log 875266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need to print out fps log 875366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 875466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needDebugFps() 875566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 875666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool needFps = false; 875766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin needFps = mParameters.isFpsDebugEnabled(); 875866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return needFps; 875966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 876066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 876166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 876266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isCACEnabled 876366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 876466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if CAC is enabled 876566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 876666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 876766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 876866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 876966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 877066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 877166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::isCACEnabled() 877266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 877366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 877466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(prop, 0, sizeof(prop)); 877566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.feature.cac", prop, "0"); 877666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int enableCAC = atoi(prop); 877766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return enableCAC == 1; 877866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 877966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 878066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 878166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : is4k2kResolution 878266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 878366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if resolution is 4k x 2k or true 4k x 2k 878466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 878566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 878666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 878766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 878866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 878966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 879066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::is4k2kResolution(cam_dimension_t* resolution) 879166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 879266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool enabled = false; 879366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((resolution->width == 4096 && resolution->height == 2160) || 879466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (resolution->width == 3840 && resolution->height == 2160) ) { 879566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enabled = true; 879666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 879766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return enabled; 879866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 879966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 880066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 880166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isPreviewRestartEnabled 880266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 880366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Check whether preview should be restarted automatically 880466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * during image capture. 880566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 880666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 880766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 880866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 880966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 881066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 881166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::isPreviewRestartEnabled() 881266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 881366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 881466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(prop, 0, sizeof(prop)); 881566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.feature.restart", prop, "0"); 881666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int earlyRestart = atoi(prop); 881766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return earlyRestart == 1; 881866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 881966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 882066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 882166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needReprocess 882266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 882366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if reprocess is needed 882466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 882566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 882666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 882766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 882866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 882966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 883066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needReprocess() 883166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 883266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool needReprocess = false; 883366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 883466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isJpegPictureFormat() && 883566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.isNV21PictureFormat()) { 883666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // RAW image, no need to reprocess 883766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 883866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 883966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 884066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Disable reprocess for 4K liveshot case but enable if lowpower mode 884166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.is4k2kVideoResolution() && mParameters.getRecordingHintValue() 884266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !isLowPowerMode()) { 884366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 884466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 884566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 884666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // pp feature config 884766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_feature_config_t pp_config; 884866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 884966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 885066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Decide whether to do reprocess or not based on 885166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //ppconfig obtained in the first pass. 885266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getPPConfig(pp_config); 885366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 885466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pp_config.feature_mask > 0) { 885566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin needReprocess = true; 885666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 885766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 885866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("needReprocess %s", needReprocess ? "true" : "false"); 885966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return needReprocess; 886066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 886166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 886266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 886366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 886466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needRotationReprocess 886566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 886666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: if rotation needs to be done by reprocess in pp 886766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 886866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 886966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 887066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 887166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 887266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 887366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needRotationReprocess() 887466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 887566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isJpegPictureFormat() && 887666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.isNV21PictureFormat()) { 887766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // RAW image, no need to reprocess 887866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 887966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 888066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 888166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Disable reprocess for 4K liveshot case 888266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.is4k2kVideoResolution() && mParameters.getRecordingHintValue() 888366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !isLowPowerMode()) { 888466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Disable reprocess for 4K liveshot case 888566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 888666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 888766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 888866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & 888966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_ROTATION) > 0 && 889066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mParameters.getJpegRotation() > 0)) { 889166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // current rotation is not zero, and pp has the capability to process rotation 889266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("need to do reprocess for rotation=%d", 889366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getJpegRotation()); 889466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return true; 889566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 889666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 889766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 889866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 889966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 890066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 890166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getThumbnailSize 890266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 890366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get user set thumbnail size 890466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 890566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 890666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dim : output of thumbnail dimension 890766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 890866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 890966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 891066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::getThumbnailSize(cam_dimension_t &dim) 891166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 891266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getThumbnailSize(&dim.width, &dim.height); 891366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 891466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 891566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 891666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegQuality 891766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 891866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get user set jpeg quality 891966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 892066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 892166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 892266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : jpeg quality setting 892366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 892466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::getJpegQuality() 892566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 892666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t quality = 0; 892766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin quality = mParameters.getJpegQuality(); 892866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return quality; 892966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 893066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 893166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 893266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getExifData 893366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 893466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get exif data to be passed into jpeg encoding 893566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 893666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 893766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 893866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : exif data from user setting and GPS 893966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 894066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraExif *QCamera2HardwareInterface::getExifData() 894166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 894266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraExif *exif = new QCameraExif(); 894366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (exif == NULL) { 894466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for QCameraExif"); 894566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 894666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 894766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 894866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 894966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 895066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // add exif entries 895166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 dateTime, subSecTime; 895266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifDateTime(dateTime, subSecTime); 895366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 895466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_DATE_TIME, EXIF_ASCII, 895566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(dateTime.length() + 1), (void *)dateTime.string()); 895666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, EXIF_ASCII, 895766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(dateTime.length() + 1), (void *)dateTime.string()); 895866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_DIGITIZED, EXIF_ASCII, 895966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(dateTime.length() + 1), (void *)dateTime.string()); 896066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_SUBSEC_TIME, EXIF_ASCII, 896166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(subSecTime.length() + 1), (void *)subSecTime.string()); 896266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_SUBSEC_TIME_ORIGINAL, EXIF_ASCII, 896366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(subSecTime.length() + 1), (void *)subSecTime.string()); 896466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_SUBSEC_TIME_DIGITIZED, EXIF_ASCII, 896566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(subSecTime.length() + 1), (void *)subSecTime.string()); 896666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 896766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifDateTime failed"); 896866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 896966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 897066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t focalLength; 897166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifFocalLength(&focalLength); 897266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 897366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_FOCAL_LENGTH, 897466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_RATIONAL, 897566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 897666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&(focalLength)); 897766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 897866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifFocalLength failed"); 897966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 898066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 898166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint16_t isoSpeed = mParameters.getExifIsoSpeed(); 898266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getSensorType() != CAM_SENSOR_YUV) { 898366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_ISO_SPEED_RATING, 898466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_SHORT, 898566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 898666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&(isoSpeed)); 898766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 898866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 898966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE]; 899066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t count = 0; 899166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 899266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*gps data might not be available */ 899366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifGpsProcessingMethod(gpsProcessingMethod, count); 899466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 899566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_PROCESSINGMETHOD, 899666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, 899766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin count, 899866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)gpsProcessingMethod); 899966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 900066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifGpsProcessingMethod failed"); 900166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 900266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 900366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t latitude[3]; 900466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char latRef[2]; 900566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifLatitude(latitude, latRef); 900666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 900766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_LATITUDE, 900866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_RATIONAL, 900966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3, 901066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)latitude); 901166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_LATITUDE_REF, 901266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, 901366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2, 901466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)latRef); 901566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 901666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifLatitude failed"); 901766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 901866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 901966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t longitude[3]; 902066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char lonRef[2]; 902166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifLongitude(longitude, lonRef); 902266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 902366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_LONGITUDE, 902466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_RATIONAL, 902566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3, 902666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)longitude); 902766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 902866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_LONGITUDE_REF, 902966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, 903066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2, 903166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)lonRef); 903266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 903366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifLongitude failed"); 903466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 903566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 903666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t altitude; 903766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char altRef; 903866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifAltitude(&altitude, &altRef); 903966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 904066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_ALTITUDE, 904166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_RATIONAL, 904266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 904366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&(altitude)); 904466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 904566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_ALTITUDE_REF, 904666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_BYTE, 904766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 904866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&altRef); 904966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 905066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifAltitude failed"); 905166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 905266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 905366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char gpsDateStamp[20]; 905466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t gpsTimeStamp[3]; 905566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mParameters.getExifGpsDateTimeStamp(gpsDateStamp, 20, gpsTimeStamp); 905666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(rc == NO_ERROR) { 905766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_DATESTAMP, 905866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, 905966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(strlen(gpsDateStamp) + 1), 906066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)gpsDateStamp); 906166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 906266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_GPS_TIMESTAMP, 906366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_RATIONAL, 906466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3, 906566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)gpsTimeStamp); 906666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 906766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifGpsDataTimeStamp failed"); 906866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 906966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 907066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef ENABLE_MODEL_INFO_EXIF 907166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 907266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 907366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (property_get("persist.sys.exif.make", value, "") > 0 || 907466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("ro.product.manufacturer", value, "QCOM-AA") > 0) { 907566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_MAKE, 907666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, strlen(value) + 1, (void *)value); 907766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 907866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifMaker failed"); 907966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 908066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 908166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (property_get("persist.sys.exif.model", value, "") > 0 || 908266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("ro.product.model", value, "QCAM-AA") > 0) { 908366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_MODEL, 908466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_ASCII, strlen(value) + 1, (void *)value); 908566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 908666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifModel failed"); 908766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 908866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 908966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (property_get("ro.build.description", value, "QCAM-AA") > 0) { 909066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_SOFTWARE, EXIF_ASCII, 909166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)(strlen(value) + 1), (void *)value); 909266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 909366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("getExifSoftware failed"); 909466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 909566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 909666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 909766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 909866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.useJpegExifRotation()) { 909966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int16_t orientation; 910066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (mParameters.getJpegExifRotation()) { 910166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 0: 910266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin orientation = 1; 910366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 910466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 90: 910566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin orientation = 6; 910666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 910766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 180: 910866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin orientation = 3; 910966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 911066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case 270: 911166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin orientation = 8; 911266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 911366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 911466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin orientation = 1; 911566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 911666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 911766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_ORIENTATION, 911866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_SHORT, 911966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 912066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&orientation); 912166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif->addEntry(EXIFTAGID_TN_ORIENTATION, 912266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin EXIF_SHORT, 912366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 912466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)&orientation); 912566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 912666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 912766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return exif; 912866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 912966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 913066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 913166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setHistogram 913266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 913366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set if histogram should be enabled 913466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 913566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 913666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @histogram_en : bool flag if histogram should be enabled 913766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 913866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 913966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 914066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 914166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 914266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setHistogram(bool histogram_en) 914366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 914466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.setHistogram(histogram_en); 914566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 914666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 914766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 914866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setFaceDetection 914966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 915066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set if face detection should be enabled 915166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 915266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 915366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @enabled : bool flag if face detection should be enabled 915466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 915566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 915666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 915766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 915866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 915966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setFaceDetection(bool enabled) 916066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 916166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mParameters.setFaceDetection(enabled, true); 916266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 916366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 916466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 916566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isCaptureShutterEnabled 916666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 916766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Check whether shutter should be triggered immediately after 916866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * capture 916966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 917066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 917166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 917266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true - regular capture 917366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false - other type of capture 917466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 917566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::isCaptureShutterEnabled() 917666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 917766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 917866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(prop, 0, sizeof(prop)); 917966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.feature.shutter", prop, "0"); 918066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int enableShutter = atoi(prop); 918166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return enableShutter == 1; 918266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 918366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 918466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 918566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needProcessPreviewFrame 918666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 918766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: returns whether preview frame need to be displayed 918866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 918966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 9190d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @frameID : frameID of frame to be processed 919166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 919266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 919366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 919466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 919566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 9196d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschbool QCamera2HardwareInterface::needProcessPreviewFrame(uint32_t frameID) 919766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 9198d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch return ((m_stateMachine.isPreviewRunning()) && 9199d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (!isDisplayFrameToSkip(frameID)) && 9200d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (!mParameters.isInstantAECEnabled())); 9201d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} 920266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 920366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 920466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needSendPreviewCallback 920566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 920666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: returns whether preview frame need to callback to APP 920766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 920866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 920966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 921066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true - need preview frame callbck 921166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false - not send preview frame callback 921266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 921366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needSendPreviewCallback() 921466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 921566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_stateMachine.isPreviewRunning() 921666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (mDataCb != NULL) 921766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) 921866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && m_stateMachine.isPreviewCallbackNeeded(); 921966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; 922066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 922166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 9222d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * FUNCTION : setDisplaySkip 9223d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9224d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * DESCRIPTION: set range of frames to skip for preview 9225d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9226d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * PARAMETERS : 9227d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @enabled : TRUE to start skipping frame to display 9228d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch FALSE to stop skipping frame to display 9229d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @skipCnt : Number of frame to skip. 0 by default 9230d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9231d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * RETURN : None 9232d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *==========================================================================*/ 9233d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschvoid QCamera2HardwareInterface::setDisplaySkip(bool enabled, uint8_t skipCnt) 9234d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch{ 9235d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch pthread_mutex_lock(&mGrallocLock); 9236d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (enabled) { 9237d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplayFrameSkip(); 9238d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplayFrameSkip(mLastPreviewFrameID + skipCnt + 1); 9239d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else { 9240d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch setDisplayFrameSkip(mFrameSkipStart, (mLastPreviewFrameID + skipCnt + 1)); 9241d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 9242d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch pthread_mutex_unlock(&mGrallocLock); 9243d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} 9244d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 9245d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch/*=========================================================================== 9246d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * FUNCTION : setDisplayFrameSkip 9247d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9248d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * DESCRIPTION: set range of frames to skip for preview 9249d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9250d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * PARAMETERS : 9251d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @start : frameId to start skip 9252d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @end : frameId to stop skip 9253d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9254d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * RETURN : None 9255d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *==========================================================================*/ 9256d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschvoid QCamera2HardwareInterface::setDisplayFrameSkip(uint32_t start, 9257d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch uint32_t end) 9258d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch{ 9259d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (start == 0) { 9260d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipStart = 0; 9261d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipEnd = 0; 9262d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch return; 9263d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 9264d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if ((mFrameSkipStart == 0) || (mFrameSkipStart > start)) { 9265d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipStart = start; 9266d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 9267d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if ((end == 0) || (end > mFrameSkipEnd)) { 9268d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mFrameSkipEnd = end; 9269d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 9270d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} 9271d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 9272d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch/*=========================================================================== 9273d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * FUNCTION : isDisplayFrameToSkip 9274d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9275d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * DESCRIPTION: function to determin if input frame falls under skip range 9276d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9277d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * PARAMETERS : 9278d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * @frameId : frameId to verify 9279d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * 9280d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * RETURN : true : need to skip 9281d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch * false: no need to skip 9282d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch *==========================================================================*/ 9283d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschbool QCamera2HardwareInterface::isDisplayFrameToSkip(uint32_t frameId) 9284d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch{ 9285d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch return ((mFrameSkipStart != 0) && (frameId >= mFrameSkipStart) && 9286d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (frameId <= mFrameSkipEnd || mFrameSkipEnd == 0)) ? TRUE : FALSE; 9287d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} 9288d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 9289d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch/*=========================================================================== 929066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : prepareHardwareForSnapshot 929166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 929266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: prepare hardware for snapshot, such as LED 929366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 929466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 929566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @afNeeded: flag indicating if Auto Focus needs to be done during preparation 929666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 929766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 929866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 929966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 930066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 930166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::prepareHardwareForSnapshot(int32_t afNeeded) 930266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 930366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 930466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: Send PREPARE SANSPHOT event"); 930566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mCameraHandle->ops->prepare_snapshot(mCameraHandle->camera_handle, 930666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin afNeeded); 930766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 930866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 930966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 931066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needFDMetadata 931166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 931266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: check whether we need process Face Detection metadata in this chanel 931366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 931466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 931566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @channel_type: channel type 931666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 931766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true: needed 931866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false: no need 931966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 932066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needFDMetadata(qcamera_ch_type_enum_t channel_type) 932166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 932266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Note: Currently we only process ZSL channel 932366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool value = false; 932466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(channel_type == QCAMERA_CH_TYPE_ZSL){ 932566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if FD requirement is enabled 932666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mParameters.isSnapshotFDNeeded() && 932766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.isFaceDetectionEnabled()){ 932866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin value = true; 932966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Face Detection metadata is required in ZSL mode."); 933066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 933166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 933266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 933366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return value; 933466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 933566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 933666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 933766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : deferredWorkRoutine 933866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 933966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: data process routine that executes deferred tasks 934066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 934166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 934266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : user data ptr (QCamera2HardwareInterface) 934366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 934466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 934566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 934666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid *QCamera2HardwareInterface::deferredWorkRoutine(void *obj) 934766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 934866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int running = 1; 934966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret; 935066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_active = FALSE; 935166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t job_status = 0; 935266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 935366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)obj; 935466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraCmdThread *cmdThread = &pme->mDeferredWorkThread; 935566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmdThread->setName("CAM_defrdWrk"); 935666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 935766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 935866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 935966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = cam_sem_wait(&cmdThread->cmd_sem); 936066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != 0 && errno != EINVAL) { 936166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cam_sem_wait error (%s)", 936266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strerror(errno)); 936366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 936466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 936566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (ret != 0); 936666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 936766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we got notified about new cmd avail in cmd queue 936866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_cmd_type_t cmd = cmdThread->getCmd(); 936966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("cmd: %d", cmd); 937066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cmd) { 937166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_START_DATA_PROC: 937266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("start data proc"); 937366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = TRUE; 937466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 937566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_STOP_DATA_PROC: 937666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stop data proc"); 937766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = FALSE; 937866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // signal cmd is completed 937966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&cmdThread->sync_sem); 938066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 938166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_DO_NEXT_JOB: 938266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 938366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DefWork *dw = 938466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<DefWork *>(pme->mCmdQueue.dequeue()); 938566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 938666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == dw ) { 938766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid deferred work"); 938866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 938966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 939066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 939166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch( dw->cmd ) { 939266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_ALLOCATE_BUFF: 939366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 939466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel * pChannel = dw->args.allocArgs.ch; 939566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 939666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == pChannel ) { 939766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid deferred work channel"); 939866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = BAD_VALUE; 939966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 940066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 940166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 940266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t streamType = dw->args.allocArgs.type; 940366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Deferred buffer allocation started for stream type: %d", 940466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamType); 940566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 940666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t iNumOfStreams = pChannel->getNumOfStreams(); 940766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 940866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for ( uint32_t i = 0; i < iNumOfStreams; ++i) { 940966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByIndex(i); 941066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 941166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == pStream ) { 941266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = BAD_VALUE; 941366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 941466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 941566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 941666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( pStream->isTypeOf(streamType)) { 941766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( pStream->allocateBuffers() ) { 941866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating buffers !!!"); 941966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = NO_MEMORY; 942066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 942166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 942266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 942366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 942466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 942566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 942666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 942766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 942866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_PPROC_START: 942966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 943066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = pme->getDefJobStatus(pme->mInitPProcJob); 943166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 943266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = ret; 943366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("PPROC Start failed"); 943466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 943566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 943666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 943766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 943866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel * pChannel = dw->args.pprocArgs; 943966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin assert(pChannel); 944066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 944166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_postprocessor.start(pChannel) != NO_ERROR) { 944266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start postprocessor"); 944366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = BAD_VALUE; 944466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 944566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 944666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 944766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 944866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 944966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_METADATA_ALLOC: 945066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 945166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = pme->getDefJobStatus(pme->mParamAllocJob); 945266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 945366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = ret; 945466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Metadata alloc failed"); 945566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 945666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 945766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 945866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 945966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mMetadataMem = new QCameraMetadataStreamMemory( 946066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCAMERA_ION_USE_CACHE); 946166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 946266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mMetadataMem == NULL) { 946366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to allocate metadata buffers"); 946466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = BAD_VALUE; 946566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 946666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 946766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 946866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->mMetadataMem->allocate( 946966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dw->args.metadataAllocArgs.bufferCnt, 947066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dw->args.metadataAllocArgs.size, 947166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NON_SECURE); 947266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc < 0) { 947366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pme->mMetadataMem; 947466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mMetadataMem = NULL; 947566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 947666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 947766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 947866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 947966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_CREATE_JPEG_SESSION: 948066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 948166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel * pChannel = dw->args.pprocArgs; 948266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin assert(pChannel); 948366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9484d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch int32_t ret = pme->getDefJobStatus(pme->mReprocJob); 9485d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (ret != NO_ERROR) { 9486d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch job_status = ret; 9487d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("Jpeg create failed"); 9488d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch break; 9489d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 9490d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 949166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_postprocessor.createJpegSession(pChannel) 949266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin != NO_ERROR) { 949366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot create JPEG session"); 949466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 949566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 949666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 949766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 949866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 949966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 950066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_PPROC_INIT: 950166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 950266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 950366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 950466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_encode_callback_t jpegEvtHandle = 950566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dw->args.pprocInitArgs.jpeg_cb; 950666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void* user_data = dw->args.pprocInitArgs.user_data; 950766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *postProcessor = 950866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &(pme->m_postprocessor); 950966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t cameraId = pme->mCameraId; 951066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_t *capability = 951166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gCamCapability[cameraId]; 951266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t padding_info; 951366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t& cam_capability_padding_info = 951466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin capability->padding_info; 951566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 951666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!pme->mJpegClientHandle) { 951766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pme->initJpegHandle(); 951866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 951966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! creating JPEG handle failed"); 952066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 952166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 952266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 952366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 952466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 952566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 952666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("mJpegClientHandle : %d", pme->mJpegClientHandle); 952766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 952866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = postProcessor->setJpegHandle(&pme->mJpegHandle, 952966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &pme->mJpegMpoHandle, 953066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegClientHandle); 953166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 953266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! set JPEG handle failed"); 953366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 953466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 953566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 953666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 953766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 953866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 953966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* get max pic size for jpeg work buf calculation*/ 954066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = postProcessor->init(jpegEvtHandle, user_data); 954166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 954266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 954366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot init postprocessor"); 954466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 954566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 954666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 954766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 954866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 954966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 955066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // update padding info from jpeg 955166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin postProcessor->getJpegPaddingReq(padding_info); 955266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cam_capability_padding_info.width_padding < 955366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.width_padding) { 955466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.width_padding = 955566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.width_padding; 955666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 955766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cam_capability_padding_info.height_padding < 955866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.height_padding) { 955966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.height_padding = 956066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.height_padding; 956166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 956266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cam_capability_padding_info.plane_padding != 956366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.plane_padding) { 956466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.plane_padding = 956566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_calc_lcm( 956666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.plane_padding, 956766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.plane_padding); 956866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 956966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cam_capability_padding_info.offset_info.offset_x 957066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin != padding_info.offset_info.offset_x) { 957166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.offset_info.offset_x = 957266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_calc_lcm ( 957366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.offset_info.offset_x, 957466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_x); 957566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 957666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cam_capability_padding_info.offset_info.offset_y 957766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin != padding_info.offset_info.offset_y) { 957866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.offset_info.offset_y = 957966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_calc_lcm ( 958066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_padding_info.offset_info.offset_y, 958166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_y); 958266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 958366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 958466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 958566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_PARAM_ALLOC: 958666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 958766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->mParameters.allocate(); 958866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // notify routine would not be initialized by this time. 958966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // So, just update error job status 959066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 959166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = rc; 959266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Param allocation failed"); 959366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 959466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 959566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 959666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 959766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_PARAM_INIT: 959866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 959966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->getDefJobStatus(pme->mParamAllocJob); 960066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 960166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = rc; 960266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Param init failed"); 960366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 960466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 960566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 960666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 960766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 960866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t camId = pme->mCameraId; 960966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capability_t * cap = gCamCapability[camId]; 961066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 961166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mCameraHandle == NULL) { 961266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Camera handle is null"); 961366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = BAD_VALUE; 961466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 961566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 961666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 961766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 961866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 961966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Now PostProc need calibration data as initialization 962066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // time for jpeg_open and calibration data is a 962166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // get param for now, so params needs to be initialized 962266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // before postproc init 962366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pme->mParameters.init(cap, 962466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle, 962566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme); 962666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 962766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 962866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Parameter Initialization failed"); 962966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 963066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 963166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 963266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 963366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 963466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Get related cam calibration only in 963566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dual camera mode 963666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->getRelatedCamSyncInfo()->sync_control == 963766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_SYNC_RELATED_SENSORS_ON) { 963866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pme->mParameters.getRelatedCamCalibration( 963966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &(pme->mJpegMetadata.otp_calibration_data)); 964066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Dumping Calibration Data Version Id %f rc %d", 964166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegMetadata.otp_calibration_data.calibration_format_version, 964266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc); 964366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 964466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = UNKNOWN_ERROR; 964566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("getRelatedCamCalibration failed"); 964666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 964766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 964866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 964966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 965066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_bRelCamCalibValid = true; 965166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 965266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 965366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegMetadata.sensor_mount_angle = 965466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cap->sensor_mount_angle; 965566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegMetadata.default_sensor_flip = FLIP_NONE; 965666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 965766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mParameters.setMinPpMask( 965866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cap->qcom_supported_feature_mask); 965966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params = 966066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_jpeg_debug_exif_params_t *) 966166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(mm_jpeg_debug_exif_params_t)); 966266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->mExifParams.debug_params) { 966366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Out of Memory. Allocation failed for " 966466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "3A debug exif params"); 966566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = NO_MEMORY; 966666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, 966766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_ERROR_UNKNOWN, 0); 966866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 966966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 967066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(pme->mExifParams.debug_params, 0, 967166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(mm_jpeg_debug_exif_params_t)); 967266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 967366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 967466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CMD_DEF_GENERIC: 967566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 967666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin BackgroundTask *bgTask = dw->args.genericArgs; 967766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_status = bgTask->bgFunction(bgTask->bgArgs); 967866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 967966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 968066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 968166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Incorrect command : %d", dw->cmd); 968266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 968366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 968466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dequeueDeferredWork(dw, job_status); 968566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 968666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 968766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_EXIT: 968866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin running = 0; 968966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 969066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 969166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 969266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 969366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (running); 969466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 969566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 969666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 969766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 969866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 969966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : queueDeferredWork 970066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 970166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function which queues deferred tasks 970266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 970366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 970466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cmd : deferred task 970566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @args : deferred task arguments 970666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 970766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : job id of deferred job 970866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * : 0 in case of error 970966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 971066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::queueDeferredWork(DeferredWorkCmd cmd, 971166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args) 971266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 971366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(mDefLock); 971466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int32_t i = 0; i < MAX_ONGOING_JOBS; ++i) { 971566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDefOngoingJobs[i].mDefJobId == 0) { 971666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DefWork *dw = new DefWork(cmd, sNextJobId, args); 971766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!dw) { 971866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("out of memory."); 971966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 972066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 972166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCmdQueue.enqueue(dw)) { 972266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefOngoingJobs[i].mDefJobId = sNextJobId++; 972366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefOngoingJobs[i].mDefJobStatus = 0; 972466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (sNextJobId == 0) { // handle overflow 972566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sNextJobId = 1; 972666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 972766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDeferredWorkThread.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, 972866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FALSE, 972966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FALSE); 973066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mDefOngoingJobs[i].mDefJobId; 973166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 973266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Command queue not active! cmd = %d", cmd); 973366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete dw; 973466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 973566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 973666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 973766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 973866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 973966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 974066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 974166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 974266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : initJpegHandle 974366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 974466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Opens JPEG client and gets a handle. 974566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Sends Dual cam calibration info if present 974666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 974766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 974866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 974966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 975066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 975166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::initJpegHandle() { 975266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if JPEG client handle is present 975366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 975466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!mJpegClientHandle) { 975566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_dimension max_size = {0, 0}; 975666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t size; 975766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 975866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getMaxPicSize(size); 975966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_size.w = size.width; 976066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_size.h = size.height; 976166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 976266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (getRelatedCamSyncInfo()->sync_control == CAM_SYNC_RELATED_SENSORS_ON) { 976366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bRelCamCalibValid) { 976466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = jpeg_open(&mJpegHandle, &mJpegMpoHandle, 976566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_size, &mJpegMetadata); 976666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 976766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = jpeg_open(&mJpegHandle, &mJpegMpoHandle, 976866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin max_size, NULL); 976966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 977066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 977166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = jpeg_open(&mJpegHandle, NULL, max_size, NULL); 977266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 977366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mJpegClientHandle) { 977466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error !! jpeg_open failed!! "); 977566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 977666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 977766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set JPEG initialized as true to signify that this camera 977866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // has initialized the handle 977966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegHandleOwner = true; 978066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 978166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X mJpegHandleOwner: %d, mJpegClientHandle: %d camera id: %d", 978266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegHandleOwner, mJpegClientHandle, mCameraId); 978366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 978466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 978566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 978666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 978766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : deinitJpegHandle 978866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 978966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Closes JPEG client using handle 979066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 979166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 979266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 979366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 979466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 979566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::deinitJpegHandle() { 979666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 979766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 979866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if JPEG client handle is present and inited by this camera 979966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(mJpegHandleOwner && mJpegClientHandle) { 980066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mJpegHandle.close(mJpegClientHandle); 980166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 980266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! Closing mJpegClientHandle: %d failed", 980366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle); 980466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 980566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 980666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegMpoHandle, 0, sizeof(mJpegMpoHandle)); 980766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegHandleOwner = false; 980866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 980966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = 0; 981066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 981166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 981266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 981366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 981466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 981566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setJpegHandleInfo 981666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 981766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: sets JPEG client handle info 981866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 981966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS: 982066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ops : JPEG ops 982166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mpo_ops : Jpeg MPO ops 982266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pJpegClientHandle : o/p Jpeg Client Handle 982366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 982466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 982566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 982666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 982766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 982866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::setJpegHandleInfo(mm_jpeg_ops_t *ops, 982966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_mpo_ops_t *mpo_ops, uint32_t pJpegClientHandle) { 983066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 983166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pJpegClientHandle && ops && mpo_ops) { 983266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Setting JPEG client handle %d", 983366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pJpegClientHandle); 983466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(&mJpegHandle, ops, sizeof(mm_jpeg_ops_t)); 983566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(&mJpegMpoHandle, mpo_ops, sizeof(mm_jpeg_mpo_ops_t)); 983666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = pJpegClientHandle; 983766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 983866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 983966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 984066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! No Handle found: %d", 984166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pJpegClientHandle); 984266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 984366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 984466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 984566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 984666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 984766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegHandleInfo 984866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 984966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: gets JPEG client handle info 985066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 985166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS: 985266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ops : JPEG ops 985366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mpo_ops : Jpeg MPO ops 985466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pJpegClientHandle : o/p Jpeg Client Handle 985566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 985666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 985766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 985866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 985966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 986066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::getJpegHandleInfo(mm_jpeg_ops_t *ops, 986166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_mpo_ops_t *mpo_ops, uint32_t *pJpegClientHandle) { 986266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 986366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != waitDeferredWork(mInitPProcJob)) { 986466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Init PProc Deferred work failed"); 986566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 986666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 986766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Copy JPEG ops if present 986866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ops && mpo_ops && pJpegClientHandle) { 986966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(ops, &mJpegHandle, sizeof(mm_jpeg_ops_t)); 987066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(mpo_ops, &mJpegMpoHandle, sizeof(mm_jpeg_mpo_ops_t)); 987166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *pJpegClientHandle = mJpegClientHandle; 987266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Getting JPEG client handle %d", 987366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pJpegClientHandle); 987466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 987566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 987666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 987766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 987866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 987966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 988066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 988166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dequeueDeferredWork 988266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 988366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function which dequeues deferred tasks 988466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 988566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 988666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dw : deferred work 988766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jobStatus: deferred task job status 988866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 988966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 989066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 989166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 989266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 989366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::dequeueDeferredWork(DefWork* dw, int32_t jobStatus) 989466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 989566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(mDefLock); 989666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < MAX_ONGOING_JOBS; i++) { 989766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDefOngoingJobs[i].mDefJobId == dw->id) { 989866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jobStatus != NO_ERROR) { 989966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefOngoingJobs[i].mDefJobStatus = jobStatus; 990066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("updating job status %d for id %d", 990166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jobStatus, dw->id); 990266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 990366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefOngoingJobs[i].mDefJobId = 0; 990466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefOngoingJobs[i].mDefJobStatus = 0; 990566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 990666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete dw; 990766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefCond.broadcast(); 990866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 990966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 991066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 991166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 991266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 991366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 991466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 991566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 991666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getDefJobStatus 991766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 991866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Gets if a deferred task is success/fail 991966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 992066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 992166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job_id : deferred task id 992266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 992366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : NO_ERROR if the job success, otherwise false 992466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 992566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PRECONDITION : mDefLock is held by current thread 992666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 992766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::getDefJobStatus(uint32_t &job_id) 992866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 992966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < MAX_ONGOING_JOBS; i++) { 993066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDefOngoingJobs[i].mDefJobId == job_id) { 993166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NO_ERROR != mDefOngoingJobs[i].mDefJobStatus ) { 993266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("job_id (%d) was failed", job_id); 993366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mDefOngoingJobs[i].mDefJobStatus; 993466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 993566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 993666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 993766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 993866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 993966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 994066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 994166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 994266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 994366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 994466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : checkDeferredWork 994566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 994666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: checks if a deferred task is in progress 994766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 994866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 994966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job_id : deferred task id 995066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 995166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true if the task exists, otherwise false 995266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 995366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PRECONDITION : mDefLock is held by current thread 995466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 995566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::checkDeferredWork(uint32_t &job_id) 995666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 995766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < MAX_ONGOING_JOBS; i++) { 995866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDefOngoingJobs[i].mDefJobId == job_id) { 995966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return (NO_ERROR == mDefOngoingJobs[i].mDefJobStatus); 996066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 996166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 996266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 996366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 996466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 996566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 996666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : waitDeferredWork 996766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 996866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: waits for a deferred task to finish 996966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 997066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 997166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job_id : deferred task id 997266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 997366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 997466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 997566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 997666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 997766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::waitDeferredWork(uint32_t &job_id) 997866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 997966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(mDefLock); 998066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 998166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (job_id == 0) { 998266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Invalid job id %d", job_id); 998366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 998466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 998566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 998666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (checkDeferredWork(job_id) == true ) { 998766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDefCond.waitRelative(mDefLock, CAMERA_DEFERRED_THREAD_TIMEOUT); 998866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 998966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return getDefJobStatus(job_id); 999066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 999166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 999266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 999366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : scheduleBackgroundTask 999466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 999566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Run a requested task in the deferred thread 999666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 999766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 999866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bgTask : Task to perform in the background 999966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1000066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : job id of deferred job 1000166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * : 0 in case of error 1000266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1000366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera2HardwareInterface::scheduleBackgroundTask(BackgroundTask* bgTask) 1000466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1000566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin DeferWorkArgs args; 1000666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&args, 0, sizeof(DeferWorkArgs)); 1000766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin args.genericArgs = bgTask; 1000866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1000966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return queueDeferredWork(CMD_DEF_GENERIC, args); 1001066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1001166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1001266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1001366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : waitForBackgroundTask 1001466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1001566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Wait for a background task to complete 1001666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1001766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1001866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @taskId : Task id to wait for 1001966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1002066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 1002166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 1002266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 1002366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1002466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::waitForBackgroundTask(uint32_t& taskId) 1002566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1002666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return waitDeferredWork(taskId); 1002766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1002866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1002966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1003066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : needDeferedAllocation 1003166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1003266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to decide background task for streams 1003366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1003466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1003566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : stream type 1003666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1003766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true - if background task is needed 1003866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false - if background task is NOT needed 1003966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1004066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::needDeferred(cam_stream_type_t stream_type) 1004166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1004266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream_type == CAM_STREAM_TYPE_PREVIEW && mPreviewWindow == NULL) 1004366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (stream_type == CAM_STREAM_TYPE_ANALYSIS)) { 1004466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return FALSE; 1004566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1004666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1004766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream_type == CAM_STREAM_TYPE_RAW) 1004866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (mParameters.getofflineRAW())) { 1004966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return FALSE; 1005066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1005166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1005266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream_type == CAM_STREAM_TYPE_SNAPSHOT) 1005366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (!mParameters.getRecordingHintValue())){ 1005466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return TRUE; 1005566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1005666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1005766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream_type == CAM_STREAM_TYPE_PREVIEW) 1005866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (stream_type == CAM_STREAM_TYPE_METADATA) 1005966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (stream_type == CAM_STREAM_TYPE_RAW) 1006066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (stream_type == CAM_STREAM_TYPE_POSTVIEW)) { 1006166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return TRUE; 1006266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1006366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1006466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_type == CAM_STREAM_TYPE_VIDEO) { 1006566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return FALSE; 1006666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1006766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return FALSE; 1006866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1006966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1007066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1007166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isRegularCapture 1007266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1007366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Check configuration for regular catpure 1007466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1007566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1007666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1007766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true - regular capture 1007866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false - other type of capture 1007966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1008066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::isRegularCapture() 1008166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1008266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool ret = false; 1008366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1008466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (numOfSnapshotsExpected() == 1 && 1008566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !isLongshotEnabled() && 1008666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.isHDREnabled() && 1008766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !mParameters.getRecordingHintValue() && 1008866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !isZSLMode() && !mParameters.getofflineRAW()) { 1008966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = true; 1009066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1009166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 1009266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1009366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1009466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1009566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getLogLevel 1009666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1009766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Reads the log level property into a variable 1009866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1009966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1010066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 1010166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1010266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 1010366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 1010466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1010566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::getLogLevel() 1010666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1010766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 1010866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1010966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.kpi.debug", prop, "1"); 1011066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gKpiDebugLevel = atoi(prop); 1011166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 1011266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1011366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1011466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1011566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getSensorType 1011666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1011766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Returns the type of sensor being used whether YUV or Bayer 1011866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1011966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1012066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 1012166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1012266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : Type of sensor - bayer or YUV 1012366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1012466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1012566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincam_sensor_t QCamera2HardwareInterface::getSensorType() 1012666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1012766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return gCamCapability[mCameraId]->sensor_type.sens_type; 1012866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1012966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1013066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1013166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startRAWChannel 1013266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1013366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start RAW Channel 1013466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1013566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1013666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pChannel : Src channel to link this RAW channel. 1013766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1013866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 1013966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 1014066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 1014166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1014266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::startRAWChannel(QCameraChannel *pMetaChannel) 1014366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1014466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 1014566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_channels[QCAMERA_CH_TYPE_RAW]; 1014666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pChannel) && (mParameters.getofflineRAW())) { 1014766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Find and try to link a metadata stream from preview channel 1014866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pMetaStream = NULL; 1014966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1015066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaChannel != NULL) { 1015166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t streamNum = pMetaChannel->getNumOfStreams(); 1015266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 1015366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0 ; i < streamNum ; i++ ) { 1015466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pMetaChannel->getStreamByIndex(i); 1015566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pStream) && 1015666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAM_STREAM_TYPE_METADATA == pStream->getMyType())) { 1015766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaStream = pStream; 1015866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 1015966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1016066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1016166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1016266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pMetaStream) { 1016366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->linkStream(pMetaChannel, pMetaStream); 1016466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 1016566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Metadata stream link failed %d", rc); 1016666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1016766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1016866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1016966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pChannel->start(); 1017066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1017166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 1017266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1017366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1017466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1017566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startRecording 1017666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1017766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start recording impl 1017866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1017966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 1018066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1018166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 1018266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 1018366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 1018466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1018566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::stopRAWChannel() 1018666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1018766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 1018866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = stopChannel(QCAMERA_CH_TYPE_RAW); 1018966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 1019066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1019166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1019266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 1019366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isLowPowerMode 1019466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1019566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Returns TRUE if low power mode settings are to be applied for video recording 1019666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1019766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 1019866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 1019966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1020066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : TRUE/FALSE 1020166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1020266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 1020366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::isLowPowerMode() 1020466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 1020566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 1020666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_VIDEO, dim); 1020766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1020866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 1020966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("camera.lowpower.record.enable", prop, "0"); 1021066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int enable = atoi(prop); 1021166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1021266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Enable low power mode if : 1021366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //1. Video resolution is 2k (2048x1080) or above and 1021466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //2. camera.lowpower.record.enable is set 1021566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1021666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool isLowpower = mParameters.getRecordingHintValue() && enable 1021766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && ((dim.width * dim.height) >= (2048 * 1080)); 1021866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return isLowpower; 1021966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 1022066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1022166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 10222