1a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev/* Copyright (c) 2012, The Linux Foundataion. All rights reserved.
2a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *
3a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * Redistribution and use in source and binary forms, with or without
4a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * modification, are permitted provided that the following conditions are
5a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * met:
6a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *     * Redistributions of source code must retain the above copyright
7a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       notice, this list of conditions and the following disclaimer.
8a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *     * Redistributions in binary form must reproduce the above
9a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       copyright notice, this list of conditions and the following
10a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       disclaimer in the documentation and/or other materials provided
11a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       with the distribution.
12a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
13a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       contributors may be used to endorse or promote products derived
14a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *       from this software without specific prior written permission.
15a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *
16a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev *
28a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev */
29a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
30a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#ifndef __QCAMERA_STREAM_H__
31a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#define __QCAMERA_STREAM_H__
32a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
33a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#include <hardware/camera.h>
34a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#include "QCameraCmdThread.h"
35a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#include "QCameraMem.h"
36a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#include "QCameraAllocator.h"
37a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
38a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevextern "C" {
39a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#include <mm_camera_interface.h>
40a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev}
41a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
42a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevnamespace qcamera {
43a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
44a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevclass QCameraStream;
45a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevtypedef void (*stream_cb_routine)(mm_camera_super_buf_t *frame,
46a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                                  QCameraStream *stream,
47a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                                  void *userdata);
48a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
49a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevclass QCameraStream
50a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev{
51a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevpublic:
52a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraStream(QCameraAllocator &allocator,
53a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                  uint32_t camHandle,
54a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                  uint32_t chId,
55a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                  mm_camera_ops_t *camOps,
56a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                  cam_padding_info_t *paddingInfo);
57a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual ~QCameraStream();
58a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t init(QCameraHeapMemory *streamInfoBuf,
59a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                         uint8_t minStreamBufNum,
60a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                         stream_cb_routine stream_cb,
61a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                         void *userdata);
62a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t processZoomDone(preview_stream_ops_t *previewWindow,
63a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                                    cam_crop_data_t &crop_info);
64a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t bufDone(int index);
65a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t bufDone(const void *opaque, bool isMetaData);
66a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t processDataNotify(mm_camera_super_buf_t *bufs);
67a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t start();
68a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    virtual int32_t stop();
69a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
70a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, void *userdata);
71a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    static void *dataProcRoutine(void *data);
72a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint32_t getMyHandle() const {return mHandle;}
73a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    bool isTypeOf(cam_stream_type_t type);
74c55c7a4acc3726062dd56ed6437f539e4b0bd954Nagesh Subba Reddy    bool isOrignalTypeOf(cam_stream_type_t type);
75a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t getFrameOffset(cam_frame_len_offset_t &offset);
76a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t getCropInfo(cam_rect_t &crop);
77a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t getFrameDimension(cam_dimension_t &dim);
78a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t getFormat(cam_format_t &fmt);
79a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraMemory *getStreamBufs() {return mStreamBufs;};
80a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint32_t getMyServerID();
81a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    cam_stream_type_t getMyType();
82a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
83a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t mapBuf(uint8_t buf_type, uint32_t buf_idx,
84a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                   int32_t plane_idx, int fd, uint32_t size);
85a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t unmapBuf(uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx);
86a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t setParameter(cam_stream_parm_buffer_t &param);
87a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
88a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchevprivate:
89a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint32_t mCamHandle;
90a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint32_t mChannelHandle;
91a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint32_t mHandle; // stream handle from mm-camera-interface
92a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    mm_camera_ops_t *mCamOps;
93a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    cam_stream_info_t *mStreamInfo; // ptr to stream info buf
94a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    mm_camera_stream_mem_vtbl_t mMemVtbl;
95a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    uint8_t mNumBufs;
96a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    stream_cb_routine mDataCB;
97a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    void *mUserData;
98a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
99a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraQueue     mDataQ;
100a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraCmdThread mProcTh; // thread for dataCB
101a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
102a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraHeapMemory *mStreamInfoBuf;
103a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraMemory *mStreamBufs;
104a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    QCameraAllocator &mAllocator;
105a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    mm_camera_buf_def_t *mBufDefs;
106a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    cam_frame_len_offset_t mFrameLenOffset;
107a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    cam_padding_info_t mPaddingInfo;
108a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    cam_rect_t mCropInfo;
109a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    pthread_mutex_t mCropLock; // lock to protect crop info
110a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
111a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    static int32_t get_bufs(
112a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     cam_frame_len_offset_t *offset,
113a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     uint8_t *num_bufs,
114a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     uint8_t **initial_reg_flag,
115a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     mm_camera_buf_def_t **bufs,
116a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     mm_camera_map_unmap_ops_tbl_t *ops_tbl,
117a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     void *user_data);
118a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    static int32_t put_bufs(
119a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     mm_camera_map_unmap_ops_tbl_t *ops_tbl,
120a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     void *user_data);
121a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    static int32_t invalidate_buf(int index, void *user_data);
122d64ffc3df91dc2ebedcb225b2068e310ee59f5d1Ivan Evlogiev    static int32_t clean_invalidate_buf(int index, void *user_data);
123a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
124a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t getBufs(cam_frame_len_offset_t *offset,
125a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     uint8_t *num_bufs,
126a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     uint8_t **initial_reg_flag,
127a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     mm_camera_buf_def_t **bufs,
128a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev                     mm_camera_map_unmap_ops_tbl_t *ops_tbl);
129a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t putBufs(mm_camera_map_unmap_ops_tbl_t *ops_tbl);
130a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev    int32_t invalidateBuf(int index);
131d64ffc3df91dc2ebedcb225b2068e310ee59f5d1Ivan Evlogiev    int32_t cleanInvalidateBuf(int index);
132a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
133a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev};
134a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
135a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev}; // namespace qcamera
136a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev
137a195c88bb97b50d3a393254f8824d7d5a8590e54Iliyan Malchev#endif /* __QCAMERA_STREAM_H__ */
138