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