aboutsummaryrefslogtreecommitdiff
path: root/camera/QCamera2/HAL/QCameraStream.h
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera2/HAL/QCameraStream.h')
-rw-r--r--camera/QCamera2/HAL/QCameraStream.h272
1 files changed, 272 insertions, 0 deletions
diff --git a/camera/QCamera2/HAL/QCameraStream.h b/camera/QCamera2/HAL/QCameraStream.h
new file mode 100644
index 0000000..fc5c443
--- /dev/null
+++ b/camera/QCamera2/HAL/QCameraStream.h
@@ -0,0 +1,272 @@
+/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __QCAMERA_STREAM_H__
+#define __QCAMERA_STREAM_H__
+
+// Camera dependencies
+#include "camera.h"
+#include "QCameraCmdThread.h"
+#include "QCameraMem.h"
+#include "QCameraAllocator.h"
+
+extern "C" {
+#include "mm_camera_interface.h"
+}
+
+namespace qcamera {
+
+class QCameraStream;
+typedef void (*stream_cb_routine)(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+
+#define CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE 16
+#define CAMERA_MIN_VIDEO_BATCH_BUFFERS 3
+
+
+class QCameraStream
+{
+public:
+ QCameraStream(QCameraAllocator &allocator,
+ uint32_t camHandle, uint32_t chId,
+ mm_camera_ops_t *camOps, cam_padding_info_t *paddingInfo,
+ bool deffered = false, cam_rotation_t online_rotation = ROTATE_0);
+ virtual ~QCameraStream();
+ virtual int32_t init(QCameraHeapMemory *streamInfoBuf,
+ QCameraHeapMemory *miscBuf,
+ uint8_t minStreamBufNum,
+ stream_cb_routine stream_cb,
+ void *userdata,
+ bool bDynallocBuf);
+ virtual int32_t processZoomDone(preview_stream_ops_t *previewWindow,
+ cam_crop_data_t &crop_info);
+ virtual int32_t bufDone(uint32_t index);
+ virtual int32_t bufDone(const void *opaque, bool isMetaData);
+ virtual int32_t processDataNotify(mm_camera_super_buf_t *bufs);
+ virtual int32_t start();
+ virtual int32_t stop();
+
+ /* Used for deffered allocation of buffers */
+ virtual int32_t allocateBuffers();
+ virtual int32_t mapBuffers();
+ virtual int32_t releaseBuffs();
+
+ static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, void *userdata);
+ static void dataNotifySYNCCB(mm_camera_super_buf_t *recvd_frame,
+ void *userdata);
+ static void *dataProcRoutine(void *data);
+ static void *BufAllocRoutine(void *data);
+ uint32_t getMyHandle() const {return mHandle;}
+ bool isTypeOf(cam_stream_type_t type);
+ bool isOrignalTypeOf(cam_stream_type_t type);
+ int32_t getFrameOffset(cam_frame_len_offset_t &offset);
+ int32_t getCropInfo(cam_rect_t &crop);
+ int32_t setCropInfo(cam_rect_t crop);
+ int32_t getFrameDimension(cam_dimension_t &dim);
+ int32_t getFormat(cam_format_t &fmt);
+ QCameraMemory *getStreamBufs() {return mStreamBufs;};
+ QCameraHeapMemory *getStreamInfoBuf() {return mStreamInfoBuf;};
+ QCameraHeapMemory *getMiscBuf() {return mMiscBuf;};
+ uint32_t getMyServerID();
+ cam_stream_type_t getMyType();
+ cam_stream_type_t getMyOriginalType();
+ int32_t acquireStreamBufs();
+
+ int32_t mapBuf(uint8_t buf_type, uint32_t buf_idx,
+ int32_t plane_idx, int fd, size_t size,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl = NULL);
+ int32_t mapBufs(cam_buf_map_type_list bufMapList,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl = NULL);
+ int32_t mapNewBuffer(uint32_t index);
+ int32_t unmapBuf(uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl = NULL);
+ int32_t setParameter(cam_stream_parm_buffer_t &param);
+ int32_t getParameter(cam_stream_parm_buffer_t &param);
+ int32_t syncRuntimeParams();
+ cam_stream_parm_buffer_t getOutputCrop() { return m_OutputCrop;};
+ cam_stream_parm_buffer_t getImgProp() { return m_ImgProp;};
+
+ static void releaseFrameData(void *data, void *user_data);
+ int32_t configStream();
+ bool isDeffered() const { return mDefferedAllocation; }
+ bool isSyncCBEnabled() {return mSyncCBEnabled;};
+ void deleteStream();
+
+ uint8_t getBufferCount() { return mNumBufs; }
+ uint32_t getChannelHandle() { return mChannelHandle; }
+ int32_t getNumQueuedBuf();
+
+ uint32_t mDumpFrame;
+ uint32_t mDumpMetaFrame;
+ uint32_t mDumpSkipCnt;
+
+ void cond_wait();
+ void cond_signal(bool forceExit = false);
+
+ int32_t setSyncDataCB(stream_cb_routine data_cb);
+ //Stream time stamp. We need this for preview stream to update display
+ nsecs_t mStreamTimestamp;
+
+ //Frame Buffer will be stored here in case framework batch mode.
+ camera_memory_t *mCurMetaMemory; // Current metadata buffer ptr
+ int8_t mCurBufIndex; // Buffer count filled in current metadata
+ int8_t mCurMetaIndex; // Active metadata buffer index
+
+ nsecs_t mFirstTimeStamp; // Timestamp of first frame in Metadata.
+
+ // Buffer storage structure.
+ typedef struct {
+ bool consumerOwned; // Metadata is with Consumer if TRUE
+ uint8_t numBuffers; // Num of buffer need to released
+ uint8_t buf_index[CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE];
+ } MetaMemory;
+ MetaMemory mStreamMetaMemory[CAMERA_MIN_VIDEO_BATCH_BUFFERS];
+
+private:
+ uint32_t mCamHandle;
+ uint32_t mChannelHandle;
+ uint32_t mHandle; // stream handle from mm-camera-interface
+ mm_camera_ops_t *mCamOps;
+ cam_stream_info_t *mStreamInfo; // ptr to stream info buf
+ mm_camera_stream_mem_vtbl_t mMemVtbl;
+ uint8_t mNumBufs;
+ uint8_t mNumPlaneBufs;
+ uint8_t mNumBufsNeedAlloc;
+ uint8_t *mRegFlags;
+ stream_cb_routine mDataCB;
+ stream_cb_routine mSYNCDataCB;
+ void *mUserData;
+
+ QCameraQueue mDataQ;
+ QCameraCmdThread mProcTh; // thread for dataCB
+
+ QCameraHeapMemory *mStreamInfoBuf;
+ QCameraHeapMemory *mMiscBuf;
+ QCameraMemory *mStreamBufs;
+ QCameraMemory *mStreamBatchBufs;
+ QCameraAllocator &mAllocator;
+ mm_camera_buf_def_t *mBufDefs;
+ mm_camera_buf_def_t *mPlaneBufDefs;
+ cam_frame_len_offset_t mFrameLenOffset;
+ cam_padding_info_t mPaddingInfo;
+ cam_rect_t mCropInfo;
+ cam_rotation_t mOnlineRotation;
+ pthread_mutex_t mCropLock; // lock to protect crop info
+ pthread_mutex_t mParameterLock; // lock to sync access to parameters
+ bool mStreamBufsAcquired;
+ bool m_bActive; // if stream mProcTh is active
+ bool mDynBufAlloc; // allow buf allocation in 2 steps
+ pthread_t mBufAllocPid;
+ mm_camera_map_unmap_ops_tbl_t m_MemOpsTbl;
+ cam_stream_parm_buffer_t m_OutputCrop;
+ cam_stream_parm_buffer_t m_ImgProp;
+
+ static int32_t get_bufs(
+ cam_frame_len_offset_t *offset,
+ uint8_t *num_bufs,
+ uint8_t **initial_reg_flag,
+ mm_camera_buf_def_t **bufs,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl,
+ void *user_data);
+
+ static int32_t get_bufs_deffered(
+ cam_frame_len_offset_t *offset,
+ uint8_t *num_bufs,
+ uint8_t **initial_reg_flag,
+ mm_camera_buf_def_t **bufs,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl,
+ void *user_data);
+
+ static int32_t put_bufs(
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl,
+ void *user_data);
+
+ static int32_t put_bufs_deffered(
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl,
+ void *user_data);
+
+ static int32_t set_config_ops(
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl,
+ void *user_data);
+
+ static int32_t invalidate_buf(uint32_t index, void *user_data);
+ static int32_t clean_invalidate_buf(uint32_t index, void *user_data);
+
+ static int32_t backgroundAllocate(void* data);
+ static int32_t backgroundMap(void* data);
+
+ int32_t getBufs(cam_frame_len_offset_t *offset,
+ uint8_t *num_bufs,
+ uint8_t **initial_reg_flag,
+ mm_camera_buf_def_t **bufs,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl);
+ int32_t getBufsDeferred(cam_frame_len_offset_t *offset,
+ uint8_t *num_bufs,
+ uint8_t **initial_reg_flag,
+ mm_camera_buf_def_t **bufs,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl);
+ int32_t putBufs(mm_camera_map_unmap_ops_tbl_t *ops_tbl);
+ int32_t putBufsDeffered();
+
+ /* Used for deffered allocation of buffers */
+ int32_t allocateBatchBufs(cam_frame_len_offset_t *offset,
+ uint8_t *num_bufs, uint8_t **initial_reg_flag,
+ mm_camera_buf_def_t **bufs, mm_camera_map_unmap_ops_tbl_t *ops_tbl);
+
+ int32_t releaseBatchBufs(mm_camera_map_unmap_ops_tbl_t *ops_tbl);
+
+ int32_t invalidateBuf(uint32_t index);
+ int32_t cleanInvalidateBuf(uint32_t index);
+ int32_t calcOffset(cam_stream_info_t *streamInfo);
+ int32_t unmapStreamInfoBuf();
+ int32_t releaseStreamInfoBuf();
+ int32_t releaseMiscBuf();
+ int32_t mapBufs(QCameraMemory *heapBuf, cam_mapping_buf_type bufType,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl = NULL);
+ int32_t unMapBuf(QCameraMemory *heapBuf, cam_mapping_buf_type bufType,
+ mm_camera_map_unmap_ops_tbl_t *ops_tbl = NULL);
+
+ bool mDefferedAllocation;
+
+ bool wait_for_cond;
+ pthread_mutex_t m_lock;
+ pthread_cond_t m_cond;
+
+ BackgroundTask mAllocTask;
+ uint32_t mAllocTaskId;
+ BackgroundTask mMapTask;
+ uint32_t mMapTaskId;
+
+ bool mSyncCBEnabled;
+};
+
+}; // namespace qcamera
+
+#endif /* __QCAMERA_STREAM_H__ */