100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang/* 200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** Copyright 2008, Google Inc. 3e3e6d5190f31c50e5fd9f9b34dfdf32bfe457f3fDuy Truong** Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. 400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** 500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** Licensed under the Apache License, Version 2.0 (the "License"); 600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** you may not use this file except in compliance with the License. 700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** You may obtain a copy of the License at 800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** 900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** http://www.apache.org/licenses/LICENSE-2.0 1000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** 1100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** Unless required by applicable law or agreed to in writing, software 1200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** distributed under the License is distributed on an "AS IS" BASIS, 1300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** See the License for the specific language governing permissions and 1500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang** limitations under the License. 1600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang*/ 1700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 1800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#ifndef ANDROID_HARDWARE_QCAMERA_STREAM_H 1900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define ANDROID_HARDWARE_QCAMERA_STREAM_H 2000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 2100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 2200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <utils/threads.h> 2300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 2400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <binder/MemoryBase.h> 2500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <binder/MemoryHeapBase.h> 2600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <utils/threads.h> 2700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 2800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 2900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include "QCameraHWI.h" 3000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangextern "C" { 3100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <mm_camera_interface.h> 3200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#include <mm_jpeg_interface.h> 3300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 3400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define OPAQUE_BUFFER_COUNT 5 3500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define STREAM_TABLE_SIZE 8 3600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 3700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define MM_CAMERA_CH_PREVIEW_MASK (0x01 << MM_CAMERA_CH_PREVIEW) 3800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define MM_CAMERA_CH_VIDEO_MASK (0x01 << MM_CAMERA_CH_VIDEO) 3900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#define MM_CAMERA_CH_SNAPSHOT_MASK (0x01 << MM_CAMERA_CH_SNAPSHOT) 4000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 4100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang} /* extern C*/ 4200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 4300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangnamespace android { 4400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 4500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass QCameraHardwareInterface; 4600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 4700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass StreamQueue { 4800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprivate: 4900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang Mutex mQueueLock; 5000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang Condition mQueueWait; 5100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool mInitialized; 5200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 5300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang //Vector<struct msm_frame *> mContainer; 5400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang Vector<void *> mContainer; 5500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 5600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang StreamQueue(); 5700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual ~StreamQueue(); 5800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool enqueue(void *element); 5900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void flush(); 6000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void* dequeue(); 6100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void init(); 6200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void deinit(); 6300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool isInitialized(); 6400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangbool isEmpty(); 6500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; 6600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 6700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangtypedef struct { 6800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int buffer_count; 6900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang buffer_handle_t buffer_handle[MM_CAMERA_MAX_NUM_FRAMES]; 7000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang struct private_handle_t *private_buffer_handle[MM_CAMERA_MAX_NUM_FRAMES]; 7100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int stride[MM_CAMERA_MAX_NUM_FRAMES]; 7200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t addr_offset[MM_CAMERA_MAX_NUM_FRAMES]; 7300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t local_flag[MM_CAMERA_MAX_NUM_FRAMES]; 7400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int main_ion_fd[MM_CAMERA_MAX_NUM_FRAMES]; 7500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang struct ion_fd_data ion_info_fd[MM_CAMERA_MAX_NUM_FRAMES]; 7600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang} QCameraStreamMemory_t; 7700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 7800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass QCameraStream { 7900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 8000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 8100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool mInit; 8200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool mActive; 8300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 8400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mCameraHandle; 8500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mChannelId; 8600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mMmStreamId; 8700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mWidth; 8800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mHeight; 8900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang cam_format_t mFormat; 9000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t mNumBuffers; 9100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_frame_len_offset mFrameOffsetInfo; 9200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *p_mm_ops; 9300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_img_mode mExtImgMode; 9400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 9500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t mPendingCount; 9600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 9700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang pthread_mutex_t mFrameDeliveredMutex; 9800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang pthread_cond_t mFrameDeliveredCond; 9900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 10000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t init(); 10100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t start(); 10200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void stop(); 10300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void release(); 10400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 10500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t setFormat(); 10600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t setMode(int enable); 10700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 10800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int getStreamId() {return mStreamId;} 10900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int getMaxBuffers() {return mMaxBuffers;} 11000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 11100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream *getStreamAtId(int id); 11200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream *getStreamAtMmId(uint32_t mm_id); 11300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static void streamOffAll(); 11400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 11500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void setHALCameraControl(QCameraHardwareInterface* ctrl); 11600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 11700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual int prepareStream() {return NO_ERROR;} 11800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void onNewRequest(); 11900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void dataCallback(mm_camera_super_buf_t *bufs); 12000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int32_t streamOn(); 12100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int32_t streamOff(bool aSync); 12200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t initStream(mm_camera_img_mode imgmode, cam_format_t format); 12300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t deinitStream(); 12400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t initBuffers(){return NO_ERROR;} 12500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual sp<IMemoryHeap> getRawHeap() const {return NULL;} 12600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void *getLastQueuedFrame(void){return NULL;} 12700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t processPreviewFrame(mm_camera_super_buf_t *frame){return NO_ERROR;} 12800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 12900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang /* Set the ANativeWindow */ 13000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual int setPreviewWindow(const camera2_stream_ops_t* window) {return NO_ERROR;} 13100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void notifyWDenoiseEvent(cam_ctrl_status_t status, void * cookie) {;} 13200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void resetSnapshotCounters(void ){}; 13300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void initHdrInfoForSnapshot(bool HDR_on, int number_frames, int *exp){}; 13400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual void notifyHdrEvent(cam_ctrl_status_t status, void * cookie){}; 13500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t receiveRawPicture(mm_camera_super_buf_t* recvd_frame){return NO_ERROR;}; 13600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 13700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream(uint32_t CameraHandle, 13800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 13900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 14000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 14100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 14200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 14300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual ~QCameraStream(); 14400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 14500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraHardwareInterface* mHalCamCtrl; 14600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_rect_t mCrop; 14700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 14800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t myMode; 14900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 15000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mutable Mutex mLock; 15100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprotected: 15200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 15300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mStreamId; 15400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int mMaxBuffers; 15500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int allocateStreamId(); 15600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int deallocateStreamId(int id); 15700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 15800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprivate: 15900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream *mStreamTable[STREAM_TABLE_SIZE]; 16000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 16100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang StreamQueue mBusyQueue; 16200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang StreamQueue mFreeQueue; 16300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 16400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream(); 16500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 16600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang// friend void liveshot_callback(mm_camera_ch_data_buf_t *frame,void *user_data); 16700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; 16800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 16900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass QCameraStream_preview : public QCameraStream { 17000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 17100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t init(); 17200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t start() ; 17300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void stop() ; 17400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void release() ; 17500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 17600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream* createInstance(uint32_t CameraHandle, 17700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 17800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 17900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 18000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int requestedFormat, 18100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 18200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 18300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static void deleteInstance(QCameraStream *p); 18400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 18500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual ~QCameraStream_preview(); 18600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void *getLastQueuedFrame(void); 18700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t initBuffers(); 18800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void deinitBuffers(); 18900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 19000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual int prepareStream(); 19100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang virtual status_t processPreviewFrame(mm_camera_super_buf_t *frame); 19200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 19300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int setPreviewWindow(const camera2_stream_ops_t* window); 19400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int registerStreamBuffers(int num_buffers, buffer_handle_t *buffers); 19500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang friend class QCameraHardwareInterface; 19600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 19700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprivate: 19800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream_preview(); 19900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream_preview(uint32_t CameraHandle, 20000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 20100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 20200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 20300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int requestedFormat, 20400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 20500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 20600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 20700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void dumpFrameToFile(mm_camera_buf_def_t* newFrame); 20800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 20900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprivate: 21000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang bool mFirstFrameRcvd; 21100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStreamMemory_t mPreviewMemory; 21200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang Mutex mPreviewMemoryLock; 21300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 21400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int8_t my_id; 21500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_op_mode_type_t op_mode; 21600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_buf_def_t *mLastQueuedFrame; 21700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_buf_def_t *mDisplayBuf; 21800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang Mutex mDisplayLock; 21900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang const camera2_stream_ops_t *mPreviewWindow; 22000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_super_buf_t mNotifyBuffer[16]; 22100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int8_t mNumFDRcvd; 22200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int mVFEOutputs; 22300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int mHFRFrameCnt; 22400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int mHFRFrameSkip; 22500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; 22600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 22700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass QCameraStream_SnapshotMain : public QCameraStream { 22800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 22900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t init(); 23000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t start(); 23100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void stop(); 23200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void release(); 23300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t initMainBuffers(); 23400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void releaseMainBuffers(); 23500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void initHdrInfoForSnapshot(bool HDR_on, int number_frames, int *exp); 23600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void notifyHdrEvent(cam_ctrl_status_t status, void * cookie); 23700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static void deleteInstance(QCameraStream *p); 23800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t receiveRawPicture(mm_camera_super_buf_t* recvd_frame); 23900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_buf_def_t mSnapshotStreamBuf[MM_CAMERA_MAX_NUM_FRAMES]; 24000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream* createInstance(uint32_t CameraHandle, 24100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 24200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 24300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 24400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Format, 24500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t NumBuffers, 24600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 24700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_img_mode imgmode, 24800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 24900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream_SnapshotMain(uint32_t CameraHandle, 25000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 25100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 25200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 25300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Format, 25400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t NumBuffers, 25500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 25600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_img_mode imgmode, 25700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 25800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang ~QCameraStream_SnapshotMain(); 25900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 26000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangprivate: 26100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t doHdrProcessing(); 26200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t encodeData(mm_camera_super_buf_t* recvd_frame); 26300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang /*Member variables*/ 26400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_jpeg_ops_t mJpegHandle; 26500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t mJpegClientHandle; 26600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang int mSnapshotState; 26700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang StreamQueue mSnapshotQueue; 26800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; 26900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 27000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangclass QCameraStream_SnapshotThumbnail : public QCameraStream { 27100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wangpublic: 27200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t init(); 27300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t start(); 27400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void stop(); 27500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang void release(); 27600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang status_t initThumbnailBuffers(); 27700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static QCameraStream* createInstance(uint32_t CameraHandle, 27800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 27900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 28000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 28100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Format, 28200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t NumBuffers, 28300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 28400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_img_mode imgmode, 28500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 28600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang QCameraStream_SnapshotThumbnail(uint32_t CameraHandle, 28700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t ChannelId, 28800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Width, 28900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Height, 29000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint32_t Format, 29100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang uint8_t NumBuffers, 29200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_vtbl_t *mm_ops, 29300bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_img_mode imgmode, 29400bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang camera_mode_t mode); 29500bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang ~QCameraStream_SnapshotThumbnail(); 29600bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang static void deleteInstance(QCameraStream *p); 29700bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang mm_camera_buf_def_t mPostviewStreamBuf[MM_CAMERA_MAX_NUM_FRAMES]; 29800bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; 29900bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 30000bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang}; // namespace android 30100bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang 30200bf2d2f8f42f81436d1eaa7e0672817eb834994Shuzhen Wang#endif 303