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     hearder 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/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *   Change file, class name to ExynosXXX.
319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin *
329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin */
339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifndef EXYNOS_CAMERA_HW_INTERFACE_H
359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <utils/threads.h>
379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <utils/RefBase.h>
389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <binder/MemoryBase.h>
399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <binder/MemoryHeapBase.h>
409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <hardware/camera.h>
419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <hardware/gralloc.h>
429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <camera/Camera.h>
439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <camera/CameraParameters.h>
44f4979f5067ab25d0e385b791ba3770eb156e0e94Dima Zavin#include <media/hardware/MetadataBufferType.h>
459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "gralloc_priv.h"
479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "exynos_format.h"
499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "csc.h"
509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include "ExynosCamera.h"
519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <fcntl.h>
539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#include <sys/mman.h>
549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define USE_EGL                         (1)
569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define  NUM_OF_PREVIEW_BUF             (8)
589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define  NUM_OF_VIDEO_BUF               (8)
599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define  NUM_OF_PICTURE_BUF             (6)
609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define  NUM_OF_WAITING_PUT_PICTURE_BUF (1)
619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#define  NUM_OF_DETECTED_FACES          (32)
639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinnamespace android {
659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinclass ExynosCameraHWInterface : public virtual RefBase {
679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinpublic:
689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosCameraHWInterface(int cameraId, camera_device_t *dev);
699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual             ~ExynosCameraHWInterface();
709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    setPreviewWindow(preview_stream_ops *w);
729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        setCallbacks(camera_notify_callback notify_cb,
739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                     camera_data_callback data_cb,
749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                     camera_data_timestamp_callback data_cb_timestamp,
759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                     camera_request_memory get_memory,
769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                     void *user);
779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        enableMsgType(int32_t msgType);
799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        disableMsgType(int32_t msgType);
809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual bool        msgTypeEnabled(int32_t msgType);
819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    startPreview();
839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        stopPreview();
849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual bool        previewEnabled();
859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    storeMetaDataInBuffers(bool enable);
879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    startRecording();
899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        stopRecording();
909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual bool        recordingEnabled();
919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        releaseRecordingFrame(const void *opaque);
929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    autoFocus();
949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    cancelAutoFocus();
959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    takePicture();
979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    cancelPicture();
989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    setParameters(const CameraParameters& params);
1009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual CameraParameters  getParameters() const;
1019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    sendCommand(int32_t command, int32_t arg1, int32_t arg2);
1029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual void        release();
1049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    virtual status_t    dump(int fd) const;
1069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    inline  int         getCameraId() const;
1089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinprivate:
1109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    class PreviewThread : public Thread {
1119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosCameraHWInterface *mHardware;
1129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    public:
1139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        PreviewThread(ExynosCameraHWInterface *hw):
1149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        Thread(false),
1159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        mHardware(hw) { }
1169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual void onFirstRef() {
1179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            //run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY);
1189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            run("CameraPreviewThread", PRIORITY_DEFAULT);
1199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual bool threadLoop() {
1219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            mHardware->m_previewThreadFuncWrapper();
1229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            return false;
1239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    };
1259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    class VideoThread : public Thread {
1279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosCameraHWInterface *mHardware;
1289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    public:
1299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        VideoThread(ExynosCameraHWInterface *hw):
1309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        Thread(false),
1319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        mHardware(hw) { }
1329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual void onFirstRef() {
1339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            run("CameraVideoThread", PRIORITY_DEFAULT);
1349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual bool threadLoop() {
1369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            mHardware->m_videoThreadFuncWrapper();
1379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            return false;
1389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    };
1409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    class PictureThread : public Thread {
1429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosCameraHWInterface *mHardware;
1439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    public:
1449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        PictureThread(ExynosCameraHWInterface *hw):
1459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        Thread(false),
1469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        mHardware(hw) { }
1479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual bool threadLoop() {
1489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            mHardware->m_pictureThreadFunc();
1499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            return false;
1509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    };
1529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    class AutoFocusThread : public Thread {
1549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosCameraHWInterface *mHardware;
1559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    public:
1569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        AutoFocusThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { }
1579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual void onFirstRef() {
1589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            run("CameraAutoFocusThread", PRIORITY_DEFAULT);
1599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        virtual bool threadLoop() {
1619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            mHardware->m_autoFocusThreadFunc();
1629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            return true;
1639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        }
1649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    };
1659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinprivate:
1679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void        m_initDefaultParameters(int cameraId);
1689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_startPreviewInternal(void);
1709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void        m_stopPreviewInternal(void);
1719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_previewThreadFuncWrapper(void);
1739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_previewThreadFunc(void);
1749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_videoThreadFuncWrapper(void);
1759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_videoThreadFunc(void);
1769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_autoFocusThreadFunc(void);
1779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_startPictureInternal(void);
1799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_stopPictureInternal(void);
1809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_pictureThreadFunc(void);
1819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int         m_saveJpeg(unsigned char *real_jpeg, int jpeg_size);
1839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void        m_savePostView(const char *fname, uint8_t *buf,
1849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                               uint32_t size);
1859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int         m_decodeInterleaveData(unsigned char *pInterleaveData,
1869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       int interleaveDataSize,
1879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       int yuvWidth,
1889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       int yuvHeight,
1899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       int *pJpegSize,
1909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       void *pJpegData,
1919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                       void *pYuvData);
1929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight);
1939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_scaleDownYuv422(char *srcBuf, uint32_t srcWidth,
1949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                  uint32_t srcHight, char *dstBuf,
1959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                  uint32_t dstWidth, uint32_t dstHight);
1969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
1979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_checkVideoStartMarker(unsigned char *pBuf);
1989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_checkEOIMarker(unsigned char *pBuf);
1999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_findEOIMarkerInJPEG(unsigned char *pBuf,
2009426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                                      int dwBufSize, int *pnJPEGsize);
2019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_splitFrame(unsigned char *pFrame, int dwSize,
2029426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                             int dwJPEGLineLength, int dwVideoLineLength,
2039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                             int dwVideoHeight, void *pJPEG,
2049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                             int *pdwJPEGSize, void *pVideo,
2059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                             int *pdwVideoSize);
2069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void        m_setSkipFrame(int frame);
2079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_isSupportedPreviewSize(const int width, const int height) const;
2089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void        m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf);
2109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_getResolutionList(String8 & string8Buf, char * strBuf, int w, int h);
2129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_getZoomRatioList(String8 & string8Buf, char * strBuf, int maxZoom, int start, int end);
2149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int         m_bracketsStr2Ints(char *str, int num, ExynosRect2 *rect2s, int *weights);
2169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_subBracketsStr2Ints(int num, char *str, int *arr);
2179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_getRatioSize(int  src_w,  int   src_h,
2189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                               int  dst_w,  int   dst_h,
2199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                               int *crop_x, int *crop_y,
2209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                               int *crop_w, int *crop_h,
2219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin                               int zoom);
2229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int         m_calibratePosition(int w, int new_w, int x);
2239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#ifdef LOG_NDEBUG
2249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool        m_fileDump(char *filename, void *srcBuf, uint32_t size);
2259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif
2269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shinprivate:
2289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    sp<PreviewThread>   m_previewThread;
2299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    sp<VideoThread>     m_videoThread;
2309426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    sp<AutoFocusThread> m_autoFocusThread;
2319426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    sp<PictureThread>   m_pictureThread;
2329426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2339426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    /* used by auto focus thread to block until it's told to run */
2349426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_focusLock;
2359426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_focusCondition;
2369426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_exitAutoFocusThread;
2379426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2389426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    /* used by preview thread to block until it's told to run */
2399426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_previewLock;
2409426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_previewCondition;
2419426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_previewStoppedCondition;
2429426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_previewRunning;
2439426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_exitPreviewThread;
2449426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_previewStartDeferred;
2459426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2469426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_videoLock;
2479426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_videoCondition;
2489426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_videoStoppedCondition;
2499426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_videoRunning;
2509426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_videoStart;
2519426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_exitVideoThread;
2529426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_recordingHint;
2539426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2549426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void               *m_grallocVirtAddr[NUM_OF_PREVIEW_BUF];
2559426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int                 m_matchedGrallocIndex[NUM_OF_PREVIEW_BUF];
2569426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosBuffer        m_pictureBuf;
2579426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosBuffer        copy_previewBuf;
2589426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2599426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    struct ExynosBufferQueue {
2609426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosBuffer       buf;
2619426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin        ExynosBufferQueue *next;
2629426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    };
2639426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2649426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosBufferQueue  *m_oldPictureBufQueueHead;
2659426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosBufferQueue   m_oldPictureBufQueue[NUM_OF_PICTURE_BUF];
2669426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_pictureLock;
2679426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Condition   m_pictureCondition;
2689426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_pictureRunning;
2699426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            bool        m_captureInProgress;
2709426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            int         m_numOfAvaliblePictureBuf;
2719426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2729426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosRect          m_orgPreviewRect;
2739426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosRect          m_orgPictureRect;
2749426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosRect          m_orgVideoRect;
2759426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2769426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void               *m_exynosPreviewCSC;
2779426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void               *m_exynosPictureCSC;
2789426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void               *m_exynosVideoCSC;
2799426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2809426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            preview_stream_ops *m_previewWindow;
2819426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2829426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    /* used to guard threading state */
2839426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_stateLock;
2849426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2859426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    CameraParameters    m_params;
2869426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    CameraParameters    m_internalParams;
2879426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2889426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_memory_t    *m_previewHeap[NUM_OF_PREVIEW_BUF];
2899426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    buffer_handle_t    *m_previewBufHandle[NUM_OF_PREVIEW_BUF];
2909426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int                 m_previewStride[NUM_OF_PREVIEW_BUF];
2919426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool                m_avaliblePreviewBufHandle[NUM_OF_PREVIEW_BUF];
2929426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool                m_flagGrallocLocked[NUM_OF_PREVIEW_BUF];
2939426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int                 m_minUndequeuedBufs;
2949426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int                 m_numOfAvailableVideoBuf;
2959426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    int                 m_cntVideoBuf;
2969426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
2979426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_memory_t    *m_videoHeap[NUM_OF_VIDEO_BUF];
2989426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_memory_t    *m_resizedVideoHeap[NUM_OF_VIDEO_BUF];
2999426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_memory_t    *m_pictureHeap[NUM_OF_PICTURE_BUF];
300471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    int			m_pictureFds[NUM_OF_PICTURE_BUF][3];
3019426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_memory_t    *m_rawHeap;
302471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    int			m_ion_client;
3039426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3049426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_frame_metadata_t  m_frameMetadata;
3059426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_face_t            m_faces[NUM_OF_DETECTED_FACES];
3069426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    bool                     m_faceDetected;
3079426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3089426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    ExynosCamera       *m_secCamera;
3099426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3109426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    mutable Mutex       m_skipFrameLock;
3119426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            int         m_skipFrame;
3129426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3139426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_notify_callback     m_notifyCb;
3149426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_data_callback       m_dataCb;
3159426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_data_timestamp_callback m_dataCbTimestamp;
3169426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_request_memory      m_getMemoryCb;
3179426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    void                      *m_callbackCookie;
3189426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3199426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin            int32_t     m_msgEnabled;
3209426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3219426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin           Vector<Size> m_supportedPreviewSizes;
3229426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3239426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    camera_device_t *m_halDevice;
3249426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin    static gralloc_module_t const* m_grallocHal;
3259426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin};
3269426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3279426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin}; // namespace android
3289426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin
3299426c428f0ffede2ee24d397912f7db84c56c3f7Jiyoung Shin#endif
330