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>
346cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang#include <utils/List.h>
35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Stream.h"
36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h"
373ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru#include "QCamera3PostProc.h"
383ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru#include "QCamera3HALHeader.h"
3909e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang#include "utils/Vector.h"
40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" {
42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h>
43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}
44340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
45340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangusing namespace android;
46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera {
48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
4969c21b5cfa0d1ecd34c7e52f124346649c97303aTanmaya Godboletypedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata,
50dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                                camera3_stream_buffer_t *buffer,
51dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                                uint32_t frame_number, void *userdata);
52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Channel
54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
56340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Channel(uint32_t cam_handle,
57340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                   mm_camera_ops_t *cam_ops,
58dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                   channel_cb_routine cb_routine,
59dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                   cam_padding_info_t *paddingInfo,
60dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                   void *userData);
61340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Channel();
62340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3Channel();
6365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
6465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t addStream(cam_stream_type_t streamType,
65340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                              cam_format_t streamFormat,
66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                              cam_dimension_t streamDim,
67dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                              uint8_t minStreamBufnum);
686c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t start();
696cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang    virtual int32_t stop();
7065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
7165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
72102ec43246e5c36c50d8b897e79a9ae979ac949cNagesh Subba Reddy    uint32_t getStreamTypeMask();
736625718416009d7330af77764c5fc24104d0ff20Shuzhen Wang    uint32_t getStreamID(uint32_t streamMask);
743ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    virtual int32_t initialize() = 0;
75f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang    virtual int32_t request(buffer_handle_t * /*buffer*/,
76f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang                uint32_t /*frameNumber*/){ return 0;};
77f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang    virtual int32_t request(buffer_handle_t * /*buffer*/,
78f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang                uint32_t /*frameNumber*/,
7971ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang                mm_camera_buf_def_t* /*pInputBuffer*/,
80ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang                metadata_buffer_t* /*metadata*/){ return 0;};
81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                            QCamera3Stream *stream) = 0;
83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
846c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t *buffer) = 0;
8565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0;
8665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs() = 0;
8765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
88340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream *getStreamByHandle(uint32_t streamHandle);
89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t getMyHandle() const {return m_handle;};
90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint8_t getNumOfStreams() const {return m_numStreams;};
91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3Stream *getStreamByIndex(uint8_t index);
92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static void streamCbRoutine(mm_camera_super_buf_t *super_frame,
94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                QCamera3Stream *stream, void *userdata);
951a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    void *mUserData;
961a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    cam_padding_info_t *mPaddingInfo;
971a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE];
981a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    uint8_t m_numStreams;
99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprotected:
100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
1013ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru   virtual int32_t init(mm_camera_channel_attr_t *attr,
102dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                         mm_camera_buf_notify_t dataCB);
103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    int32_t allocateStreamInfoBuf(camera3_stream_t *stream);
104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t m_camHandle;
106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_ops_t *m_camOps;
107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    bool m_bIsActive;
108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
109340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t m_handle;
1101a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani
1111a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani
112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    mm_camera_buf_notify_t mDataCB;
1131a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani
114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mStreamInfoBuf;
116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    channel_cb_routine mChannelCB;
1171a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    //cam_padding_info_t *mPaddingInfo;
118340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
119340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
120340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3RegularChannel is used to handle all streams that are directly
121340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * generated by hardware and given to frameworks without any postprocessing at HAL.
122340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */
123340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3RegularChannel : public QCamera3Channel
124340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3RegularChannel(uint32_t cam_handle,
127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    mm_camera_ops_t *cam_ops,
128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    channel_cb_routine cb_routine,
129dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                    cam_padding_info_t *paddingInfo,
130dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                    void *userData,
1316c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    camera3_stream_t *stream,
1326c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    cam_stream_type_t stream_type);
133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3RegularChannel();
134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
1356c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t start();
1363ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    virtual int32_t initialize();
137dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
13865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
13965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang                                            QCamera3Stream *stream);
14065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
141286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len);
1422d2e8ed6d371c5350d20445fcfb722b54faf227aMansoor Aftab    virtual void putStreamBufs() {};
14371ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang    mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer);
1446c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t *buffer);
145340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
146340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
147340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int kMaxBuffers;
14884057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabprotected:
14909e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang    QCamera3GrallocMemory mMemory;
150340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
151340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    camera3_stream_t *mCamera3Stream;
152340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mNumBufs;
1536c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
1546c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    cam_stream_type_t mStreamType; // Stream type
155340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
156340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
157340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */
158340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3MetadataChannel : public QCamera3Channel
159340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
160340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
161340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3MetadataChannel(uint32_t cam_handle,
162340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                    mm_camera_ops_t *cam_ops,
163dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                    channel_cb_routine cb_routine,
164dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                    cam_padding_info_t *paddingInfo,
165dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang                    void *userData);
166340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual ~QCamera3MetadataChannel();
167340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
1683ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    virtual int32_t initialize();
169340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
170dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
1716c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
1726c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                            QCamera3Stream *stream);
1736c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
174286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len);
1756c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual void putStreamBufs();
1766c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
1776c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang            { return NO_ERROR; };
1786c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
1796c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangprivate:
1806c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    QCamera3HeapMemory *mMemory;
1816c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang};
1826c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
1836c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang/* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */
1846c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangclass QCameraRawChannel : public QCamera3Channel
1856c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang{
1866c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangpublic:
1876c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    QCameraRawChannel(uint32_t cam_handle,
1886c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    mm_camera_ops_t *cam_ops,
1896c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    channel_cb_routine cb_routine,
1906c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    cam_padding_info_t *paddingInfo,
1916c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    void *userData,
1926c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang                    cam_dimension_t *raw_dim);
1936c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual ~QCameraRawChannel();
1946c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
1956c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t initialize();
1966c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
1976c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
198340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual int32_t registerBuffers(uint32_t num_buffers,
199340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                buffer_handle_t **buffers);
200340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
201340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang                            QCamera3Stream *stream);
202340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
203286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len);
20465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs();
2056c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    void dumpRawSnapshot(mm_camera_buf_def_t *frame);
2066c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
2076c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang            { return NO_ERROR; };
20869c21b5cfa0d1ecd34c7e52f124346649c97303aTanmaya Godbole
209340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
210340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mMemory;
2116c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    uint32_t mWidth, mHeight;
2126c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    uint32_t mMaxBuffers;
213340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
214340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
21584057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab/* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing
21684057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab * vendor specific bayer data or 16-bit unpacked bayer data */
21784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabclass QCamera3RawChannel : public QCamera3RegularChannel
21852658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab{
21952658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftabpublic:
22084057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    QCamera3RawChannel(uint32_t cam_handle,
22152658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab                    mm_camera_ops_t *cam_ops,
22252658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab                    channel_cb_routine cb_routine,
22352658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab                    cam_padding_info_t *paddingInfo,
22452658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab                    void *userData,
22584057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab                    camera3_stream_t *stream,
22684057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab                    bool raw_16 = false);
22784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    virtual ~QCamera3RawChannel();
22852658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab
22952658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
23052658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab                            QCamera3Stream *stream);
23152658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab
23284057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab
23384057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabpublic:
23484057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    static int kMaxBuffers;
23552658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab
23652658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftabprivate:
23784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    bool mRawDump;
23884057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    bool mIsRaw16;
23984057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab
24084057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    void dumpRawSnapshot(mm_camera_buf_def_t *frame);
24184057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab    void convertToRaw16(mm_camera_buf_def_t *frame);
24252658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab};
24352658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab
244340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated
245340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * by the hardware, and encoded to a JPEG stream */
246340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3PicChannel : public QCamera3Channel
247340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{
248340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
249340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3PicChannel(uint32_t cam_handle,
2503ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            mm_camera_ops_t *cam_ops,
2513ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            channel_cb_routine cb_routine,
2523ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            cam_padding_info_t *paddingInfo,
2533ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            void *userData,
2543ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            camera3_stream_t *stream);
255340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    ~QCamera3PicChannel();
256340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
2573ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    virtual int32_t initialize();
258f01d050546971cfea3f84aeb8be9e270471f127eShuzhen Wang    virtual int32_t stop();
2593ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    virtual int32_t request(buffer_handle_t *buffer,
260ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang            uint32_t frameNumber,
261ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang            mm_camera_buf_def_t* pInputBuffer,
262ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang            metadata_buffer_t* metadata);
263340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
2643ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            QCamera3Stream *stream);
26565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
266286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t len);
26765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang    virtual void putStreamBufs();
268ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang
2691a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    bool isWNREnabled() {return m_bWNROn;};
2703ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    bool needOnlineRotation();
271ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    QCamera3Exif *getExifData(metadata_buffer_t *metadata,
272ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang            jpeg_settings_t *jpeg_settings);
273ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    void overrideYuvSize(uint32_t width, uint32_t height);
2743ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru    static void jpegEvtHandle(jpeg_job_status_t status,
2753ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            uint32_t /*client_hdl*/,
2763ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            uint32_t jobId,
2773ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            mm_jpeg_output_t *p_output,
2783ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru            void *userdata);
279e803115f5c8573703e3b00a3f8741bf3816b8f23Mansoor Aftab    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
280e803115f5c8573703e3b00a3f8741bf3816b8f23Mansoor Aftab            void *userdata);
281ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    int32_t queueReprocMetadata(metadata_buffer_t *metadata);
2826c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t *buffer);
283ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang
284ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wangprivate:
285ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    int32_t queueJpegSetting(int32_t out_buf_index, metadata_buffer_t *metadata);
28665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang
287340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic:
288340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    static int kMaxBuffers;
2891a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3PostProcessor m_postprocessor; // post processor
290340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate:
291340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    camera3_stream_t *mCamera3Stream;
292340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    uint32_t mNumBufs;
293b6424056f1221af718daa26e0dc441b8d3cd15e5Apurva Rajguru    int32_t mCurrentBufIndex;
2941a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    bool m_bWNROn;
295ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    uint32_t mYuvWidth, mYuvHeight;
2963ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru
29709e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang    QCamera3GrallocMemory mMemory;
298340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang    QCamera3HeapMemory *mYuvMemory;
29939e17326969dfb6ba9af2efcefe36987d353029aMansoor Aftab    QCamera3Channel *m_pMetaChannel;
30039e17326969dfb6ba9af2efcefe36987d353029aMansoor Aftab    mm_camera_super_buf_t *mMetaFrame;
301ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang
3021a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani};
3031a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani
3041a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani// reprocess channel class
3051a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudaniclass QCamera3ReprocessChannel : public QCamera3Channel
3061a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani{
3071a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudanipublic:
3081a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3ReprocessChannel(uint32_t cam_handle,
3091a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                            mm_camera_ops_t *cam_ops,
3101a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                            channel_cb_routine cb_routine,
3111a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                            cam_padding_info_t *paddingInfo,
3121a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                            void *userData, void *ch_hdl);
3131a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3ReprocessChannel();
3141a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    virtual ~QCamera3ReprocessChannel();
3151a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    // online reprocess
3161a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    int32_t doReprocess(mm_camera_super_buf_t *frame,
3171a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                        mm_camera_super_buf_t *meta_frame);
318ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    int32_t doReprocessOffline(mm_camera_super_buf_t *frame,
319ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang                        metadata_buffer_t *metadata);
3201a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    // offline reprocess
3211a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val,
3221a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                        mm_camera_super_buf_t *meta_buf);
3231a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    virtual QCamera3Memory *getStreamBufs(uint32_t len);
3241a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    virtual void putStreamBufs();
3251a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    virtual int32_t initialize();
3261a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
3271a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                            QCamera3Stream *stream);
3286cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang    virtual int32_t stop();
3291a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
3301a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                                       void* userdata);
331ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config,
3321a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                                       QCamera3Channel *pSrcChannel,
3331a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani                                       QCamera3Channel *pMetaChannel);
334ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle);
335ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang    QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle);
3368991e1387b323f2cd4003c0703dc28db5ee5cb87Mansoor Aftab    int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame);
3376c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
3386c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang            { return NO_ERROR; };
3396c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang
3401a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudanipublic:
3411a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    void *picChHandle;
3421a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudaniprivate:
3436cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang    typedef struct {
3446cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang        QCamera3Stream *stream;
3456cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang        cam_mapping_buf_type type;
3466cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang        int index;
3476cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang    } OfflineBuffer;
3486cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang
3496cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang    android::List<OfflineBuffer> mOfflineBuffers;
3501a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE];
3511a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess
3521a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3Channel *m_pMetaChannel;
3531a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani    QCamera3HeapMemory *mMemory;
354340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang};
355340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
356286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang/* QCamera3SupportChannel is for HAL internal consumption only */
357286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangclass QCamera3SupportChannel : public QCamera3Channel
358286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang{
359286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangpublic:
360286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    QCamera3SupportChannel(uint32_t cam_handle,
361286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang                    mm_camera_ops_t *cam_ops,
362286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang                    cam_padding_info_t *paddingInfo,
363286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang                    void *userData);
364286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual ~QCamera3SupportChannel();
365286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang
366286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual int32_t initialize();
367286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang
368286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
369286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
370286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang                            QCamera3Stream *stream);
371286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang
372286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual QCamera3Memory *getStreamBufs(uint32_t le);
373286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual void putStreamBufs();
374286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
375286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang            { return NO_ERROR; };
376286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang
377286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    static cam_dimension_t kDim;
378286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangprivate:
379286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang    QCamera3HeapMemory *mMemory;
380286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang};
381286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang
382340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera
383340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang
384340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA_CHANNEL_H__ */
385