QCamera3Channel.h revision 65717e762ce17a3531e47732dd133ba6fa290474
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_CHANNEL_H__
31340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#define __QCAMERA3_CHANNEL_H__
32340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
33340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <hardware/camera3.h>
34340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Stream.h"
35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h"
36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
37340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" {
38340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h>
39340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}
40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangusing namespace android;
42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera {
44340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
45340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangtypedef void (*channel_cb_routine)(mm_camera_buf_def_t *frame,
46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                                camera3_stream_buffer_t *buffer, void *userdata);
47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Channel
49340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
50340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
51340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Channel(uint32_t cam_handle,
52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                   mm_camera_ops_t *cam_ops,
53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                   channel_cb_routine cb_routine);
54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Channel();
55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3Channel();
5665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
5765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t addStream(cam_stream_type_t streamType,
58340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                              cam_format_t streamFormat,
59340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                              cam_dimension_t streamDim,
60340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                              uint8_t minStreamBufnum,
6165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang                              cam_padding_info_t *paddingInfo);
6265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t start();
6365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t stop();
6465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
6565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t registerBuffers(uint32_t num_buffers,
67340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                        buffer_handle_t **buffers) = 0;
6865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual int32_t request(const camera3_stream_buffer_t *buffer) = 0;
69340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
70340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                            QCamera3Stream *stream) = 0;
71340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
7265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0;
7365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs() = 0;
7465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
75340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream *getStreamByHandle(uint32_t streamHandle);
76340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t getMyHandle() const {return m_handle;};
77340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint8_t getNumOfStreams() const {return m_numStreams;};
78340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream *getStreamByIndex(uint8_t index);
79340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
80340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static void streamCbRoutine(mm_camera_super_buf_t *super_frame,
81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                QCamera3Stream *stream, void *userdata);
82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprotected:
83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
84340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t init(mm_camera_channel_attr_t *attr,
85340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         mm_camera_buf_notify_t dataCB, // data CB for channel data
86340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         cam_padding_info_t *paddingInfo,
87340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                         void *userData);
88340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t allocateStreamInfoBuf(camera3_stream_t *stream);
89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t m_camHandle;
91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_ops_t *m_camOps;
92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    bool m_bIsActive;
93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t m_handle;
95340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint8_t m_numStreams;
96340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE];
97340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_buf_notify_t mDataCB;
98340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    void *mUserData;
99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mStreamInfoBuf;
101340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    channel_cb_routine mChannelCB;
102340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    cam_padding_info_t *mPaddingInfo;
103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3RegularChannel is used to handle all streams that are directly
106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * generated by hardware and given to frameworks without any postprocessing at HAL.
107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */
108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3RegularChannel : public QCamera3Channel
109340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
110340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
111340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3RegularChannel(uint32_t cam_handle,
112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    mm_camera_ops_t *cam_ops,
113340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    channel_cb_routine cb_routine,
114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    camera3_stream_t *stream);
115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3RegularChannel();
116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
11765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual int32_t request(const camera3_stream_buffer_t *buffer);
11865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual int32_t registerBuffers(uint32_t num_buffers,
11965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang                                buffer_handle_t **buffers);
12065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
12165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang                                            QCamera3Stream *stream);
12265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
12365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t le);
12465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs();
125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int kMaxBuffers;
128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
129340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    camera3_stream_t *mCamera3Stream;
130340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mNumBufs;
13165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    buffer_handle_t **mCamera3Buffers;
132340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3GrallocMemory *mMemory;
134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
135340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
136340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */
137340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3MetadataChannel : public QCamera3Channel
138340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
139340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
140340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3MetadataChannel(uint32_t cam_handle,
141340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    mm_camera_ops_t *cam_ops,
142340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    channel_cb_routine cb_routine);
143340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3MetadataChannel();
144340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
145340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t initialize();
146340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
14765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual int32_t request(const camera3_stream_buffer_t *buffer);
148340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t registerBuffers(uint32_t num_buffers,
149340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                buffer_handle_t **buffers);
150340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
151340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                            QCamera3Stream *stream);
152340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
15365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t le);
15465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs();
15565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
156340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
157340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mMemory;
15865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    bool mStarted;
159340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
160340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
161340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated
162340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * by the hardware, and encoded to a JPEG stream */
163340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3PicChannel : public QCamera3Channel
164340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
165340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
166340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3PicChannel(uint32_t cam_handle,
167340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    mm_camera_ops_t *cam_ops,
168340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    channel_cb_routine cb_routine,
169340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    camera3_stream_t *stream);
170340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    ~QCamera3PicChannel();
171340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
17265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual int32_t request(const camera3_stream_buffer_t *buffer);
173340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t registerBuffers(uint32_t num_buffers,
174340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                        buffer_handle_t **buffers);
175340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
176340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                            QCamera3Stream *stream);
17765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
17865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t le);
17965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs();
18065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
181340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
182340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int kMaxBuffers;
183340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
184340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    camera3_stream_t *mCamera3Stream;
185340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mNumBufs;
186340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    camera3_stream_buffer_set_t *mCamera3Buffers;
187340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
188340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3GrallocMemory *mJpegMemory;
189340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mYuvMemory;
190340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
191340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
192340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera
193340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
194340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA_CHANNEL_H__ */
195