111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without
411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are
511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met:
611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Redistributions of source code must retain the above copyright
711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       notice, this list of conditions and the following disclaimer.
811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Redistributions in binary form must reproduce the above
911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       copyright notice, this list of conditions and the following
1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       disclaimer in the documentation and/or other materials provided
1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       with the distribution.
1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       contributors may be used to endorse or promote products derived
1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       from this software without specific prior written permission.
1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */
2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#ifndef __QCAMERA3_CHANNEL_H__
3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCAMERA3_CHANNEL_H__
3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <hardware/camera3.h>
3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCamera3Stream.h"
3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCamera3Mem.h"
3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCamera3PostProc.h"
3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCamera3HALHeader.h"
3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" {
4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h>
4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}
4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevusing namespace android;
4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
45c8301d02dcb437da3fd90943086d351fa739b390Mekala Natarajan#define F_NUMBER_DECIMAL_PRECISION  100
4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera {
4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata,
4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                camera3_stream_buffer_t *buffer,
5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                uint32_t frame_number, void *userdata);
5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Channel
5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Channel(uint32_t cam_handle,
5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                   mm_camera_ops_t *cam_ops,
5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                   channel_cb_routine cb_routine,
5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                   cam_padding_info_t *paddingInfo,
5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                   void *userData);
6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Channel();
6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3Channel();
6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t addStream(cam_stream_type_t streamType,
6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              cam_format_t streamFormat,
6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              cam_dimension_t streamDim,
6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              uint8_t minStreamBufnum);
6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t start();
6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t stop();
6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t getStreamTypeMask();
7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t registerBuffers(uint32_t num_buffers,
7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                        buffer_handle_t **buffers) = 0;
7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t initialize() = 0;
7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t request(buffer_handle_t * /*buffer*/,
7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                uint32_t /*frameNumber*/){ return 0;};
7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t request(buffer_handle_t * /*buffer*/,
7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                uint32_t /*frameNumber*/,
8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                jpeg_settings_t* /*mJpegSettings*/,
8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                mm_camera_buf_def_t* /*pInputBuffer*/,
8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                QCamera3Channel* /*pInputChannel*/){ return 0;};
8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            QCamera3Stream *stream) = 0;
8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0;
8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void putStreamBufs() = 0;
8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Stream *getStreamByHandle(uint32_t streamHandle);
9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t getMyHandle() const {return m_handle;};
9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint8_t getNumOfStreams() const {return m_numStreams;};
9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Stream *getStreamByIndex(uint8_t index);
9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void streamCbRoutine(mm_camera_super_buf_t *super_frame,
9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                QCamera3Stream *stream, void *userdata);
9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void *mUserData;
9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    cam_padding_info_t *mPaddingInfo;
9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE];
9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint8_t m_numStreams;
10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprotected:
10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev   virtual int32_t init(mm_camera_channel_attr_t *attr,
10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                         mm_camera_buf_notify_t dataCB);
10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t allocateStreamInfoBuf(camera3_stream_t *stream);
10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t m_camHandle;
10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_ops_t *m_camOps;
10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool m_bIsActive;
10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t m_handle;
11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_buf_notify_t mDataCB;
11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3HeapMemory *mStreamInfoBuf;
11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    channel_cb_routine mChannelCB;
11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    //cam_padding_info_t *mPaddingInfo;
11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* QCamera3RegularChannel is used to handle all streams that are directly
12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * generated by hardware and given to frameworks without any postprocessing at HAL.
12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */
12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3RegularChannel : public QCamera3Channel
12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3RegularChannel(uint32_t cam_handle,
12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    mm_camera_ops_t *cam_ops,
12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    channel_cb_routine cb_routine,
13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    cam_padding_info_t *paddingInfo,
13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    void *userData,
13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    camera3_stream_t *stream);
13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3RegularChannel(uint32_t cam_handle,
13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    mm_camera_ops_t *cam_ops,
13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    channel_cb_routine cb_routine,
13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    cam_padding_info_t *paddingInfo,
13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    void *userData,
13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    camera3_stream_t *stream,
13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    uint32_t width, uint32_t height);
14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3RegularChannel();
14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t initialize();
14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t registerBuffers(uint32_t num_buffers,
14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                buffer_handle_t **buffers);
14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                            QCamera3Stream *stream);
14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual QCamera3Memory *getStreamBufs(uint32_t le);
15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void putStreamBufs();
15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer);
15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static int kMaxBuffers;
15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    camera3_stream_t *mCamera3Stream;
15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mNumBufs;
15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    buffer_handle_t **mCamera3Buffers;
15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
16011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3GrallocMemory *mMemory;
16111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // width and height of internal stream may be different than what's
16211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // specified in camera3_stream_t. For example: ZSL stream size is
16311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // always the active region size, but internally we use the JPEG
16411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // size.
16511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mWidth, mHeight;
16611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
16711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
16811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */
16911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3MetadataChannel : public QCamera3Channel
17011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
17111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
17211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3MetadataChannel(uint32_t cam_handle,
17311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    mm_camera_ops_t *cam_ops,
17411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    channel_cb_routine cb_routine,
17511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    cam_padding_info_t *paddingInfo,
17611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                    void *userData);
17711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3MetadataChannel();
17811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
17911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t initialize();
18011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
18111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
18211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t registerBuffers(uint32_t num_buffers,
18311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                buffer_handle_t **buffers);
18411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
18511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            QCamera3Stream *stream);
18611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
18711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual QCamera3Memory *getStreamBufs(uint32_t le);
18811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void putStreamBufs();
18911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
19011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
19111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3HeapMemory *mMemory;
19211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
19311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
19411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated
19511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * by the hardware, and encoded to a JPEG stream */
19611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3PicChannel : public QCamera3Channel
19711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
19811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
19911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3PicChannel(uint32_t cam_handle,
20011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            mm_camera_ops_t *cam_ops,
20111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            channel_cb_routine cb_routine,
20211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            cam_padding_info_t *paddingInfo,
20311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            void *userData,
20411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            camera3_stream_t *stream);
20511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    ~QCamera3PicChannel();
20611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
20711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t initialize();
20811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
20911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t request(buffer_handle_t *buffer,
21011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            uint32_t frameNumber, jpeg_settings_t* mJpegSettings,
21111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            mm_camera_buf_def_t* pInputBuffer,QCamera3Channel* pInputChannel);
21211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t registerBuffers(uint32_t num_buffers,
21311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            buffer_handle_t **buffers);
21411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
21511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            QCamera3Stream *stream);
21611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
21711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual QCamera3Memory *getStreamBufs(uint32_t le);
21811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void putStreamBufs();
21911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool isWNREnabled() {return m_bWNROn;};
22011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool needOnlineRotation();
22111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void getThumbnailSize(cam_dimension_t &dim);
22211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int getJpegQuality();
22311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int getJpegRotation();
22411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool isRawSnapshot();
22511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Exif *getExifData();
22611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void jpegEvtHandle(jpeg_job_status_t status,
22711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            uint32_t /*client_hdl*/,
22811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            uint32_t jobId,
22911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            mm_jpeg_output_t *p_output,
23011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            void *userdata);
23111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
23211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev            void *userdata);
23311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void queueMetadata(mm_camera_super_buf_t *metadata_buf);
23411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
23511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
23611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static int kMaxBuffers;
23711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3PostProcessor m_postprocessor; // post processor
23811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
23911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    camera3_stream_t *mCamera3Stream;
24011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mNumBufs;
24111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    buffer_handle_t **mCamera3Buffers;
24211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    jpeg_settings_t* mJpegSettings;
24311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t mCurrentBufIndex;
24411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool m_bWNROn;
24511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
24611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
24711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3GrallocMemory *mMemory;
24811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3HeapMemory *mYuvMemory;
24911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
25011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
25111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// reprocess channel class
25211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3ReprocessChannel : public QCamera3Channel
25311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
25411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
25511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3ReprocessChannel(uint32_t cam_handle,
25611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            mm_camera_ops_t *cam_ops,
25711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            channel_cb_routine cb_routine,
25811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            cam_padding_info_t *paddingInfo,
25911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            void *userData, void *ch_hdl);
26011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3ReprocessChannel();
26111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3ReprocessChannel();
26211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // online reprocess
26311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t doReprocess(mm_camera_super_buf_t *frame,
26411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                        mm_camera_super_buf_t *meta_frame);
26511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // offline reprocess
26611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val,
26711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                        mm_camera_super_buf_t *meta_buf);
26811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers);
26911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual QCamera3Memory *getStreamBufs(uint32_t len);
27011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void putStreamBufs();
27111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t initialize();
27211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
27311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            QCamera3Stream *stream);
27411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
27511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       void* userdata);
27611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &config,
27711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       QCamera3Channel *pSrcChannel,
27811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       QCamera3Channel *pMetaChannel);
27911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Stream *getStreamBySourceHandle(uint32_t srcHandle);
28011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
28111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void *picChHandle;
28211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
28311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE];
28411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess
28511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Channel *m_pMetaChannel;
28611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *m_metaFrame;
28711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3HeapMemory *mMemory;
28811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
28911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
29011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; // namespace qcamera
29111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
29211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* __QCAMERA_CHANNEL_H__ */
293