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