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