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