1 /* 2 ** 3 ** Copyright 2008, The Android Open Source Project 4 ** Copyright 2010, Samsung Electronics Co. LTD 5 ** 6 ** Licensed under the Apache License, Version 2.0 (the "License"); 7 ** you may not use this file except in compliance with the License. 8 ** You may obtain a copy of the License at 9 ** 10 ** http://www.apache.org/licenses/LICENSE-2.0 11 ** 12 ** Unless required by applicable law or agreed to in writing, software 13 ** distributed under the License is distributed on an "AS IS" BASIS, 14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 ** See the License for the specific language governing permissions and 16 ** limitations under the License. 17 */ 18 19 #ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_SEC_H 20 #define ANDROID_HARDWARE_CAMERA_HARDWARE_SEC_H 21 22 #include "SecCamera.h" 23 #include <utils/threads.h> 24 #include <utils/RefBase.h> 25 #include <binder/MemoryBase.h> 26 #include <binder/MemoryHeapBase.h> 27 #include <hardware/camera.h> 28 #include <hardware/gralloc.h> 29 #include <camera/CameraParameters.h> 30 31 namespace android { 32 class CameraHardwareSec : public virtual RefBase { 33 public: 34 virtual void setCallbacks(camera_notify_callback notify_cb, 35 camera_data_callback data_cb, 36 camera_data_timestamp_callback data_cb_timestamp, 37 camera_request_memory get_memory, 38 void *user); 39 40 virtual void enableMsgType(int32_t msgType); 41 virtual void disableMsgType(int32_t msgType); 42 virtual bool msgTypeEnabled(int32_t msgType); 43 44 virtual status_t startPreview(); 45 virtual void stopPreview(); 46 virtual bool previewEnabled(); 47 48 virtual status_t startRecording(); 49 virtual void stopRecording(); 50 virtual bool recordingEnabled(); 51 virtual void releaseRecordingFrame(const void *opaque); 52 53 virtual status_t autoFocus(); 54 virtual status_t cancelAutoFocus(); 55 virtual status_t takePicture(); 56 virtual status_t cancelPicture(); 57 virtual status_t dump(int fd) const; 58 virtual status_t setParameters(const CameraParameters& params); 59 virtual CameraParameters getParameters() const; 60 virtual status_t sendCommand(int32_t command, int32_t arg1, int32_t arg2); 61 virtual status_t setPreviewWindow(preview_stream_ops *w); 62 virtual status_t storeMetaDataInBuffers(bool enable); 63 virtual void release(); 64 65 inline int getCameraId() const; 66 67 CameraHardwareSec(int cameraId, camera_device_t *dev); 68 virtual ~CameraHardwareSec(); 69 private: 70 status_t startPreviewInternal(); 71 void stopPreviewInternal(); 72 73 static const int kBufferCount = MAX_BUFFERS; 74 static const int kBufferCountForRecord = MAX_BUFFERS; 75 76 class PreviewThread : public Thread { 77 CameraHardwareSec *mHardware; 78 public: 79 PreviewThread(CameraHardwareSec *hw): 80 Thread(false), 81 mHardware(hw) { } 82 virtual void onFirstRef() { 83 run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); 84 } 85 virtual bool threadLoop() { 86 mHardware->previewThreadWrapper(); 87 return false; 88 } 89 }; 90 91 class PictureThread : public Thread { 92 CameraHardwareSec *mHardware; 93 public: 94 PictureThread(CameraHardwareSec *hw): 95 Thread(false), 96 mHardware(hw) { } 97 virtual bool threadLoop() { 98 mHardware->pictureThread(); 99 return false; 100 } 101 }; 102 103 class AutoFocusThread : public Thread { 104 CameraHardwareSec *mHardware; 105 public: 106 AutoFocusThread(CameraHardwareSec *hw): Thread(false), mHardware(hw) { } 107 virtual void onFirstRef() { 108 run("CameraAutoFocusThread", PRIORITY_DEFAULT); 109 } 110 virtual bool threadLoop() { 111 mHardware->autoFocusThread(); 112 return true; 113 } 114 }; 115 116 void initDefaultParameters(int cameraId); 117 void initHeapLocked(); 118 119 sp<PreviewThread> mPreviewThread; 120 int previewThread(); 121 int previewThreadWrapper(); 122 123 sp<AutoFocusThread> mAutoFocusThread; 124 int autoFocusThread(); 125 126 sp<PictureThread> mPictureThread; 127 int pictureThread(); 128 bool mCaptureInProgress; 129 130 int save_jpeg(unsigned char *real_jpeg, int jpeg_size); 131 void save_postview(const char *fname, uint8_t *buf, 132 uint32_t size); 133 int decodeInterleaveData(unsigned char *pInterleaveData, 134 int interleaveDataSize, 135 int yuvWidth, 136 int yuvHeight, 137 int *pJpegSize, 138 void *pJpegData, 139 void *pYuvData); 140 bool YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight); 141 bool scaleDownYuv422(char *srcBuf, uint32_t srcWidth, 142 uint32_t srcHight, char *dstBuf, 143 uint32_t dstWidth, uint32_t dstHight); 144 145 bool CheckVideoStartMarker(unsigned char *pBuf); 146 bool CheckEOIMarker(unsigned char *pBuf); 147 bool FindEOIMarkerInJPEG(unsigned char *pBuf, 148 int dwBufSize, int *pnJPEGsize); 149 bool SplitFrame(unsigned char *pFrame, int dwSize, 150 int dwJPEGLineLength, int dwVideoLineLength, 151 int dwVideoHeight, void *pJPEG, 152 int *pdwJPEGSize, void *pVideo, 153 int *pdwVideoSize); 154 void setSkipFrame(int frame); 155 bool isSupportedPreviewSize(const int width, 156 const int height) const; 157 bool isSupportedParameter(const char * const parm, 158 const char * const supported_parm) const; 159 status_t waitCaptureCompletion(); 160 /* used by auto focus thread to block until it's told to run */ 161 mutable Mutex mFocusLock; 162 mutable Condition mFocusCondition; 163 bool mExitAutoFocusThread; 164 165 /* used by preview thread to block until it's told to run */ 166 mutable Mutex mPreviewLock; 167 mutable Condition mPreviewCondition; 168 mutable Condition mPreviewStoppedCondition; 169 bool mPreviewRunning; 170 bool mPreviewStartDeferred; 171 bool mExitPreviewThread; 172 173 preview_stream_ops *mPreviewWindow; 174 175 /* used to guard mCaptureInProgress */ 176 mutable Mutex mCaptureLock; 177 mutable Condition mCaptureCondition; 178 179 CameraParameters mParameters; 180 CameraParameters mInternalParameters; 181 182 camera_memory_t *mPreviewHeap; 183 camera_memory_t *mRawHeap; 184 camera_memory_t *mRecordHeap; 185 186 SecCamera *mSecCamera; 187 const __u8 *mCameraSensorName; 188 189 mutable Mutex mSkipFrameLock; 190 int mSkipFrame; 191 192 camera_notify_callback mNotifyCb; 193 camera_data_callback mDataCb; 194 camera_data_timestamp_callback mDataCbTimestamp; 195 camera_request_memory mGetMemoryCb; 196 void *mCallbackCookie; 197 198 int32_t mMsgEnabled; 199 200 bool mRecordRunning; 201 mutable Mutex mRecordLock; 202 int mPostViewWidth; 203 int mPostViewHeight; 204 int mPostViewSize; 205 206 Vector<Size> mSupportedPreviewSizes; 207 208 camera_device_t *mHalDevice; 209 static gralloc_module_t const* mGrallocHal; 210 }; 211 212 }; // namespace android 213 214 #endif 215