/* ** Copyright 2008, Google Inc. ** Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. ** ** 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. */ #ifndef ANDROID_HARDWARE_QUALCOMM_CAMERA_HARDWARE_H #define ANDROID_HARDWARE_QUALCOMM_CAMERA_HARDWARE_H #define ICS //#include #include #include #include #include #include #ifdef ICS #include #endif #include #include "QCameraParameters.h" #include #include #include #include #include #include "QCamera_Intf.h" extern "C" { #include #include #include } struct str_map { const char *const desc; int val; }; struct buffer_map { msm_frame *frame; buffer_handle_t * buffer; int size; int lockState; }; typedef enum { TARGET_MSM7625, TARGET_MSM7625A, TARGET_MSM7627, TARGET_MSM7627A, TARGET_QSD8250, TARGET_MSM7630, TARGET_MSM8660, TARGET_MAX }targetType; typedef enum { LIVESHOT_DONE, LIVESHOT_IN_PROGRESS, LIVESHOT_STOPPED }liveshotState; #define MIN_UNDEQUEUD_BUFFER_COUNT 2 struct target_map { const char *targetStr; targetType targetEnum; }; enum { BUFFER_UNLOCKED, BUFFER_LOCKED }; struct board_property{ targetType target; unsigned int previewSizeMask; bool hasSceneDetect; bool hasSelectableZoneAf; bool hasFaceDetect; }; namespace android { class QualcommCameraHardware : public RefBase{ public: //virtual sp getPreviewHeap() const; //virtual sp getRawHeap() const; 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 dump(int fd, const Vector& args) const; virtual status_t startPreview(); virtual void stopPreview(); virtual bool previewEnabled(); 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 takeLiveSnapshot(); virtual status_t takeLiveSnapshotInternal(); void set_liveshot_exifinfo(); virtual status_t cancelPicture(); virtual status_t setParameters(const QCameraParameters& params); virtual QCameraParameters getParameters() const; virtual status_t sendCommand(int32_t command, int32_t arg1, int32_t arg2); virtual int32_t getNumberOfVideoBuffers(); virtual sp getVideoBuffer(int32_t index); virtual status_t getBufferInfo( sp& Frame, size_t *alignedSize); virtual void encodeData( ); #ifdef ICS virtual status_t set_PreviewWindow(void* param); virtual status_t setPreviewWindow(preview_stream_ops_t* window); #endif virtual status_t setPreviewWindow(const sp& buf) {return NO_ERROR;}; virtual void release(); static QualcommCameraHardware* createInstance(); static QualcommCameraHardware* getInstance(); void receivePreviewFrame(struct msm_frame *frame); void receiveLiveSnapshot(uint32_t jpeg_size); void receiveCameraStats(camstats_type stype, camera_preview_histogram_info* histinfo); void receiveRecordingFrame(struct msm_frame *frame); void receiveJpegPicture(status_t status, mm_camera_buffer_t *encoded_buffer); void jpeg_set_location(); void receiveJpegPictureFragment(uint8_t *buf, uint32_t size); void notifyShutter(bool mPlayShutterSoundOnly); void receive_camframe_error_timeout(); static void getCameraInfo(); void receiveRawPicture(status_t status,struct msm_frame *postviewframe, struct msm_frame *mainframe); int allocate_ion_memory(int *main_ion_fd, struct ion_allocation_data* alloc, struct ion_fd_data* ion_info_fd, int ion_type, int size, int *memfd); int deallocate_ion_memory(int *main_ion_fd, struct ion_fd_data* ion_info_fd); virtual ~QualcommCameraHardware(); int storeMetaDataInBuffers(int enable); private: QualcommCameraHardware(); status_t startPreviewInternal(); status_t startRecordingInternal(); status_t setHistogramOn(); status_t setHistogramOff(); status_t runFaceDetection(); status_t setFaceDetection(const char *str); void stopPreviewInternal(); friend void *auto_focus_thread(void *user); void runAutoFocus(); status_t cancelAutoFocusInternal(); bool native_set_dimension (int camfd); bool native_jpeg_encode (void); bool updatePictureDimension(const QCameraParameters& params, int& width, int& height); bool native_set_parms(camera_parm_type_t type, uint16_t length, void *value); bool native_set_parms(camera_parm_type_t type, uint16_t length, void *value, int *result); bool native_zoom_image(int fd, int srcOffset, int dstOffset, common_crop_t *crop); status_t startInitialPreview(); void stopInitialPreview(); status_t getBuffersAndStartPreview(); void relinquishBuffers(); QualcommCameraHardware * singleton; /* These constants reflect the number of buffers that libmmcamera requires for preview and raw, and need to be updated when libmmcamera changes. */ static const int kPreviewBufferCount = NUM_PREVIEW_BUFFERS; static const int kRawBufferCount = 1; static const int kJpegBufferCount = 1; static const int kTotalPreviewBufferCount = kPreviewBufferCount + MIN_UNDEQUEUD_BUFFER_COUNT; int numCapture; int numJpegReceived; int jpegPadding; QCameraParameters mParameters; unsigned int frame_size; bool mCameraRunning; Mutex mCameraRunningLock; bool mPreviewInitialized; class MMCameraDL : public RefBase{ private: static wp instance; MMCameraDL(); virtual ~MMCameraDL(); void *libmmcamera; static Mutex singletonLock; public: static sp getInstance(); void * pointer(); }; // This class represents a heap which maintains several contiguous // buffers. The heap may be backed by pmem (when pmem_pool contains // the name of a /dev/pmem* file), or by ashmem (when pmem_pool == NULL). struct MemPool : public RefBase { MemPool(int buffer_size, int num_buffers, int frame_size, const char *name); virtual ~MemPool() ;// = 0; void completeInitialization(); bool initialized() const { return mHeap != NULL && mHeap->base() != MAP_FAILED; } virtual status_t dump(int fd, const Vector& args) const; int mBufferSize; int mAlignedBufferSize; int mNumBuffers; int mFrameSize; sp mHeap; sp *mBuffers; const char *mName; }; struct DispMemPool : public MemPool { DispMemPool(int fd, int buffer_size, int num_buffers, int frame_size, const char *name); virtual ~DispMemPool(); int mFD; }; sp mPreviewHeap[kPreviewBufferCount + MIN_UNDEQUEUD_BUFFER_COUNT]; struct AshmemPool : public MemPool { AshmemPool(int buffer_size, int num_buffers, int frame_size, const char *name); }; struct PmemPool : public MemPool { PmemPool(const char *pmem_pool, int flags, int pmem_type, int buffer_size, int num_buffers, int frame_size, int cbcr_offset, int yoffset, const char *name); virtual ~PmemPool(); int mFd; int mPmemType; int mCbCrOffset; int myOffset; int mCameraControlFd; uint32_t mAlignedSize; struct pmem_region mSize; sp mMMCameraDLRef; }; //TODO struct IonPool : public MemPool { IonPool( int ion_heap_id, int flags, int ion_type, int buffer_size, int num_buffers, int frame_size, int cbcr_offset, int yoffset, const char *name); virtual ~IonPool(); int mFd; int mIonType; int mCbCrOffset; int myOffset; int mCameraControlFd; uint32_t mAlignedSize; sp mMMCameraDLRef; static const char mIonDevName[]; }; #ifdef USE_ION // sp mPreviewHeap; sp mYV12Heap; sp mRecordHeap; sp mThumbnailHeap; sp mRawHeap; sp mDisplayHeap; sp mJpegHeap; sp mStatHeap; sp mMetaDataHeap; sp mRawSnapShotPmemHeap; sp mLastPreviewFrameHeap; sp mPostviewHeap; #else // sp mPreviewHeap; sp mYV12Heap; sp mRecordHeap; sp mThumbnailHeap; sp mRawHeap; sp mDisplayHeap; sp mJpegHeap; sp mStatHeap; sp mMetaDataHeap; sp mRawSnapShotPmemHeap; sp mLastPreviewFrameHeap; sp mPostviewHeap; sp mPostViewHeap; sp mInitialPreviewHeap; #endif sp mMMCameraDLRef; bool startCamera(); bool initPreview(); bool initRecord(); void deinitPreview(); bool initRaw(bool initJpegHeap); bool initZslBuffers(bool initJpegHeap); bool deinitZslBuffers(); bool initLiveSnapshot(int videowidth, int videoheight); bool initRawSnapshot(); void deinitRaw(); void deinitRawSnapshot(); bool mPreviewThreadRunning; bool createSnapshotMemory (int numberOfRawBuffers, int numberOfJpegBuffers, bool initJpegHeap, int snapshotFormat = 1 /*PICTURE_FORMAT_JPEG*/); Mutex mPreviewThreadWaitLock; Condition mPreviewThreadWait; friend void *preview_thread(void *user); friend void *openCamera(void *data); void runPreviewThread(void *data); friend void *hfr_thread(void *user); void runHFRThread(void *data); bool mHFRThreadRunning; int mapBuffer(msm_frame *frame); int mapRawBuffer(msm_frame *frame); int mapThumbnailBuffer(msm_frame *frame); int mapJpegBuffer(mm_camera_buffer_t* buffer); int mapvideoBuffer( msm_frame *frame); int mapFrame(buffer_handle_t *buffer); Mutex mHFRThreadWaitLock; class FrameQueue : public RefBase{ private: Mutex mQueueLock; Condition mQueueWait; bool mInitialized; Vector mContainer; public: FrameQueue(); virtual ~FrameQueue(); bool add(struct msm_frame *element); void flush(); struct msm_frame* get(); void init(); void deinit(); bool isInitialized(); }; FrameQueue mPreviewBusyQueue; bool mFrameThreadRunning; Mutex mFrameThreadWaitLock; Condition mFrameThreadWait; friend void *frame_thread(void *user); void runFrameThread(void *data); //720p recording video thread bool mVideoThreadExit; bool mVideoThreadRunning; Mutex mVideoThreadWaitLock; Condition mVideoThreadWait; friend void *video_thread(void *user); void runVideoThread(void *data); // smooth zoom int mTargetSmoothZoom; bool mSmoothzoomThreadExit; bool mSmoothzoomThreadRunning; Mutex mSmoothzoomThreadWaitLock; Mutex mSmoothzoomThreadLock; Condition mSmoothzoomThreadWait; friend void *smoothzoom_thread(void *user); void runSmoothzoomThread(void* data); // For Histogram int mStatsOn; int mCurrent; bool mSendData; Mutex mStatsWaitLock; Condition mStatsWait; //For Face Detection int mFaceDetectOn; bool mSendMetaData; Mutex mMetaDataWaitLock; bool mShutterPending; Mutex mShutterLock; bool mSnapshotThreadRunning; Mutex mSnapshotThreadWaitLock; Condition mSnapshotThreadWait; friend void *snapshot_thread(void *user); void runSnapshotThread(void *data); Mutex mRawPictureHeapLock; bool mJpegThreadRunning; Mutex mJpegThreadWaitLock; Condition mJpegThreadWait; bool mInSnapshotMode; Mutex mInSnapshotModeWaitLock; Condition mInSnapshotModeWait; bool mEncodePending; Mutex mEncodePendingWaitLock; Condition mEncodePendingWait; bool mBuffersInitialized; void debugShowPreviewFPS() const; void debugShowVideoFPS() const; int mSnapshotFormat; bool mFirstFrame; void hasAutoFocusSupport(); void filterPictureSizes(); void filterPreviewSizes(); static void storeTargetType(); bool supportsSceneDetection(); bool supportsSelectableZoneAf(); bool supportsFaceDetection(); void initDefaultParameters(); bool initImageEncodeParameters(int size); bool initZslParameter(void); status_t setCameraMode(const QCameraParameters& params); status_t setPreviewSize(const QCameraParameters& params); status_t setJpegThumbnailSize(const QCameraParameters& params); status_t setPreviewFpsRange(const QCameraParameters& params); status_t setPreviewFrameRate(const QCameraParameters& params); status_t setPreviewFrameRateMode(const QCameraParameters& params); status_t setRecordSize(const QCameraParameters& params); status_t setPictureSize(const QCameraParameters& params); status_t setJpegQuality(const QCameraParameters& params); status_t setAntibanding(const QCameraParameters& params); status_t setEffect(const QCameraParameters& params); status_t setRecordingHint(const QCameraParameters& params); status_t setExposureCompensation(const QCameraParameters ¶ms); status_t setAutoExposure(const QCameraParameters& params); status_t setWhiteBalance(const QCameraParameters& params); status_t setFlash(const QCameraParameters& params); status_t setGpsLocation(const QCameraParameters& params); status_t setRotation(const QCameraParameters& params); status_t setZoom(const QCameraParameters& params); status_t setFocusMode(const QCameraParameters& params); status_t setFocusAreas(const QCameraParameters& params); status_t setMeteringAreas(const QCameraParameters& params); status_t setBrightness(const QCameraParameters& params); status_t setSkinToneEnhancement(const QCameraParameters& params); status_t setOrientation(const QCameraParameters& params); status_t setLensshadeValue(const QCameraParameters& params); status_t setMCEValue(const QCameraParameters& params); status_t setHDRImaging(const QCameraParameters& params); status_t setExpBracketing(const QCameraParameters& params); status_t setISOValue(const QCameraParameters& params); status_t setPictureFormat(const QCameraParameters& params); status_t setSharpness(const QCameraParameters& params); status_t setContrast(const QCameraParameters& params); status_t setSaturation(const QCameraParameters& params); status_t setSceneMode(const QCameraParameters& params); status_t setContinuousAf(const QCameraParameters& params); status_t setTouchAfAec(const QCameraParameters& params); status_t setSceneDetect(const QCameraParameters& params); status_t setStrTextures(const QCameraParameters& params); status_t setPreviewFormat(const QCameraParameters& params); status_t setSelectableZoneAf(const QCameraParameters& params); status_t setHighFrameRate(const QCameraParameters& params); bool register_record_buffers(bool register_buffer); status_t setRedeyeReduction(const QCameraParameters& params); status_t setDenoise(const QCameraParameters& params); status_t setZslParam(const QCameraParameters& params); status_t setSnapshotCount(const QCameraParameters& params); void setGpsParameters(); bool storePreviewFrameForPostview(); bool isValidDimension(int w, int h); status_t updateFocusDistances(const char *focusmode); int mStoreMetaDataInFrame; Mutex mLock; Mutex mDisplayLock; Mutex mCamframeTimeoutLock; bool camframe_timeout_flag; bool mReleasedRecordingFrame; Mutex mParametersLock; Mutex mCallbackLock; Mutex mOverlayLock; Mutex mRecordLock; Mutex mRecordFrameLock; Condition mRecordWait; Condition mStateWait; /* mJpegSize keeps track of the size of the accumulated JPEG. We clear it when we are about to take a picture, so at any time it contains either zero, or the size of the last JPEG picture taken. */ uint32_t mJpegSize; unsigned int mPreviewFrameSize; unsigned int mRecordFrameSize; int mRawSize; int mCbCrOffsetRaw; int mYOffset; int mJpegMaxSize; int32_t mStatSize; cam_ctrl_dimension_t mDimension; bool mAutoFocusThreadRunning; Mutex mAutoFocusThreadLock; Mutex mAfLock; pthread_t mFrameThread; pthread_t mVideoThread; pthread_t mPreviewThread; pthread_t mSnapshotThread; pthread_t mDeviceOpenThread; pthread_t mSmoothzoomThread; pthread_t mHFRThread; common_crop_t mCrop; bool mInitialized; int mBrightness; int mSkinToneEnhancement; int mHJR; unsigned int mThumbnailMapped[MAX_SNAPSHOT_BUFFERS]; unsigned int mThumbnailLockState[MAX_SNAPSHOT_BUFFERS]; int mRawfd[MAX_SNAPSHOT_BUFFERS]; int mRawSnapshotfd; int mJpegfd[MAX_SNAPSHOT_BUFFERS]; int mRecordfd[9]; camera_memory_t *mPreviewMapped[kPreviewBufferCount + MIN_UNDEQUEUD_BUFFER_COUNT]; camera_memory_t *mRawMapped[MAX_SNAPSHOT_BUFFERS]; camera_memory_t *mJpegMapped[MAX_SNAPSHOT_BUFFERS]; camera_memory_t *mRawSnapshotMapped; camera_memory_t *mStatsMapped[3]; camera_memory_t *mRecordMapped[9]; camera_memory_t *mJpegCopyMapped; camera_memory_t* metadata_memory[9]; camera_memory_t *mJpegLiveSnapMapped; int raw_main_ion_fd[MAX_SNAPSHOT_BUFFERS]; int raw_snapshot_main_ion_fd; int Jpeg_main_ion_fd[MAX_SNAPSHOT_BUFFERS]; int record_main_ion_fd[9]; struct ion_allocation_data raw_alloc[MAX_SNAPSHOT_BUFFERS]; struct ion_allocation_data raw_snapshot_alloc; struct ion_allocation_data Jpeg_alloc[MAX_SNAPSHOT_BUFFERS]; struct ion_allocation_data record_alloc[9]; struct ion_fd_data raw_ion_info_fd[MAX_SNAPSHOT_BUFFERS]; struct ion_fd_data raw_snapshot_ion_info_fd; struct ion_fd_data Jpeg_ion_info_fd[MAX_SNAPSHOT_BUFFERS]; struct ion_fd_data record_ion_info_fd[9]; struct msm_frame frames[kPreviewBufferCount + MIN_UNDEQUEUD_BUFFER_COUNT]; struct buffer_map frame_buffer[kPreviewBufferCount + MIN_UNDEQUEUD_BUFFER_COUNT]; struct msm_frame *recordframes; struct msm_frame *rawframes; bool *record_buffers_tracking_flag; bool mInPreviewCallback; preview_stream_ops_t* mPreviewWindow; android_native_buffer_t *mPostViewBuffer; buffer_handle_t *mThumbnailBuffer[MAX_SNAPSHOT_BUFFERS]; bool mIs3DModeOn; int32_t mMsgEnabled; // camera msg to be handled camera_notify_callback mNotifyCallback; camera_data_callback mDataCallback; camera_data_timestamp_callback mDataCallbackTimestamp; camera_request_memory mGetMemory; void *mCallbackCookie; // same for all callbacks int mDebugFps; int kPreviewBufferCountActual; int previewWidth, previewHeight; int yv12framesize; bool mSnapshotDone; int maxSnapshotWidth; int maxSnapshotHeight; bool mHasAutoFocusSupport; int videoWidth, videoHeight; bool mDisEnabled; int mRotation; bool mResetWindowCrop; int mThumbnailWidth, mThumbnailHeight; status_t setVpeParameters(); status_t setDIS(); bool strTexturesOn; int mPictureWidth; int mPictureHeight; int mPostviewWidth; int mPostviewHeight; int mTotalPreviewBufferCount; int mDenoiseValue; int mZslEnable; int mZslPanorama; bool mZslFlashEnable; cam_3d_frame_format_t mSnapshot3DFormat; bool mSnapshotCancel; bool mHFRMode; Mutex mSnapshotCancelLock; int mActualPictWidth; int mActualPictHeight; bool mUseJpegDownScaling; bool mPreviewStopping; bool mInHFRThread; Mutex mPmemWaitLock; Condition mPmemWait; bool mPrevHeapDeallocRunning; bool mHdrMode; bool mExpBracketMode; bool mMultiTouch; int mRecordingState; int mNumFDRcvd; int mFacesDetected; int mFaceArray[MAX_ROI * 4 + 1]; }; extern "C" int HAL_getNumberOfCameras(); extern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo* cameraInfo); extern "C" QualcommCameraHardware* HAL_openCameraHardware(int cameraId); }; // namespace android #endif