QCamera2HWI.cpp revision 72594c0844ef2066190ecaddf73c9207a983ad90
16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCamera2HWI" 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/properties.h> 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <hardware/camera.h> 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <stdlib.h> 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h> 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gralloc_priv.h> 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h" 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraMem.h" 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define MAP_TO_DRIVER_COORDINATE(val, base, scale, offset) (val * scale / base + offset) 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_STREAMING_BUFFERS 3 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_JPEG_ENCODING_BUFFERS 2 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_VIDEO_BUFFERS 9 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic pthread_mutex_t g_camlock = PTHREAD_MUTEX_INITIALIZER; 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevcamera_device_ops_t QCamera2HardwareInterface::mCameraOps = { 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev set_preview_window: QCamera2HardwareInterface::set_preview_window, 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev set_callbacks: QCamera2HardwareInterface::set_CallBacks, 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev enable_msg_type: QCamera2HardwareInterface::enable_msg_type, 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev disable_msg_type: QCamera2HardwareInterface::disable_msg_type, 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev msg_type_enabled: QCamera2HardwareInterface::msg_type_enabled, 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev start_preview: QCamera2HardwareInterface::start_preview, 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stop_preview: QCamera2HardwareInterface::stop_preview, 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev preview_enabled: QCamera2HardwareInterface::preview_enabled, 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev store_meta_data_in_buffers: QCamera2HardwareInterface::store_meta_data_in_buffers, 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev start_recording: QCamera2HardwareInterface::start_recording, 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stop_recording: QCamera2HardwareInterface::stop_recording, 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev recording_enabled: QCamera2HardwareInterface::recording_enabled, 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev release_recording_frame: QCamera2HardwareInterface::release_recording_frame, 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev auto_focus: QCamera2HardwareInterface::auto_focus, 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cancel_auto_focus: QCamera2HardwareInterface::cancel_auto_focus, 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev take_picture: QCamera2HardwareInterface::take_picture, 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cancel_picture: QCamera2HardwareInterface::cancel_picture, 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev set_parameters: QCamera2HardwareInterface::set_parameters, 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev get_parameters: QCamera2HardwareInterface::get_parameters, 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev put_parameters: QCamera2HardwareInterface::put_parameters, 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev send_command: QCamera2HardwareInterface::send_command, 786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev release: QCamera2HardwareInterface::release, 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev dump: QCamera2HardwareInterface::dump, 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : set_preview_window 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set preview window. 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @window : window ops table 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::set_preview_window(struct camera_device *device, 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct preview_stream_ops *window) 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: NULL camera device", __func__); 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = hw->processAPI(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW, (void *)window); 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW); 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = hw->m_apiResult.status; 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : set_CallBacks 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set callbacks for notify and data 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @notify_cb : notify cb 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data_cb : data cb 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data_cb_timestamp : video data cd with timestamp 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @get_memory : ops table for request gralloc memory 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user : user data ptr 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::set_CallBacks(struct camera_device *device, 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_notify_callback notify_cb, 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_data_callback data_cb, 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_request_memory get_memory, 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *user) 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_sm_evt_setcb_payload_t payload; 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.notify_cb = notify_cb; 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.data_cb = data_cb; 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.data_cb_timestamp = data_cb_timestamp; 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.get_memory = get_memory; 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.user = user; 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = hw->processAPI(QCAMERA_SM_EVT_SET_CALLBACKS, (void *)&payload); 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_SET_CALLBACKS); 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : enable_msg_type 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable certain msg type 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::enable_msg_type(struct camera_device *device, int32_t msg_type) 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = hw->processAPI(QCAMERA_SM_EVT_ENABLE_MSG_TYPE, (void *)msg_type); 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_ENABLE_MSG_TYPE); 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : disable_msg_type 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: disable certain msg type 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::disable_msg_type(struct camera_device *device, int32_t msg_type) 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = hw->processAPI(QCAMERA_SM_EVT_DISABLE_MSG_TYPE, (void *)msg_type); 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_DISABLE_MSG_TYPE); 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : msg_type_enabled 2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if certain msg type is enabled 2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask 2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : 1 -- enabled 2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 -- not enabled 2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msg_type_enabled(struct camera_device *device, int32_t msg_type) 2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_MSG_TYPE_ENABLED, (void *)msg_type); 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_MSG_TYPE_ENABLED); 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.enabled; 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : start_preview 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start preview 2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::start_preview(struct camera_device *device) 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 269fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: E", __func__); 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_sm_evt_enum_t evt = QCAMERA_SM_EVT_START_PREVIEW; 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (hw->isNoDisplayMode()) { 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev evt = QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW; 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(evt, NULL); 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(evt); 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 281fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: X", __func__); 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stop_preview 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop preview 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::stop_preview(struct camera_device *device) 2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 303fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: E", __func__); 3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_PREVIEW, NULL); 3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_STOP_PREVIEW); 3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 310fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: X", __func__); 3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : preview_enabled 3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if preview is running 3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : 1 -- running 3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 -- not running 3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::preview_enabled(struct camera_device *device) 3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_PREVIEW_ENABLED, NULL); 3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_PREVIEW_ENABLED); 3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.enabled; 3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : store_meta_data_in_buffers 3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if need to store meta data in buffers for video frame 3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @enable : flag if enable 3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::store_meta_data_in_buffers( 3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct camera_device *device, int enable) 3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS, (void *)enable); 3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS); 3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : start_recording 3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start recording 3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::start_recording(struct camera_device *device) 3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 401fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: E", __func__); 4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_START_RECORDING, NULL); 4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_START_RECORDING); 4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 409fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: X", __func__); 4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stop_recording 4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop recording 4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::stop_recording(struct camera_device *device) 4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 431fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: E", __func__); 4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_RECORDING, NULL); 4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_STOP_RECORDING); 4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 438fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: X", __func__); 4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : recording_enabled 4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if recording is running 4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : 1 -- running 4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 -- not running 4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::recording_enabled(struct camera_device *device) 4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_RECORDING_ENABLED, NULL); 4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_RECORDING_ENABLED); 4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.enabled; 4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : release_recording_frame 4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return recording frame back 4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @opaque : ptr to frame to be returned 4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::release_recording_frame( 4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct camera_device *device, const void *opaque) 4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 492fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME, (void *)opaque); 4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME); 4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 499fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : auto_focus 5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start auto focus 5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::auto_focus(struct camera_device *device) 5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 523fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s : E", __func__); 5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_START_AUTO_FOCUS, NULL); 5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_START_AUTO_FOCUS); 5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 531fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s : X", __func__); 5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancel_auto_focus 5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel auto focus 5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancel_auto_focus(struct camera_device *device) 5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_STOP_AUTO_FOCUS, NULL); 5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_STOP_AUTO_FOCUS); 5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : take_picture 5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take picture 5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::take_picture(struct camera_device *device) 5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 589fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: E", __func__); 5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Prepare snapshot in case LED needs to be flashed */ 5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, NULL); 5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_PREPARE_SNAPSHOT); 5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Regardless what the result value for prepare_snapshot, 6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * go ahead with capture anyway. Just like the way autofocus 6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * is handled in capture case. */ 6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* capture */ 6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_TAKE_PICTURE, NULL); 6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_TAKE_PICTURE); 6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 611fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s: X", __func__); 6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancel_picture 6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel current take picture request 6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancel_picture(struct camera_device *device) 6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_CANCEL_PICTURE, NULL); 6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_CANCEL_PICTURE); 6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : set_parameters 6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set camera parameters 6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @parms : string of packed parameters 6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::set_parameters(struct camera_device *device, 6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev const char *parms) 6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS, (void *)parms); 6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS); 6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : get_parameters 6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: query camera parameters 6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : packed parameters in a string 6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevchar* QCamera2HardwareInterface::get_parameters(struct camera_device *device) 6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char *ret = NULL; 6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = hw->processAPI(QCAMERA_SM_EVT_GET_PARAMS, NULL); 7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_GET_PARAMS); 7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.params; 7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : put_parameters 7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return camera parameters string back to HAL 7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @parm : ptr to parameter string to be returned 7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::put_parameters(struct camera_device *device, 7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char *parm) 7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = hw->processAPI(QCAMERA_SM_EVT_PUT_PARAMS, (void *)parm); 7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_PUT_PARAMS); 7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : send_command 7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: command to be executed 7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cmd : cmd to be executed 7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @arg1 : ptr to optional argument1 7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @arg2 : ptr to optional argument2 7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::send_command(struct camera_device *device, 7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t cmd, 7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t arg1, 7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t arg2) 7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_sm_evt_command_payload_t payload; 7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&payload, 0, sizeof(qcamera_sm_evt_command_payload_t)); 7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.cmd = cmd; 7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.arg1 = arg1; 7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.arg2 = arg2; 7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_SEND_COMMAND, (void *)&payload); 7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_SEND_COMMAND); 7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : release 7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: release camera resource 7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::release(struct camera_device *device) 7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE, NULL); 8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE); 8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : dump 8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dump camera status 8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @fd : fd for status to be dumped to 8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::dump(struct camera_device *device, int fd) 8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_DUMP, (void *)fd); 8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_DUMP); 8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.status; 8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : close_camera_device 8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: close camera device 8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::close_camera_device(hw_device_t *hw_dev) 8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>( 8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<camera_device_t *>(hw_dev)->priv); 8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete hw; 8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : register_face_image 8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: register a face image into imaging lib for face authenticatio/ 8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * face recognition 8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @device : ptr to camera device struct 8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @img_ptr : ptr to image buffer 8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @config : ptr to config about input image, i.e., format, dimension, and etc. 8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : >=0 unique ID of face registerd. 8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * <0 failure. 8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::register_face_image(struct camera_device *device, 8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *img_ptr, 8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_offline_src_config_t *config) 8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *hw = 8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev reinterpret_cast<QCamera2HardwareInterface *>(device->priv); 8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!hw) { 8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("NULL camera device"); 8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_sm_evt_reg_face_payload_t payload; 8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&payload, 0, sizeof(qcamera_sm_evt_reg_face_payload_t)); 8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.img_ptr = img_ptr; 8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload.config = config; 8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->lockAPI(); 8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->processAPI(QCAMERA_SM_EVT_REG_FACE_IMAGE, (void *)&payload); 8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->waitAPIResult(QCAMERA_SM_EVT_REG_FACE_IMAGE); 9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = hw->m_apiResult.handle; 9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev hw->unlockAPI(); 9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCamera2HardwareInterface 9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCamera2HardwareInterface 9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cameraId : camera ID 9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCamera2HardwareInterface::QCamera2HardwareInterface(int cameraId) 9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev : mCameraId(cameraId), 9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle(NULL), 9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraOpened(false), 9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewWindow(NULL), 9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mMsgEnabled(0), 9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStoreMetaDataInFrame(0), 9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_stateMachine(this), 9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor(this), 9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_thermalAdapter(QCameraThermalAdapter::getInstance()), 9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_cbNotifier(this), 9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bShutterSoundPlayed(false), 9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_currentFocusState(CAM_AF_NOT_FOCUSED), 9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bStartZSLSnapshotCalled(false), 9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pPowerModule(NULL), 9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mDumpFrmCnt(0), 9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mDumpSkipCnt(0) 9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraDevice.common.version = HARDWARE_DEVICE_API_VERSION(1, 0); 9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraDevice.common.close = close_camera_device; 9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraDevice.ops = &mCameraOps; 9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraDevice.priv = this; 9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_init(&m_lock, NULL); 9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_init(&m_cond, NULL); 9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&m_apiResult, 0, sizeof(qcamera_api_result_t)); 9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(m_channels, 0, sizeof(m_channels)); 9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED 9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif 9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCamera2HardwareInterface 9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCamera2HardwareInterface 9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 9656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 9666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCamera2HardwareInterface::~QCamera2HardwareInterface() 9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev closeCamera(); 9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_destroy(&m_lock); 9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_destroy(&m_cond); 9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : openCamera 9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: open camera 9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @hw_device : double ptr for camera device struct 9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device) 9866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 9876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 9886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mCameraOpened) { 9896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *hw_device = NULL; 9906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return PERMISSION_DENIED; 9916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = openCamera(); 9946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) 9956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *hw_device = &mCameraDevice.common; 9966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev else 9976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *hw_device = NULL; 9986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 9996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 10006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 10026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : openCamera 10036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: open camera 10056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 10076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 10096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 10106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 10116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 10126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::openCamera() 10136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 10146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mCameraHandle) { 10156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("Failure: Camera already opened"); 10166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ALREADY_EXISTS; 10176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle = camera_open(mCameraId); 10196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mCameraHandle) { 10206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("camera_open failed."); 10216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 10226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle, 10256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camEvtHandle, 10266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *) this); 10276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = m_postprocessor.init(jpegEvtHandle, this); 10296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != 0) { 10306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("Init Postprocessor failed"); 10316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 10326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // update padding info from jpeg 10356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_padding_info_t padding_info; 10366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.getJpegPaddingReq(padding_info); 10376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (gCamCapability[mCameraId]->padding_info.width_padding < padding_info.width_padding) { 10386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev gCamCapability[mCameraId]->padding_info.width_padding = padding_info.width_padding; 10396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (gCamCapability[mCameraId]->padding_info.height_padding < padding_info.height_padding) { 10416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev gCamCapability[mCameraId]->padding_info.height_padding = padding_info.height_padding; 10426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (gCamCapability[mCameraId]->padding_info.plane_padding < padding_info.plane_padding) { 10446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev gCamCapability[mCameraId]->padding_info.plane_padding = padding_info.plane_padding; 10456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_thermalAdapter.init(this); 10486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != 0) { 10496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("Init thermal adapter failed"); 10506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.init(gCamCapability[mCameraId], mCameraHandle); 10536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraOpened = true; 10546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 10566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 10576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 10596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : closeCamera 10606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: close camera 10626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 10646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 10656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 10666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 10676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 10686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 10696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::closeCamera() 10706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 10716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 10726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int i; 10736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // deinit Parameters 10756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.deinit(); 10766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // stop and deinit postprocessor 10786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 10796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.deinit(); 10806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_thermalAdapter.deinit(); 10826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // delete all channels if not already deleted 10846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 10856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[i] != NULL) { 10866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[i]->stop(); 10876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[i]; 10886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[i] = NULL; 10896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 10936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle = NULL; 10946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraOpened = false; 10956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 10976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 10986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 11006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 11026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : initCapabilities 11036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialize camera capabilities in static data struct 11056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 11076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cameraId : camera Id 11086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 11106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 11116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 11126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 11136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::initCapabilities(int cameraId) 11146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 11156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 11166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_vtbl_t *cameraHandle = NULL; 11176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *capabilityHeap = NULL; 11186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cameraHandle = camera_open(cameraId); 11206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!cameraHandle) { 11216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: camera_open failed", __func__); 11226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = UNKNOWN_ERROR; 11236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto open_failed; 11246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Allocate memory for capability buffer */ 11276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev capabilityHeap = new QCameraHeapMemory(); 11286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = capabilityHeap->allocate(1, sizeof(cam_capability_t)); 11296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc != OK) { 11306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for cappability", __func__); 11316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto allocate_failed; 11326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Map memory for capability buffer */ 11356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 11366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 11376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAM_MAPPING_BUF_TYPE_CAPABILITY, 11386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev capabilityHeap->getFd(0), 11396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sizeof(cam_capability_t)); 11406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc < 0) { 11416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: failed to map capability buffer", __func__); 11426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto map_failed; 11436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Query Capability */ 11466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 11476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc < 0) { 11486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: failed to query capability",__func__); 11496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto query_failed; 11506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 11526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!gCamCapability[cameraId]) { 11536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: out of memory", __func__); 11546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto query_failed; 11556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 11576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sizeof(cam_capability_t)); 11586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_ERROR; 11606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevquery_failed: 11626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 11636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAM_MAPPING_BUF_TYPE_CAPABILITY); 11646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevmap_failed: 11656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev capabilityHeap->deallocate(); 11666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete capabilityHeap; 11676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevallocate_failed: 11686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cameraHandle->ops->close_camera(cameraHandle->camera_handle); 11696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cameraHandle = NULL; 11706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevopen_failed: 11716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 11726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 11736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 11756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getCapabilities 11766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: query camera capabilities 11786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 11806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cameraId : camera Id 11816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @info : camera info struct to be filled in with camera capabilities 11826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 11846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 11856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 11866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 11876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getCapabilities(int cameraId, 11886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct camera_info *info) 11896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 11906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 11916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&g_camlock); 11936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == gCamCapability[cameraId]) { 11946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = initCapabilities(cameraId); 11956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc < 0) { 11966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&g_camlock); 11976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 11986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch(gCamCapability[cameraId]->position) { 12026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_POSITION_BACK: 12036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev info->facing = CAMERA_FACING_BACK; 12046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_POSITION_FRONT: 12076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev info->facing = CAMERA_FACING_FRONT; 12086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 12116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 12126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = BAD_VALUE; 12136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 12176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&g_camlock); 12186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 12196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 12206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 12226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getBufNumRequired 12236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return number of stream buffers needed for given stream type 12256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 12276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @stream_type : type of stream 12286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : number of buffers needed 12306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 12316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevuint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_type) 12326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 12336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int bufferCnt = 0; 12346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int minCaptureBuffers = mParameters.getNumOfSnapshots(); 12356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int zslQBuffers = mParameters.getZSLQueueDepth() + 12376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue(); 12386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int minCircularBufNum = CAMERA_MIN_STREAMING_BUFFERS + 12406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_JPEG_ENCODING_BUFFERS + 12416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getNumOfHDRBufsIfNeeded(); 12436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Get buffer count for the particular stream type 12456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (stream_type) { 12466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_PREVIEW: 12476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 12496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = zslQBuffers + minCircularBufNum; 12506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 12516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = CAMERA_MIN_STREAMING_BUFFERS + 12526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue(); 12536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_POSTVIEW: 12576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = minCaptureBuffers + 12596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getNumOfExtraHDRBufsIfNeeded() + 12616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_STREAMING_BUFFERS; 12626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_SNAPSHOT: 12656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 12676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = zslQBuffers + minCircularBufNum; 12686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 12696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = minCaptureBuffers + 12706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getNumOfExtraHDRBufsIfNeeded() + 12726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_STREAMING_BUFFERS; 12736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_RAW: 12776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 12786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = zslQBuffers + CAMERA_MIN_STREAMING_BUFFERS; 12796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 12806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = minCaptureBuffers + 12816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getNumOfExtraHDRBufsIfNeeded() + 12836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_STREAMING_BUFFERS; 12846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_VIDEO: 12876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = CAMERA_MIN_VIDEO_BUFFERS + 12896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_STREAMING_BUFFERS; 12916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_METADATA: 12946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = minCaptureBuffers + 12966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue() + 12976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getNumOfExtraHDRBufsIfNeeded() + 12986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CAMERA_MIN_STREAMING_BUFFERS; 12996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (bufferCnt < zslQBuffers + minCircularBufNum) { 13006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = zslQBuffers + minCircularBufNum; 13016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_OFFLINE_PROC: 13056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 13066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = minCaptureBuffers + 13076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getMaxUnmatchedFramesInQueue(); 13086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (bufferCnt < CAMERA_MIN_STREAMING_BUFFERS) { 13096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = CAMERA_MIN_STREAMING_BUFFERS; 13106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_DEFAULT: 13146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_MAX: 13156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 13166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = 0; 13176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return bufferCnt; 13216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 13226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 13246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : allocateStreamBuf 13256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 13266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: alocate stream buffers 13276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 13286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 13296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @stream_type : type of stream 13306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @size : size of buffer 13316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @bufferCnt : [IN/OUT] minimum num of buffers to be allocated. 13326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * could be modified during allocation if more buffers needed 13336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 13346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : ptr to a memory obj that holds stream buffers. 13356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NULL if failed 13366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 13376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraMemory *QCamera2HardwareInterface::allocateStreamBuf(cam_stream_type_t stream_type, 13386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int size, 13396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t &bufferCnt) 13406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 13416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 13426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraMemory *mem = NULL; 13436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Allocate stream buffer memory object 13456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (stream_type) { 13466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_PREVIEW: 1347fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li { 1348fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li if (isNoDisplayMode()) { 1349fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mem = new QCameraStreamMemory(mGetMemory); 1350fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li } else { 1351fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li cam_dimension_t dim; 1352fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li QCameraGrallocMemory *grallocMemory = new QCameraGrallocMemory(mGetMemory); 1353fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li 1354fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mParameters.getStreamDimension(stream_type, dim); 1355fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li if (grallocMemory) 1356fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li grallocMemory->setWindowInfo(mPreviewWindow, dim.width, dim.height, 1357fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mParameters.getPreviewHalPixelFormat()); 1358fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mem = grallocMemory; 1359fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li } 1360fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li } 1361fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li break; 1362fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li case CAM_STREAM_TYPE_POSTVIEW: 1363fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li { 1364fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li cam_dimension_t dim; 1365fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li QCameraGrallocMemory *grallocMemory = new QCameraGrallocMemory(mGetMemory); 1366fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li 1367fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mParameters.getStreamDimension(stream_type, dim); 1368fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li if (grallocMemory) 1369fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li grallocMemory->setWindowInfo(mPreviewWindow, dim.width, dim.height, 1370fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mParameters.getPreviewHalPixelFormat()); 1371fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li mem = grallocMemory; 13726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_SNAPSHOT: 13756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_RAW: 13766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_METADATA: 13776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_OFFLINE_PROC: 13786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mem = new QCameraStreamMemory(mGetMemory); 13796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_VIDEO: 13816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mem = new QCameraVideoMemory(mGetMemory); 13826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_DEFAULT: 13846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_MAX: 13856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mem) { 13886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 13896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (bufferCnt > 0) { 13926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mem->allocate(bufferCnt, size); 13936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc < 0) { 13946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete mem; 13956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 13966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bufferCnt = mem->getCnt(); 13986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mem; 14006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 14036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : allocateStreamInfoBuf 14046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: alocate stream info buffer 14066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 14086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @stream_type : type of stream 14096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : ptr to a memory obj that holds stream info buffer. 14116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NULL if failed 14126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 14136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraHeapMemory *QCamera2HardwareInterface::allocateStreamInfoBuf( 14146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_type_t stream_type) 14156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 14166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 14176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *streamInfoBuf = new QCameraHeapMemory(); 14196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!streamInfoBuf) { 14206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("allocateStreamInfoBuf: Unable to allocate streamInfo object"); 14216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 14226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = streamInfoBuf->allocate(1, sizeof(cam_stream_info_t)); 14256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc < 0) { 14266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("allocateStreamInfoBuf: Failed to allocate stream info memory"); 14276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete streamInfoBuf; 14286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 14296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_info_t *streamInfo = (cam_stream_info_t *)streamInfoBuf->getPtr(0); 14326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(streamInfo, 0, sizeof(cam_stream_info_t)); 14336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->stream_type = stream_type; 14346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getStreamFormat(stream_type, streamInfo->fmt); 14356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getStreamDimension(stream_type, streamInfo->dim); 14366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 14386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (stream_type) { 14396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_SNAPSHOT: 14406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_RAW: 14416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 14426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 14436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 14446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 14456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->num_of_burst = mParameters.getNumOfSnapshots(); 14466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_STREAM_TYPE_POSTVIEW: 14496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 14506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->num_of_burst = mParameters.getNumOfSnapshots(); 14516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 14536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //set flip mode based on Stream type; 14576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int flipMode = mParameters.getFlipMode(stream_type); 1458fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li if (flipMode > 0) { 1459fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_FLIP; 1460fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li streamInfo->pp_config.flip = flipMode; 1461fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li } 14626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // set Rotation if need online rotation per stream in CPP 14646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (needOnlineRotation()) { 14656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 14666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rotation = mParameters.getJpegRotation(); 14676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rotation == 0) { 14686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->pp_config.rotation = ROTATE_0; 14696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 90) { 14706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->pp_config.rotation = ROTATE_90; 14716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 180) { 14726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->pp_config.rotation = ROTATE_180; 14736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 270) { 14746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->pp_config.rotation = ROTATE_270; 14756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return streamInfoBuf; 14796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 14826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : setPreviewWindow 14836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set preview window impl 14856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 14876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @window : ptr to window ops table struct 14886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 14906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 14916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 14926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 14936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::setPreviewWindow( 14946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct preview_stream_ops *window) 14956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 14966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewWindow = window; 14976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 14986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : setCallBacks 15026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set callbacks impl 15046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @notify_cb : notify cb 15076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data_cb : data cb 15086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data_cb_timestamp : data cb with time stamp 15096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @get_memory : request memory ops table 15106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user : user data ptr 15116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 15136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 15146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 15156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::setCallBacks(camera_notify_callback notify_cb, 15176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_data_callback data_cb, 15186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 15196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_request_memory get_memory, 15206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *user) 15216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mNotifyCb = notify_cb; 15236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mDataCb = data_cb; 15246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mDataCbTimestamp = data_cb_timestamp; 15256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mGetMemory = get_memory; 15266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCallbackCookie = user; 15276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_cbNotifier.setCallbacks(notify_cb, data_cb, data_cb_timestamp, user); 15286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 15296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 15306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : enableMsgType 15336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable msg type impl 15356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask to be enabled 15386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 15406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 15416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 15426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::enableMsgType(int32_t msg_type) 15446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mMsgEnabled |= msg_type; 15466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 15476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 15486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : disableMsgType 15516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: disable msg type impl 15536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask to be disabled 15566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 15586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 15596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 15606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::disableMsgType(int32_t msg_type) 15626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mMsgEnabled &= ~msg_type; 15646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 15656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 15666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : msgTypeEnabled 15696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: impl to determine if certain msg_type is enabled 15716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask 15746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : 0 -- not enabled 15766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none 0 -- enabled 15776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msgTypeEnabled(int32_t msg_type) 15796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return (mMsgEnabled & msg_type); 15816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 15826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : msgTypeEnabledWithLock 15856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: impl to determine if certain msg_type is enabled with lock 15876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type : msg type mask 15906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : 0 -- not enabled 15926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none 0 -- enabled 15936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msgTypeEnabledWithLock(int32_t msg_type) 15956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int enabled = 0; 15976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev lockAPI(); 15986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev enabled = mMsgEnabled & msg_type; 15996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unlockAPI(); 16006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return enabled; 16016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 16026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 16046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : startPreview 16056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start preview impl 16076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 16096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 16116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 16126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 16136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 16146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::startPreview() 16156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 16166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 1617fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 16186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start preview stream 16194faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) { 16206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_ZSL); 16216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_PREVIEW); 16236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1624fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 16256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 16266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 16276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 16296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stopPreview 16306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop preview impl 16326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 16346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 16366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 16376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 16386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 16396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::stopPreview() 16406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1641fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 16426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // stop preview stream 16434faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) { 16446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_ZSL); 16456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_PREVIEW); 16476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // delete all channels from preparePreview 16506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unpreparePreview(); 1651fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 16526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 16536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 16546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 16566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : storeMetaDataInBuffers 16576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable store meta data in buffers for video frames impl 16596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 16616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @enable : flag if need enable 16626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 16646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 16656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 16666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 16676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::storeMetaDataInBuffers(int enable) 16686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 16696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStoreMetaDataInFrame = enable; 16706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 16716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 16726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 16746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : startRecording 16756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start recording impl 16776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 16796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 16806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 16816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 16826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 16836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 16846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::startRecording() 16856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 16866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 1687fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 16886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.getRecordingHintValue() == false) { 16896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: start recording when hint is false, stop preview first", __func__); 16906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_PREVIEW); 16916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_PREVIEW); 16926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Set local recording hint to TRUE 16946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setRecordingHintValue(true); 16956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = preparePreview(); 16966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 16976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_PREVIEW); 16986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 17026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_VIDEO); 17036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED 17066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 17076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pPowerModule) { 17086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pPowerModule->powerHint) { 17096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, (void *)"state=1"); 17106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif 1714fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 17156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 17166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 17176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 17196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stopRecording 17206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop recording impl 17226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 17246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 17266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 17276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 17286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 17296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::stopRecording() 17306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 17316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = stopChannel(QCAMERA_CH_TYPE_VIDEO); 1732fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 17336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED 17346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pPowerModule) { 17356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pPowerModule->powerHint) { 17366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, (void *)"state=0"); 17376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif 1740fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 17416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 17426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 17436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 17456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseRecordingFrame 17466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return video frame impl 17486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 17506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @opaque : ptr to video frame to be returned 17516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 17536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 17546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 17556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 17566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::releaseRecordingFrame(const void * opaque) 17576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 17586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = UNKNOWN_ERROR; 17596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraVideoChannel *pChannel = 17606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (QCameraVideoChannel *)m_channels[QCAMERA_CH_TYPE_VIDEO]; 1761fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: opaque data = %p", __func__,opaque); 17626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(pChannel != NULL) { 17636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->releaseFrame(opaque, mStoreMetaDataInFrame > 0); 17646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 17666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 17676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 17696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : autoFocus 17706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start auto focus impl 17726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 17746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 17756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 17766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 17776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 17786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 17796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::autoFocus() 17806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 17816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 17826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_focus_mode_type focusMode = mParameters.getFocusMode(); 17836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (focusMode) { 17856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_AUTO: 17866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_MACRO: 17876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 17886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mCameraHandle->ops->do_auto_focus(mCameraHandle->camera_handle); 17896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 17906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setAFRunning(true); 17916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 17936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 17946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 17956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // According to Google API definition, the focus callback will immediately 17966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // return with a boolean that indicates whether the focus is sharp or not. 17976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // The focus position is locked after autoFocus call. 17986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // in this sense, the effect is the same as cancel_auto_focus 17996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 18006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.setLockCAF(true); 18016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send evt notify that foucs is done 18036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sendEvtNotify(CAMERA_MSG_FOCUS, 18046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (m_currentFocusState == CAM_AF_FOCUSED)? true : false, 18056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 18066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 18096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // According to Google API definition, if the autofocus is in the middle 18106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // of scanning, the focus callback will return when it completes. If the 18116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // autofocus is not scanning, focus callback will immediately return with 18126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // a boolean that indicates whether the focus is sharp or not. The apps 18136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // can then decide if they want to take a picture immediately or to change 18146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // the focus mode to auto, and run a full autofocus cycle. The focus position 18156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // is locked after autoFocus call. 18166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_currentFocusState != CAM_AF_SCANNING) { 18176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // lock focus 18186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.setLockCAF(true); 18196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send evt notify that foucs is done 18216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sendEvtNotify(CAMERA_MSG_FOCUS, 18226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (m_currentFocusState == CAM_AF_FOCUSED)? true : false, 18236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 18246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 18256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // set flag that lock CAF is needed once focus state becomes focsued/not focused 18266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setLockCAFNeeded(true); 18276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_ERROR; 18286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_INFINITY: 18316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_FIXED: 18326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_EDOF: 18336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 18346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No ops in focusMode (%d)", __func__, focusMode); 18356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = BAD_VALUE; 18366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 18396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 18406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 18426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancelAutoFocus 18436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel auto focus impl 18456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 18476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 18496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 18506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 18516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 18526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelAutoFocus() 18536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 18546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 18556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_focus_mode_type focusMode = mParameters.getFocusMode(); 18566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (focusMode) { 18586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_AUTO: 18596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_MACRO: 18606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isAFRunning()) { 18616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mCameraHandle->ops->cancel_auto_focus(mCameraHandle->camera_handle); 18626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 18636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setAFRunning(false); 18646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 18686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 18696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isCAFLocked()) { 18706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // resume CAF by unlock CAF 18716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.setLockCAF(false);; 18726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setLockCAFNeeded(false); 18736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_INFINITY: 18766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_FIXED: 18776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_EDOF: 18786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 18796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGI("%s: No ops in focusMode (%d)", __func__, focusMode); 18806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 18816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 18826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 18836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 18846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 18866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : takePicture 18876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take picture impl 18896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 18916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 18926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 18936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 18946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 18956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 18966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::takePicture() 18976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 18986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 18996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t numSnapshots = mParameters.getNumOfSnapshots(); 1900fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: E", __func__); 19016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 19026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPicChannel *pZSLChannel = 19036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 19046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pZSLChannel) { 19056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start postprocessor 19066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.start(pZSLChannel); 19076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 19086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pZSLChannel->takePicture(numSnapshots); 19096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 19106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot take ZSL picture", __func__); 19116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 19126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: ZSL channel is NULL", __func__); 19166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 19176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // normal capture case 19206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // need to stop preview channel 19216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_PREVIEW); 19226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_PREVIEW); 19236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 19246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start snapshot 19257fde32d818742141a39fda194e66b84109182affEmilian Peev if (mParameters.isJpegPictureFormat() || 19267fde32d818742141a39fda194e66b84109182affEmilian Peev mParameters.isNV16PictureFormat() ) { 19276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addCaptureChannel(); 19286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 19296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start postprocessor 19306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_CAPTURE]); 19316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 19326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start catpure channel 19336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_CAPTURE); 19346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 19356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot start capture channel", __func__); 19366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 19376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_CAPTURE); 19386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot add capture channel", __func__); 19426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addRawChannel(); 19466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 19476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start postprocessor 19486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_RAW]); 19496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_RAW); 19506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 19516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot start raw channel", __func__); 19526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 19536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_RAW); 19546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot add raw channel", __func__); 19586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1962fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("%s: X", __func__); 19636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 19646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 19656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 19666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 19676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancelPicture 19686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 19696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel picture impl 19706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 19716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 19726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 19736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 19746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 19756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 19766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 19776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelPicture() 19786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 19796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //stop post processor 19806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 19816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 19826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 19836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPicChannel *pZSLChannel = 19846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL]; 19856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pZSLChannel) { 19866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_bStartZSLSnapshotCalled) { 19876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops->stop_zsl_snapshot( 19886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->camera_handle); 19896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bStartZSLSnapshotCalled = false; 19906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pZSLChannel->cancelPicture(); 19926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 19936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 19946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // normal capture case 19957fde32d818742141a39fda194e66b84109182affEmilian Peev if (mParameters.isJpegPictureFormat() || 19967fde32d818742141a39fda194e66b84109182affEmilian Peev mParameters.isNV16PictureFormat() ) { 19976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_CAPTURE); 19986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_CAPTURE); 19996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 20006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel(QCAMERA_CH_TYPE_RAW); 20016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_RAW); 20026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 20036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 20046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 20056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 20066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 20086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : takeLiveSnapshot 20096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take live snapshot during recording 20116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 20136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 20156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 20166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 20176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 20186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::takeLiveSnapshot() 20196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 20206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 20216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start post processor 20236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_SNAPSHOT]); 20246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // start snapshot channel 20266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 20276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = startChannel(QCAMERA_CH_TYPE_SNAPSHOT); 20286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 20296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 20306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 20316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 20336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancelLiveSnapshot 20346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel current live snapshot request 20366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 20386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 20406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 20416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 20426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 20436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelLiveSnapshot() 20446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 20456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 20466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //stop post processor 20486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_postprocessor.stop(); 20496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // stop snapshot channel 20516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = stopChannel(QCAMERA_CH_TYPE_SNAPSHOT); 20526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 20546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 20556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 20576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getParameters 20586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get parameters impl 20606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 20626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : a string containing parameter pairs 20646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 20656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevchar* QCamera2HardwareInterface::getParameters() 20666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 20676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char* strParams = NULL; 20686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev String8 str; 20696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev str = mParameters.flatten( ); 20706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev strParams = (char *)malloc(sizeof(char)*(str.length()+1)); 20716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(strParams != NULL){ 20726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(strParams, 0, sizeof(char)*(str.length()+1)); 20736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev strncpy(strParams, str.string(), str.length()); 20746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev strParams[str.length()] = 0; 20756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 20766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return strParams; 20776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 20786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 20806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : putParameters 20816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: put parameters string impl 20836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 20856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @parms : parameters string to be released 20866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 20876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 20886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 20896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 20906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 20916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::putParameters(char *parms) 20926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 20936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(parms); 20946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 20956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 20966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 20976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 20986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : sendCommand 20996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send command impl 21016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 21036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @command : command to be executed 21046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @arg1 : optional argument 1 21056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @arg2 : optional argument 2 21066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 21086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 21096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 21106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 21116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::sendCommand(int32_t command, int32_t /*arg1*/, int32_t /*arg2*/) 21126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 21136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 21146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (command) { 21166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_START_FACE_DETECTION: 21176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_STOP_FACE_DETECTION: 21186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = setFaceDetection(command == CAMERA_CMD_START_FACE_DETECTION? true : false); 21196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 21206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 21216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_ERROR; 21226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 21236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 21256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 21266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 21286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : registerFaceImage 21296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: register face image impl 21316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 21336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @img_ptr : ptr to image buffer 21346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @config : ptr to config struct about input image info 21356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @faceID : [OUT] face ID to uniquely identifiy the registered face image 21366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 21376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 21386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 21396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 21406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 21416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::registerFaceImage(void *img_ptr, 21426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_offline_src_config_t *config, 21436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t &faceID) 21446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 21456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = NO_ERROR; 21466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faceID = -1; 21476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (img_ptr == NULL || config == NULL) { 21496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: img_ptr or config is NULL", __func__); 21506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 21516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // allocate ion memory for source image 21546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *imgBuf = new QCameraHeapMemory(); 21556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (imgBuf == NULL) { 21566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Unable to new heap memory obj for image buf", __func__); 21576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 21586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = imgBuf->allocate(1, config->input_buf_planes.plane_info.frame_len); 21616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc < 0) { 21626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Unable to allocate heap memory for image buf", __func__); 21636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete imgBuf; 21646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 21656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *pBufPtr = imgBuf->getPtr(0); 21686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pBufPtr == NULL) { 21696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: image buf is NULL", __func__); 21706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev imgBuf->deallocate(); 21716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete imgBuf; 21726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 21736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(pBufPtr, img_ptr, config->input_buf_planes.plane_info.frame_len); 21756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_feature_config_t pp_feature; 21776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&pp_feature, 0, sizeof(cam_pp_feature_config_t)); 21786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_feature.feature_mask = CAM_QCOM_FEATURE_REGISTER_FACE; 21796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraReprocessChannel *pChannel = 21806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev addOfflineReprocChannel(*config, pp_feature, NULL, NULL); 21816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pChannel == NULL) { 21836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: fail to add offline reprocess channel", __func__); 21846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev imgBuf->deallocate(); 21856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete imgBuf; 21866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 21876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 218972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li rc = pChannel->start(); 21906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 21916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Cannot start reprocess channel", __func__); 21926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev imgBuf->deallocate(); 21936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete imgBuf; 21946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 21956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 21966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 21976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 21986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->doReprocess(imgBuf->getFd(0), imgBuf->getSize(0), faceID); 21996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // done with register face image, free imgbuf and delete reprocess channel 22016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev imgBuf->deallocate(); 22026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete imgBuf; 22036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev imgBuf = NULL; 22046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel->stop(); 22056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 22066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = NULL; 22076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 22096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 22106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 22126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : release 22136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: release camera resource impl 22156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 22176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 22196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 22206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 22216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 22226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::release() 22236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 22246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // stop and delete all channels 22256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i <QCAMERA_CH_TYPE_MAX ; i++) { 22266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[i] != NULL) { 22276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopChannel((qcamera_ch_type_enum_t)i); 22286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel((qcamera_ch_type_enum_t)i); 22296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 22306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 22316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 22336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 22346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 22366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : dump 22376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: camera status dump impl 22396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 22416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @fd : fd for the buffer to be dumped with camera status 22426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 22446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 22456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 22466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 22476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::dump(int /*fd*/) 22486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 22496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: not supported yet", __func__); 22506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return INVALID_OPERATION; 22516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 22526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 22546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processAPI 22556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process API calls from upper layer 22576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 22596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @api : API to be processed 22606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @api_payload : ptr to API payload if any 22616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 22636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 22646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 22656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 22666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::processAPI(qcamera_sm_evt_enum_t api, void *api_payload) 22676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 22686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_stateMachine.procAPI(api, api_payload); 22696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 22706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 22726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processEvt 22736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process Evt from backend via mm-camera-interface 22756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 22776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @evt : event type to be processed 22786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @evt_payload : ptr to event payload if any 22796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 22816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 22826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 22836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 22846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload) 22856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 22866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_stateMachine.procEvt(evt, evt_payload); 22876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 22886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 22896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 22906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : evtHandle 22916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Function registerd to mm-camera-interface to handle backend events 22936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 22956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @camera_handle : event type to be processed 22966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @evt : ptr to event 22976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr 22986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 22996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 23006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 23016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::camEvtHandle(uint32_t /*camera_handle*/, 23026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_event_t *evt, 23036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *user_data) 23046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 23056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)user_data; 23066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (obj && evt) { 23076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_event_t *payload = 23086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (mm_camera_event_t *)malloc(sizeof(mm_camera_event_t)); 23096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != payload) { 23106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *payload = *evt; 23116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev obj->processEvt(QCAMERA_SM_EVT_EVT_NOTIFY, payload); 23126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 23136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 23146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: NULL user_data", __func__); 23156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 23166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 23176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 23186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 23196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : jpegEvtHandle 23206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events 23226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 23246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @status : status of jpeg job 23256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @client_hdl: jpeg client handle 23266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @jobId : jpeg job Id 23276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @p_ouput : ptr to jpeg output result struct 23286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userdata : user data ptr 23296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 23316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 23326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::jpegEvtHandle(jpeg_job_status_t status, 23336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t /*client_hdl*/, 23346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t jobId, 23356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_output_t *p_output, 23366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *userdata) 23376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 23386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)userdata; 23396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (obj) { 23406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_evt_payload_t *payload = 23416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_jpeg_evt_payload_t *)malloc(sizeof(qcamera_jpeg_evt_payload_t)); 23426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != payload) { 23436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(payload, 0, sizeof(qcamera_jpeg_evt_payload_t)); 23446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload->status = status; 23456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload->jobId = jobId; 23466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (p_output != NULL) { 23476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev payload->out_data = *p_output; 23486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 23496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev obj->processEvt(QCAMERA_SM_EVT_JPEG_EVT_NOTIFY, payload); 23506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 23516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 23526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: NULL user_data", __func__); 23536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 23546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 23556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 23566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 23576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : thermalEvtHandle 23586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: routine to handle thermal event notification 23606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 23626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @level : thermal level 23636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userdata : userdata passed in during registration 23646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : opaque data from thermal client 23656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 23676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 23686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 23696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 23706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::thermalEvtHandle( 23716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_thermal_level_enum_t level, void *userdata, void *data) 23726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 23736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Make sure thermal events are logged 23746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGI("%s: level = %d, userdata = %p, data = %p", 23756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, level, userdata, data); 23766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //We don't need to lockAPI, waitAPI here. QCAMERA_SM_EVT_THERMAL_NOTIFY 23776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // becomes an aync call. This also means we can only pass payload 23786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // by value, not by address. 23796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return processAPI(QCAMERA_SM_EVT_THERMAL_NOTIFY, (void *)level); 23806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 23816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 23826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 23836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : sendEvtNotify 23846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send event notify to notify thread 23866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 23886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type: msg type to be sent 23896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext1 : optional extension1 23906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext2 : optional extension2 23916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 23926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 23936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 23946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 23956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 23966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::sendEvtNotify(int32_t msg_type, 23976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ext1, 23986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ext2) 23996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 24006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 24016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 24026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 24036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = msg_type; 24046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext1 = ext1; 24056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext2 = ext2; 24066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_cbNotifier.notifyCallback(cbArg); 24076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 24086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 24106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processAutoFocusEvent 24116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process auto focus event 24136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 24156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @focus_data: struct containing auto focus result info 24166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 24186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 24196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 24206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 24216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processAutoFocusEvent(cam_auto_focus_data_t &focus_data) 24226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 24236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = NO_ERROR; 24246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_currentFocusState = focus_data.focus_state; 24266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_focus_mode_type focusMode = mParameters.getFocusMode(); 24286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (focusMode) { 24296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_AUTO: 24306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_MACRO: 24316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isAFRunning()) { 24326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (focus_data.focus_state == CAM_AF_SCANNING) { 24336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // in the middle of focusing, just ignore it 24346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 24356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // update focus distance 24386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.updateFocusDistances(&focus_data.focus_dist); 24396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = sendEvtNotify(CAMERA_MSG_FOCUS, 24406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (focus_data.focus_state == CAM_AF_FOCUSED)? true : false, 24416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 24426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setAFRunning(false); 24436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 24446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = UNKNOWN_ERROR; 24456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: autoFocusEvent when no auto_focus running", __func__); 24466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 24486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_VIDEO: 24496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_CONTINOUS_PICTURE: 24506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (focus_data.focus_state == CAM_AF_FOCUSED || 24516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev focus_data.focus_state == CAM_AF_NOT_FOCUSED) { 24526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // update focus distance 24536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.updateFocusDistances(&focus_data.focus_dist); 24546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isLockCAFNeeded()) { 24556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.setLockCAFNeeded(false); 24566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mParameters.setLockCAF(true); 24576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = sendEvtNotify(CAMERA_MSG_FOCUS, 24606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (focus_data.focus_state == CAM_AF_FOCUSED)? true : false, 24616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 24626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = sendEvtNotify(CAMERA_MSG_FOCUS_MOVE, 24646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (focus_data.focus_state == CAM_AF_SCANNING)? true : false, 24656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 24666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 24676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_INFINITY: 24686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_FIXED: 24696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FOCUS_MODE_EDOF: 24706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 24716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: no ops for autofocus event in focusmode %d", __func__, focusMode); 24726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 24736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 24766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 24776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 24796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processZoomEvent 24806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process zoom event 24826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 24846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @crop_info : crop info as a result of zoom operation 24856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 24866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 24876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 24886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 24896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 24906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processZoomEvent(cam_crop_data_t &crop_info) 24916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 24926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = NO_ERROR; 24936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 24946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 24956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[i] != NULL) { 24966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = m_channels[i]->processZoomDone(mPreviewWindow, crop_info); 24976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 24996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 25006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 25016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 25036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processPrepSnapshotDone 25046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process prep snapshot done event 25066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 25086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @prep_snapshot_state : state of prepare snapshot done. In other words, 25096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * i.e. whether need future frames for capture. 25106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 25126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 25136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 25146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 25156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processPrepSnapshotDoneEvent( 25166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_prep_snapshot_state_t prep_snapshot_state) 25176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 25186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = NO_ERROR; 25196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_ZSL] && 25216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev prep_snapshot_state == NEED_FUTURE_FRAME) { 25226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mCameraHandle->ops->start_zsl_snapshot( 25246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->camera_handle); 25256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret < 0) { 25266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: start_led_zsl_capture failed %d", 25276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, ret); 25286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 25296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 25306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bStartZSLSnapshotCalled = true; 25316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 25326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 25336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 25346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 25366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processJpegNotify 25376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process jpeg event 25396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 25416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @jpeg_evt: ptr to jpeg event payload 25426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 25446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 25456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 25466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 25476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_evt) 25486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 25496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_postprocessor.processJpegEvt(jpeg_evt); 25506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 25516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 25536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : lockAPI 25546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: lock to process API 25566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 25586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 25606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 25616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::lockAPI() 25626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 25636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 25646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 25656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 25676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : waitAPIResult 25686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: wait for API result coming back. This is a blocking call, it will 25706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * return only cerntain API event type arrives 25716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 25736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @api_evt : API event type 25746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 25766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 25776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::waitAPIResult(qcamera_sm_evt_enum_t api_evt) 25786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 25796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: wait for API result of evt (%d)", __func__, api_evt); 25806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&m_apiResult, 0, sizeof(qcamera_api_result_t)); 25816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while (m_apiResult.request_api != api_evt) { 25826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_wait(&m_cond, &m_lock); 25836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 25846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: return (%d) from API result wait for evt (%d)", 25856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, m_apiResult.status, api_evt); 25866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 25876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 25886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 25896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : unlockAPI 25906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: API processing is done, unlock 25926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 25946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 25956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 25966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 25976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::unlockAPI() 25986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 25996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 26006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 26016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 26036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : signalAPIResult 26046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: signal condition viarable that cerntain API event type arrives 26066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 26086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @result : API result 26096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 26116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 26126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::signalAPIResult(qcamera_api_result_t *result) 26136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 26146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 26156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_apiResult = *result; 26166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_signal(&m_cond); 26176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 26186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 26196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 26216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addStreamToChannel 26226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a stream into a channel 26246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 26266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pChannel : ptr to channel obj 26276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @streamType : type of stream to be added 26286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @streamCB : callback of stream 26296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userData : user data ptr to callback 26306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 26326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 26336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 26346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 26356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addStreamToChannel(QCameraChannel *pChannel, 26366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_type_t streamType, 26376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stream_cb_routine streamCB, 26386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *userData) 26396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 26406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 26416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(streamType); 26426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStreamInfo == NULL) { 26436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for stream info buf", __func__); 26446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 26456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 26466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t minStreamBufNum = getBufNumRequired(streamType); 26476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->addStream(*this, 26486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfo, 26496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev minStreamBufNum, 26506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev &gCamCapability[mCameraId]->padding_info, 26516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamCB, userData); 26526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 26536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add stream type (%d) failed, ret = %d", 26546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, streamType, rc); 26556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfo->deallocate(); 26566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pStreamInfo; 26576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 26586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 26596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 26616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 26626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 26646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addPreviewChannel 26656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a preview channel that contains a preview stream 26676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 26696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 26706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 26716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 26726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 26736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 26746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addPreviewChannel() 26756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 26766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 26776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = NULL; 26786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) { 26806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if we had preview channel before, delete it first 26816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_PREVIEW]; 26826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_PREVIEW] = NULL; 26836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 26846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraChannel(mCameraHandle->camera_handle, 26866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 26876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 26886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for preview channel", __func__); 26896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 26906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 26916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 26926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // preview only channel, don't need bundle attr and cb 26936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, NULL, NULL); 26946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 26956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init preview channel failed, ret = %d", __func__, rc); 26966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 26976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 26986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 26996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // meta data stream always coexists with preview if applicable 27016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 27026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev metadata_stream_cb_routine, this); 27036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 27046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc); 27056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 27066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (isNoDisplayMode()) { 27106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 27116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev nodisplay_preview_stream_cb_routine, this); 27126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 27136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 27146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev preview_stream_cb_routine, this); 27156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 27176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add preview stream failed, ret = %d", __func__, rc); 27186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 27196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_PREVIEW] = pChannel; 27236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 27256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 27276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addVideoChannel 27286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a video channel that contains a video stream 27306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 27326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 27346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 27356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 27366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 27376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addVideoChannel() 27386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 27396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 27406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraVideoChannel *pChannel = NULL; 27416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_VIDEO] != NULL) { 27436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if we had video channel before, delete it first 27446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_VIDEO]; 27456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_VIDEO] = NULL; 27466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraVideoChannel(mCameraHandle->camera_handle, 27496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 27506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 27516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for video channel", __func__); 27526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 27536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // preview only channel, don't need bundle attr and cb 27566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, NULL, NULL); 27576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != 0) { 27586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init video channel failed, ret = %d", __func__, rc); 27596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 27606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_VIDEO, 27646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev video_stream_cb_routine, this); 27656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 27666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add video stream failed, ret = %d", __func__, rc); 27676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 27686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_VIDEO] = pChannel; 27726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 27736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 27746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 27766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addSnapshotChannel 27776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a snapshot channel that contains a snapshot stream 27796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 27816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 27826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 27836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 27846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 27856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : Add this channel for live snapshot usecase. Regular capture will 27866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * use addCaptureChannel. 27876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 27886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addSnapshotChannel() 27896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 27906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 27916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = NULL; 27926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_SNAPSHOT] != NULL) { 27946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if we had ZSL channel before, delete it first 27956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 27966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = NULL; 27976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 27986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 27996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraChannel(mCameraHandle->camera_handle, 28006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 28016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 28026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for snapshot channel", __func__); 28036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 28046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, NULL, NULL); 28076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 28086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init snapshot channel failed, ret = %d", __func__, rc); 28096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 28106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 28146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev snapshot_stream_cb_routine, this); 28156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 28166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc); 28176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 28186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = pChannel; 28226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 28246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 28266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addRawChannel 28276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a raw channel that contains a raw image stream 28296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 28316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 28336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 28346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 28356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 28366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addRawChannel() 28376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 28386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 28396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = NULL; 28406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_RAW] != NULL) { 28426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if we had raw channel before, delete it first 28436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_RAW]; 28446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_RAW] = NULL; 28456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraChannel(mCameraHandle->camera_handle, 28486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 28496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 28506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for raw channel", __func__); 28516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 28526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, NULL, NULL); 28556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 28566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init raw channel failed, ret = %d", __func__, rc); 28576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 28586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // meta data stream always coexists with snapshot in regular RAW capture case 28626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 28636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev metadata_stream_cb_routine, this); 28646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 28656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc); 28666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 28676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_RAW, 28716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev raw_stream_cb_routine, this); 28726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 28736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc); 28746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 28756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 28776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_RAW] = pChannel; 28796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 28806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 28816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 28836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addZSLChannel 28846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a ZSL channel that contains a preview stream and 28866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * a snapshot stream 28876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 28896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 28906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 28916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 28926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 28936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 28946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addZSLChannel() 28956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 28966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 28976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPicChannel *pChannel = NULL; 28986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 28996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_ZSL] != NULL) { 29006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if we had ZSL channel before, delete it first 29016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_ZSL]; 29026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_ZSL] = NULL; 29036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraPicChannel(mCameraHandle->camera_handle, 29066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 29076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 29086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for ZSL channel", __func__); 29096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 29106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // ZSL channel, init with bundle attr and cb 29136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_channel_attr_t attr; 29146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 29156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 29166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.look_back = mParameters.getZSLBackLookCount(); 29176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.post_frame_skip = mParameters.getZSLBurstInterval(); 29186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.water_mark = mParameters.getZSLQueueDepth(); 29196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 29206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(&attr, 29216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev zsl_channel_cb, 29226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev this); 29236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != 0) { 29246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init ZSL channel failed, ret = %d", __func__, rc); 29256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 29266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 29276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // meta data stream always coexists with preview if applicable 29306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 29316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev metadata_stream_cb_routine, this); 29326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 29336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc); 29346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 29356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 29366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (isNoDisplayMode()) { 29396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 29406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev nodisplay_preview_stream_cb_routine, this); 29416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 29426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW, 29436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev preview_stream_cb_routine, this); 29446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 29466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add preview stream failed, ret = %d", __func__, rc); 29476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 29486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 29496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 29526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, this); 29536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 29546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc); 29556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 29566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 29576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_ZSL] = pChannel; 29606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 29616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 29626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 29646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addCaptureChannel 29656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 29666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a capture channel that contains a snapshot stream 29676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * and a postview stream 29686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 29696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 29706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 29716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 29726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 29736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 29746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : Add this channel for regular capture usecase. 29756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * For Live snapshot usecase, use addSnapshotChannel. 29766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 29776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addCaptureChannel() 29786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 29796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 29806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = NULL; 29816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_CAPTURE] != NULL) { 29836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_CAPTURE]; 29846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_CAPTURE] = NULL; 29856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraChannel(mCameraHandle->camera_handle, 29886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 29896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 29906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for capture channel", __func__); 29916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 29926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 29936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 29946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Capture channel, only need snapshot and postview streams start together 29956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_channel_attr_t attr; 29966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 29976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 29986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 29996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(&attr, 30016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev capture_channel_cb_routine, 30026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev this); 30036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init capture channel failed, ret = %d", __func__, rc); 30056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // meta data stream always coexists with snapshot in regular capture case 30116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 30126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev metadata_stream_cb_routine, this); 30136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc); 30156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // TODO: commented out for now 30206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#if 0 30216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_POSTVIEW, 30226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev postview_stream_cb_routine, this); 30236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add postview stream failed, ret = %d", __func__, rc); 30266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif 30306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT, 30326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, this); 30336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc); 30356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_CAPTURE] = pChannel; 30406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 30426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 30446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addMetaDataChannel 30456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 30466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a meta data channel that contains a metadata stream 30476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 30486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 30496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 30506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 30516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 30526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 30536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 30546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addMetaDataChannel() 30556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 30566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 30576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = NULL; 30586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[QCAMERA_CH_TYPE_METADATA] != NULL) { 30606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[QCAMERA_CH_TYPE_METADATA]; 30616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_METADATA] = NULL; 30626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraChannel(mCameraHandle->camera_handle, 30656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 30666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 30676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for metadata channel", __func__); 30686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 30696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, 30726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, 30736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL); 30746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init metadata channel failed, ret = %d", __func__, rc); 30766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA, 30816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev metadata_stream_cb_routine, this); 30826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 30836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc); 30846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 30856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 30876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[QCAMERA_CH_TYPE_METADATA] = pChannel; 30896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 30906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 30916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 30926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 30936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addOnlineReprocChannel 30946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 30956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 30966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * coming from input channel 30976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 30986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 30996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pInputChannel : ptr to input channel whose frames will be post-processed 31006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 31016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : Ptr to the newly created channel obj. NULL if failed. 31026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 31036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel *QCamera2HardwareInterface::addOnlineReprocChannel( 31046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pInputChannel) 31056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 31066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 31076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraReprocessChannel *pChannel = NULL; 31086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pInputChannel == NULL) { 31106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: input channel obj is NULL", __func__); 31116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 31126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle, 31156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 31166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 31176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for reprocess channel", __func__); 31186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 31196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Capture channel, only need snapshot and postview streams start together 31226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_channel_attr_t attr; 31236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 31246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 31256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue(); 31266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(&attr, 31276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev postproc_channel_cb_routine, 31286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev this); 31296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 31306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 31316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 31326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 31336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // pp feature config 31366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_feature_config_t pp_config; 31376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 31386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode()) { 31396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 31406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 31416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.sharpness = mParameters.getInt(QCameraParameters::KEY_QC_SHARPNESS); 31426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isWNREnabled()) { 31456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 31466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.denoise2d.denoise_enable = 1; 31476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.denoise2d.process_plates = mParameters.getWaveletDenoiseProcessPlate(); 31486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (needRotationReprocess()) { 31516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 31526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rotation = mParameters.getJpegRotation(); 31536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rotation == 0) { 31546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.rotation = ROTATE_0; 31556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 90) { 31566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.rotation = ROTATE_90; 31576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 180) { 31586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.rotation = ROTATE_180; 31596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (rotation == 270) { 31606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config.rotation = ROTATE_270; 31616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t minStreamBufNum = mParameters.getNumOfSnapshots(); 31656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->addReprocStreamsFromSource(*this, 31666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_config, 31676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pInputChannel, 31686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev minStreamBufNum, 31696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev &gCamCapability[mCameraId]->padding_info); 31706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 31716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 31726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 31736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 31746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return pChannel; 31766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 31776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 31786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 31796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addOfflineReprocChannel 31806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 31816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a offline reprocess channel contains one reproc stream, 31826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * that will do reprocess on frames coming from external images 31836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 31846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 31856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @img_config : offline reporcess image info 31866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pp_feature : pp feature config 31876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 31886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 31896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 31906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 31916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 31926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel *QCamera2HardwareInterface::addOfflineReprocChannel( 31936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_offline_src_config_t &img_config, 31946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_feature_config_t &pp_feature, 31956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stream_cb_routine stream_cb, 31966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *userdata) 31976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 31986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 31996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraReprocessChannel *pChannel = NULL; 32006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle, 32026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCameraHandle->ops); 32036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pChannel) { 32046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for reprocess channel", __func__); 32056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 32066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 32076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->init(NULL, NULL, NULL); 32096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 32106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 32116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 32126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 32136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 32146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC); 32166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStreamInfo == NULL) { 32176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for stream info buf", __func__); 32186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 32196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 32206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 32216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_info_t *streamInfoBuf = (cam_stream_info_t *)pStreamInfo->getPtr(0); 32236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(streamInfoBuf, 0, sizeof(cam_stream_info_t)); 32246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 32256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->fmt = img_config.input_fmt; 32266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->dim = img_config.input_dim; 32276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->buf_planes = img_config.input_buf_planes; 32286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->streaming_mode = CAM_STREAMING_MODE_BURST; 32296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->num_of_burst = img_config.num_of_bufs; 32306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->reprocess_config.pp_type = CAM_OFFLINE_REPROCESS_TYPE; 32326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->reprocess_config.offline = img_config; 32336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfoBuf->reprocess_config.pp_feature_config = pp_feature; 32346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pChannel->addStream(*this, 32366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfo, img_config.num_of_bufs, 32376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev &gCamCapability[mCameraId]->padding_info, 32386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stream_cb, userdata); 32396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 32416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add reprocess stream failed, ret = %d", __func__, rc); 32426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfo->deallocate(); 32436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pStreamInfo; 32446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pChannel; 32456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 32466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 32476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return pChannel; 32496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 32506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 32526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addChannel 32536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 32546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a channel by its type 32556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 32566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 32576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ch_type : channel type 32586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 32596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 32606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 32616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 32626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 32636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addChannel(qcamera_ch_type_enum_t ch_type) 32646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 32656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = UNKNOWN_ERROR; 32666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (ch_type) { 32676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_ZSL: 32686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addZSLChannel(); 32696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_CAPTURE: 32716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addCaptureChannel(); 32726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_PREVIEW: 32746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addPreviewChannel(); 32756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_VIDEO: 32776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addVideoChannel(); 32786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_SNAPSHOT: 32806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addSnapshotChannel(); 32816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_RAW: 32836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addRawChannel(); 32846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_CH_TYPE_METADATA: 32866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addMetaDataChannel(); 32876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 32896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 32906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 32916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 32926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 32936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 32946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 32956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : delChannel 32966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 32976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: delete a channel by its type 32986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 32996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 33006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ch_type : channel type 33016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 33036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 33046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 33056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 33066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::delChannel(qcamera_ch_type_enum_t ch_type) 33076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 33086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[ch_type] != NULL) { 33096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_channels[ch_type]; 33106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[ch_type] = NULL; 33116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 33146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 33156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 33176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : startChannel 33186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start a channel by its type 33206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 33226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ch_type : channel type 33236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 33256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 33266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 33276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 33286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::startChannel(qcamera_ch_type_enum_t ch_type) 33296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 33306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = UNKNOWN_ERROR; 33316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[ch_type] != NULL) { 333272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li rc = m_channels[ch_type]->start(); 33336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 33366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 33376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 33396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stopChannel 33406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop a channel by its type 33426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 33446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ch_type : channel type 33456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 33476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 33486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 33496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 33506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::stopChannel(qcamera_ch_type_enum_t ch_type) 33516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 33526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = UNKNOWN_ERROR; 33536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[ch_type] != NULL) { 33546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_channels[ch_type]->stop(); 33556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 33586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 33596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 33616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : preparePreview 33626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add channels needed for preview 33646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 33666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 33676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 33686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 33696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 33706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 33716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::preparePreview() 33726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 33736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 33746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33754faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) { 33766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addChannel(QCAMERA_CH_TYPE_ZSL); 33776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 33786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 33796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 33816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addChannel(QCAMERA_CH_TYPE_PREVIEW); 33826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 33836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 33846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 33866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(mParameters.getRecordingHintValue() == true) { 33876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addChannel(QCAMERA_CH_TYPE_VIDEO); 33886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 33896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_PREVIEW); 33906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 33916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addChannel(QCAMERA_CH_TYPE_SNAPSHOT); 33936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 33946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_METADATA); 33956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_PREVIEW); 33966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_VIDEO); 33976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 33996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 34026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 34036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 34056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : unpreparePreview 34066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: delete channels for preview 34086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 34106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 34126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 34136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::unpreparePreview() 34146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 34154faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) { 34166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_ZSL); 34176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 34186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_PREVIEW); 34196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(mParameters.getRecordingHintValue() == true) { 34206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_VIDEO); 34216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delChannel(QCAMERA_CH_TYPE_SNAPSHOT); 34226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 34256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 34276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : playShutter 34286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send request to play shutter sound 34306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 34326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 34346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 34356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::playShutter(){ 34366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mNotifyCb == NULL || 34376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev msgTypeEnabledWithLock(CAMERA_MSG_SHUTTER) == 0){ 34386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: shutter msg not enabled or NULL cb", __func__); 34396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 34406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 34436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 34446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 34456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_SHUTTER; 34466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext1 = 0; 34476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(!m_bShutterSoundPlayed){ 34496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext2 = true; 34506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_cbNotifier.notifyCallback(cbArg); 34516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext2 = false; 34536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_cbNotifier.notifyCallback(cbArg); 34546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bShutterSoundPlayed = false; 34556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 34566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 34586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getChannelByHandle 34596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return a channel by its handle 34616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 34636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @channelHandle : channel handle 34646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : a channel obj if found, NULL if not found 34666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 34676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel *QCamera2HardwareInterface::getChannelByHandle(uint32_t channelHandle) 34686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 34696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for(int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) { 34706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_channels[i] != NULL && 34716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_channels[i]->getMyHandle() == channelHandle) { 34726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_channels[i]; 34736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 34776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 34786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 34806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processFaceDetectionReuslt 34816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process face detection reuslt 34836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 34856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @fd_data : ptr to face detection result struct 34866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 34876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 34886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 34896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 34906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 34916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processFaceDetectionResult(cam_face_detection_data_t *fd_data) 34926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 34936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isFaceDetectionEnabled()) { 34946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: FaceDetection not enabled, no ops here", __func__); 34956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 34966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 34976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 34986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((NULL == mDataCb) || (msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_METADATA) == 0)) { 34996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: prevew metadata msgtype not enabled, no ops here", __func__); 35006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 35016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 35026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_dimension_t display_dim; 35046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getStreamDimension(CAM_STREAM_TYPE_PREVIEW, display_dim); 35056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (display_dim.width <= 0 || display_dim.height <= 0) { 35066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Invalid preview width or height (%d x %d)", 35076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, display_dim.width, display_dim.height); 35086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 35096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 35106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // process face detection result 35126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev size_t faceResultSize = sizeof(camera_frame_metadata_t); 35136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faceResultSize += sizeof(camera_face_t) * MAX_ROI; 35146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *faceResultBuffer = mGetMemory(-1, 35156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faceResultSize, 35166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 35176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCallbackCookie); 35186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == faceResultBuffer ) { 35196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Not enough memory for face result data", 35206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__); 35216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 35226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 35236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3524b971e1489cccffac4035c15eefdeff9ac892cce2Emilian Peev unsigned char *faceData = ( unsigned char * ) faceResultBuffer->data; 35256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(faceData, 0, faceResultSize); 35266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_frame_metadata_t *roiData = (camera_frame_metadata_t * ) faceData; 3527b971e1489cccffac4035c15eefdeff9ac892cce2Emilian Peev camera_face_t *faces = (camera_face_t *) ( faceData + sizeof(camera_frame_metadata_t) ); 35286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev roiData->number_of_faces = fd_data->num_faces_detected; 35306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev roiData->faces = faces; 35316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (roiData->number_of_faces > 0) { 35326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < roiData->number_of_faces; i++) { 35336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].id = fd_data->faces[i].face_id; 35346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].score = fd_data->faces[i].score; 35356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // left 35376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].rect[0] = 35386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.left, display_dim.width, 2000, -1000); 35396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // top 35416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].rect[1] = 35426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.top, display_dim.height, 2000, -1000); 35436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // right 35456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].rect[2] = faces[i].rect[0] + 35466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.width, display_dim.width, 2000, 0); 35476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // bottom 35496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].rect[3] = faces[i].rect[1] + 35506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.height, display_dim.height, 2000, 0); 35516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Center of left eye 35536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].left_eye[0] = 35546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].left_eye_center.x, display_dim.width, 2000, -1000); 35556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].left_eye[1] = 35576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].left_eye_center.y, display_dim.height, 2000, -1000); 35586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Center of right eye 35606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].right_eye[0] = 35616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].right_eye_center.x, display_dim.width, 2000, -1000); 35626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].right_eye[1] = 35646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].right_eye_center.y, display_dim.height, 2000, -1000); 35656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Center of mouth 35676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].mouth[0] = 35686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].mouth_center.x, display_dim.width, 2000, -1000); 35696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].mouth[1] = 35716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].mouth_center.y, display_dim.height, 2000, -1000); 35726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#if 0 35746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].smile_degree = fd_data->faces[i].smile_degree; 35756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].smile_score = fd_data->faces[i].smile_confidence; 35766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].blink_detected = fd_data->faces[i].blink_detected; 35776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].face_recognised = fd_data->faces[i].face_recognised; 35786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].gaze_angle = fd_data->faces[i].gaze_angle; 35796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // upscale by 2 to recover from demaen downscaling 35816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].updown_dir = fd_data->faces[i].updown_dir * 2; 35826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].leftright_dir = fd_data->faces[i].leftright_dir * 2; 35836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].roll_dir = fd_data->faces[i].roll_dir * 2; 35846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].leye_blink = fd_data->faces[i].left_blink; 35866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].reye_blink = fd_data->faces[i].right_blink; 35876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].left_right_gaze = fd_data->faces[i].left_right_gaze; 35886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev faces[i].top_bottom_gaze = fd_data->faces[i].top_bottom_gaze; 35896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif 35906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 35926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 35936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 35946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 35956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 35966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_DATA_CALLBACK; 35976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_PREVIEW_METADATA; 35986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.data = faceResultBuffer; 35996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.metadata = roiData; 36006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.user_data = faceResultBuffer; 36016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cookie = this; 36026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.release_cb = releaseCameraMemory; 36036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_cbNotifier.notifyCallback(cbArg); 36046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 36066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 36076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 36096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseCameraMemory 36106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: releases camera memory objects 36126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 36146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : buffer to be released 36156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cookie : context data 36166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 36186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 36196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::releaseCameraMemory(void *data, void */*cookie*/) 36206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 36216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *mem = ( camera_memory_t * ) data; 36226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mem ) { 36236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mem->release(mem); 36246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 36256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 36266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 36286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : returnStreamBuffer 36296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: returns back a stream buffer 36316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 36336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : buffer to be released 36346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cookie : context data 36356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 36376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 36386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::returnStreamBuffer(void *data, void *cookie) 36396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 36406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *stream = ( QCameraStream * ) cookie; 36416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int idx = ( int ) data; 36426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( ( NULL != stream )) { 36436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stream->bufDone(idx); 36446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 36456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 36466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 36486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processHistogramStats 36496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process histogram stats 36516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 36536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @hist_data : ptr to histogram stats struct 36546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 36566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 36576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 36586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 36596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processHistogramStats(cam_hist_stats_t &/*stats_data*/) 36606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 36616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isHistogramEnabled()) { 36626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: Histogram not enabled, no ops here", __func__); 36636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 36646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 36656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *histBuffer = mGetMemory(-1, 36676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sizeof(cam_histogram_data_t), 36686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 36696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCallbackCookie); 36706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == histBuffer ) { 36716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Not enough memory for histogram data", 36726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__); 36736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 36746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 36756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_histogram_data_t *pHistData = (cam_histogram_data_t *)histBuffer->data; 36776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pHistData == NULL) { 36786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: memory data ptr is NULL", __func__); 36796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 36806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 36816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 36846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 36856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 36866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 36876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : updateThermalLevel 36886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: update thermal level depending on thermal events 36906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 36926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @level : thermal level 36936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 36956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 36966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 36976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 36986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::updateThermalLevel( 36996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_thermal_level_enum_t level) 37006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 37016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 37026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_fps_range_t adjustedRange; 37036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int minFPS, maxFPS; 37046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_thermal_mode thermalMode = mParameters.getThermalMode(); 37056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev enum msm_vfe_frame_skip_pattern skipPattern; 37066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getPreviewFpsRange(&minFPS, &maxFPS); 37086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch(level) { 37106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_THERMAL_NO_ADJUSTMENT: 37116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 37126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps = minFPS/1000.0f; 37136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = maxFPS/1000.0f; 37146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev skipPattern = NO_SKIP; 37156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 37176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_THERMAL_SLIGHT_ADJUSTMENT: 37186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 37196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps = minFPS/1000.0f; 37206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = (maxFPS / 2 ) / 1000.0f; 37216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( adjustedRange.max_fps < adjustedRange.min_fps ) { 37226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = adjustedRange.min_fps; 37236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev skipPattern = EVERY_2FRAME; 37256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 37276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_THERMAL_BIG_ADJUSTMENT: 37286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 37296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps = minFPS/1000.0f; 37306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = adjustedRange.min_fps; 37316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev skipPattern = EVERY_4FRAME; 37326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 37346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case QCAMERA_THERMAL_SHUTDOWN: 37356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 37366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Stop Preview? 37376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Set lowest min FPS for now 37386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps = minFPS/1000.0f; 37396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = minFPS/1000.0f; 37406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for ( int i = 0 ; i < gCamCapability[mCameraId]->fps_ranges_tbl_cnt ; i++ ) { 37416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps < adjustedRange.min_fps ) { 37426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps = gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps; 37436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps = adjustedRange.min_fps; 37446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev skipPattern = MAX_SKIP; 37476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 37496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 37506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 37516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Invalid thermal level %d", __func__, level); 37526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 37536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 37556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 37566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGI("%s: Thermal level %d, FPS range [%3.2f,%3.2f], frameskip %d", 37586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, 37596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev level, 37606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.min_fps, 37616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev adjustedRange.max_fps, 37626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev skipPattern); 37636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (thermalMode == QCAMERA_THERMAL_ADJUST_FPS) 37656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mParameters.adjustPreviewFpsRange(&adjustedRange); 37666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev else if (thermalMode == QCAMERA_THERMAL_ADJUST_FRAMESKIP) 37676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mParameters.setFrameSkip(skipPattern); 37686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev else 37696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Incorrect thermal mode %d", __func__, thermalMode); 37706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 37726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 37746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 37766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : updateParameters 37776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 37786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: update parameters 37796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 37806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 37816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @parms : input parameters string 37826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @needRestart : output, flag to indicate if preview restart is needed 37836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 37846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 37856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 37866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 37876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 37886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::updateParameters(const char *parms, bool &needRestart) 37896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 37906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev String8 str = String8(parms); 37916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraParameters param(str); 37926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.updateParameters(param, needRestart); 37936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 37946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 37956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 37966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : commitParameterChanges 37976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 37986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: commit parameter changes to the backend to take effect 37996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 38016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 38036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 38046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 38056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : This function must be called after updateParameters. 38066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Otherwise, no change will be passed to backend to take effect. 38076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 38086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::commitParameterChanges() 38096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 38106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = mParameters.commitParameters(); 38116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 38126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // update number of snapshot based on committed parameters setting 38136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.setNumOfSnapshot(); 38146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 38156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 38166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 38176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 38196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : needDebugFps 38206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if fps log info need to be printed out 38226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 38246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true: need print out fps log 38266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * false: no need to print out fps log 38276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 38286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needDebugFps() 38296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 38306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.isFpsDebugEnabled(); 38316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 38326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 38346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : needReprocess 38356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if reprocess is needed 38376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 38396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true: needed 38416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * false: no need 38426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 38436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needReprocess() 38446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3845b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // TODO: hack here to return false to avoid reprocess 3846b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // Need to be enabled after PP is enabled 3847b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li return false; 3848b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li 38496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isJpegPictureFormat()) { 38506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // RAW image, no need to reprocess 38516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 38526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 38536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode() && 38556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ((gCamCapability[mCameraId]->min_required_pp_mask > 0) || 38566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.isWNREnabled())) { 38576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // TODO: add for ZSL HDR later 38586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 38596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 38606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return true; 38616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 38626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return needRotationReprocess(); 38646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 38656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 38676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : needRotationReprocess 38686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if rotation needs to be done by reprocess in pp 38706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 38726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 38736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true: needed 38746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * false: no need 38756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 38766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needRotationReprocess() 38776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3878b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // TODO: hack here to return false to avoid reprocess 3879b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // Need to be enabled after PP is enabled 3880b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li return false; 3881b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li 38826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isJpegPictureFormat()) { 38836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // RAW image, no need to reprocess 38846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 38856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 38866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mParameters.isZSLMode() && 38886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 38896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getJpegRotation() > 0) { 38906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // current rotation is not zero, and pp has the capability to process rotation 38916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: need do reprocess for rotation", __func__); 38926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return true; 38936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 38946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 38966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 38976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 38986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 38996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : needRotationReprocess 39006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if online rotation needs to be done by cpp 39026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 39046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true: needed 39066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * false: no need 39076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 39086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needOnlineRotation() 39096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3910b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // TODO: hack here to return false to avoid reprocess 3911b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li // Need to be enabled after PP is enabled 3912b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li return false; 3913b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li 39146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isJpegPictureFormat()) { 39156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // RAW image, no need 39166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 39176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 39186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!mParameters.isZSLMode() && 39206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 39216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getJpegRotation() > 0) { 39226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // current rotation is not zero, and pp has the capability to process rotation 39236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: need do online rotation", __func__); 39246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return true; 39256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 39266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 39286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 39296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 39316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getThumbnailSize 39326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get user set thumbnail size 39346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 39366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @dim : output of thumbnail dimension 39376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 39396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 39406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::getThumbnailSize(cam_dimension_t &dim) 39416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 39426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParameters.getThumbnailSize(&dim.width, &dim.height); 39436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 39446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 39466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getJpegQuality 39476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get user set jpeg quality 39496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 39516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : jpeg quality setting 39536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 39546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getJpegQuality() 39556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 39566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.getJpegQuality(); 39576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 39586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 39606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getJpegRotation 39616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get rotation information to be passed into jpeg encoding 39636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 39656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : rotation information 39676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 39686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getJpegRotation() { 39696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.getJpegRotation(); 39706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 39716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 39736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getExifData 39746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get exif data to be passed into jpeg encoding 39766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 39786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 39796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : exif data from user setting and GPS 39806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 39816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraExif *QCamera2HardwareInterface::getExifData() 39826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 39836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraExif *exif = new QCameraExif(); 39846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (exif == NULL) { 39856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for QCameraExif", __func__); 39866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 39876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 39886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 39906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t count = 0; 39916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 39926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // add exif entries 39936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char dateTime[20]; 39946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(dateTime, 0, sizeof(dateTime)); 39956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev count = 20; 39966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifDateTime(dateTime, count); 39976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 39986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, 39996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_ASCII, 40006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev count, 40016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)dateTime); 40026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifDateTime failed", __func__); 40046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t focalLength; 40076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifFocalLength(&focalLength); 40086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 40096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_FOCAL_LENGTH, 40106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_RATIONAL, 40116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 40126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)&(focalLength)); 40136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifFocalLength failed", __func__); 40156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint16_t isoSpeed = mParameters.getExifIsoSpeed(); 40186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_ISO_SPEED_RATING, 40196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_SHORT, 40206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 40216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)&(isoSpeed)); 40226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE]; 40246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev count = 0; 40256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifGpsProcessingMethod(gpsProcessingMethod, count); 40266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 40276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_PROCESSINGMETHOD, 40286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_ASCII, 40296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev count, 40306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)gpsProcessingMethod); 40316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifGpsProcessingMethod failed", __func__); 40336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t latitude[3]; 40366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char latRef[2]; 40376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifLatitude(latitude, latRef); 40386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 40396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_LATITUDE, 40406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_RATIONAL, 40416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3, 40426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)latitude); 40436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_LATITUDE_REF, 40446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_ASCII, 40456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2, 40466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)latRef); 40476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifLatitude failed", __func__); 40496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t longitude[3]; 40526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char lonRef[2]; 40536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifLongitude(longitude, lonRef); 40546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 40556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_LONGITUDE, 40566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_RATIONAL, 40576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3, 40586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)longitude); 40596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_LONGITUDE_REF, 40616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_ASCII, 40626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2, 40636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)lonRef); 40646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifLongitude failed", __func__); 40666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t altitude; 40696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char altRef; 40706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifAltitude(&altitude, &altRef); 40716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 40726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_ALTITUDE, 40736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_RATIONAL, 40746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 40756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)&(altitude)); 40766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_ALTITUDE_REF, 40786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_BYTE, 40796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1, 40806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)&altRef); 40816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifAltitude failed", __func__); 40836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 40846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char gpsDateStamp[20]; 40866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t gpsTimeStamp[3]; 40876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mParameters.getExifGpsDateTimeStamp(gpsDateStamp, 20, gpsTimeStamp); 40886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc == NO_ERROR) { 40896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_DATESTAMP, 40906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_ASCII, 40916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev strlen(gpsDateStamp) + 1, 40926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)gpsDateStamp); 40936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 40946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif->addEntry(EXIFTAGID_GPS_TIMESTAMP, 40956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIF_RATIONAL, 40966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3, 40976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)gpsTimeStamp); 40986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 40996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: getExifGpsDataTimeStamp failed", __func__); 41006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 41016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 41026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return exif; 41036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 41046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 41056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 41066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : setHistogram 41076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set if histogram should be enabled 41096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 41116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @histogram_en : bool flag if histogram should be enabled 41126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 41146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 41156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 41166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 41176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::setHistogram(bool histogram_en) 41186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 41196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.setHistogram(histogram_en); 41206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 41216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 41226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 41236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : setFaceDetection 41246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set if face detection should be enabled 41266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 41286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @enabled : bool flag if face detection should be enabled 41296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 41316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 41326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 41336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 41346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::setFaceDetection(bool enabled) 41356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 41366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mParameters.setFaceDetection(enabled); 41376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 41386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 41396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 41406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : prepareHardwareForSnapshot 41416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: prepare hardware for snapshot, such as LED 41436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 41456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @afNeeded: flag indicating if Auto Focus needs to be done during preparation 41466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 41476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 41486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 41496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 41506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 41516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::prepareHardwareForSnapshot(int32_t afNeeded) 41526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 41536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mCameraHandle->ops->prepare_snapshot(mCameraHandle->camera_handle, 41546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev afNeeded); 41556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 41566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 41576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera 4158