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