19426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/* 29426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** 39426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** Copyright 2008, The Android Open Source Project 49426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** Copyright 2010, Samsung Electronics Co. LTD 59426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** 69426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** Licensed under the Apache License, Version 2.0 (the "License"); 79426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** you may not use this file except in compliance with the License. 89426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** You may obtain a copy of the License at 99426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** 109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** http://www.apache.org/licenses/LICENSE-2.0 119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** 129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** Unless required by applicable law or agreed to in writing, software 139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** distributed under the License is distributed on an "AS IS" BASIS, 149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** See the License for the specific language governing permissions and 169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin** limitations under the License. 179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin*/ 189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/*! 209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * \file ExynosCameraHWInterface.h 219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * \brief source file for Android Camera HAL 229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * \author thun.hwang(thun.hwang@samsung.com) 239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * \date 2010/06/03 249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * <b>Revision History: </b> 269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n 279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Initial version 289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * - 2012/02/01 : Sangwoo, Park(sw5771.park@samsung.com) \n 309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Adjust Android Standard features 319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n 339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Change file, class name to ExynosXXX. 349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 376d6b76cc8e61620ba27de268a91cf892ba76a14aNick Kralevich#include <sys/types.h> 386d6b76cc8e61620ba27de268a91cf892ba76a14aNick Kralevich#include <sys/stat.h> 396d6b76cc8e61620ba27de268a91cf892ba76a14aNick Kralevich 409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin//#define LOG_NDEBUG 0 419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define LOG_TAG "ExynosCameraHWInterface" 429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <utils/Log.h> 439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "ExynosCameraHWInterface.h" 459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "exynos_format.h" 469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define VIDEO_COMMENT_MARKER_H (0xFFBE) 489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define VIDEO_COMMENT_MARKER_L (0xFFBF) 499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define VIDEO_COMMENT_MARKER_LENGTH (4) 509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define JPEG_EOI_MARKER (0xFFD9) 519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define HIBYTE(x) (((x) >> 8) & 0xFF) 529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define LOBYTE(x) ((x) & 0xFF) 539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/*TODO: This values will be changed */ 559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR "0.10,1.20,Infinity" 569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define FRONT_CAMERA_FOCUS_DISTANCES_STR "0.20,0.25,Infinity" 579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR "0.10,0.20,Infinity" 599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR "0.10,1.20,Infinity" 609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define BACK_CAMERA_FOCUS_DISTANCE_INFINITY "Infinity" 629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define FRONT_CAMERA_FOCUS_DISTANCE_INFINITY "Infinity" 639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// This hack does two things: 659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// -- it sets preview to NV21 (YUV420SP) 669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// -- it sets gralloc to YV12 679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// 689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// The reason being: the samsung encoder understands only yuv420sp, and gralloc 699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// does yv12 and rgb565. So what we do is we break up the interleaved UV in 709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// separate V and U planes, which makes preview look good, and enabled the 719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// encoder as well. 729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// 739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// FIXME: Samsung needs to enable support for proper yv12 coming out of the 749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// camera, and to fix their video encoder to work with yv12. 759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// FIXME: It also seems like either Samsung's YUV420SP (NV21) or img's YV12 has 769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// the color planes switched. We need to figure which side is doing it 779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin// wrong and have the respective party fix it. 789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinnamespace android { 809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic const int INITIAL_SKIP_FRAME = 8; 829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic const int EFFECT_SKIP_FRAME = 1; 839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shingralloc_module_t const* ExynosCameraHWInterface::m_grallocHal; 859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung ShinExynosCameraHWInterface::ExynosCameraHWInterface(int cameraId, camera_device_t *dev) 879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin : 889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_captureInProgress(false), 899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrame(0), 909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_notifyCb(0), 919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(0), 929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCbTimestamp(0), 939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_callbackCookie(0), 949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_msgEnabled(0), 959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faceDetected(false), 969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_halDevice(dev), 979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf(0) 989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 99f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 1009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int ret = 0; 1019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewWindow = NULL; 1039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera = ExynosCamera::createInstance(); 1049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PREVIEW_BUF; i++) { 1069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i] = NULL; 1079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewBufHandle[i] = NULL; 1089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStride[i] = 0; 1099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[i] = false; 1109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_flagGrallocLocked[i] = false; 1119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_matchedGrallocIndex[i] = -1; 1129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_grallocVirtAddr[i] = NULL; 1139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 1149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_minUndequeuedBufs = 0; 1169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 1179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_cntVideoBuf = 0; 1189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 1199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead = NULL; 1219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getMemoryCb = NULL; 1229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPreviewCSC = NULL; 1239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPictureCSC = NULL; 1249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosVideoCSC = NULL; 1259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.number_of_faces = 0; 1269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.faces = m_faces; 1279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_VIDEO_BUF; i++) { 1299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i] = NULL; 1309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i] = NULL; 1319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 1329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 133471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_ion_client = ion_client_create(); 1349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PICTURE_BUF; i++) 1359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureHeap[i] = NULL; 1369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap = NULL; 1389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitAutoFocusThread = false; 1409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitPreviewThread = false; 1419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitVideoThread = false; 1429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* whether the PreviewThread is active in preview or stopped. we 1439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * create the thread but it is initially in stopped state. 1449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 1459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewRunning = false; 1469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = false; 1479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureRunning = false; 1489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 1499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoStart = false; 1509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 1519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStartDeferred = false; 1539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_recordingHint = false; 1559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!m_grallocHal) { 1579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const hw_module_t **)&m_grallocHal); 1589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (ret) 159f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on loading gralloc HAL", __func__); 1609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 1619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->create(cameraId) == false) { 163f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->create(%d)", __func__, cameraId); 1649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return; 1659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 1669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_initDefaultParameters(cameraId); 1689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CSC_METHOD cscMethod = CSC_METHOD_HW; 1709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPreviewCSC = csc_init(cscMethod); 1729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPreviewCSC == NULL) 173f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_init() fail", __func__); 1749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPictureCSC = csc_init(cscMethod); 1769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPictureCSC == NULL) 177f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_init() fail", __func__); 1789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosVideoCSC = csc_init(cscMethod); 1809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosVideoCSC == NULL) 181f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_init() fail", __func__); 1829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewThread = new PreviewThread(this); 1849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoThread = new VideoThread(this); 1859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_autoFocusThread = new AutoFocusThread(this); 1869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureThread = new PictureThread(this); 1879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 1889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung ShinExynosCameraHWInterface::~ExynosCameraHWInterface() 1909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 191471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin close(m_ion_client); 1929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin this->release(); 1939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 1949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::setPreviewWindow(preview_stream_ops *w) 1969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 1979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewWindow = w; 198f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_previewWindow %p", __func__, m_previewWindow); 1999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow == NULL) { 201f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):preview window is NULL!", __func__); 2029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return OK; 2039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.lock(); 2069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewRunning == true && m_previewStartDeferred == false) { 208f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):stop preview (window change)", __func__); 2099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stopPreviewInternal(); 2109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->get_min_undequeued_buffer_count(m_previewWindow, &m_minUndequeuedBufs) != 0) { 213f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not retrieve min undequeued buffer count", __func__); 2149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 2159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NUM_OF_PREVIEW_BUF <= m_minUndequeuedBufs) { 218f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):min undequeued buffer count %d is too high (expecting at most %d)", __func__, 2199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_minUndequeuedBufs, NUM_OF_PREVIEW_BUF - 1); 2209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->set_buffer_count(m_previewWindow, NUM_OF_PREVIEW_BUF) != 0) { 223f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not set buffer count", __func__); 2249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 2259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewW, previewH; 2289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int hal_pixel_format = HAL_PIXEL_FORMAT_YV12; 2299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.getPreviewSize(&previewW, &previewH); 2319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *str_preview_format = m_params.getPreviewFormat(); 232f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):str preview format %s width : %d height : %d ", __func__, str_preview_format, previewW, previewH); 2339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(str_preview_format, 2359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::PIXEL_FORMAT_RGB565)) { 2369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565; 2379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(str_preview_format, 2389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::PIXEL_FORMAT_RGBA8888)) { 2399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888; 2409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(str_preview_format, 2419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::PIXEL_FORMAT_YUV420SP)) { 2429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin hal_pixel_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(str_preview_format, 2449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::PIXEL_FORMAT_YUV420P)) 2459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin hal_pixel_format = HAL_PIXEL_FORMAT_YV12; 2469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->set_usage(m_previewWindow, 2489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin GRALLOC_USAGE_SW_WRITE_OFTEN | 2499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_EGL 2509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 2519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin GRALLOC_USAGE_HWC_HWOVERLAY | 2529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 2539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin GRALLOC_USAGE_HW_ION) != 0) { 254f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not set usage on gralloc buffer", __func__); 2559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 2569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->set_buffers_geometry(m_previewWindow, 2599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewW, previewH, 2609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin hal_pixel_format) != 0) { 261f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not set buffers geometry to %s", 2629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, str_preview_format); 2639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 2649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewRunning == true && m_previewStartDeferred == true) { 267f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):start/resume preview", __func__); 2689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_startPreviewInternal() == true) { 2699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStartDeferred = false; 2709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.signal(); 2719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 2739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 2749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return OK; 2769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 2779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::setCallbacks(camera_notify_callback notify_cb, 2799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_data_callback data_cb, 2809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_data_timestamp_callback data_cb_timestamp, 2819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_request_memory get_memory, 2829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *user) 2839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 2849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_notifyCb = notify_cb; 2859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb = data_cb; 2869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCbTimestamp = data_cb_timestamp; 2879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getMemoryCb = get_memory; 2889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_callbackCookie = user; 2899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 2909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::enableMsgType(int32_t msgType) 2929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 293f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):msgType = 0x%x, m_msgEnabled before = 0x%x", 2949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, msgType, m_msgEnabled); 2959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_msgEnabled |= msgType; 2969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.lock(); 2989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( msgType & CAMERA_MSG_PREVIEW_FRAME 2999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_previewRunning == true 3009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_previewStartDeferred == true) { 3019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 302f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):starting deferred preview", __func__); 3039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_startPreviewInternal() == true) { 3059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStartDeferred = false; 3069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.signal(); 3079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 3109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 311f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_msgEnabled = 0x%x", __func__, m_msgEnabled); 3129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::disableMsgType(int32_t msgType) 3159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 316f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):msgType = 0x%x, m_msgEnabled before = 0x%x", 3179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, msgType, m_msgEnabled); 3189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_msgEnabled &= ~msgType; 319f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_msgEnabled = 0x%x", __func__, m_msgEnabled); 3209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::msgTypeEnabled(int32_t msgType) 3239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 3249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return (m_msgEnabled & msgType); 3259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::startPreview() 3289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 3299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int ret = OK; 3309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 331f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 3329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_stateLock); 3349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_captureInProgress == true) { 335f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s : capture in progress, not allowed", __func__); 3369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 3379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.lock(); 3409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewRunning == true) { 341f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s : preview thread already running", __func__); 3429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 3439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 3449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewRunning = true; 3479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStartDeferred = false; 3489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow == NULL) { 3509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!(m_msgEnabled & CAMERA_MSG_PREVIEW_FRAME)) { 351f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):deferring", __func__); 3529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStartDeferred = true; 3539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 3549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 3559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 356f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s(%d): m_previewWindow is NULL", __func__, __LINE__); 3579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return UNKNOWN_ERROR; 3589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_startPreviewInternal() == true) { 3619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.signal(); 3629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = OK; 3639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 3649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 3659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 3689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return ret; 3699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::stopPreview() 3729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 373f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 3749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* request that the preview thread stop. */ 3769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.lock(); 3779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stopPreviewInternal(); 3789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 3799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::previewEnabled() 3829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 3839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_previewLock); 384f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):%d", __func__, m_previewRunning); 3859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return m_previewRunning; 3869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::storeMetaDataInBuffers(bool enable) 3899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 3909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!enable) { 391f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("Non-m_frameMetadata buffer mode is not supported!"); 3929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 3939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return OK; 3959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 3969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::startRecording() 3989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 399f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 4009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_videoLock); 4029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int videoW, videoH, videoFormat, videoFramesize; 4049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getVideoSize(&videoW, &videoH); 4069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoFormat = m_secCamera->getVideoFormat(); 4079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(videoFormat), videoW, videoH); 4089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int orgVideoFrameSize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(videoFormat), m_orgVideoRect.w, m_orgVideoRect.h); 4109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_VIDEO_BUF; i++) { 4129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 4149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer videoBuf; 4159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoHeap[i] != NULL) { 4179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i]->release(m_videoHeap[i]); 4189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i] = 0; 4199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i] = m_getMemoryCb(-1, videoFramesize, 1, NULL); 4229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!m_videoHeap[i]) { 423f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(m_videoHeap[%d], size(%d) fail", __func__, i, videoFramesize); 4249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return UNKNOWN_ERROR; 4259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getAlignedYUVSize(videoFormat, videoW, videoH, &videoBuf); 4289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoBuf.virt.extP[0] = (char *)m_videoHeap[i]->data; 4309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int j = 1; j < 3; j++) { 4319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (videoBuf.size.extS[j] != 0) 4329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoBuf.virt.extP[j] = videoBuf.virt.extP[j-1] + videoBuf.size.extS[j-1]; 4339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 4349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoBuf.virt.extP[j] = NULL; 4359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoBuf.reserved.p = i; 4389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->setVideoBuf(&videoBuf); 4409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 4419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // original VideoSized heap 4439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_resizedVideoHeap[i] != NULL) { 4459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i]->release(m_resizedVideoHeap[i]); 4469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i] = 0; 4479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i] = m_getMemoryCb(-1, orgVideoFrameSize, 1, NULL); 4509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!m_resizedVideoHeap[i]) { 451f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(m_resizedVideoHeap[%d], size(%d) fail", __func__, i, orgVideoFrameSize); 4529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return UNKNOWN_ERROR; 4539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoRunning == false) { 4579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->startVideo() == false) { 458f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->startVideo()", __func__); 4599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return UNKNOWN_ERROR; 4609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf = NUM_OF_VIDEO_BUF; 4639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 4659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = true; 4669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoCondition.signal(); 4689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 4699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoStart = true; 4709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 4719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 4729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 4749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 4759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::stopRecording() 4779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 478f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 4799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 4819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoStart = false; 4829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 4839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoRunning == true) { 4859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = false; 4869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_videoLock); 4889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoCondition.signal(); 4909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* wait until video thread is stopped */ 4919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoStoppedCondition.wait(m_videoLock); 4929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else 493f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):video not running, doing nothing", __func__); 4949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 4959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::recordingEnabled() 4979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return m_videoStart; 4999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::releaseRecordingFrame(const void *opaque) 5029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 5039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // This lock makes video lock up 5049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Mutex::Autolock lock(m_videoLock); 5059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int i; 5079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool find = false; 5089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // HACK : this causes recording slow 5109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* 5119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (i = 0; i < NUM_OF_VIDEO_BUF; i++) { 5129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((char *)m_videoHeap[i]->data == (char *)opaque) { 5139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin find = true; 5149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 5159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (find == true) { 5199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer videoBuf; 5209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoBuf.reserved.p = i; 5219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->putVideoBuf(&videoBuf); 5239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf++; 5259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NUM_OF_VIDEO_BUF <= m_numOfAvailableVideoBuf) 5269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf = NUM_OF_VIDEO_BUF; 5279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 528f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):no matched index(%p)", __func__, (char *)opaque); 5299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 5319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::autoFocus() 5349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 535f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 5369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* signal m_autoFocusThread to run once */ 5379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusCondition.signal(); 5389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 5399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::cancelAutoFocus() 5429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 5439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->cancelAutoFocus() == false) { 544f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->cancelAutoFocus()", __func__); 5459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return UNKNOWN_ERROR; 5469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 5499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::takePicture() 5529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 5539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_stateLock); 5549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_captureInProgress == true) { 555f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s : capture already in progress", __func__); 5569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 5579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == false) { 560f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGI("%s(%d): m_pictureRunning is false", __func__, __LINE__); 5619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_startPictureInternal() == false) { 562f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s(%d): m_startPictureInternal() fail!!!", __func__, __LINE__); 5639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 5649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.lock(); 5689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_captureInProgress = true; 5699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.unlock(); 5709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureThread->run("CameraPictureThread", PRIORITY_DEFAULT) != NO_ERROR) { 572f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s : couldn't run picture thread", __func__); 5739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return INVALID_OPERATION; 5749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 5779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::cancelPicture() 5809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 581f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 5829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureThread.get()) { 584f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):waiting for picture thread to exit", __func__); 5859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureThread->requestExitAndWait(); 586f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):picture thread has exited", __func__); 5879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 5889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 5909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 5919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::setParameters(const CameraParameters& params) 5939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 594f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 5959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin status_t ret = NO_ERROR; 5979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 5989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* if someone calls us while picture thread is running, it could screw 5999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * up the sensor quite a bit so return error. we can't wait because 6009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * that would cause deadlock with the callbacks 6019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 6029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.lock(); 6039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_captureInProgress == true) { 6049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 6059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.lock(); 6069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureCondition.waitRelative(m_pictureLock, (2000 * 1000000)); 6079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.unlock(); 6089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 6099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 6109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /////////////////////////////////////////////////// 6129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Google Official API : Camera.Parameters 6139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // http://developer.android.com/reference/android/hardware/Camera.Parameters.html 6149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /////////////////////////////////////////////////// 6159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // recording hint 6179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newRecordingHint = params.get(CameraParameters::KEY_RECORDING_HINT); 6189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newRecordingHint != NULL) { 6199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strcmp(newRecordingHint, "true") == 0) 6209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_recordingHint = true; 6219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 6229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_recordingHint = false; 6239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->setRecordingHint(m_recordingHint); 6259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 6269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // preview size 6289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newPreviewW = 0; 6299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newPreviewH = 0; 6309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newCalPreviewW = 0; 6319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newCalPreviewH = 0; 6329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewMaxW = 0; 6339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewMaxH = 0; 6349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin params.getPreviewSize(&newPreviewW, &newPreviewH); 6359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // In general, it will show preview max size 6379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedPreviewSizes(&previewMaxW, &previewMaxH); 6389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newCalPreviewW = previewMaxW; 6399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newCalPreviewH = previewMaxH; 6409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // When recording, it will show video max size 6429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_recordingHint == true) { 6439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedVideoSizes(&newCalPreviewW, &newCalPreviewH); 6449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( previewMaxW < newCalPreviewW 6459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || previewMaxH < newCalPreviewH) { 6469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newCalPreviewW = previewMaxW; 6479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newCalPreviewH = previewMaxH; 6489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 6499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 6509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPreviewRect.w = newPreviewW; 6529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPreviewRect.h = newPreviewH; 6539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // TODO : calibrate original preview ratio 6559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //m_getRatioSize(newCalPreviewW, newCalPreviewH, newPreviewW, newPreviewH, &newPreviewW, &newPreviewH); 6569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewW = newCalPreviewW; 6579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewH = newCalPreviewH; 6589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewPreviewFormat = params.getPreviewFormat(); 660f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newPreviewW x newPreviewH = %dx%d, format = %s", 6619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newPreviewW, newPreviewH, strNewPreviewFormat); 6629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < newPreviewW && 6649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0 < newPreviewH && 6659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strNewPreviewFormat != NULL && 6669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_isSupportedPreviewSize(newPreviewW, newPreviewH) == true) { 6679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newPreviewFormat = 0; 6689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_RGB565)) 6709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_RGB565; 6719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_RGBA8888)) 6729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_RGB32; 6739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_YUV420SP)) 6749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_NV21; 6759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_YUV420P)) 6769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_YVU420M; 6779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, "yuv420sp_custom")) 6789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_NV12T; 6799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, "yuv422i")) 6809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_YUYV; 6819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewPreviewFormat, "yuv422p")) 6829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_YUV422P; 6839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 6849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat = V4L2_PIX_FMT_NV21; //for 3rd party 6859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPreviewRect.colorFormat = newPreviewFormat; 6879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int curPreviewW, curPreviewH; 6899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreviewSize(&curPreviewW, &curPreviewH); 6909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int curPreviewFormat = m_secCamera->getPreviewFormat(); 6919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 6929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (curPreviewW != newPreviewW || 6939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin curPreviewH != newPreviewH || 6949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin curPreviewFormat != newPreviewFormat) { 6959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->setPreviewSize(newPreviewW, newPreviewH) == false 6969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || m_secCamera->setPreviewFormat(newPreviewFormat) == false) { 697f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setPreviewSize(width(%d), height(%d), format(%d))", 6989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newPreviewW, newPreviewH, newPreviewFormat); 6999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 7009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 7019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow) { 7029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewRunning == true && m_previewStartDeferred == false) { 703f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):preview is running, cannot change size and format!", __func__); 7049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = INVALID_OPERATION; 7059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 707f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_previewWindow (%p) set_buffers_geometry", __func__, m_previewWindow); 708f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_previewWindow->set_buffers_geometry (%p)", __func__, 7099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewWindow->set_buffers_geometry); 7109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewWindow->set_buffers_geometry(m_previewWindow, 7119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewW, newPreviewH, 7129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newPreviewFormat); 713f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):DONE m_previewWindow (%p) set_buffers_geometry", __func__, m_previewWindow); 7149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setPreviewSize(newPreviewW, newPreviewH); 7169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setPreviewFormat(strNewPreviewFormat); 7179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 720f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):preview size and format has not changed", __func__); 7219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 723f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid preview size(%dx%d)", __func__, newPreviewW, newPreviewH); 7249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = INVALID_OPERATION; 7259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newPictureW = 0; 7289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newPictureH = 0; 7299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin params.getPictureSize(&newPictureW, &newPictureH); 730f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newPictureW x newPictureH = %dx%d", __func__, newPictureW, newPictureH); 7319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < newPictureW && 0 < newPictureH) { 7339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int orgPictureW, orgPictureH = 0; 7359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPictureSize(&orgPictureW, &orgPictureH); 7369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setPictureSize(newPictureW, newPictureH) == false) { 738f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setPictureSize(width(%d), height(%d))", 7399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newPictureW, newPictureH); 7409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 7419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 7429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int tempW, tempH = 0; 7439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPictureSize(&tempW, &tempH); 7449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (tempW != orgPictureW || tempH != orgPictureH) { 7469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == true) { 7489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_stopPictureInternal() == false) 749f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_stopPictureInternal() fail", __func__); 7509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_startPictureInternal() == false) 752f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_startPictureInternal() fail", __func__); 7539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPictureRect.w = newPictureW; 7569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPictureRect.h = newPictureH; 7579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setPictureSize(newPictureW, newPictureH); 7589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // picture format 7629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newPictureFormat = params.getPictureFormat(); 763f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newPictureFormat %s", __func__, newPictureFormat); 7649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newPictureFormat != NULL) { 7669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int value = 0; 7679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newPictureFormat, CameraParameters::PIXEL_FORMAT_RGB565)) 7699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_RGB565; 7709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, CameraParameters::PIXEL_FORMAT_RGBA8888)) 7719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_RGB32; 7729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, CameraParameters::PIXEL_FORMAT_YUV420SP)) 7739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_NV21; 7749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "yuv420sp_custom")) 7759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_NV12T; 7769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "yuv420p")) 7779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_YUV420; 7789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "yuv422i")) 7799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_YUYV; 7809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "uyv422i_custom")) //Zero copy UYVY format 7819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_UYVY; 7829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "uyv422i")) //Non-zero copy UYVY format 7839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_UYVY; 7849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, CameraParameters::PIXEL_FORMAT_JPEG)) 7859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_YUYV; 7869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newPictureFormat, "yuv422p")) 7879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_YUV422P; 7889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 7899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = V4L2_PIX_FMT_NV21; //for 3rd party 7909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 7919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (value != m_secCamera->getPictureFormat()) { 7929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setPictureFormat(value) == false) { 793f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setPictureFormat(format(%d))", __func__, value); 7949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 7959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 7969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPictureRect.colorFormat = value; 7979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setPictureFormat(newPictureFormat); 7989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 7999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // JPEG image quality 8039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newJpegQuality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); 804f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newJpegQuality %d", __func__, newJpegQuality); 8059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // we ignore bad values 8069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newJpegQuality >=1 && newJpegQuality <= 100) { 8079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setJpegQuality(newJpegQuality) == false) { 808f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setJpegQuality(quality(%d))", __func__, newJpegQuality); 8099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 8119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_JPEG_QUALITY, newJpegQuality); 8129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // JPEG thumbnail size 8169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newJpegThumbnailW = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 8179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newJpegThumbnailH = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 8189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newJpegThumbnailW && 0 <= newJpegThumbnailH) { 8199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setJpegThumbnailSize(newJpegThumbnailW, newJpegThumbnailH) == false) { 820f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setJpegThumbnailSize(width(%d), height(%d))", __func__, newJpegThumbnailW, newJpegThumbnailH); 8219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 8239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, newJpegThumbnailW); 8249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, newJpegThumbnailH); 8259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // JPEG thumbnail quality 8299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newJpegThumbnailQuality = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 830f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newJpegThumbnailQuality %d", __func__, newJpegThumbnailQuality); 8319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // we ignore bad values 8329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newJpegThumbnailQuality >=1 && newJpegThumbnailQuality <= 100) { 8339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setJpegThumbnailQuality(newJpegThumbnailQuality) == false) { 834f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setJpegThumbnailQuality(quality(%d))", 8359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newJpegThumbnailQuality); 8369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 8389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, newJpegThumbnailQuality); 8399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Video size 8439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newVideoW = 0; 8449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newVideoH = 0; 8459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin params.getVideoSize(&newVideoW, &newVideoH); 846f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newVideoW (%d) newVideoH (%d)", __func__, newVideoW, newVideoH); 8479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < newVideoW && 0 < newVideoH && m_videoStart == false) { 8489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgVideoRect.w = newVideoW; 8509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgVideoRect.h = newVideoH; 8519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setVideoSize(newVideoW, newVideoH) == false) { 853f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setVideoSize(width(%d), height(%d))", 8549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newVideoW, newVideoH); 8559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setVideoSize(newVideoW, newVideoH); 8589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // video stablization 8619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newVideoStabilization = params.get(CameraParameters::KEY_VIDEO_STABILIZATION); 8629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool currVideoStabilization = m_secCamera->getVideoStabilization(); 863f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newVideoStabilization %s", __func__, newVideoStabilization); 8649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newVideoStabilization != NULL) { 8659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 8669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newVideoStabilization, "true")) 8689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 8699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( currVideoStabilization != toggle) { 8719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setVideoStabilization(toggle) == false) { 872f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):setVideoStabilization() fail", __func__); 8739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 8759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_VIDEO_STABILIZATION, newVideoStabilization); 8769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // 3dnr 8819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *new3dnr = params.get("3dnr"); 882f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):new3drn %s", __func__, new3dnr); 8839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (new3dnr != NULL) { 8849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 8859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(new3dnr, "true")) 8879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 8889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->set3DNR(toggle) == false) { 890f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):set3DNR() fail", __func__); 8919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 8929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 8939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("3dnr", new3dnr); 8949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 8969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 8979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // odc 8989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newOdc = params.get("odc"); 899f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newOdc %s", __func__, new3dnr); 9009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newOdc != NULL) { 9019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 9029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newOdc, "true")) 9049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 9059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setODC(toggle) == false) { 907f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):setODC() fail", __func__); 9089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("odc", newOdc); 9119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // frame rate 9159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newFrameRate = params.getPreviewFrameRate(); 916f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newFrameRate %d", __func__, newFrameRate); 9179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ignore any fps request, we're determine fps automatically based 9189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // on scene mode. don't return an error because it causes CTS failure. 9199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newFrameRate != m_params.getPreviewFrameRate()) { 9209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setPreviewFrameRate(newFrameRate) == false) { 921f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setPreviewFrameRate(%d)", __func__, newFrameRate); 9229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.setPreviewFrameRate(newFrameRate); 9259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // zoom 9299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newZoom = params.getInt(CameraParameters::KEY_ZOOM); 930f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newZoom %d", __func__, newZoom); 9319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newZoom) { 9329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setZoom(newZoom) == false) { 933f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setZoom(newZoom(%d))", __func__, newZoom); 9349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 9379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_ZOOM, newZoom); 9389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // rotation 9429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newRotation = params.getInt(CameraParameters::KEY_ROTATION); 943f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newRotation %d", __func__, newRotation); 9449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newRotation) { 945f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):set orientation:%d", __func__, newRotation); 9469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setRotation(newRotation) == false) { 947f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setRotation(%d)", __func__, newRotation); 9489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_ROTATION, newRotation); 9519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // auto exposure lock 9559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newAutoExposureLock = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK); 9569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newAutoExposureLock != NULL) { 9579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 9589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newAutoExposureLock, "true")) 9609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 9619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setAutoExposureLock(toggle) == false) { 963f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setAutoExposureLock()", __func__); 9649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, newAutoExposureLock); 9679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // exposure 9719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minExposureCompensation = params.getInt(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION); 9729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxExposureCompensation = params.getInt(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION); 9739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newExposureCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 974f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newExposureCompensation %d", __func__, newExposureCompensation); 9759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((minExposureCompensation <= newExposureCompensation) && 9769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (newExposureCompensation <= maxExposureCompensation)) { 9779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setExposureCompensation(newExposureCompensation) == false) { 978f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setExposureCompensation(exposure(%d))", __func__, newExposureCompensation); 9799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, newExposureCompensation); 9829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // auto white balance lock 9869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newAutoWhitebalanceLock = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK); 9879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newAutoWhitebalanceLock != NULL) { 9889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 9899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newAutoWhitebalanceLock, "true")) 9919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 9929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 9939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setAutoWhiteBalanceLock(toggle) == false) { 994f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setAutoWhiteBalanceLock()", __func__); 9959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 9969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 9979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, newAutoWhitebalanceLock); 9989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 9999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // white balance 10029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newWhiteBalance = params.get(CameraParameters::KEY_WHITE_BALANCE); 1003f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newWhiteBalance %s", __func__, newWhiteBalance); 10049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newWhiteBalance != NULL) { 10059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int value = -1; 10069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_AUTO)) 10089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_AUTO; 10099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_INCANDESCENT)) 10109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_INCANDESCENT; 10119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_FLUORESCENT)) 10129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_FLUORESCENT; 10139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT)) 10149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT; 10159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_DAYLIGHT)) 10169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_DAYLIGHT; 10179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT)) 10189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT; 10199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_TWILIGHT)) 10209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_TWILIGHT; 10219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newWhiteBalance, CameraParameters::WHITE_BALANCE_SHADE)) 10229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::WHITE_BALANCE_SHADE; 10239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1024f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid white balance(%s)", __func__, newWhiteBalance); //twilight, shade, warm_flourescent 10259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 10269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= value) { 10299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setWhiteBalance(value) == false) { 1030f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setWhiteBalance(white(%d))", __func__, value); 10319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 10329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 10339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_WHITE_BALANCE, newWhiteBalance); 10349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Metering 10399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // This is the additional API(not Google API). 10409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // But, This is set berfore the below KEY_METERING_AREAS. 10419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewMetering = params.get("metering"); 1042f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):strNewMetering %s", __func__, strNewMetering); 10439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewMetering != NULL) { 10449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newMetering = -1; 10459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewMetering, "average")) 10479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newMetering = ExynosCamera::METERING_MODE_AVERAGE; 10489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewMetering, "center")) 10499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newMetering = ExynosCamera::METERING_MODE_CENTER; 10509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewMetering, "matrix")) 10519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newMetering = ExynosCamera::METERING_MODE_MATRIX; 10529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewMetering, "spot")) 10539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newMetering = ExynosCamera::METERING_MODE_SPOT; 10549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1055f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid metering newMetering(%s)", __func__, strNewMetering); 10569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 10579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newMetering) { 10609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setMeteringMode(newMetering) == false) { 1061f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setMeteringMode(%d)", __func__, newMetering); 10629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 10639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 10649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("metering", strNewMetering); 10659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // metering areas 10709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newMeteringAreas = params.get(CameraParameters::KEY_METERING_AREAS); 10719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxNumMeteringAreas = m_secCamera->getMaxNumMeteringAreas(); 10729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newMeteringAreas != NULL && maxNumMeteringAreas != 0) { 10749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : (-10,-10,0,0,300),(0,0,10,10,700) 10759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 *rect2s = new ExynosRect2[maxNumMeteringAreas]; 10769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int *weights = new int[maxNumMeteringAreas]; 10779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int validMeteringAreas = m_bracketsStr2Ints((char *)newMeteringAreas, maxNumMeteringAreas, rect2s, weights); 10799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < validMeteringAreas) { 10809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < validMeteringAreas; i++) { 10819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x1 = m_calibratePosition(2000, newPreviewW, rect2s[i].x1 + 1000); 10829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y1 = m_calibratePosition(2000, newPreviewH, rect2s[i].y1 + 1000); 10839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x2 = m_calibratePosition(2000, newPreviewW, rect2s[i].x2 + 1000); 10849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y2 = m_calibratePosition(2000, newPreviewH, rect2s[i].y2 + 1000); 10859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setMeteringAreas(validMeteringAreas, rect2s, weights) == false) { 1088f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):setMeteringAreas(%s) fail", __func__, newMeteringAreas); 10899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 10909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 10929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_METERING_AREAS, newMeteringAreas); 10939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 10969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin delete [] rect2s; 10979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin delete [] weights; 10989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 10999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // anti banding 11019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newAntibanding = params.get(CameraParameters::KEY_ANTIBANDING); 1102f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newAntibanding %s", __func__, newAntibanding); 11039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newAntibanding != NULL) { 11049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int value = -1; 11059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(newAntibanding, CameraParameters::ANTIBANDING_AUTO)) 11079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::ANTIBANDING_AUTO; 11089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newAntibanding, CameraParameters::ANTIBANDING_50HZ)) 11099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::ANTIBANDING_50HZ; 11109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newAntibanding, CameraParameters::ANTIBANDING_60HZ)) 11119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::ANTIBANDING_60HZ; 11129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(newAntibanding, CameraParameters::ANTIBANDING_OFF)) 11139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin value = ExynosCamera::ANTIBANDING_OFF; 11149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1115f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid antibanding value(%s)", __func__, newAntibanding); 11169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 11179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= value) { 11209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setAntibanding(value) == false) { 1121f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setAntibanding(%d)", __func__, value); 11229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 11239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 11249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_ANTIBANDING, newAntibanding); 11259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // scene mode 11309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewSceneMode = params.get(CameraParameters::KEY_SCENE_MODE); 11319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strCurSceneMode = m_params.get(CameraParameters::KEY_SCENE_MODE); 11329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // fps range 11349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newMinFps = 0; 11359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newMaxFps = 0; 11369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int curMinFps = 0; 11379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int curMaxFps = 0; 11389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin params.getPreviewFpsRange(&newMinFps, &newMaxFps); 11399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.getPreviewFpsRange(&curMinFps, &curMaxFps); 11409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* our fps range is determined by the sensor, reject any request 11419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * that isn't exactly what we're already at. 11429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * but the check is performed when requesting only changing fps range 11439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 11449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewSceneMode && strCurSceneMode) { 11459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewSceneMode, strCurSceneMode)) { 11469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((newMinFps != curMinFps) || (newMaxFps != curMaxFps)) { 1147f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGW("%s : requested newMinFps = %d, newMaxFps = %d not allowed", 11489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, newMinFps, newMaxFps); 1149f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s : curMinFps = %d, curMaxFps = %d", 11509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, curMinFps, curMaxFps); 11519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 11529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 11559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Check basic validation if scene mode is different */ 11569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((newMaxFps < newMinFps) || 11579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (newMinFps < 0) || (newMaxFps < 0)) 11589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 11599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 11609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewSceneMode != NULL) { 11629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newSceneMode = -1; 11639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewFlashMode = params.get(CameraParameters::KEY_FLASH_MODE); 11659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewFocusMode = params.get(CameraParameters::KEY_FOCUS_MODE); 11669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // fps range is (15000,30000) by default. 11689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)"); 11699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "15000,30000"); 11709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_AUTO)) { 11729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_AUTO; 11739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 11749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // defaults for non-auto scene modes 11759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getSupportedFocusModes() != 0) 11769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strNewFocusMode = CameraParameters::FOCUS_MODE_AUTO; 11779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strNewFlashMode = CameraParameters::FLASH_MODE_OFF; 11799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 11809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_ACTION)) { 11819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_ACTION; 11829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_PORTRAIT)) { 11839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_PORTRAIT; 11849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strNewFlashMode = CameraParameters::FLASH_MODE_AUTO; 11859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_LANDSCAPE)) { 11869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_LANDSCAPE; 11879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_NIGHT)) { 11889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_NIGHT; 11899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(4000,30000)"); 11909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "4000,30000"); 11919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT)) { 11929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT; 11939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_THEATRE)) { 11949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_THEATRE; 11959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_BEACH)) { 11969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_BEACH; 11979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SNOW)) { 11989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_SNOW; 11999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SUNSET)) { 12009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_SUNSET; 12019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO)) { 12029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_STEADYPHOTO; 12039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_FIREWORKS)) { 12049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_FIREWORKS; 12059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SPORTS)) { 12069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_SPORTS; 12079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_PARTY)) { 12089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_PARTY; 12099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strNewFlashMode = CameraParameters::FLASH_MODE_AUTO; 12109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT)) { 12119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSceneMode = ExynosCamera::SCENE_MODE_CANDLELIGHT; 12129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 1213f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched scene_mode(%s)", 12149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, strNewSceneMode); //action, night-portrait, theatre, steadyphoto 12159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // focus mode 12209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewFocusMode != NULL) { 12219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newFocusMode = -1; 12229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_AUTO)) { 12249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_AUTO; 12259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FOCUS_DISTANCES, 12269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR); 12279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_INFINITY)) { 12289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_INFINITY; 12299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FOCUS_DISTANCES, 12309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR); 12319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_MACRO)) { 12329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_MACRO; 12339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FOCUS_DISTANCES, 12349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR); 12359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_FIXED)) { 12369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_FIXED; 12379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_EDOF)) { 12389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_EDOF; 12399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO)) { 12409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO; 12419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)) { 12429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFocusMode = ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE; 12439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 1244f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched focus_mode(%s)", __func__, strNewFocusMode); 12459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newFocusMode) { 12499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setFocusMode(newFocusMode) == false) { 1250f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setFocusMode(%d) fail", __func__, newFocusMode); 12519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 12539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FOCUS_MODE, strNewFocusMode); 12549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // flash mode 12599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewFlashMode != NULL) { 12609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newFlashMode = -1; 12619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_OFF)) 12639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFlashMode = ExynosCamera::FLASH_MODE_OFF; 12649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_AUTO)) 12659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFlashMode = ExynosCamera::FLASH_MODE_AUTO; 12669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_ON)) 12679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFlashMode = ExynosCamera::FLASH_MODE_ON; 12689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_RED_EYE)) 12699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFlashMode = ExynosCamera::FLASH_MODE_RED_EYE; 12709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_TORCH)) 12719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newFlashMode = ExynosCamera::FLASH_MODE_TORCH; 12729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1273f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched flash_mode(%s)", __func__, strNewFlashMode); //red-eye 12749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newFlashMode) { 12779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setFlashMode(newFlashMode) == false) { 1278f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setFlashMode(%d) fail", __func__, newFlashMode); 12799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 12819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FLASH_MODE, strNewFlashMode); 12829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // scene mode 12879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newSceneMode) { 12889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setSceneMode(newSceneMode) == false) { 1289f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setSceneMode(%d) fail", __func__, newSceneMode); 12909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 12919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 12929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_SCENE_MODE, strNewSceneMode); 12939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 12969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 12979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // focus areas 12989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *newFocusAreas = params.get(CameraParameters::KEY_FOCUS_AREAS); 12999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxNumFocusAreas = m_secCamera->getMaxNumFocusAreas(); 13009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newFocusAreas != NULL && maxNumFocusAreas != 0) { 13029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int curFocusMode = m_secCamera->getFocusMode(); 13039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // In CameraParameters.h 13059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Focus area only has effect if the cur focus mode is FOCUS_MODE_AUTO, 13069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // FOCUS_MODE_MACRO, FOCUS_MODE_CONTINUOUS_VIDEO, or 13079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // FOCUS_MODE_CONTINUOUS_PICTURE. 13089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( curFocusMode & ExynosCamera::FOCUS_MODE_AUTO 13099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || curFocusMode & ExynosCamera::FOCUS_MODE_MACRO 13109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || curFocusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO 13119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || curFocusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE) { 13129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : (-10,-10,0,0,300),(0,0,10,10,700) 13149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 *rect2s = new ExynosRect2[maxNumFocusAreas]; 13159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int *weights = new int[maxNumFocusAreas]; 13169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int validFocusedAreas = m_bracketsStr2Ints((char *)newFocusAreas, maxNumFocusAreas, rect2s, weights); 13189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < validFocusedAreas) { 13199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // CameraParameters.h 13209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // A special case of single focus area (0,0,0,0,0) means driver to decide 13219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // the focus area. For example, the driver may use more signals to decide 13229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // focus areas and change them dynamically. Apps can set (0,0,0,0,0) if they 13239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // want the driver to decide focus areas. 13249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( validFocusedAreas == 1 13259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && rect2s[0].x1 == 0 && rect2s[0].y1 == 0 && rect2s[0].x2 == 0 && rect2s[0].y2 == 0) { 13269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[0].x1 = 0; 13279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[0].y1 = 0; 13289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[0].x2 = newPreviewW; 13299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[0].y2 = newPreviewH; 13309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 13319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < validFocusedAreas; i++) { 13329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x1 = (rect2s[i].x1 + 1000) * 1023 / 2000; 13339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y1 = (rect2s[i].y1 + 1000) * 1023 / 2000; 13349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x2 = (rect2s[i].x2 + 1000) * 1023 / 2000; 13359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y2 = (rect2s[i].y2 + 1000) * 1023 / 2000; 13369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setFocusAreas(validFocusedAreas, rect2s, weights) == false) { 1339f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):setFocusAreas(%s) fail", __func__, newFocusAreas); 13409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 13419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 13429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_FOCUS_AREAS, newFocusAreas); 13439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin delete [] rect2s; 13489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin delete [] weights; 13499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // image effect 13539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewEffect = params.get(CameraParameters::KEY_EFFECT); 13549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewEffect != NULL) { 13559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newEffect = -1; 13579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewEffect, CameraParameters::EFFECT_NONE)) { 13599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_NONE; 13609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_MONO)) { 13619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_MONO; 13629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_NEGATIVE)) { 13639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_NEGATIVE; 13649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_SOLARIZE)) { 13659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_SOLARIZE; 13669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_SEPIA)) { 13679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_SEPIA; 13689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_POSTERIZE)) { 13699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_POSTERIZE; 13709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_WHITEBOARD)) { 13719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_WHITEBOARD; 13729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_BLACKBOARD)) { 13739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_BLACKBOARD; 13749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (!strcmp(strNewEffect, CameraParameters::EFFECT_AQUA)) { 13759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newEffect = ExynosCamera::EFFECT_AQUA; 13769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 1377f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid effect(%s)", __func__, strNewEffect); 13789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 13799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newEffect) { 13829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setColorEffect(newEffect) == false) { 1383f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setColorEffect(effect(%d))", __func__, newEffect); 13849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 13859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 13869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *oldStrEffect = m_params.get(CameraParameters::KEY_EFFECT); 13879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (oldStrEffect) { 13899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strcmp(oldStrEffect, strNewEffect)) { 13909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_setSkipFrame(EFFECT_SKIP_FRAME); 13919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_EFFECT, strNewEffect); 13949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 13979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 13989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // gps altitude 13999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGpsAltitude = params.get(CameraParameters::KEY_GPS_ALTITUDE); 14009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGpsAltitude(strNewGpsAltitude) == false) { 1402f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGpsAltitude(%s) fail", __func__, strNewGpsAltitude); 14039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGpsAltitude) 14069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_GPS_ALTITUDE, strNewGpsAltitude); 14079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 14089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.remove(CameraParameters::KEY_GPS_ALTITUDE); 14099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // gps latitude 14129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGpsLatitude = params.get(CameraParameters::KEY_GPS_LATITUDE); 14139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGpsLatitude(strNewGpsLatitude) == false) { 1414f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGpsLatitude(%s) fail", __func__, strNewGpsLatitude); 14159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGpsLatitude) 14189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_GPS_LATITUDE, strNewGpsLatitude); 14199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 14209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.remove(CameraParameters::KEY_GPS_LATITUDE); 14219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // gps longitude 14249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGpsLongtitude = params.get(CameraParameters::KEY_GPS_LONGITUDE); 14259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGpsLongitude(strNewGpsLongtitude) == false) { 1426f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGpsLongitude(%s) fail", __func__, strNewGpsLongtitude); 14279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGpsLongtitude) 14309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_GPS_LONGITUDE, strNewGpsLongtitude); 14319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 14329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.remove(CameraParameters::KEY_GPS_LONGITUDE); 14339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // gps processing method 14369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGpsProcessingMethod = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 14379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGpsProcessingMethod(strNewGpsProcessingMethod) == false) { 1439f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGpsProcessingMethod(%s) fail", __func__, strNewGpsProcessingMethod); 14409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGpsProcessingMethod) 14439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, strNewGpsProcessingMethod); 14449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 14459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD); 14469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // gps timestamp 14499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGpsTimestamp = params.get(CameraParameters::KEY_GPS_TIMESTAMP); 14509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGpsTimeStamp(strNewGpsTimestamp) == false) { 1451f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGpsTimeStamp(%s) fail", __func__, strNewGpsTimestamp); 14529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGpsTimestamp) 14559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set(CameraParameters::KEY_GPS_TIMESTAMP, strNewGpsTimestamp); 14569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 14579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.remove(CameraParameters::KEY_GPS_TIMESTAMP); 14589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /////////////////////////////////////////////////// 14619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Additional API. 14629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /////////////////////////////////////////////////// 14639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // brightness 14649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newBrightness = params.getInt("brightness"); 14659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxBrightness = params.getInt("brightness-max"); 14669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minBrightness = params.getInt("brightness-min"); 1467f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newBrightness %d", __func__, newBrightness); 14689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((minBrightness <= newBrightness) && (newBrightness <= maxBrightness)) { 14699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setBrightness(newBrightness) == false) { 1470f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setBrightness(%d)", __func__, newBrightness); 14719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("brightness", newBrightness); 14749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // saturation 14789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newSaturation = params.getInt("saturation"); 14799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxSaturation = params.getInt("saturation-max"); 14809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minSaturation = params.getInt("saturation-min"); 1481f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newSaturation %d", __func__, newSaturation); 14829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((minSaturation <= newSaturation) && (newSaturation <= maxSaturation)) { 14839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setSaturation(newSaturation) == false) { 1484f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setSaturation(%d)", __func__, newSaturation); 14859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 14869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 14879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("saturation", newSaturation); 14889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 14909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 14919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // sharpness 14929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newSharpness = params.getInt("sharpness"); 14939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxSharpness = params.getInt("sharpness-max"); 14949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minSharpness = params.getInt("sharpness-min"); 1495f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newSharpness %d", __func__, newSharpness); 14969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((minSharpness <= newSharpness) && (newSharpness <= maxSharpness)) { 14979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setSharpness(newSharpness) == false) { 1498f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setSharpness(%d)", __func__, newSharpness); 14999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 15019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("sharpness", newSharpness); 15029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // hue 15069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newHue = params.getInt("hue"); 15079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxHue = params.getInt("hue-max"); 15089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minHue = params.getInt("hue-min"); 1509f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newHue %d", __func__, newHue); 15109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((minHue <= newHue) && (maxHue >= newHue)) { 15119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setHue(newHue) == false) { 1512f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setHue(hue(%d))", __func__, newHue); 15139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 15159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("hue", newHue); 15169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ISO 15209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewISO = params.get("iso"); 1521f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):strNewISO %s", __func__, strNewISO); 15229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewISO != NULL) { 15239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newISO = -1; 15249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewISO, "auto")) 15269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newISO = 0; 15279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 15289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newISO = (int)atoi(strNewISO); 15299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newISO == 0) { 1530f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid iso value(%s)", __func__, strNewISO); 15319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newISO) { 15369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setISO(newISO) == false) { 1537f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setISO(iso(%d))", __func__, newISO); 15389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 15409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("iso", strNewISO); 15419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //contrast 15469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewContrast = params.get("contrast"); 1547f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):strNewContrast %s", __func__, strNewContrast); 15489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewContrast != NULL) { 15499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newContrast = -1; 15509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewContrast, "auto")) 15529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_AUTO; 15539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewContrast, "-2")) 15549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_MINUS_2; 15559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewContrast, "-1")) 15569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_MINUS_1; 15579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewContrast, "0")) 15589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_DEFAULT; 15599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewContrast, "1")) 15609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_PLUS_1; 15619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewContrast, "2")) 15629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newContrast = ExynosCamera::CONTRAST_PLUS_2; 15639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1564f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid contrast value(%s)", __func__, strNewContrast); 15659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newContrast) { 15699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setContrast(newContrast) == false) { 1570f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setContrast(contrast(%d))", __func__, newContrast); 15719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 15739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.set("contrast", strNewContrast); 15749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //WDR 15799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newWdr = params.getInt("wdr"); 1580f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newWdr %d", __func__, newWdr); 15819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newWdr) { 15829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setWDR(newWdr) == false) { 1583f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setWDR(%d)", __func__, newWdr); 15849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 15879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //anti shake 15899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newAntiShake = m_internalParams.getInt("anti-shake"); 1590f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newAntiShake %d", __func__, newAntiShake); 15919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newAntiShake) { 15929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 15939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newAntiShake == 1) 15949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 15959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 15969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setAntiShake(toggle) == false) { 1597f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setAntiShake(%d)", __func__, newAntiShake); 15989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 15999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //gamma 16039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewGamma = m_internalParams.get("video_recording_gamma"); 1604f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):strNewGamma %s", __func__, strNewGamma); 16059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewGamma != NULL) { 16069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newGamma = -1; 16079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewGamma, "off")) 16089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newGamma = 0; 16099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewGamma, "on")) 16109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newGamma = 1; 16119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1612f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched gamma(%s)", __func__, strNewGamma); 16139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 16149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newGamma) { 16179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 16189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newGamma == 1) 16199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 16209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setGamma(toggle) == false) { 1622f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setGamma(%s) fail", __func__, strNewGamma); 16239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 16249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //slow ae 16299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *strNewSlowAe = m_internalParams.get("slow_ae"); 1630f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):strNewSlowAe %s", __func__, strNewSlowAe); 16319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (strNewSlowAe != NULL) { 16329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newSlowAe = -1; 16339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!strcmp(strNewSlowAe, "off")) 16359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSlowAe = 0; 16369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (!strcmp(strNewSlowAe, "on")) 16379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newSlowAe = 1; 16389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 1639f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched slow_ae(%s)", __func__, strNewSlowAe); 16409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 16419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newSlowAe) { 16449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool toggle = false; 16459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (newSlowAe == 1) 16469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin toggle = true; 16479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setSlowAE(newSlowAe) == false) { 1648f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera->setSlowAE(%d) fail", __func__, newSlowAe); 16499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 16509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Shot mode 16559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int newShotMode = m_internalParams.getInt("shot_mode"); 1656f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):newShotMode %d", __func__, newShotMode); 16579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 <= newShotMode) { 16589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->setShotMode(newShotMode) == false) { 1659f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->setShotMode(%d)", __func__, newShotMode); 16609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = UNKNOWN_ERROR; 16619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 16639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin newShotMode=0; 16649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1666f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):return ret = %d", __func__, ret); 16679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return ret; 16699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 16709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung ShinCameraParameters ExynosCameraHWInterface::getParameters() const 16729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 1673f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 16749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return m_params; 16759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 16769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::sendCommand(int32_t command, int32_t arg1, int32_t arg2) 16789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 16799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin switch (command) { 16809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case CAMERA_CMD_START_FACE_DETECTION: 16819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case CAMERA_CMD_STOP_FACE_DETECTION: 16829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getMaxNumDetectedFaces() == 0) { 1683f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):getMaxNumDetectedFaces == 0", __func__); 16849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return BAD_VALUE; 16859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (arg1 == CAMERA_FACE_DETECTION_SW) { 1688f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):only support HW face dectection", __func__); 16899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return BAD_VALUE; 16909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 16929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (command == CAMERA_CMD_START_FACE_DETECTION) { 16939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartFaceDetection() == false 16949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->startFaceDetection() == false) { 1695f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):startFaceDetection() fail", __func__); 16969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return BAD_VALUE; 16979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 16989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { // if (command == CAMERA_CMD_STOP_FACE_DETECTION) 16999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartFaceDetection() == true 17009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopFaceDetection() == false) { 1701f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):stopFaceDetection() fail", __func__); 17029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return BAD_VALUE; 17039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 17069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin default: 1707f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unexpectect command(%d) fail", __func__, command); 17089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return BAD_VALUE; 17099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 17109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 17129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 17139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::release() 17159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 1716f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 17179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* shut down any threads we have that might be running. do it here 17199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * instead of the destructor. we're guaranteed to be on another thread 17209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * than the ones below. if we used the destructor, since the threads 17219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * have a reference to this object, we could wind up trying to wait 17229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * for ourself to exit, which is a deadlock. 17239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 17249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoThread != NULL) { 17259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoThread->requestExit(); 17269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitVideoThread = true; 17279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = true; // let it run so it can exit 17289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoCondition.signal(); 17299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoThread->requestExitAndWait(); 17309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoThread.clear(); 17319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewThread != NULL) { 17349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* this thread is normally already in it's threadLoop but blocked 17359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * on the condition variable or running. signal it so it wakes 17369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * up and can exit. 17379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 17389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewThread->requestExit(); 17399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitPreviewThread = true; 17409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewRunning = true; // let it run so it can exit 17419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.signal(); 17429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewThread->requestExitAndWait(); 17439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewThread.clear(); 17449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_autoFocusThread != NULL) { 17479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* this thread is normally already in it's threadLoop but blocked 17489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * on the condition variable. signal it so it wakes up and can exit. 17499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 17509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.lock(); 17519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_autoFocusThread->requestExit(); 17529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exitAutoFocusThread = true; 17539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusCondition.signal(); 17549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.unlock(); 17559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_autoFocusThread->requestExitAndWait(); 17569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_autoFocusThread.clear(); 17579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureThread != NULL) { 17609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureThread->requestExitAndWait(); 17619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureThread.clear(); 17629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_VIDEO_BUF; i++) { 17659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoHeap[i]) { 17669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i]->release(m_videoHeap[i]); 17679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoHeap[i] = 0; 17689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_resizedVideoHeap[i]) { 17719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i]->release(m_resizedVideoHeap[i]); 17729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[i] = 0; 17739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PREVIEW_BUF; i++) { 17779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewHeap[i]) { 17789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i]->release(m_previewHeap[i]); 17799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i] = 0; 17809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == true) { 17849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_stopPictureInternal() == false) 1785f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_stopPictureInternal() fail", __func__); 17869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 17879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosVideoCSC) 17899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_deinit(m_exynosVideoCSC); 17909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosVideoCSC = NULL; 17919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPictureCSC) 17939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_deinit(m_exynosPictureCSC); 17949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPictureCSC = NULL; 17959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 17969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPreviewCSC) 17979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_deinit(m_exynosPreviewCSC); 17989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_exynosPreviewCSC = NULL; 17999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* close after all the heaps are cleared since those 18019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * could have dup'd our file descriptor. 18029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 18039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->flagCreate() == true) 18049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->destroy(); 18059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 18069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatus_t ExynosCameraHWInterface::dump(int fd) const 18089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 18099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const size_t SIZE = 256; 18109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char buffer[SIZE]; 18119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin String8 result; 18129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const Vector<String16> args; 18139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera != 0) { 18159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params.dump(fd, args); 18169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_internalParams.dump(fd, args); 18179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(buffer, 255, " preview running(%s)\n", m_previewRunning?"true": "false"); 18189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin result.append(buffer); 18199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 18209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin result.append("No camera client yet.\n"); 18219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 18229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin write(fd, result.string(), result.size()); 18249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return NO_ERROR; 18259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 18269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinint ExynosCameraHWInterface::getCameraId() const 18289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 18299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return m_secCamera->getCameraId(); 18309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 18319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::m_initDefaultParameters(int cameraId) 18339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 18349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera == NULL) { 1835f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_secCamera object is NULL", __func__); 18369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return; 18379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 18389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters p; 18409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters ip; 18419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin String8 parameterString; 18439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char * cameraName; 18459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cameraName = m_secCamera->getCameraName(); 18469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (cameraName == NULL) 1847f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):getCameraName() fail", __func__); 18489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* 18509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (cameraId == ExynosCamera::CAMERA_ID_BACK) { 18519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 18529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "3264x2448,2576x1948,1920x1080,1280x720,800x480,720x480,640x480,320x240,528x432,176x144"); 18539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 18549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "3264x2448,1920x1080,1280x720,800x480,720x480,640x480"); 18559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 18569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "1920x1080,1280x720,640x480,176x144"); 18579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 18589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 18599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "1392x1392,1280x720,640x480,352x288,320x240,176x144"); 18609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 18619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "1392x1392,1280x960,640x480"); 18629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 18639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin "1280x720,640x480,176x144"); 18649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 18659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 18669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char strBuf[256]; 18689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin String8 listString; 18699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // preview 18719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewMaxW = 0; 18729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewMaxH = 0; 18739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedPreviewSizes(&previewMaxW, &previewMaxH); 18749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 18769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_getResolutionList(listString, strBuf, previewMaxW, previewMaxH) == false) { 1877f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getResolutionList() fail", __func__); 18789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewMaxW = 640; 18809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewMaxH = 480; 18819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%dx%d", previewMaxW, previewMaxH); 18829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 18839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, listString.string()); 18859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setPreviewSize(previewMaxW, previewMaxH); 18869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.getSupportedPreviewSizes(m_supportedPreviewSizes); 18879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 18899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%s,%s", CameraParameters::PIXEL_FORMAT_YUV420SP, CameraParameters::PIXEL_FORMAT_YUV420P); 18909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, listString); 18919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420P); 18929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // video 18949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int videoMaxW = 0; 18959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int videoMaxH = 0; 18969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedVideoSizes(&videoMaxW, &videoMaxH); 18979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 18989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 18999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_getResolutionList(listString, strBuf, videoMaxW, videoMaxH) == false) { 1900f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getResolutionList() fail", __func__); 19019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoMaxW = 640; 19039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoMaxH = 480; 19049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%dx%d", videoMaxW, videoMaxH); 19059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, listString.string()); 19079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setVideoSize(videoMaxW, videoMaxH); 19089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int preferredPreviewW = 0; 19109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int preferredPreviewH = 0; 19119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreferredPreivewSizeForVideo(&preferredPreviewW, &preferredPreviewH); 19129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 19139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%dx%d", preferredPreviewW, preferredPreviewH); 19149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, listString.string()); 19159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, CameraParameters::PIXEL_FORMAT_YUV420SP); 19169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isVideoSnapshotSupported() == true) 19189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, "true"); 19199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 19209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, "false"); 19219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isVideoStabilizationSupported() == true) 19239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, "true"); 19249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 19259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, "false"); 19269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // picture 19289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int pictureMaxW = 0; 19299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int pictureMaxH = 0; 19309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedPictureSizes(&pictureMaxW, &pictureMaxH); 19319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 19339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_getResolutionList(listString, strBuf, pictureMaxW, pictureMaxH) == false) { 1934f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getResolutionList() fail", __func__); 19359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureMaxW = 640; 19379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureMaxW = 480; 19389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%dx%d", pictureMaxW, pictureMaxH); 19399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, listString.string()); 19419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setPictureSize(pictureMaxW, pictureMaxH); 19429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 19449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::PIXEL_FORMAT_JPEG); 19459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 19479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_JPEG_QUALITY, "100"); // maximum quality 19499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // thumbnail 19519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int thumbnailMaxW = 0; 19529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int thumbnailMaxH = 0; 19539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getSupportedJpegThumbnailSizes(&thumbnailMaxW, &thumbnailMaxH); 19559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString = String8::format("%dx%d", thumbnailMaxW, thumbnailMaxH); 19569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.append(",0x0"); 19579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, listString.string()); 19589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, thumbnailMaxW); 19599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, thumbnailMaxH); 19609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "100"); 19619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // exposure 19639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, m_secCamera->getMinExposureCompensation()); 19649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, m_secCamera->getMaxExposureCompensation()); 19659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, m_secCamera->getExposureCompensation()); 19669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, m_secCamera->getExposureCompensationStep()); 19679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isAutoExposureLockSupported() == true) 19699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true"); 19709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 19719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "false"); 19729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // face detection 19749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, m_secCamera->getMaxNumDetectedFaces()); 19759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 0); 19769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 19779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // focus mode 19789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int focusMode = m_secCamera->getSupportedFocusModes(); 19799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 19809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_AUTO) { 19819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_AUTO); 19829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 19839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_INFINITY) { 19859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_INFINITY); 19869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 19879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_MACRO) { 19899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_MACRO); 19909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 19919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_FIXED) { 19939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_FIXED); 19949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 19959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 19969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_EDOF) { 19979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_EDOF); 19989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 19999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO) { 20019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO); 20029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE) 20059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE); 20069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 20089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.string()); 20099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE) 20119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_MODE, 20129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE); 20139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (focusMode & ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO) 20149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_MODE, 20159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO); 20169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else if (focusMode & ExynosCamera::FOCUS_MODE_AUTO) 20179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_MODE, 20189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::FOCUS_MODE_AUTO); 20199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 20209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_MODE, 20219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::FOCUS_MODE_FIXED); 20229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // HACK 20249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (cameraId == ExynosCamera::CAMERA_ID_BACK) { 20259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_DISTANCES, 20269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR); 20279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::FOCUS_DISTANCE_INFINITY, 20289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin BACK_CAMERA_FOCUS_DISTANCE_INFINITY); 20299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 20309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCUS_DISTANCES, 20319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin FRONT_CAMERA_FOCUS_DISTANCES_STR); 20329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::FOCUS_DISTANCE_INFINITY, 20339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin FRONT_CAMERA_FOCUS_DISTANCE_INFINITY); 20349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (focusMode & ExynosCamera::FOCUS_MODE_TOUCH) 20379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, m_secCamera->getMaxNumFocusAreas()); 20389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // flash 20409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int flashMode = m_secCamera->getSupportedFlashModes(); 20419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 20429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flashMode & ExynosCamera::FLASH_MODE_OFF) { 20439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FLASH_MODE_OFF); 20449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flashMode & ExynosCamera::FLASH_MODE_AUTO) { 20479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FLASH_MODE_AUTO); 20489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flashMode & ExynosCamera::FLASH_MODE_ON) { 20519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FLASH_MODE_ON); 20529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flashMode & ExynosCamera::FLASH_MODE_RED_EYE) { 20559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FLASH_MODE_RED_EYE); 20569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flashMode & ExynosCamera::FLASH_MODE_TORCH) 20599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::FLASH_MODE_TORCH); 20609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, parameterString.string()); 20629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FLASH_MODE, CameraParameters::FLASH_MODE_OFF); 20639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 20649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // scene mode 20659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int sceneMode = m_secCamera->getSupportedSceneModes(); 20669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 20679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_AUTO) { 20689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_AUTO); 20699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_ACTION) { 20729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_ACTION); 20739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_PORTRAIT) { 20769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_PORTRAIT); 20779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_LANDSCAPE) { 20809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_LANDSCAPE); 20819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_NIGHT) { 20849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_NIGHT); 20859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT) { 20889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_NIGHT_PORTRAIT); 20899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_THEATRE) { 20929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_THEATRE); 20939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_BEACH) { 20969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_BEACH); 20979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 20989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 20999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_SNOW) { 21009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_SNOW); 21019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_SUNSET) { 21049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_SUNSET); 21059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_STEADYPHOTO) { 21089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_STEADYPHOTO); 21099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_FIREWORKS) { 21129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_FIREWORKS); 21139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_SPORTS) { 21169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_SPORTS); 21179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_PARTY) { 21209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_PARTY); 21219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (sceneMode & ExynosCamera::SCENE_MODE_CANDLELIGHT) 21249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::SCENE_MODE_CANDLELIGHT); 21259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 21269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 21279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.string()); 21289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SCENE_MODE, 21299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters::SCENE_MODE_AUTO); 21309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 21319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // effect 21329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int effect = m_secCamera->getSupportedColorEffects(); 21339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 21349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_NONE) { 21359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_NONE); 21369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_MONO) { 21399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_MONO); 21409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_NEGATIVE) { 21439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_NEGATIVE); 21449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_SOLARIZE) { 21479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_SOLARIZE); 21489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_SEPIA) { 21519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_SEPIA); 21529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_POSTERIZE) { 21559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_POSTERIZE); 21569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_WHITEBOARD) { 21599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_WHITEBOARD); 21609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_BLACKBOARD) { 21639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_BLACKBOARD); 21649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (effect & ExynosCamera::EFFECT_AQUA) 21679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::EFFECT_AQUA); 21689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 21699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, parameterString.string()); 21709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_NONE); 21719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 21729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // white balance 21739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int whiteBalance = m_secCamera->getSupportedWhiteBalance(); 21749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 21759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_AUTO) { 21769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_AUTO); 21779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_INCANDESCENT) { 21809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_INCANDESCENT); 21819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_FLUORESCENT) { 21849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_FLUORESCENT); 21859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT) { 21889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT); 21899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_DAYLIGHT) { 21929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_DAYLIGHT); 21939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT) { 21969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT); 21979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 21989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 21999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_TWILIGHT) { 22009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_TWILIGHT); 22019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 22029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (whiteBalance & ExynosCamera::WHITE_BALANCE_SHADE) 22049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::WHITE_BALANCE_SHADE); 22059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 22079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.string()); 22089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_WHITE_BALANCE, CameraParameters::WHITE_BALANCE_AUTO); 22099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isAutoWhiteBalanceLockSupported() == true) 22119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true"); 22129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 22139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "false"); 22149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // anti banding 22169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int antiBanding = m_secCamera->getSupportedAntibanding(); 22179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.setTo(""); 22189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (antiBanding & ExynosCamera::ANTIBANDING_AUTO) { 22199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::ANTIBANDING_AUTO); 22209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 22219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (antiBanding & ExynosCamera::ANTIBANDING_50HZ) { 22239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::ANTIBANDING_50HZ); 22249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 22259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (antiBanding & ExynosCamera::ANTIBANDING_60HZ) { 22279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::ANTIBANDING_60HZ); 22289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(","); 22299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (antiBanding & ExynosCamera::ANTIBANDING_OFF) 22319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.append(CameraParameters::ANTIBANDING_OFF); 22329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 22349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin parameterString.string()); 22359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ANTIBANDING, CameraParameters::ANTIBANDING_OFF); 22379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // rotation 22399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ROTATION, 0); 22409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // view angle 22429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, m_secCamera->getHorizontalViewAngle()); 22439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, m_secCamera->getVerticalViewAngle()); 22449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // metering 22469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < m_secCamera->getMaxNumMeteringAreas()) 22479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, m_secCamera->getMaxNumMeteringAreas()); 22489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // zoom 22509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isZoomSupported() == true) { 22519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxZoom = m_secCamera->getMaxZoom(); 22539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < maxZoom) { 22549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "true"); 22569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->isSmoothZoomSupported() == true) 22589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true"); 22599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 22609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false"); 22619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_MAX_ZOOM, maxZoom); 22639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM, m_secCamera->getZoom()); 22649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int max_zoom_ratio = m_secCamera->getMaxZoomRatio(); 22669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 22689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_getZoomRatioList(listString, strBuf, maxZoom, 100, max_zoom_ratio) == true) 22709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM_RATIOS, listString.string()); 22719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 22729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM_RATIOS, "100"); 22739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 22749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false"); 22759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false"); 22769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 22799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false"); 22809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false"); 22819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // fps 22849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minPreviewFps, maxPreviewFps; 22859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreviewFpsRange(&minPreviewFps, &maxPreviewFps); 22869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int baseFps = ((minPreviewFps + 5) / 5) * 5; 22889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.setTo(""); 22909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(strBuf, 256, "%d", minPreviewFps); 22919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.append(strBuf); 22929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 22939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = baseFps; i <= maxPreviewFps; i += 5) { 22949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int step = (i / 5) * 5; 22959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(strBuf, 256, ",%d", step); 22969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin listString.append(strBuf); 22979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 22989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, listString.string()); 22999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.setPreviewFrameRate(maxPreviewFps); 23009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int minFpsRange = minPreviewFps * 1000; // 15 -> 15000 23029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int maxFpsRange = maxPreviewFps * 1000; // 30 -> 30000 23039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(strBuf, 256, "(%d,%d)", minFpsRange, maxFpsRange); 23059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, strBuf); 23069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(strBuf, 256, "%d,%d", minFpsRange, maxFpsRange); 23089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, strBuf); 23099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)"); 23109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "15000,30000") 23119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // focal length 23139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int num = 0; 23149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int den = 0; 23159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int precision = 0; 23169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getFocalLength(&num, &den); 23179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin switch (den) { 23199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin default: 23209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 1000: 23219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin precision = 3; 23229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 23239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 100: 23249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin precision = 2; 23259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 23269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 10: 23279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin precision = 1; 23289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 23299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 1: 23309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin precision = 0; 23319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 23329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 23339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin snprintf(strBuf, 256, "%.*f", precision, ((float)num / (float)den)); 23359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set(CameraParameters::KEY_FOCAL_LENGTH, strBuf); 23369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //p.set(CameraParameters::KEY_FOCAL_LENGTH, "3.43"); 23379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //p.set(CameraParameters::KEY_FOCAL_LENGTH, "0.9"); 23389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Additional params. 23409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("contrast", "auto"); 23429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("iso", "auto"); 23439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("wdr", 0); 23449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("metering", "center"); 23459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("brightness", 0); 23479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("brightness-max", 2); 23489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("brightness-min", -2); 23499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("saturation", 0); 23519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("saturation-max", 2); 23529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("saturation-min", -2); 23539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("sharpness", 0); 23559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("sharpness-max", 2); 23569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("sharpness-min", -2); 23579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("hue", 0); 23599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("hue-max", 2); 23609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p.set("hue-min", -2); 23619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_params = p; 23639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_internalParams = ip; 23649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* make sure m_secCamera has all the settings we do. applications 23669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * aren't required to call setParameters themselves (only if they 23679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * want to change something. 23689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 23699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin setParameters(p); 23709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->setPreviewFrameRate(maxPreviewFps); 23729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 23739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_startPreviewInternal(void) 23759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 2376f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 23779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int i; 23799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewW, previewH, previewFormat, previewFramesize; 23809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreviewSize(&previewW, &previewH); 23829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewFormat = m_secCamera->getPreviewFormat(); 23839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // we will use previewFramesize for m_previewHeap[i] 23859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(m_orgPreviewRect.colorFormat), m_orgPreviewRect.w, m_orgPreviewRect.h); 23869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer previewBuf; 23889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *virtAddr[3]; 2389471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin int fd[3]; 23909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2391471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin for (i = 0; i < 3; i++) { 23929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin virtAddr[i] = NULL; 2393471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[i] = -1; 2394471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 23959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (i = 0; i < NUM_OF_PREVIEW_BUF; i++) { 23979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 23989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[i] = false; 23999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->dequeue_buffer(m_previewWindow, &m_previewBufHandle[i], &m_previewStride[i]) != 0) { 2401f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not dequeue gralloc buffer[%d]!!", __func__, i); 24029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin continue; 24039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 24049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->lock_buffer(m_previewWindow, m_previewBufHandle[i]) != 0) 2405f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not lock gralloc buffer[%d]!!", __func__, i); 24069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2408471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin if (m_flagGrallocLocked[i] == false) { 24099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_grallocHal->lock(m_grallocHal, 2410471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin *m_previewBufHandle[i], 2411471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_YUV_ADDR, 24129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, previewW, previewH, virtAddr) != 0) { 2413f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not obtain gralloc buffer", __func__); 24149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->cancel_buffer(m_previewWindow, m_previewBufHandle[i]) != 0) 2416f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not cancel_buffer gralloc buffer[%d]!!", __func__, i); 24179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin continue; 24199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2421471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*m_previewBufHandle[i]); 2422471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[0] = priv_handle->fd; 2423471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[1] = priv_handle->u_fd; 2424471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[2] = priv_handle->v_fd; 24259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_grallocVirtAddr[i] = virtAddr[0]; 24269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_matchedGrallocIndex[i] = i; 24279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_flagGrallocLocked[i] = true; 24289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getAlignedYUVSize(previewFormat, previewW, previewH, &previewBuf); 24319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.reserved.p = i; 24339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[0] = (char *)virtAddr[0]; 24349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[1] = (char *)virtAddr[1]; 24359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[2] = (char *)virtAddr[2]; 2436471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[0] = fd[0]; 2437471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[1] = fd[1]; 2438471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[2] = fd[2]; 24399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->setPreviewBuf(&previewBuf); 24419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewHeap[i]) { 24439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i]->release(m_previewHeap[i]); 24449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i] = 0; 24459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewHeap[i] = m_getMemoryCb(-1, previewFramesize, 1, 0); 24489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!m_previewHeap[i]) { 2449f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(m_previewHeap[%d], size(%d) fail", __func__, i, previewFramesize); 24509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin continue; 24519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[i] = true; 24549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->startPreview() == false) { 2457f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->startPreview()", __func__); 24589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 24599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (i = NUM_OF_PREVIEW_BUF - m_minUndequeuedBufs; i < NUM_OF_PREVIEW_BUF; i++) { 24629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getPreviewBuf(&previewBuf) == false) { 2463f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):getPreviewBuf() fail", __func__); 24649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 24659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_grallocHal && m_flagGrallocLocked[previewBuf.reserved.p] == true) { 24689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_grallocHal->unlock(m_grallocHal, *m_previewBufHandle[previewBuf.reserved.p]); 24699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_flagGrallocLocked[previewBuf.reserved.p] = false; 24709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->cancel_buffer(m_previewWindow, m_previewBufHandle[previewBuf.reserved.p]) != 0) 2473f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not cancel_buffer gralloc buffer[%d]!!", __func__, previewBuf.reserved.p); 24749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[previewBuf.reserved.p] = false; 24769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 24779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_setSkipFrame(INITIAL_SKIP_FRAME); 24799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == false 24819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_startPictureInternal() == false) 2482f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_startPictureInternal() fail", __func__); 24839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 24859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 24869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::m_stopPreviewInternal(void) 24889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 2489f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 24909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* request that the preview thread stop. */ 24929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewRunning == true) { 24939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewRunning = false; 24949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 24959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewStartDeferred == false) { 24969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.signal(); 24979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* wait until preview thread is stopped */ 24989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStoppedCondition.wait(m_previewLock); 24999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PREVIEW_BUF; i++) { 25019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewBufHandle[i] != NULL) { 25029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_grallocHal && m_flagGrallocLocked[i] == true) { 25039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_grallocHal->unlock(m_grallocHal, *m_previewBufHandle[i]); 25049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_flagGrallocLocked[i] = false; 25059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_avaliblePreviewBufHandle[i] == true) { 25089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->cancel_buffer(m_previewWindow, m_previewBufHandle[i]) != 0) { 2509f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail to cancel buffer(%d)", __func__, i); 25109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 25119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewBufHandle[i] = NULL; 25129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStride[i] = NULL; 25139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[i] = false; 25169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 2520f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):preview running but deferred, doing nothing", __func__); 25219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 2523f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):preview not running, doing nothing", __func__); 25249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 25269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_previewThreadFuncWrapper(void) 25289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 2529f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):starting", __func__); 25309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (1) { 25319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.lock(); 25329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (m_previewRunning == false) { 25339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartPreview() == true 25349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopPreview() == false) 2535f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->stopPreview()", __func__); 25369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2537f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):calling m_secCamera->stopPreview() and waiting", __func__); 25389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStoppedCondition.signal(); 25409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewCondition.wait(m_previewLock); 2541f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):return from wait", __func__); 25429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewLock.unlock(); 25449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exitPreviewThread == true) { 25469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartPreview() == true 25479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopPreview() == false) 2548f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->stopPreview()", __func__); 25499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 25519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewThreadFunc(); 25539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 25559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_previewThreadFunc(void) 25579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 25589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer previewBuf, callbackBuf; 25599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int stride; 25609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewW, previewH; 25619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool doPutPreviewBuf = true; 25629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getPreviewBuf(&previewBuf) == false) { 2564f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):getPreviewBuf() fail", __func__); 25659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 25669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 25699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoStart == true) { 25709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin copy_previewBuf = previewBuf; 25719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = true; 25729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoCondition.signal(); 25739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 25759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrameLock.lock(); 25779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < m_skipFrame) { 25789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrame--; 25799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrameLock.unlock(); 2580f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):skipping %d frame", __func__, previewBuf.reserved.p); 25819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( doPutPreviewBuf == true 25839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->putPreviewBuf(&previewBuf) == false) { 2584f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):putPreviewBuf(%d) fail", __func__, previewBuf.reserved.p); 25859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 25869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 25899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 25909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrameLock.unlock(); 25919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin callbackBuf = previewBuf; 25939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreviewSize(&previewW, &previewH); 25959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow && m_grallocHal && m_previewRunning == true) { 25979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 25989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool findGrallocBuf = false; 25999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buffer_handle_t *bufHandle = NULL; 26009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *virtAddr[3]; 2601471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin int fd[3]; 26029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Unlock grallocHal buffer if locked */ 26049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_flagGrallocLocked[previewBuf.reserved.p] == true) { 26059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_grallocHal->unlock(m_grallocHal, *m_previewBufHandle[previewBuf.reserved.p]); 26069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_flagGrallocLocked[previewBuf.reserved.p] = false; 26079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 26089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->lock_buffer(m_previewWindow, bufHandle) != 0) 2609f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not lock gralloc buffer!!", __func__); 26109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Enqueue lastest buffer */ 26139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_avaliblePreviewBufHandle[previewBuf.reserved.p] == true) { 26149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->enqueue_buffer(m_previewWindow, 26159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewBufHandle[previewBuf.reserved.p]) != 0) { 2616f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not enqueue gralloc buffer[%d]!!", __func__, previewBuf.reserved.p); 26179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto callbacks; 26189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[previewBuf.reserved.p] = false; 26219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Dequeue buffer from Gralloc */ 26249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_previewWindow->dequeue_buffer(m_previewWindow, 26259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &bufHandle, 26269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &stride) != 0) { 2627f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Could not dequeue gralloc buffer!!", __func__); 26289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto callbacks; 26299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Get virtual address from dequeued buf */ 26329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_grallocHal->lock(m_grallocHal, 26339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *bufHandle, 26349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_YUV_ADDR, 26359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, previewW, previewH, virtAddr) != 0) { 2636f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):could not obtain gralloc buffer", __func__); 26379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto callbacks; 26389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2640471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*bufHandle); 2641471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[0] = priv_handle->fd; 2642471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[1] = priv_handle->u_fd; 2643471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin fd[2] = priv_handle->v_fd; 2644471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 26459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PREVIEW_BUF; i++) { 26469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((unsigned int)m_grallocVirtAddr[i] == (unsigned int)virtAddr[0]) { 26479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin findGrallocBuf = true; 26489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewBufHandle[i] = bufHandle; 26509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_previewStride[i] = stride; 26519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.reserved.p = i; 26539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[0] = (char *)virtAddr[0]; 26549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[1] = (char *)virtAddr[1]; 26559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewBuf.virt.extP[2] = (char *)virtAddr[2]; 26569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2657471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[0] = fd[0]; 2658471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[1] = fd[1]; 2659471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin previewBuf.fd.extFd[2] = fd[2]; 2660471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 26619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->setPreviewBuf(&previewBuf); 26629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_matchedGrallocIndex[previewBuf.reserved.p] = i; 26639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_avaliblePreviewBufHandle[i] = true; 26649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 26659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (findGrallocBuf == false) { 2669f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("%s:addr(%x) is not matched any gralloc buffer's addr", __func__, virtAddr[0]); 26709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto callbacks; 26719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( doPutPreviewBuf == true 26749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->putPreviewBuf(&previewBuf) == false) 2675f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):putPreviewBuf(%d) fail", __func__, previewBuf.reserved.p); 26769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 26779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin doPutPreviewBuf = false; 26789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 26799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shincallbacks: 26819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_previewRunning == true 26839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_msgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 26849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // resize from previewBuf(max size) to m_previewHeap(user's set size) 26869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPreviewCSC) { 26879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewFormat = m_secCamera->getPreviewFormat(); 26889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_format(m_exynosPreviewCSC, 26909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewW, previewH - 8, 26919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, previewW, previewH - 8, 26929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(previewFormat), 26939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 26949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 26959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_format(m_exynosPreviewCSC, 26969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPreviewRect.w, m_orgPreviewRect.h, 26979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, m_orgPreviewRect.w, m_orgPreviewRect.h, 26989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(m_orgPreviewRect.colorFormat), 26999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1); 27009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_buffer(m_exynosPreviewCSC, 27039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)callbackBuf.virt.extP[0], 27049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)callbackBuf.virt.extP[1], 27059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)callbackBuf.virt.extP[2], 27069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 27079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer dstBuf; 27099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getAlignedYUVSize(m_orgPreviewRect.colorFormat, m_orgPreviewRect.w, m_orgPreviewRect.h, &dstBuf); 27109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf.virt.extP[0] = (char *)m_previewHeap[callbackBuf.reserved.p]->data; 27129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 1; i < 3; i++) { 27139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (dstBuf.size.extS[i] != 0) 27149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf.virt.extP[i] = dstBuf.virt.extP[i-1] + dstBuf.size.extS[i-1]; 27159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 27169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_buffer(m_exynosPreviewCSC, 27189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[0], 27199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[1], 27209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[2], 27219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 27229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (csc_convert(m_exynosPreviewCSC) != 0) 2724f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_convert() fail", __func__); 27259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 2726f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_exynosPreviewCSC == NULL", __func__); 27279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 27289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 27299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* TODO: We need better error handling scheme than this scheme */ 27319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( doPutPreviewBuf == true 27329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->putPreviewBuf(&previewBuf) == false) 2733f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):putPreviewBuf(%d) fail", __func__, previewBuf.reserved.p); 27349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 27359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin doPutPreviewBuf = false; 27369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_previewRunning == true 27389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_msgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 27399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_PREVIEW_FRAME, m_previewHeap[callbackBuf.reserved.p], 0, NULL, m_callbackCookie); 27409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 27419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* Face detection */ 27439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_previewRunning == true 27449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_msgEnabled & CAMERA_MSG_PREVIEW_METADATA 27459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->flagStartFaceDetection() == true) { 27469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_frame_metadata_t *ptrMetadata = NULL; 27489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int id[NUM_OF_DETECTED_FACES]; 27509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int score[NUM_OF_DETECTED_FACES]; 27519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 detectedFace[NUM_OF_DETECTED_FACES]; 27529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 detectedLeftEye[NUM_OF_DETECTED_FACES]; 27539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 detectedRightEye[NUM_OF_DETECTED_FACES]; 27549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect2 detectedMouth[NUM_OF_DETECTED_FACES]; 27559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int numOfDetectedFaces = m_secCamera->getDetectedFacesAreas(NUM_OF_DETECTED_FACES, 27579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin id, 27589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin score, 27599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin detectedFace, 27609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin detectedLeftEye, 27619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin detectedRightEye, 27629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin detectedMouth); 27639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 < numOfDetectedFaces) { 27659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // camera.h 27669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // width : -1000~1000 27679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // height : -1000~1000 27689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // if eye, mouth is not detectable : -2000, -2000. 27699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int realNumOfDetectedFaces = 0; 27719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faceDetected = true; 27729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < numOfDetectedFaces; i++) { 27749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // over 50s, we will catch 27759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //if (score[i] < 50) 27769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // continue; 27779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].rect[0] = m_calibratePosition(previewW, 2000, detectedFace[i].x1) - 1000; 27799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].rect[1] = m_calibratePosition(previewH, 2000, detectedFace[i].y1) - 1000; 27809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].rect[2] = m_calibratePosition(previewW, 2000, detectedFace[i].x2) - 1000; 27819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].rect[3] = m_calibratePosition(previewH, 2000, detectedFace[i].y2) - 1000; 27829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].id = id[i]; 27849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].score = score[i]; 27859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].left_eye[0] = (detectedLeftEye[i].x1 < 0) ? -2000 : m_calibratePosition(previewW, 2000, detectedLeftEye[i].x1) - 1000; 27879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].left_eye[1] = (detectedLeftEye[i].y1 < 0) ? -2000 : m_calibratePosition(previewH, 2000, detectedLeftEye[i].y1) - 1000; 27889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].right_eye[0] = (detectedRightEye[i].x1 < 0) ? -2000 : m_calibratePosition(previewW, 2000, detectedRightEye[i].x1) - 1000; 27909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].right_eye[1] = (detectedRightEye[i].y1 < 0) ? -2000 : m_calibratePosition(previewH, 2000, detectedRightEye[i].y1) - 1000; 27919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].mouth[0] = (detectedMouth[i].x1 < 0) ? -2000 : m_calibratePosition(previewW, 2000, detectedMouth[i].x1) - 1000; 27939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faces[realNumOfDetectedFaces].mouth[1] = (detectedMouth[i].y1 < 0) ? -2000 : m_calibratePosition(previewH, 2000, detectedMouth[i].y1) - 1000; 27949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin realNumOfDetectedFaces++; 27969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 27979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 27989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.number_of_faces = realNumOfDetectedFaces; 27999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.faces = m_faces; 28009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ptrMetadata = &m_frameMetadata; 28029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_PREVIEW_METADATA, m_previewHeap[callbackBuf.reserved.p], 0, ptrMetadata, m_callbackCookie); 28049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if (numOfDetectedFaces == 0 && m_faceDetected == true) { 28059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.number_of_faces = 0; 28069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_frameMetadata.faces = m_faces; 28079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ptrMetadata = &m_frameMetadata; 28099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_PREVIEW_METADATA, m_previewHeap[callbackBuf.reserved.p], 0, ptrMetadata, m_callbackCookie); 28119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_faceDetected = false; 28129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // zero shutter lag 28169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == false 28179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_startPictureInternal() == false) 2818f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_startPictureInternal() fail", __func__); 28199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.lock(); 28219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_captureInProgress == true) { 28229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 28239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 28249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 28259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_numOfAvaliblePictureBuf < NUM_OF_PICTURE_BUF) { 28279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBufferQueue *cur = m_oldPictureBufQueueHead; 28299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin do { 28309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if(cur->next == NULL) { 28319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cur->buf = m_pictureBuf; 28329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 28339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cur = cur->next; 28359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } while (cur->next); 28369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getPictureBuf(&m_pictureBuf) == false) 2838f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):getPictureBuf() fail", __func__); 28399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 28409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvaliblePictureBuf++; 28419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NUM_OF_WAITING_PUT_PICTURE_BUF < m_numOfAvaliblePictureBuf) { 28449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer nullBuf; 28459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer oldBuf; 28469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin oldBuf = m_oldPictureBufQueueHead->buf; 28489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead->buf = nullBuf; 28509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_oldPictureBufQueueHead->next) { 28529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBufferQueue *newQueueHead = m_oldPictureBufQueueHead->next; 28539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead->next = NULL; 28549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead = newQueueHead; 28559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 28569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead = &m_oldPictureBufQueue[0]; 28579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (oldBuf != nullBuf) { 28609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->putPictureBuf(&oldBuf) == false) 2861f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):putPictureBuf(%d) fail", __func__, oldBuf.reserved.p); 28629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else { 28639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvaliblePictureBuf--; 28649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_numOfAvaliblePictureBuf < 0) 28659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvaliblePictureBuf = 0; 28669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 28739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 28749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_videoThreadFuncWrapper(void) 28769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 28779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (1) { 28789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (m_videoRunning == false) { 28799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoLock.lock(); 28809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 28829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartVideo() == true 28839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopVideo() == false) 2884f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->stopVideo()", __func__); 28859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 28869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2887f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):calling mExynosCamera->stopVideo() and waiting", __func__); 28889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoStoppedCondition.signal(); 28909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoCondition.wait(m_videoLock); 2891f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):return from wait", __func__); 28929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoLock.unlock(); 28949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 28959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exitVideoThread == true) { 28979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoLock.lock(); 28989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 28999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 29009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_secCamera->flagStartVideo() == true 29019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopVideo() == false) 2902f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->stopVideo()", __func__); 29039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoLock.unlock(); 29069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 29079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 29089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoThreadFunc(); 29109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 29119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_videoRunning = false; 29129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 29149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 29159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 29169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_videoThreadFunc(void) 29189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 29199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin nsecs_t timestamp; 29209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 29219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer videoBuf; 29229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_numOfAvailableVideoBuf == 0) 29259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin usleep(1000); // sleep 1msec for other threads. 29269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 29289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_msgEnabled & CAMERA_MSG_VIDEO_FRAME 29299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_videoRunning == true) { 29309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_videoLock); 29329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_numOfAvailableVideoBuf == 0) { 2934f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):waiting releaseRecordingFrame()", __func__); 29359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 29369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 29379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 29399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->getVideoBuf(&videoBuf) == false) { 2940f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on ExynosCamera->getVideoBuf()", __func__); 29419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 29429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 29439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf--; 29469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_numOfAvailableVideoBuf < 0) 29479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf = 0; 29489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 29509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Notify the client of a new frame. 29529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( m_msgEnabled & CAMERA_MSG_VIDEO_FRAME 29539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_videoRunning == true) { 29549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // resize from videoBuf(max size) to m_videoHeap(user's set size) 29569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosVideoCSC) { 29579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int videoW, videoH, videoFormat = 0; 29589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int cropX, cropY, cropW, cropH = 0; 29599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef USE_3DNR_DMAOUT 29619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int previewW, previewH, previewFormat = 0; 29629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewFormat = m_secCamera->getPreviewFormat(); 29639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPreviewSize(&previewW, &previewH); 29649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoFormat = m_secCamera->getVideoFormat(); 29669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getVideoSize(&videoW, &videoH); 29679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getRatioSize(videoW, videoH, 29699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgVideoRect.w, m_orgVideoRect.h, 29709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &cropX, &cropY, 29719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &cropW, &cropH, 29729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getZoom()); 29739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 2974f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d", 29759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, cropX, cropY, cropW, cropH); 29769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 29789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_format(m_exynosVideoCSC, 29799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin videoW, videoH, 29809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cropX, cropY, cropW, cropH, 29819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(videoFormat), 29829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 29839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 29849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_format(m_exynosVideoCSC, 29859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin previewW, previewH - 8, 29869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, previewW, previewH - 8, 29879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(previewFormat), 29889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 29899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 29909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_format(m_exynosVideoCSC, 29929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgVideoRect.w, m_orgVideoRect.h, 29939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, m_orgVideoRect.w, m_orgVideoRect.h, 29949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(videoFormat), 29959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1); 29969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 29979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 29989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_buffer(m_exynosVideoCSC, 29999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)videoBuf.virt.extP[0], 30009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)videoBuf.virt.extP[1], 30019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)videoBuf.virt.extP[2], 30029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 30039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 30049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_buffer(m_exynosVideoCSC, 30059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)copy_previewBuf.virt.extP[0], 30069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)copy_previewBuf.virt.extP[2], 30079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)copy_previewBuf.virt.extP[1], 30089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 30099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 30109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer dstBuf; 30129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getAlignedYUVSize(videoFormat, m_orgVideoRect.w, m_orgVideoRect.h, &dstBuf); 30139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 30159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf.virt.extP[0] = (char *)m_resizedVideoHeap[videoBuf.reserved.p]->data; 30169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 30179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf.virt.extP[0] = (char *)m_resizedVideoHeap[m_cntVideoBuf]->data; 30189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 30199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 1; i < 3; i++) { 30209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (dstBuf.size.extS[i] != 0) 30219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf.virt.extP[i] = dstBuf.virt.extP[i-1] + dstBuf.size.extS[i-1]; 30229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_buffer(m_exynosVideoCSC, 30259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[0], 30269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[1], 30279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)dstBuf.virt.extP[2], 30289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 30299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (csc_convert(m_exynosVideoCSC) != 0) 3031f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_convert() fail", __func__); 30329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 3033f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_exynosVideoCSC == NULL", __func__); 30349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 30369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCbTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, 30379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[videoBuf.reserved.p], 0, m_callbackCookie); 30389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#else 30399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCbTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, 30409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_resizedVideoHeap[m_cntVideoBuf], 0, m_callbackCookie); 30419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_cntVideoBuf++; 30429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_cntVideoBuf == NUM_OF_VIDEO_BUF) 30439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_cntVideoBuf = 0; 30449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 30459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // HACK : This must can handle on releaseRecordingFrame() 30489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef USE_3DNR_DMAOUT 30499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->putVideoBuf(&videoBuf); 30509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 30519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf++; 30529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NUM_OF_VIDEO_BUF <= m_numOfAvailableVideoBuf) 30539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvailableVideoBuf = NUM_OF_VIDEO_BUF; 30549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // until here 30559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else 30569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin usleep(1000); // sleep 1msec for stopRecording 30579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 30609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 30619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_autoFocusThreadFunc(void) 30639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 30649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int count =0; 30659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool afResult = false; 3066f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):starting", __func__); 30679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* block until we're told to start. we don't want to use 30699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * a restartable thread and requestExitAndWait() in cancelAutoFocus() 30709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * because it would cause deadlock between our callbacks and the 30719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * caller of cancelAutoFocus() which both want to grab the same lock 30729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * in CameraServices layer. 30739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 30749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.lock(); 30759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* check early exit request */ 30769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exitAutoFocusThread == true) { 30779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.unlock(); 3078f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):exiting on request0", __func__); 30799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 30809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusCondition.wait(m_focusLock); 30839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* check early exit request */ 30849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exitAutoFocusThread == true) { 30859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.unlock(); 3086f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):exiting on request1", __func__); 30879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 30889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_focusLock.unlock(); 30909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->autoFocus() == false) { 3092f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->autoFocus()", __func__); 30939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 30949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 30959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 30969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin switch (m_secCamera->getFucusModeResult()) { 30979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 0: 3098f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):AF Cancelled !!", __func__); 30999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin afResult = true; 31009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 31019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case 1: 3102f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):AF Success!!", __func__); 31039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin afResult = true; 31049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 31059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin default: 3106f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):AF Fail !!", __func__); 31079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin afResult = false; 31089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 31099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // CAMERA_MSG_FOCUS only takes a bool. true for 31129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // finished and false for failure. cancel is still 31139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // considered a true result. 31149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_FOCUS) 31159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_notifyCb(CAMERA_MSG_FOCUS, afResult, 0, m_callbackCookie); 31169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3117f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):exiting with no error", __func__); 31189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 31199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 31209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_startPictureInternal(void) 31229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 31239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == true) { 3124f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Aready m_pictureRunning is running", __func__); 31259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 31269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3128471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin int pictureW, pictureH, pictureFormat; 3129471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin unsigned int pictureFrameSize, pictureChromaSize; 31309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer nullBuf; 3131471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin int numPlanes; 31329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPictureSize(&pictureW, &pictureH); 31349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureFormat = m_secCamera->getPictureFormat(); 3135471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin PLANAR_FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(V4L2_PIX_FMT_NV16), pictureW, pictureH, &pictureFrameSize, 3136471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin &pictureChromaSize); 3137471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin numPlanes = NUM_PLANES(V4L2_PIX_2_HAL_PIXEL_FORMAT(V4L2_PIX_FMT_NV16)); 3138471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin#if 0 31399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_rawHeap) { 31409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap->release(m_rawHeap); 31419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap = 0; 31429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap = m_getMemoryCb(-1, pictureFramesize, 1, NULL); 31449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!m_rawHeap) { 3145f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(m_rawHeap, size(%d) fail", __func__, pictureFramesize); 31469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 31479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat), pictureW, pictureH); 3150471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin#endif 31519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PICTURE_BUF; i++) { 3152471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin for (int j = 0; j < 3; j++) 3153471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin if (m_pictureFds[i][j] >= 0) { 3154471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin close(m_pictureFds[i][j]); 3155471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_pictureFds[i][j] = -1; 3156471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 3157471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 3158eb42d13a54dda74f691c972d993dcbd10b6934b7Rebecca Schultz Zavin m_pictureFds[i][0] = ion_alloc(m_ion_client, pictureFrameSize, 0, ION_HEAP_SYSTEM_MASK, 0); 3159471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin if (m_pictureFds[i][0] < 0) { 3160471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin ALOGE("ERR(%s):ion_alloc(m_pictureFds[%d], size(%d) fail", __func__, i, pictureFrameSize); 3161471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin return false; 3162471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 3163471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 3164471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin for (int j = 1; j < numPlanes; j++) { 3165eb42d13a54dda74f691c972d993dcbd10b6934b7Rebecca Schultz Zavin m_pictureFds[i][j] = ion_alloc(m_ion_client, pictureChromaSize, 0, ION_HEAP_SYSTEM_MASK, 0); 3166471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin if (m_pictureFds[i][j]) { 3167471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin ALOGE("ERR(%s):ion_alloc(m_pictureFds[%d][%d], size(%d) fail", __func__, i, j, pictureFrameSize); 3168471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin return false; 3169471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 3170471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 3171471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_getAlignedYUVSize(pictureFormat, pictureW, pictureH, &m_pictureBuf); 3172471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 3173471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_pictureBuf.fd.extFd[0] = m_pictureFds[i][0]; 3174471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin for (int j = 1; j < 3; j++) { 3175471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin if (m_pictureBuf.size.extS[j] != 0) 3176471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_pictureBuf.fd.extFd[j] = m_pictureFds[i][j]; 3177471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin else 3178471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_pictureBuf.fd.extFd[j] = -1; 3179471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin } 3180471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 3181471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_pictureBuf.reserved.p = i; 3182471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin 3183471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin m_secCamera->setPictureBuf(&m_pictureBuf); 31849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // zero shutter lag 31879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->startPicture() == false) { 3188f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->startPicture()", __func__); 31899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 31909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_numOfAvaliblePictureBuf = 0; 31939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureBuf = nullBuf; 31949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 31959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PICTURE_BUF; i++) { 31969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueue[i].buf = nullBuf; 31979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueue[i].next = NULL; 31989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 31999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_oldPictureBufQueueHead = &m_oldPictureBufQueue[0]; 32019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureRunning = true; 32039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 32059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 32079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_stopPictureInternal(void) 32099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 32109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureRunning == false) { 3211f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Aready m_pictureRunning is stop", __func__); 32129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 32139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 32149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->flagStartPicture() == true 32169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && m_secCamera->stopPicture() == false) 3217f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Fail on m_secCamera->stopPicture()", __func__); 32189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < NUM_OF_PICTURE_BUF; i++) { 32209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_pictureHeap[i]) { 32219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureHeap[i]->release(m_pictureHeap[i]); 32229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureHeap[i] = 0; 32239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 32249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 32259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_rawHeap) { 32279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap->release(m_rawHeap); 32289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_rawHeap = 0; 32299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 32309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureRunning = false; 32329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 32349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 32359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_pictureThreadFunc(void) 32379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 32389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool ret = false; 32399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int pictureW, pictureH, pictureFramesize = 0; 32409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int pictureFormat; 32419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int cropX, cropY, cropW, cropH = 0; 32429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer pictureBuf; 32449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosBuffer jpegBuf; 32459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_memory_t *JpegHeap = NULL; 32479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_memory_t *JpegHeapOut = NULL; 32489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getPictureSize(&pictureW, &pictureH); 32509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureFormat = m_secCamera->getPictureFormat(); 32519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat), pictureW, pictureH); 32529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeap = m_getMemoryCb(-1, pictureFramesize, 1, 0); 32549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!JpegHeap) { 3255f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(JpegHeap, size(%d) fail", __func__, pictureFramesize); 32569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 32579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 32589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // resize from pictureBuf(max size) to rawHeap(user's set size) 32609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_exynosPictureCSC) { 32619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getRatioSize(pictureW, pictureH, 32629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPictureRect.w, m_orgPictureRect.h, 32639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &cropX, &cropY, 32649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin &cropW, &cropH, 32659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_secCamera->getZoom()); 32669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3267f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d", 32689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, cropX, cropY, cropW, cropH); 32699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_format(m_exynosPictureCSC, 32719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureW, pictureH, 32729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cropX, cropY, cropW, cropH, 32739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat), 32749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1); 32759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //0); 32769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_format(m_exynosPictureCSC, 32789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_orgPictureRect.w, m_orgPictureRect.h, 32799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, 0, m_orgPictureRect.w, m_orgPictureRect.h, 32809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin V4L2_PIX_2_HAL_PIXEL_FORMAT(V4L2_PIX_FMT_NV16), 32819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 1); 32829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin //0); 32839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_src_buffer(m_exynosPictureCSC, 32859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)m_pictureBuf.virt.extP[0], 32869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)m_pictureBuf.virt.extP[1], 32879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)m_pictureBuf.virt.extP[2], 32889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 32899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureBuf.size.extS[0] = ALIGN(m_orgPictureRect.w, 16) * ALIGN(m_orgPictureRect.h, 16) * 2; 32919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureBuf.size.extS[1] = 0; 32929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureBuf.size.extS[2] = 0; 32939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureBuf.virt.extP[0] = (char *)m_rawHeap->data; 32959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 32969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin csc_set_dst_buffer(m_exynosPictureCSC, 32979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)pictureBuf.virt.extP[0], 32989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)pictureBuf.virt.extP[1], 32999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (unsigned char *)pictureBuf.virt.extP[2], 33009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0); 33019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (csc_convert(m_exynosPictureCSC) != 0) 3303f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):csc_convert() fail", __func__); 33049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 3305f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_exynosPictureCSC == NULL", __func__); 33069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_SHUTTER) 33099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_notifyCb(CAMERA_MSG_SHUTTER, 0, 0, m_callbackCookie); 33109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_getAlignedYUVSize(V4L2_PIX_FMT_NV16, m_orgPictureRect.w, m_orgPictureRect.h, &pictureBuf); 33129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 1; i < 3; i++) { 33149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pictureBuf.size.extS[i] != 0) 33159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pictureBuf.virt.extP[i] = pictureBuf.virt.extP[i-1] + pictureBuf.size.extS[i-1]; 33169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3317f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("(%s): pictureBuf.size.extS[%d] = %d", __func__, i, pictureBuf.size.extS[i]); 33189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) { 33219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpegBuf.virt.p = (char *)JpegHeap->data; 33229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpegBuf.size.s = pictureFramesize; 33239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ExynosRect jpegRect; 33259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpegRect.w = m_orgPictureRect.w; 33269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpegRect.h = m_orgPictureRect.h; 33279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpegRect.colorFormat = V4L2_PIX_FMT_NV16; 33289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_secCamera->yuv2Jpeg(&pictureBuf, &jpegBuf, &jpegRect) == false) { 3330f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):yuv2Jpeg() fail", __func__); 33319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.lock(); 33329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_captureInProgress = false; 33339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.lock(); 33349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureCondition.signal(); 33359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.unlock(); 33369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 33379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto out; 33389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.lock(); 33429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_captureInProgress = false; 33439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.lock(); 33449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureCondition.signal(); 33459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_pictureLock.unlock(); 33469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_stateLock.unlock(); 33479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_RAW_IMAGE) 33499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_RAW_IMAGE, m_rawHeap, 0, NULL, m_callbackCookie); 33509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* TODO: Currently framework dose not support CAMERA_MSG_RAW_IMAGE_NOTIFY callback */ 33529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* 33539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_RAW_IMAGE_NOTIFY) 33549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, m_rawHeap, 0, NULL, m_callbackCookie); 33559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 33569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_POSTVIEW_FRAME) 33589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_POSTVIEW_FRAME, m_rawHeap, 0, NULL, m_callbackCookie); 33599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_msgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) { 33619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeapOut = m_getMemoryCb(-1, jpegBuf.size.s, 1, 0); 33629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!JpegHeapOut) { 3363f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_getMemoryCb(JpegHeapOut, size(%d) fail", __func__, jpegBuf.size.s); 33649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 33659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // TODO : we shall pass JpegHeap mem directly? 33689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(JpegHeapOut->data, JpegHeap->data, jpegBuf.size.s); 33699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_dataCb(CAMERA_MSG_COMPRESSED_IMAGE, JpegHeapOut, 0, NULL, m_callbackCookie); 33719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_videoStart == false) 33749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin stopPreview(); 33759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3376f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_pictureThread end", __func__); 33779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = true; 33799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinout: 33819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (JpegHeapOut) { 33839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeapOut->release(JpegHeapOut); 33849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeapOut = 0; 33859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (JpegHeap) { 33889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeap->release(JpegHeap); 33899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin JpegHeap = 0; 33909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 33919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return ret; 33939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 33949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 33959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef LOG_NDEBUG 33969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_fileDump(char *filename, void *srcBuf, uint32_t size) 33979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 33989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin FILE *yuv_fd = NULL; 33999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *buffer = NULL; 34009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin static int count = 0; 34019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin yuv_fd = fopen(filename, "w+"); 34039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_fd == NULL) { 3405f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR file open fail: %s", filename); 34069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 34079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 34089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buffer = (char *)malloc(size); 34109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (buffer == NULL) { 3412f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR malloc file"); 34139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fclose(yuv_fd); 34149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 34159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 34169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(buffer, srcBuf, size); 34189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fflush(stdout); 34209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fwrite(buffer, 1, size, yuv_fd); 34229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fflush(yuv_fd); 34249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_fd) 34269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fclose(yuv_fd); 34279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (buffer) 34289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin free(buffer); 34299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3430f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("filedump(%s) is successed!!", filename); 34319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 34329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 34339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif 34349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::m_setSkipFrame(int frame) 34369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 34379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin Mutex::Autolock lock(m_skipFrameLock); 34389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (frame < m_skipFrame) 34399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return; 34409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_skipFrame = frame; 34429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 34439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinint ExynosCameraHWInterface::m_saveJpeg( unsigned char *real_jpeg, int jpeg_size) 34459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 34469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin FILE *yuv_fp = NULL; 34479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char filename[100], *buffer = NULL; 34489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin /* file create/open, note to "wb" */ 34509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin yuv_fp = fopen("/data/camera_dump.jpeg", "wb"); 34519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_fp == NULL) { 3452f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("Save jpeg file open error"); 34539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return -1; 34549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 34559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3456f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):[BestIQ] real_jpeg size ========> %d", __func__, jpeg_size); 34579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buffer = (char *) malloc(jpeg_size); 34589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (buffer == NULL) { 3459f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("Save YUV] buffer alloc failed"); 34609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_fp) 34619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fclose(yuv_fp); 34629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return -1; 34649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 34659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(buffer, real_jpeg, jpeg_size); 34679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fflush(stdout); 34699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fwrite(buffer, 1, jpeg_size, yuv_fp); 34719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fflush(yuv_fp); 34739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_fp) 34759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin fclose(yuv_fp); 34769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (buffer) 34779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin free(buffer); 34789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 34809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 34819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 34829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::m_savePostView(const char *fname, uint8_t *buf, uint32_t size) 34839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 34849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int nw; 34859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int cnt = 0; 34869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin uint32_t written = 0; 34879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3488f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGD("opening file [%s]", fname); 34896d6b76cc8e61620ba27de268a91cf892ba76a14aNick Kralevich int fd = open(fname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 34909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (fd < 0) { 3491f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("failed to create file [%s]: %s", fname, strerror(errno)); 34929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return; 34939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 34949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3495f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGD("writing %d bytes to file [%s]", size, fname); 34969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (written < size) { 34979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin nw = ::write(fd, buf + written, size - written); 34989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (nw < 0) { 3499f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("failed to write to file %d [%s]: %s",written,fname, strerror(errno)); 35009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 35019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin written += nw; 35039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cnt++; 35049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3505f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGD("done writing %d bytes to file [%s] in %d passes",size, fname, cnt); 35069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ::close(fd); 35079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 35089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHeight, 35109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *dstBuf, uint32_t dstWidth, uint32_t dstHeight) 35119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 35129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int32_t step_x, step_y; 35139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int32_t iXsrc, iXdst; 35149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int32_t x, y, src_y_start_pos, dst_pos, src_pos; 35159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (dstWidth % 2 != 0 || dstHeight % 2 != 0) { 3517f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("scale_down_yuv422: invalid width, height for scaling"); 35189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 35199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin step_x = srcWidth / dstWidth; 35229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin step_y = srcHeight / dstHeight; 35239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dst_pos = 0; 35259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t y = 0; y < dstHeight; y++) { 35269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_y_start_pos = (y * step_y * (srcWidth * 2)); 35279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t x = 0; x < dstWidth; x += 2) { 35299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_pos = src_y_start_pos + (x * (step_x * 2)); 35309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf[dst_pos++] = srcBuf[src_pos ]; 35329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf[dst_pos++] = srcBuf[src_pos + 1]; 35339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf[dst_pos++] = srcBuf[src_pos + 2]; 35349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBuf[dst_pos++] = srcBuf[src_pos + 3]; 35359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 35399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 35409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight) 35429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 35439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int32_t x, y, src_y_start_pos, dst_cbcr_pos, dst_pos, src_pos; 35449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *srcBufPointer = (unsigned char *)srcBuf; 35459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *dstBufPointer = (unsigned char *)dstBuf; 35469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dst_pos = 0; 35489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dst_cbcr_pos = srcWidth*srcHeight; 35499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t y = 0; y < srcHeight; y++) { 35509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_y_start_pos = (y * (srcWidth * 2)); 35519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t x = 0; x < (srcWidth * 2); x += 2) { 35539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_pos = src_y_start_pos + x; 35549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBufPointer[dst_pos++] = srcBufPointer[src_pos]; 35569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t y = 0; y < srcHeight; y += 2) { 35599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_y_start_pos = (y * (srcWidth * 2)); 35609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (uint32_t x = 0; x < (srcWidth * 2); x += 4) { 35629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_pos = src_y_start_pos + x; 35639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 3]; 35659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 1]; 35669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 35709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 35719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_checkVideoStartMarker(unsigned char *pBuf) 35739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 35749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!pBuf) { 3575f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("m_checkVideoStartMarker() => pBuf is NULL"); 35769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 35779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (HIBYTE(VIDEO_COMMENT_MARKER_H) == * pBuf && LOBYTE(VIDEO_COMMENT_MARKER_H) == *(pBuf + 1) && 35809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin HIBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 2) && LOBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 3)) 35819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 35829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 35849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 35859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_checkEOIMarker(unsigned char *pBuf) 35879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 35889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!pBuf) { 3589f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("m_checkEOIMarker() => pBuf is NULL"); 35909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 35919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 35929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // EOI marker [FF D9] 35949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (HIBYTE(JPEG_EOI_MARKER) == *pBuf && LOBYTE(JPEG_EOI_MARKER) == *(pBuf + 1)) 35959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 35969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 35979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 35989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 35999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_findEOIMarkerInJPEG(unsigned char *pBuf, int dwBufSize, int *pnJPEGsize) 36019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 36029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NULL == pBuf || 0 >= dwBufSize) { 3603f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("m_findEOIMarkerInJPEG() => There is no contents."); 36049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 36059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *pBufEnd = pBuf + dwBufSize; 36089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (pBuf < pBufEnd) { 36109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_checkEOIMarker(pBuf++)) 36119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 36129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (*pnJPEGsize)++; 36149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 36179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 36189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_splitFrame(unsigned char *pFrame, int dwSize, 36209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int dwJPEGLineLength, int dwVideoLineLength, int dwVideoHeight, 36219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *pJPEG, int *pdwJPEGSize, 36229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *pVideo, int *pdwVideoSize) 36239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 3624f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):===========m_splitFrame Start==============", __func__); 36259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (NULL == pFrame || 0 >= dwSize) { 3627f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("There is no contents (pFrame=%p, dwSize=%d", pFrame, dwSize); 36289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 36299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (0 == dwJPEGLineLength || 0 == dwVideoLineLength) { 3632f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("There in no input information for decoding interleaved jpeg"); 36339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 36349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *pSrc = pFrame; 36379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *pSrcEnd = pFrame + dwSize; 36389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *pJ = (unsigned char *)pJPEG; 36409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int dwJSize = 0; 36419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *pV = (unsigned char *)pVideo; 36429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int dwVSize = 0; 36439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool bRet = false; 36459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool isFinishJpeg = false; 36469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (pSrc < pSrcEnd) { 36489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Check video start marker 36499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_checkVideoStartMarker(pSrc)) { 36509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int copyLength; 36519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pSrc + dwVideoLineLength <= pSrcEnd) 36539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin copyLength = dwVideoLineLength; 36549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 36559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin copyLength = pSrcEnd - pSrc - VIDEO_COMMENT_MARKER_LENGTH; 36569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Copy video data 36589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pV) { 36599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(pV, pSrc + VIDEO_COMMENT_MARKER_LENGTH, copyLength); 36609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pV += copyLength; 36619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dwVSize += copyLength; 36629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pSrc += copyLength + VIDEO_COMMENT_MARKER_LENGTH; 36659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 36669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Copy pure JPEG data 36679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int size = 0; 36689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int dwCopyBufLen = dwJPEGLineLength <= pSrcEnd-pSrc ? dwJPEGLineLength : pSrcEnd - pSrc; 36699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_findEOIMarkerInJPEG((unsigned char *)pSrc, dwCopyBufLen, &size)) { 36719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin isFinishJpeg = true; 36729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin size += 2; // to count EOF marker size 36739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 36749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((dwCopyBufLen == 1) && (pJPEG < pJ)) { 36759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char checkBuf[2] = { *(pJ - 1), *pSrc }; 36769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_checkEOIMarker(checkBuf)) 36789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin isFinishJpeg = true; 36799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin size = dwCopyBufLen; 36819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(pJ, pSrc, size); 36849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dwJSize += size; 36869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pJ += dwCopyBufLen; 36889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin pSrc += dwCopyBufLen; 36899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (isFinishJpeg) 36919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 36929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 36939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 36949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (isFinishJpeg) { 36959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bRet = true; 36969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pdwJPEGSize) 36979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *pdwJPEGSize = dwJSize; 36989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pdwVideoSize) 36999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *pdwVideoSize = dwVSize; 37009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 3701f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("DecodeInterleaveJPEG_WithOutDT() => Can not find EOI"); 37029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bRet = false; 37039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pdwJPEGSize) 37049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *pdwJPEGSize = 0; 37059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pdwVideoSize) 37069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *pdwVideoSize = 0; 37079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3708f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):===========m_splitFrame end==============", __func__); 37099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return bRet; 37119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 37129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinint ExynosCameraHWInterface::m_decodeInterleaveData(unsigned char *pInterleaveData, 37149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int interleaveDataSize, 37159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int yuvWidth, 37169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int yuvHeight, 37179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int *pJpegSize, 37189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *pJpegData, 37199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void *pYuvData) 37209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 37219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pInterleaveData == NULL) 37229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 37239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool ret = true; 37259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned int *interleave_ptr = (unsigned int *)pInterleaveData; 37269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *jpeg_ptr = (unsigned char *)pJpegData; 37279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *yuv_ptr = (unsigned char *)pYuvData; 37289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned char *p; 37299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int jpeg_size = 0; 37309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int yuv_size = 0; 37319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int i = 0; 37339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 3734f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_decodeInterleaveData Start~~~", __func__); 37359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin while (i < interleaveDataSize) { 37369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((*interleave_ptr == 0xFFFFFFFF) || (*interleave_ptr == 0x02FFFFFF) || 37379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin (*interleave_ptr == 0xFF02FFFF)) { 37389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Padding Data 37399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin interleave_ptr++; 37409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin i += 4; 37419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else if ((*interleave_ptr & 0xFFFF) == 0x05FF) { 37429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Start-code of YUV Data 37439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p = (unsigned char *)interleave_ptr; 37449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p += 2; 37459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin i += 2; 37469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Extract YUV Data 37489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pYuvData != NULL) { 37499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(yuv_ptr, p, yuvWidth * 2); 37509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin yuv_ptr += yuvWidth * 2; 37519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin yuv_size += yuvWidth * 2; 37529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin p += yuvWidth * 2; 37549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin i += yuvWidth * 2; 37559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Check End-code of YUV Data 37579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ((*p == 0xFF) && (*(p + 1) == 0x06)) { 37589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin interleave_ptr = (unsigned int *)(p + 2); 37599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin i += 2; 37609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 37619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = false; 37629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 37639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 37659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Extract JPEG Data 37669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pJpegData != NULL) { 37679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(jpeg_ptr, interleave_ptr, 4); 37689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpeg_ptr += 4; 37699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpeg_size += 4; 37709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin interleave_ptr++; 37729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin i += 4; 37739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (ret) { 37769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pJpegData != NULL) { 37779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Remove Padding after EOI 37789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (i = 0; i < 3; i++) { 37799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (*(--jpeg_ptr) != 0xFF) { 37809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 37819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin jpeg_size--; 37839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *pJpegSize = jpeg_size; 37859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // Check YUV Data Size 37889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (pYuvData != NULL) { 37899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (yuv_size != (yuvWidth * yuvHeight * 2)) { 37909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = false; 37919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 37939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 3794f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):m_decodeInterleaveData End~~~", __func__); 37959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return ret; 37969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 37979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 37989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_isSupportedPreviewSize(const int width, 37999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const int height) const 38009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 38019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned int i; 38029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (i = 0; i < m_supportedPreviewSizes.size(); i++) { 38049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_supportedPreviewSizes[i].width == width && 38059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin m_supportedPreviewSizes[i].height == height) 38069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 38079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 38089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 38109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 38119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinvoid ExynosCameraHWInterface::m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf) 38139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 38149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin switch (colorFormat) { 38159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // 1p 38169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_RGB565 : 38179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YUYV : 38189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_UYVY : 38199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_VYUY : 38209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YVYU : 38219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(colorFormat), w, h); 38229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = 0; 38239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = 0; 38249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // 2p 38269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV12 : 38279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV12T : 38289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV21 : 38299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16); 38309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = ALIGN(w/2, 16) * ALIGN(h/2, 16); 38319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = 0; 38329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV12M : 38349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV12MT_16X16 : 38359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = ALIGN(ALIGN(w, 16) * ALIGN(h, 16), 2048); 38369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = ALIGN(ALIGN(w, 16) * ALIGN(h >> 1, 8), 2048); 38379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = 0; 38389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV16 : 38409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_NV61 : 38419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16); 38429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = ALIGN(w, 16) * ALIGN(h, 16); 38439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = 0; 38449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // 3p 38469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YUV420 : 38479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YVU420 : 38489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = (w * h); 38499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = (w * h) >> 2; 38509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = (w * h) >> 2; 38519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YUV420M: 38539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YVU420M : 38549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin case V4L2_PIX_FMT_YUV422P : 38559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16); 38569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[1] = ALIGN(w/2, 8) * ALIGN(h/2, 8); 38579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf->size.extS[2] = ALIGN(w/2, 8) * ALIGN(h/2, 8); 38589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin default: 3860f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):unmatched colorFormat(%d)", __func__, colorFormat); 38619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return; 38629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 38639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 38649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 38659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_getResolutionList(String8 & string8Buf, char * strBuf, int w, int h) 38679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 38689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool ret = false; 38699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool flagFirst = true; 38709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // this is up to /packages/apps/Camera/res/values/arrays.xml 38729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int RESOLUTION_LIST[][2] = 38739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 38749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 3264, 2448}, 38759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 2592, 1936}, 38769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 2576, 1948}, 38779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 2560, 1920}, 38789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 2048, 1536}, 38799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 1920, 1080}, 38809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 1600, 1200}, 38819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 1280, 720}, 38829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 1024, 768}, 38839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 800, 600}, 38849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 800, 480}, 38859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 720, 480}, 38869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 640, 480}, 38879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 528, 432}, 38889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 480, 320}, 38899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 352, 288}, 38909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 320, 240}, 38919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 176, 144} 38929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin }; 38939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int sizeOfResSize = sizeof(RESOLUTION_LIST) / (sizeof(int) * 2); 38959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 38969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < sizeOfResSize; i++) { 38979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( RESOLUTION_LIST[i][0] <= w 38989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && RESOLUTION_LIST[i][1] <= h) { 38999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (flagFirst == true) 39009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin flagFirst = false; 39019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 39029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin string8Buf.append(","); 39039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin sprintf(strBuf, "%dx%d", RESOLUTION_LIST[i][0], RESOLUTION_LIST[i][1]); 39059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin string8Buf.append(strBuf); 39069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin ret = true; 39089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (ret == false) 3912f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):cannot find resolutions", __func__); 39139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return ret; 39159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 39169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_getZoomRatioList(String8 & string8Buf, char * strBuf, int maxZoom, int start, int end) 39189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 39199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bool flagFirst = true; 39209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int cur = start; 39229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int step = (end - start) / maxZoom; 39239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < maxZoom; i++) { 39259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin sprintf(strBuf, "%d", cur); 39269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin string8Buf.append(strBuf); 39279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin string8Buf.append(","); 39289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin cur += step; 39299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin sprintf(strBuf, "%d", end); 39329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin string8Buf.append(strBuf); 39339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : "100,130,160,190,220,250,280,310,340,360,400" 39359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 39379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 39389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinint ExynosCameraHWInterface::m_bracketsStr2Ints(char *str, int num, ExynosRect2 *rect2s, int *weights) 39409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 39419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *curStr = str; 39429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char buf[128]; 39439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *bracketsOpen; 39449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *bracketsClose; 39459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int tempArray[5]; 39479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int validFocusedAreas = 0; 39489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 0; i < num; i++) { 39509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (curStr == NULL) 39519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 39529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bracketsOpen = strchr(curStr, '('); 39549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (bracketsOpen == NULL) 39559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 39569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bracketsClose = strchr(bracketsOpen, ')'); 39589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (bracketsClose == NULL) 39599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 39609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strncpy(buf, bracketsOpen, bracketsClose - bracketsOpen + 1); 39629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf[bracketsClose - bracketsOpen + 1] = 0; 39639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (m_subBracketsStr2Ints(5, buf, tempArray) == false) { 3965f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):m_subBracketsStr2Ints(%s) fail", __func__, buf); 39669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 39679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x1 = tempArray[0]; 39709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y1 = tempArray[1]; 39719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].x2 = tempArray[2]; 39729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin rect2s[i].y2 = tempArray[3]; 39739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin weights[i] = tempArray[4]; 39749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin validFocusedAreas++; 39769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin curStr = bracketsClose; 39789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return validFocusedAreas; 39809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 39819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_subBracketsStr2Ints(int num, char *str, int *arr) 39839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 39849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (str == NULL || arr == NULL) { 3985f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):str or arr is NULL", __func__); 39869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 39879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 39889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : (-10,-10,0,0,300) 39909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char buf[128]; 39919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *bracketsOpen; 39929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *bracketsClose; 39939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin char *tok; 39949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 39959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bracketsOpen = strchr(str, '('); 39969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (bracketsOpen == NULL) { 3997f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):no '('", __func__); 39989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 39999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin bracketsClose = strchr(bracketsOpen, ')'); 40029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (bracketsClose == NULL) { 4003f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):no ')'", __func__); 40049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 40059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin strncpy(buf, bracketsOpen + 1, bracketsClose - bracketsOpen + 1); 40089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin buf[bracketsClose - bracketsOpen + 1] = 0; 40099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin tok = strtok(buf, ","); 40119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (tok == NULL) { 4012f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):strtok(%s) fail", __func__, buf); 40139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 40149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin arr[0] = atoi(tok); 40179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin for (int i = 1; i < num; i++) { 40199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin tok = strtok(NULL, ","); 40209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (tok == NULL) { 40219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (i < num - 1) { 4022f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):strtok() (index : %d, num : %d) fail", __func__, i, num); 40239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return false; 40249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin break; 40269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin arr[i] = atoi(tok); 40299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 40329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 40339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinbool ExynosCameraHWInterface::m_getRatioSize(int src_w, int src_h, 40359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int dst_w, int dst_h, 40369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int *crop_x, int *crop_y, 40379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int *crop_w, int *crop_h, 40389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int zoom) 40399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 40409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = src_w; 40419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = src_h; 40429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( src_w != dst_w 40449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin || src_h != dst_h) { 40459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin float src_ratio = 1.0f; 40469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin float dst_ratio = 1.0f; 40479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : 1024 / 768 40499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin src_ratio = (float)src_w / (float)src_h; 40509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // ex : 352 / 288 40529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin dst_ratio = (float)dst_w / (float)dst_h; 40539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (src_ratio != dst_ratio) { 40559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (dst_w * dst_h < src_w * src_h) { 40569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (src_ratio <= dst_ratio) { 40579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // shrink h 40589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = src_w; 40599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = src_w / dst_ratio; 40609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 40619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // shrink w 40629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = dst_h * dst_ratio; 40639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = dst_h; 40649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 40669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (src_ratio <= dst_ratio) { 40679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // shrink h 40689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = src_w; 40699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = src_w / dst_ratio; 40709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 40719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin // shrink w 40729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = src_h * dst_ratio; 40739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = src_h; 40749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (zoom != 0) { 40789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int zoomLevel = ((float)zoom + 10.0) / 10.0; 40799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w = (int)((float)*crop_w / zoomLevel); 40809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h = (int)((float)*crop_h / zoomLevel); 40819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin #define CAMERA_CROP_WIDTH_RESTRAIN_NUM (0x2) 40869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned int w_align = (*crop_w & (CAMERA_CROP_WIDTH_RESTRAIN_NUM - 1)); 40879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (w_align != 0) { 40889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1) <= w_align 40899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && *crop_w + (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align) <= dst_w) { 40909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w += (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align); 40919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 40939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_w -= w_align; 40949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 40959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 40969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin #define CAMERA_CROP_HEIGHT_RESTRAIN_NUM (0x2) 40979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin unsigned int h_align = (*crop_h & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - 1)); 40989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (h_align != 0) { 40999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if ( (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1) <= h_align 41009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin && *crop_h + (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align) <= dst_h) { 41019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h += (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align); 41029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 41039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin else 41049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_h -= h_align; 41059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 41069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_x = (src_w - *crop_w) >> 1; 41089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_y = (src_h - *crop_h) >> 1; 41099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (*crop_x & (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1)) 41119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_x -= 1; 41129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (*crop_y & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1)) 41149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *crop_y -= 1; 41159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return true; 41179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinint ExynosCameraHWInterface::m_calibratePosition(int w, int new_w, int pos) 41209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 41219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return (float)(pos * new_w) / (float)w; 41229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic CameraInfo sCameraInfo[] = { 41259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 41269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CAMERA_FACING_BACK, 41279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, /* orientation */ 41289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin }, 41299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin { 41309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CAMERA_FACING_FRONT, 41319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 0, /* orientation */ 41329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 41339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin}; 41349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** Close this device */ 41369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic camera_device_t *g_cam_device; 41389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_close(struct hw_device_t* device) 41409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4141f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 41429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (device) { 41439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_device_t *cam_device = (camera_device_t *)device; 41449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin delete static_cast<ExynosCameraHWInterface *>(cam_device->priv); 41459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin free(cam_device); 41469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device = 0; 41479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 41489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 41499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic inline ExynosCameraHWInterface *obj(struct camera_device *dev) 41529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 41539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return reinterpret_cast<ExynosCameraHWInterface *>(dev->priv); 41549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** Set the preview_stream_ops to which preview frames are sent */ 41579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_set_preview_window(struct camera_device *dev, 41589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin struct preview_stream_ops *buf) 41599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4160f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 41619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->setPreviewWindow(buf); 41629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** Set the notification and data callbacks */ 41659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_set_callbacks(struct camera_device *dev, 41669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_notify_callback notify_cb, 41679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_data_callback data_cb, 41689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_data_timestamp_callback data_cb_timestamp, 41699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin camera_request_memory get_memory, 41709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin void* user) 41719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4172f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 41739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->setCallbacks(notify_cb, data_cb, data_cb_timestamp, 41749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin get_memory, 41759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin user); 41769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 41799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * The following three functions all take a msg_type, which is a bitmask of 41809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * the messages defined in include/ui/Camera.h 41819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 41829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 41849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Enable a message, or set of messages. 41859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 41869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_enable_msg_type(struct camera_device *dev, int32_t msg_type) 41879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4188f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 41899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->enableMsgType(msg_type); 41909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 41919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 41929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 41939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Disable a message, or a set of messages. 41949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 41959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera 41969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * HAL should not rely on its client to call releaseRecordingFrame() to 41979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * release video recording frames sent out by the cameral HAL before and 41989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * after the disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera HAL 41999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * clients must not modify/access any video recording frame after calling 42009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * disableMsgType(CAMERA_MSG_VIDEO_FRAME). 42019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_disable_msg_type(struct camera_device *dev, int32_t msg_type) 42039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4204f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->disableMsgType(msg_type); 42069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Query whether a message, or a set of messages, is enabled. Note that 42109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * this is operates as an AND, if any of the messages queried are off, this 42119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * will return false. 42129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_msg_type_enabled(struct camera_device *dev, int32_t msg_type) 42149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4215f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->msgTypeEnabled(msg_type); 42179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Start preview mode. 42219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_start_preview(struct camera_device *dev) 42239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4224f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->startPreview(); 42269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Stop a previously started preview. 42309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_stop_preview(struct camera_device *dev) 42329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4233f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->stopPreview(); 42359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Returns true if preview is enabled. 42399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_preview_enabled(struct camera_device *dev) 42419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4242f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->previewEnabled(); 42449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Request the camera HAL to store meta data or real YUV data in the video 42489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * buffers sent out via CAMERA_MSG_VIDEO_FRAME for a recording session. If 42499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * it is not called, the default camera HAL behavior is to store real YUV 42509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * data in the video buffers. 42519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 42529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * This method should be called before startRecording() in order to be 42539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * effective. 42549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 42559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * If meta data is stored in the video buffers, it is up to the receiver of 42569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * the video buffers to interpret the contents and to find the actual frame 42579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * data with the help of the meta data in the buffer. How this is done is 42589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * outside of the scope of this method. 42599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 42609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Some camera HALs may not support storing meta data in the video buffers, 42619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * but all camera HALs should support storing real YUV data in the video 42629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * buffers. If the camera HAL does not support storing the meta data in the 42639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * video buffers when it is requested to do do, INVALID_OPERATION must be 42649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * returned. It is very useful for the camera HAL to pass meta data rather 42659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * than the actual frame data directly to the video encoder, since the 42669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * amount of the uncompressed frame data can be very large if video size is 42679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * large. 42689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 42699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * @param enable if true to instruct the camera HAL to store 42709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * meta data in the video buffers; false to instruct 42719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * the camera HAL to store real YUV data in the video 42729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * buffers. 42739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 42749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * @return OK on success. 42759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_store_meta_data_in_buffers(struct camera_device *dev, int enable) 42779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4278f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->storeMetaDataInBuffers(enable); 42809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Start record mode. When a record image is available, a 42849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * CAMERA_MSG_VIDEO_FRAME message is sent with the corresponding 42859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * frame. Every record frame must be released by a camera HAL client via 42869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * releaseRecordingFrame() before the client calls 42879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls 42889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's 42899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * responsibility to manage the life-cycle of the video recording frames, 42909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * and the client must not modify/access any video recording frames. 42919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 42929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_start_recording(struct camera_device *dev) 42939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4294f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 42959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->startRecording(); 42969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 42979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 42989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 42999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Stop a previously started recording. 43009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_stop_recording(struct camera_device *dev) 43029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4303f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->stopRecording(); 43059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Returns true if recording is enabled. 43099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_recording_enabled(struct camera_device *dev) 43119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4312f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->recordingEnabled(); 43149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 43189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * 43199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * It is camera HAL client's responsibility to release video recording 43209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * frames sent out by the camera HAL before the camera HAL receives a call 43219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives the call to 43229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's 43239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * responsibility to manage the life-cycle of the video recording frames. 43249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_release_recording_frame(struct camera_device *dev, 43269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const void *opaque) 43279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4328f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->releaseRecordingFrame(opaque); 43309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Start auto focus, the notification callback routine is called with 43349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() will be 43359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * called again if another auto focus is needed. 43369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_auto_focus(struct camera_device *dev) 43389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4339f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->autoFocus(); 43419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Cancels auto-focus function. If the auto-focus is still in progress, 43459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * this function will cancel it. Whether the auto-focus is in progress or 43469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * not, this function will return the focus position to the default. If 43479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * the camera does not support auto-focus, this is a no-op. 43489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_cancel_auto_focus(struct camera_device *dev) 43509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4351f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->cancelAutoFocus(); 43539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Take a picture. 43579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_take_picture(struct camera_device *dev) 43599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4360f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->takePicture(); 43629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Cancel a picture that was started with takePicture. Calling this method 43669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * when no picture is being taken is a no-op. 43679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_cancel_picture(struct camera_device *dev) 43699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4370f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->cancelPicture(); 43729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 43759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Set the camera parameters. This returns BAD_VALUE if any parameter is 43769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * invalid or not supported. 43779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 43789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_set_parameters(struct camera_device *dev, 43799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *parms) 43809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4381f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin String8 str(parms); 43839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters p(str); 43849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->setParameters(p); 43859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** Return the camera parameters. */ 43889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinchar *HAL_camera_device_get_parameters(struct camera_device *dev) 43899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4390f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 43919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin String8 str; 43929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin CameraParameters parms = obj(dev)->getParameters(); 43939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin str = parms.flatten(); 43949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return strdup(str.string()); 43959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 43969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 43979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_put_parameters(struct camera_device *dev, char *parms) 43989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4399f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin free(parms); 44019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 44049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Send command to camera driver. 44059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 44069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_send_command(struct camera_device *dev, 44079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int32_t cmd, int32_t arg1, int32_t arg2) 44089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4409f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->sendCommand(cmd, arg1, arg2); 44119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 44149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Release the hardware resources owned by this object. Note that this is 44159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * *not* done in the destructor. 44169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 44179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic void HAL_camera_device_release(struct camera_device *dev) 44189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4419f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin obj(dev)->release(); 44219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin/** 44249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin * Dump state of the camera hardware 44259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */ 44269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_dump(struct camera_device *dev, int fd) 44279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4428f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return obj(dev)->dump(fd); 44309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_getNumberOfCameras() 44339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4434f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return sizeof(sCameraInfo) / sizeof(sCameraInfo[0]); 44369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_getCameraInfo(int cameraId, struct camera_info *cameraInfo) 44399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4440f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin memcpy(cameraInfo, &sCameraInfo[cameraId], sizeof(CameraInfo)); 44429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 44439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 44449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define SET_METHOD(m) m : HAL_camera_device_##m 44469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic camera_device_ops_t camera_device_ops = { 44489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(set_preview_window), 44499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(set_callbacks), 44509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(enable_msg_type), 44519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(disable_msg_type), 44529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(msg_type_enabled), 44539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(start_preview), 44549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(stop_preview), 44559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(preview_enabled), 44569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(store_meta_data_in_buffers), 44579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(start_recording), 44589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(stop_recording), 44599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(recording_enabled), 44609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(release_recording_frame), 44619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(auto_focus), 44629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(cancel_auto_focus), 44639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(take_picture), 44649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(cancel_picture), 44659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(set_parameters), 44669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(get_parameters), 44679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(put_parameters), 44689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(send_command), 44699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(release), 44709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin SET_METHOD(dump), 44719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin}; 44729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#undef SET_METHOD 44749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic int HAL_camera_device_open(const struct hw_module_t* module, 44769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin const char *id, 44779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin struct hw_device_t** device) 44789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin{ 4479f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):", __func__); 44809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin int cameraId = atoi(id); 44829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (cameraId < 0 || cameraId >= HAL_getNumberOfCameras()) { 4483f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Invalid camera ID %s", __func__, id); 44849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return -EINVAL; 44859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 44869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (g_cam_device) { 44889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (obj(g_cam_device)->getCameraId() == cameraId) { 4489f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):returning existing camera ID %s", __func__, id); 44909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin goto done; 44919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } else { 4492f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGE("ERR(%s):Cannot open camera %d. camera %d is already running!", 44939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin __func__, cameraId, obj(g_cam_device)->getCameraId()); 44949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return -ENOSYS; 44959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 44969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin } 44979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 44989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device = (camera_device_t *)malloc(sizeof(camera_device_t)); 44999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin if (!g_cam_device) 45009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return -ENOMEM; 45019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->common.tag = HARDWARE_DEVICE_TAG; 45039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->common.version = 1; 45049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->common.module = const_cast<hw_module_t *>(module); 45059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->common.close = HAL_camera_device_close; 45069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->ops = &camera_device_ops; 45089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 4509f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):open camera %s", __func__, id); 45109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin g_cam_device->priv = new ExynosCameraHWInterface(cameraId, g_cam_device); 45129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shindone: 45149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *device = (hw_device_t *)g_cam_device; 4515f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin ALOGV("DEBUG(%s):opened camera %s (%p)", __func__, id, *device); 45169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin return 0; 45179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 45189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinstatic hw_module_methods_t camera_module_methods = { 45209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin open : HAL_camera_device_open 45219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin}; 45229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinextern "C" { 45249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin struct camera_module HAL_MODULE_INFO_SYM = { 45259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin common : { 45269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin tag : HARDWARE_MODULE_TAG, 45279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin version_major : 1, 45289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin version_minor : 0, 45299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin id : CAMERA_HARDWARE_MODULE_ID, 45309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin name : "orion camera HAL", 45319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin author : "Samsung Corporation", 45329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin methods : &camera_module_methods, 45339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin }, 45349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin get_number_of_cameras : HAL_getNumberOfCameras, 45359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin get_camera_info : HAL_getCameraInfo 45369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin }; 45379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin} 45389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin 45399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin}; // namespace android 4540