1340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *
3340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Redistribution and use in source and binary forms, with or without
4340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * modification, are permitted provided that the following conditions are
5340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * met:
6340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *     * Redistributions of source code must retain the above copyright
7340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       notice, this list of conditions and the following disclaimer.
8340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *     * Redistributions in binary form must reproduce the above
9340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       copyright notice, this list of conditions and the following
10340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       disclaimer in the documentation and/or other materials provided
11340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       with the distribution.
12340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *     * Neither the name of The Linux Foundation nor the names of its
13340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       contributors may be used to endorse or promote products derived
14340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *       from this software without specific prior written permission.
15340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *
16340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang *
28340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang */
29340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
30340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#ifndef __QCAMERA3_STREAM_H__
31340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#define __QCAMERA3_STREAM_H__
32340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
33340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <hardware/camera3.h>
34340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCameraCmdThread.h"
35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h"
36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
37340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" {
38340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h>
39340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}
40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera {
42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Stream;
4465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wangclass QCamera3Channel;
4565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangtypedef void (*stream_cb_routine)(mm_camera_super_buf_t *frame,
47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                                  QCamera3Stream *stream,
48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                                  void *userdata);
49340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
50340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Stream
51340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream(uint32_t camHandle,
54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                  uint32_t chId,
55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                  mm_camera_ops_t *camOps,
56340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                  cam_padding_info_t *paddingInfo,
5765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang                  QCamera3Channel *channel);
58340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3Stream();
59340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t init(cam_stream_type_t streamType,
60340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         cam_format_t streamFormat,
61340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         cam_dimension_t streamDim,
621a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                         cam_stream_reproc_config_t* reprocess_config,
63340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         uint8_t minStreamBufNum,
64340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         stream_cb_routine stream_cb,
65340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         void *userdata);
66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t bufDone(int index);
67340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t processDataNotify(mm_camera_super_buf_t *bufs);
68340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t start();
69340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t stop();
70340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
71340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, void *userdata);
72340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static void *dataProcRoutine(void *data);
73340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t getMyHandle() const {return mHandle;}
74102ec43246e5c36c50d8b897e79a9ae979ac949cNagesh Subba Reddy    cam_stream_type_t getMyType() const;
75340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t getFrameOffset(cam_frame_len_offset_t &offset);
76340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t getFrameDimension(cam_dimension_t &dim);
77340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t getFormat(cam_format_t &fmt);
7871ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang    mm_camera_buf_def_t* getInternalFormatBuffer(int index);
79340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Memory *getStreamBufs() {return mStreamBufs;};
80340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t getMyServerID();
81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t mapBuf(uint8_t buf_type, uint32_t buf_idx,
83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                   int32_t plane_idx, int fd, uint32_t size);
84340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t unmapBuf(uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx);
85340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t setParameter(cam_stream_parm_buffer_t &param);
86340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
870ebd059771a510273a57e8a28924fdb8e506ca5aShuzhen Wang    static void releaseFrameData(void *data, void *user_data);
880ebd059771a510273a57e8a28924fdb8e506ca5aShuzhen Wang
89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mCamHandle;
91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mChannelHandle;
92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mHandle; // stream handle from mm-camera-interface
93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_ops_t *mCamOps;
94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    cam_stream_info_t *mStreamInfo; // ptr to stream info buf
95340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_stream_mem_vtbl_t mMemVtbl;
966c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    mm_camera_map_unmap_ops_tbl_t *mMemOps;
97340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint8_t mNumBufs;
98340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    stream_cb_routine mDataCB;
99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    void *mUserData;
100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
101340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCameraQueue     mDataQ;
102340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCameraCmdThread mProcTh; // thread for dataCB
103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mStreamInfoBuf;
105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Memory *mStreamBufs;
106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_buf_def_t *mBufDefs;
107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    cam_frame_len_offset_t mFrameLenOffset;
108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    cam_padding_info_t mPaddingInfo;
10965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    QCamera3Channel *mChannel;
110340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
111340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int32_t get_bufs(
112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     cam_frame_len_offset_t *offset,
113340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     uint8_t *num_bufs,
114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     uint8_t **initial_reg_flag,
115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     mm_camera_buf_def_t **bufs,
116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     mm_camera_map_unmap_ops_tbl_t *ops_tbl,
117340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     void *user_data);
118340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int32_t put_bufs(
119340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     mm_camera_map_unmap_ops_tbl_t *ops_tbl,
120340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     void *user_data);
12102e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang    static int32_t invalidate_buf(int index, void *user_data);
12202e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang    static int32_t clean_invalidate_buf(int index, void *user_data);
123340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
124340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t getBufs(cam_frame_len_offset_t *offset,
125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     uint8_t *num_bufs,
126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     uint8_t **initial_reg_flag,
127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     mm_camera_buf_def_t **bufs,
128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                     mm_camera_map_unmap_ops_tbl_t *ops_tbl);
129340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t putBufs(mm_camera_map_unmap_ops_tbl_t *ops_tbl);
13002e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang    int32_t invalidateBuf(int index);
13102e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang    int32_t cleanInvalidateBuf(int index);
132340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
135340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera
136340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
137340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA3_STREAM_H__ */
138