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