/* ** ** Copyright 2008, The Android Open Source Project ** Copyright 2010, Samsung Electronics Co. LTD ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ /*! * \file ExynosCameraHWInterface.h * \brief hearder file for Android Camera HAL * \author thun.hwang(thun.hwang@samsung.com) * \date 2010/06/03 * * <b>Revision History: </b> * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n * Initial version * * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n * Change file, class name to ExynosXXX. * */ #ifndef EXYNOS_CAMERA_HW_INTERFACE_H #include <utils/threads.h> #include <utils/RefBase.h> #include <binder/MemoryBase.h> #include <binder/MemoryHeapBase.h> #include <hardware/camera.h> #include <hardware/gralloc.h> #include <camera/Camera.h> #include <camera/CameraParameters.h> #include <media/hardware/MetadataBufferType.h> #include "gralloc_priv.h" #include "exynos_format.h" #include "csc.h" #include "ExynosCamera.h" #include <fcntl.h> #include <sys/mman.h> #define USE_EGL (1) #define NUM_OF_PREVIEW_BUF (8) #define NUM_OF_VIDEO_BUF (8) #define NUM_OF_PICTURE_BUF (6) #define NUM_OF_WAITING_PUT_PICTURE_BUF (1) #define NUM_OF_DETECTED_FACES (32) namespace android { class ExynosCameraHWInterface : public virtual RefBase { public: ExynosCameraHWInterface(int cameraId, camera_device_t *dev); virtual ~ExynosCameraHWInterface(); virtual status_t setPreviewWindow(preview_stream_ops *w); virtual void setCallbacks(camera_notify_callback notify_cb, camera_data_callback data_cb, camera_data_timestamp_callback data_cb_timestamp, camera_request_memory get_memory, void *user); virtual void enableMsgType(int32_t msgType); virtual void disableMsgType(int32_t msgType); virtual bool msgTypeEnabled(int32_t msgType); virtual status_t startPreview(); virtual void stopPreview(); virtual bool previewEnabled(); virtual status_t storeMetaDataInBuffers(bool enable); virtual status_t startRecording(); virtual void stopRecording(); virtual bool recordingEnabled(); virtual void releaseRecordingFrame(const void *opaque); virtual status_t autoFocus(); virtual status_t cancelAutoFocus(); virtual status_t takePicture(); virtual status_t cancelPicture(); virtual status_t setParameters(const CameraParameters& params); virtual CameraParameters getParameters() const; virtual status_t sendCommand(int32_t command, int32_t arg1, int32_t arg2); virtual void release(); virtual status_t dump(int fd) const; inline int getCameraId() const; private: class PreviewThread : public Thread { ExynosCameraHWInterface *mHardware; public: PreviewThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { } virtual void onFirstRef() { //run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); run("CameraPreviewThread", PRIORITY_DEFAULT); } virtual bool threadLoop() { mHardware->m_previewThreadFuncWrapper(); return false; } }; class VideoThread : public Thread { ExynosCameraHWInterface *mHardware; public: VideoThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { } virtual void onFirstRef() { run("CameraVideoThread", PRIORITY_DEFAULT); } virtual bool threadLoop() { mHardware->m_videoThreadFuncWrapper(); return false; } }; class PictureThread : public Thread { ExynosCameraHWInterface *mHardware; public: PictureThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { } virtual bool threadLoop() { mHardware->m_pictureThreadFunc(); return false; } }; class AutoFocusThread : public Thread { ExynosCameraHWInterface *mHardware; public: AutoFocusThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { } virtual void onFirstRef() { run("CameraAutoFocusThread", PRIORITY_DEFAULT); } virtual bool threadLoop() { mHardware->m_autoFocusThreadFunc(); return true; } }; private: void m_initDefaultParameters(int cameraId); bool m_startPreviewInternal(void); void m_stopPreviewInternal(void); bool m_previewThreadFuncWrapper(void); bool m_previewThreadFunc(void); bool m_videoThreadFuncWrapper(void); bool m_videoThreadFunc(void); bool m_autoFocusThreadFunc(void); bool m_startPictureInternal(void); bool m_stopPictureInternal(void); bool m_pictureThreadFunc(void); int m_saveJpeg(unsigned char *real_jpeg, int jpeg_size); void m_savePostView(const char *fname, uint8_t *buf, uint32_t size); int m_decodeInterleaveData(unsigned char *pInterleaveData, int interleaveDataSize, int yuvWidth, int yuvHeight, int *pJpegSize, void *pJpegData, void *pYuvData); bool m_YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight); bool m_scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHight, char *dstBuf, uint32_t dstWidth, uint32_t dstHight); bool m_checkVideoStartMarker(unsigned char *pBuf); bool m_checkEOIMarker(unsigned char *pBuf); bool m_findEOIMarkerInJPEG(unsigned char *pBuf, int dwBufSize, int *pnJPEGsize); bool m_splitFrame(unsigned char *pFrame, int dwSize, int dwJPEGLineLength, int dwVideoLineLength, int dwVideoHeight, void *pJPEG, int *pdwJPEGSize, void *pVideo, int *pdwVideoSize); void m_setSkipFrame(int frame); bool m_isSupportedPreviewSize(const int width, const int height) const; void m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf); bool m_getResolutionList(String8 & string8Buf, char * strBuf, int w, int h); bool m_getZoomRatioList(String8 & string8Buf, char * strBuf, int maxZoom, int start, int end); int m_bracketsStr2Ints(char *str, int num, ExynosRect2 *rect2s, int *weights); bool m_subBracketsStr2Ints(int num, char *str, int *arr); bool m_getRatioSize(int src_w, int src_h, int dst_w, int dst_h, int *crop_x, int *crop_y, int *crop_w, int *crop_h, int zoom); int m_calibratePosition(int w, int new_w, int x); #ifdef LOG_NDEBUG bool m_fileDump(char *filename, void *srcBuf, uint32_t size); #endif private: sp<PreviewThread> m_previewThread; sp<VideoThread> m_videoThread; sp<AutoFocusThread> m_autoFocusThread; sp<PictureThread> m_pictureThread; /* used by auto focus thread to block until it's told to run */ mutable Mutex m_focusLock; mutable Condition m_focusCondition; bool m_exitAutoFocusThread; /* used by preview thread to block until it's told to run */ mutable Mutex m_previewLock; mutable Condition m_previewCondition; mutable Condition m_previewStoppedCondition; bool m_previewRunning; bool m_exitPreviewThread; bool m_previewStartDeferred; mutable Mutex m_videoLock; mutable Condition m_videoCondition; mutable Condition m_videoStoppedCondition; bool m_videoRunning; bool m_videoStart; bool m_exitVideoThread; bool m_recordingHint; void *m_grallocVirtAddr[NUM_OF_PREVIEW_BUF]; int m_matchedGrallocIndex[NUM_OF_PREVIEW_BUF]; ExynosBuffer m_pictureBuf; ExynosBuffer copy_previewBuf; struct ExynosBufferQueue { ExynosBuffer buf; ExynosBufferQueue *next; }; ExynosBufferQueue *m_oldPictureBufQueueHead; ExynosBufferQueue m_oldPictureBufQueue[NUM_OF_PICTURE_BUF]; mutable Mutex m_pictureLock; mutable Condition m_pictureCondition; bool m_pictureRunning; bool m_captureInProgress; int m_numOfAvaliblePictureBuf; ExynosRect m_orgPreviewRect; ExynosRect m_orgPictureRect; ExynosRect m_orgVideoRect; void *m_exynosPreviewCSC; void *m_exynosPictureCSC; void *m_exynosVideoCSC; preview_stream_ops *m_previewWindow; /* used to guard threading state */ mutable Mutex m_stateLock; CameraParameters m_params; CameraParameters m_internalParams; camera_memory_t *m_previewHeap[NUM_OF_PREVIEW_BUF]; buffer_handle_t *m_previewBufHandle[NUM_OF_PREVIEW_BUF]; int m_previewStride[NUM_OF_PREVIEW_BUF]; bool m_avaliblePreviewBufHandle[NUM_OF_PREVIEW_BUF]; bool m_flagGrallocLocked[NUM_OF_PREVIEW_BUF]; int m_minUndequeuedBufs; int m_numOfAvailableVideoBuf; int m_cntVideoBuf; camera_memory_t *m_videoHeap[NUM_OF_VIDEO_BUF]; camera_memory_t *m_resizedVideoHeap[NUM_OF_VIDEO_BUF]; camera_memory_t *m_pictureHeap[NUM_OF_PICTURE_BUF]; int m_pictureFds[NUM_OF_PICTURE_BUF][3]; camera_memory_t *m_rawHeap; int m_ion_client; camera_frame_metadata_t m_frameMetadata; camera_face_t m_faces[NUM_OF_DETECTED_FACES]; bool m_faceDetected; ExynosCamera *m_secCamera; mutable Mutex m_skipFrameLock; int m_skipFrame; camera_notify_callback m_notifyCb; camera_data_callback m_dataCb; camera_data_timestamp_callback m_dataCbTimestamp; camera_request_memory m_getMemoryCb; void *m_callbackCookie; int32_t m_msgEnabled; Vector<Size> m_supportedPreviewSizes; camera_device_t *m_halDevice; static gralloc_module_t const* m_grallocHal; }; }; // namespace android #endif