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 __QCAMERA_CHANNEL_H__
3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCAMERA_CHANNEL_H__
3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <hardware/camera.h>
3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCameraStream.h"
3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" {
3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h>
3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}
3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera {
4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraChannel
4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraChannel(uint32_t cam_handle,
4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                   mm_camera_ops_t *cam_ops);
4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraChannel();
4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCameraChannel();
4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t init(mm_camera_channel_attr_t *attr,
5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                         mm_camera_buf_notify_t dataCB, // data CB for channel data
5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                         void *userData);
5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // Owner of memory is transferred from the caller to the caller with this call.
5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t addStream(QCameraAllocator& allocator,
5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              QCameraHeapMemory *streamInfoBuf,
5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              uint8_t minStreamBufnum,
5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              cam_padding_info_t *paddingInfo,
5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              stream_cb_routine stream_cb,
5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                              void *userdata);
5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t start();
6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t stop();
6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int32_t processZoomDone(preview_stream_ops_t *previewWindow,
6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                    cam_crop_data_t &crop_info);
6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraStream *getStreamByHandle(uint32_t streamHandle);
6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t getMyHandle() const {return m_handle;};
6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint8_t getNumOfStreams() const {return m_numStreams;};
6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraStream *getStreamByIndex(uint8_t index);
6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraStream *getStreamByServerID(uint32_t serverID);
6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprotected:
7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t m_camHandle;
7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_ops_t *m_camOps;
7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool m_bIsActive;
7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t m_handle;
7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint8_t m_numStreams;
7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraStream *mStreams[MAX_STREAM_NUM_IN_BUNDLE];
7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_buf_notify_t mDataCB;
7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void *mUserData;
8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// burst pic channel: i.e. zsl burst mode
8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraPicChannel : public QCameraChannel
8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraPicChannel(uint32_t cam_handle,
8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                      mm_camera_ops_t *cam_ops);
8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraPicChannel();
8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCameraPicChannel();
9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t takePicture(uint8_t num_of_snapshot);
9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t cancelPicture();
9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// video channel class
9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraVideoChannel : public QCameraChannel
9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraVideoChannel(uint32_t cam_handle,
9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                        mm_camera_ops_t *cam_ops);
10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraVideoChannel();
10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCameraVideoChannel();
10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t releaseFrame(const void *opaque, bool isMetaData);
10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// reprocess channel class
10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCameraReprocessChannel : public QCameraChannel
10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraReprocessChannel(uint32_t cam_handle,
11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                            mm_camera_ops_t *cam_ops);
11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraReprocessChannel();
11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCameraReprocessChannel();
11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t addReprocStreamsFromSource(QCameraAllocator& allocator,
11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       cam_pp_feature_config_t &config,
11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       QCameraChannel *pSrcChannel,
11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       uint8_t minStreamBufNum,
11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                       cam_padding_info_t *paddingInfo);
11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // online reprocess
11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t doReprocess(mm_camera_super_buf_t *frame);
12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    // offline reprocess
12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val);
12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraStream *getStreamBySrouceHandle(uint32_t srcHandle);
12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE];
12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraChannel *m_pSrcChannel; // ptr to source channel for reprocess
12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; // namespace qcamera
13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* __QCAMERA_CHANNEL_H__ */
133