1 /* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef __QCAMERA3_CHANNEL_H__
31 #define __QCAMERA3_CHANNEL_H__
32 
33 #include <hardware/camera3.h>
34 #include <utils/List.h>
35 #include "QCamera3Stream.h"
36 #include "QCamera3Mem.h"
37 #include "QCamera3PostProc.h"
38 #include "QCamera3HALHeader.h"
39 #include "utils/Vector.h"
40 
41 extern "C" {
42 #include <mm_camera_interface.h>
43 }
44 
45 using namespace android;
46 
47 namespace qcamera {
48 
49 typedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata,
50                                 camera3_stream_buffer_t *buffer,
51                                 uint32_t frame_number, void *userdata);
52 
53 class QCamera3Channel
54 {
55 public:
56     QCamera3Channel(uint32_t cam_handle,
57                    mm_camera_ops_t *cam_ops,
58                    channel_cb_routine cb_routine,
59                    cam_padding_info_t *paddingInfo,
60                    void *userData);
61     QCamera3Channel();
62     virtual ~QCamera3Channel();
63 
64     int32_t addStream(cam_stream_type_t streamType,
65                               cam_format_t streamFormat,
66                               cam_dimension_t streamDim,
67                               uint8_t minStreamBufnum);
68     virtual int32_t start();
69     virtual int32_t stop();
70     int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
71 
72     uint32_t getStreamTypeMask();
73     uint32_t getStreamID(uint32_t streamMask);
74     virtual int32_t initialize() = 0;
request(buffer_handle_t *,uint32_t)75     virtual int32_t request(buffer_handle_t * /*buffer*/,
76                 uint32_t /*frameNumber*/){ return 0;};
request(buffer_handle_t *,uint32_t,mm_camera_buf_def_t *,metadata_buffer_t *)77     virtual int32_t request(buffer_handle_t * /*buffer*/,
78                 uint32_t /*frameNumber*/,
79                 mm_camera_buf_def_t* /*pInputBuffer*/,
80                 metadata_buffer_t* /*metadata*/){ return 0;};
81     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
82                             QCamera3Stream *stream) = 0;
83 
84     virtual int32_t registerBuffer(buffer_handle_t *buffer) = 0;
85     virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0;
86     virtual void putStreamBufs() = 0;
87 
88     QCamera3Stream *getStreamByHandle(uint32_t streamHandle);
getMyHandle()89     uint32_t getMyHandle() const {return m_handle;};
getNumOfStreams()90     uint8_t getNumOfStreams() const {return m_numStreams;};
91     QCamera3Stream *getStreamByIndex(uint8_t index);
92 
93     static void streamCbRoutine(mm_camera_super_buf_t *super_frame,
94                 QCamera3Stream *stream, void *userdata);
95     void *mUserData;
96     cam_padding_info_t *mPaddingInfo;
97     QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE];
98     uint8_t m_numStreams;
99 protected:
100 
101    virtual int32_t init(mm_camera_channel_attr_t *attr,
102                          mm_camera_buf_notify_t dataCB);
103     int32_t allocateStreamInfoBuf(camera3_stream_t *stream);
104 
105     uint32_t m_camHandle;
106     mm_camera_ops_t *m_camOps;
107     bool m_bIsActive;
108 
109     uint32_t m_handle;
110 
111 
112     mm_camera_buf_notify_t mDataCB;
113 
114 
115     QCamera3HeapMemory *mStreamInfoBuf;
116     channel_cb_routine mChannelCB;
117     //cam_padding_info_t *mPaddingInfo;
118 };
119 
120 /* QCamera3RegularChannel is used to handle all streams that are directly
121  * generated by hardware and given to frameworks without any postprocessing at HAL.
122  * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */
123 class QCamera3RegularChannel : public QCamera3Channel
124 {
125 public:
126     QCamera3RegularChannel(uint32_t cam_handle,
127                     mm_camera_ops_t *cam_ops,
128                     channel_cb_routine cb_routine,
129                     cam_padding_info_t *paddingInfo,
130                     void *userData,
131                     camera3_stream_t *stream,
132                     cam_stream_type_t stream_type);
133     virtual ~QCamera3RegularChannel();
134 
135     virtual int32_t start();
136     virtual int32_t initialize();
137     virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
138     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
139                                             QCamera3Stream *stream);
140 
141     virtual QCamera3Memory *getStreamBufs(uint32_t len);
putStreamBufs()142     virtual void putStreamBufs() {};
143     mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer);
144     virtual int32_t registerBuffer(buffer_handle_t *buffer);
145 
146 public:
147     static int kMaxBuffers;
148 protected:
149     QCamera3GrallocMemory mMemory;
150 private:
151     camera3_stream_t *mCamera3Stream;
152     uint32_t mNumBufs;
153 
154     cam_stream_type_t mStreamType; // Stream type
155 };
156 
157 /* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */
158 class QCamera3MetadataChannel : public QCamera3Channel
159 {
160 public:
161     QCamera3MetadataChannel(uint32_t cam_handle,
162                     mm_camera_ops_t *cam_ops,
163                     channel_cb_routine cb_routine,
164                     cam_padding_info_t *paddingInfo,
165                     void *userData);
166     virtual ~QCamera3MetadataChannel();
167 
168     virtual int32_t initialize();
169 
170     virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
171     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
172                             QCamera3Stream *stream);
173 
174     virtual QCamera3Memory *getStreamBufs(uint32_t len);
175     virtual void putStreamBufs();
registerBuffer(buffer_handle_t *)176     virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
177             { return NO_ERROR; };
178 
179 private:
180     QCamera3HeapMemory *mMemory;
181 };
182 
183 /* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */
184 class QCameraRawChannel : public QCamera3Channel
185 {
186 public:
187     QCameraRawChannel(uint32_t cam_handle,
188                     mm_camera_ops_t *cam_ops,
189                     channel_cb_routine cb_routine,
190                     cam_padding_info_t *paddingInfo,
191                     void *userData,
192                     cam_dimension_t *raw_dim);
193     virtual ~QCameraRawChannel();
194 
195     virtual int32_t initialize();
196 
197     virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
198     virtual int32_t registerBuffers(uint32_t num_buffers,
199                 buffer_handle_t **buffers);
200     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
201                             QCamera3Stream *stream);
202 
203     virtual QCamera3Memory *getStreamBufs(uint32_t len);
204     virtual void putStreamBufs();
205     void dumpRawSnapshot(mm_camera_buf_def_t *frame);
registerBuffer(buffer_handle_t *)206     virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
207             { return NO_ERROR; };
208 
209 private:
210     QCamera3HeapMemory *mMemory;
211     uint32_t mWidth, mHeight;
212     uint32_t mMaxBuffers;
213 };
214 
215 /* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing
216  * vendor specific bayer data or 16-bit unpacked bayer data */
217 class QCamera3RawChannel : public QCamera3RegularChannel
218 {
219 public:
220     QCamera3RawChannel(uint32_t cam_handle,
221                     mm_camera_ops_t *cam_ops,
222                     channel_cb_routine cb_routine,
223                     cam_padding_info_t *paddingInfo,
224                     void *userData,
225                     camera3_stream_t *stream,
226                     bool raw_16 = false);
227     virtual ~QCamera3RawChannel();
228 
229     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
230                             QCamera3Stream *stream);
231 
232 
233 public:
234     static int kMaxBuffers;
235 
236 private:
237     bool mRawDump;
238     bool mIsRaw16;
239 
240     void dumpRawSnapshot(mm_camera_buf_def_t *frame);
241     void convertToRaw16(mm_camera_buf_def_t *frame);
242 };
243 
244 /* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated
245  * by the hardware, and encoded to a JPEG stream */
246 class QCamera3PicChannel : public QCamera3Channel
247 {
248 public:
249     QCamera3PicChannel(uint32_t cam_handle,
250             mm_camera_ops_t *cam_ops,
251             channel_cb_routine cb_routine,
252             cam_padding_info_t *paddingInfo,
253             void *userData,
254             camera3_stream_t *stream);
255     ~QCamera3PicChannel();
256 
257     virtual int32_t initialize();
258     virtual int32_t stop();
259     virtual int32_t request(buffer_handle_t *buffer,
260             uint32_t frameNumber,
261             mm_camera_buf_def_t* pInputBuffer,
262             metadata_buffer_t* metadata);
263     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
264             QCamera3Stream *stream);
265 
266     virtual QCamera3Memory *getStreamBufs(uint32_t len);
267     virtual void putStreamBufs();
268 
isWNREnabled()269     bool isWNREnabled() {return m_bWNROn;};
270     bool needOnlineRotation();
271     QCamera3Exif *getExifData(metadata_buffer_t *metadata,
272             jpeg_settings_t *jpeg_settings);
273     void overrideYuvSize(uint32_t width, uint32_t height);
274     static void jpegEvtHandle(jpeg_job_status_t status,
275             uint32_t /*client_hdl*/,
276             uint32_t jobId,
277             mm_jpeg_output_t *p_output,
278             void *userdata);
279     static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
280             void *userdata);
281     int32_t queueReprocMetadata(metadata_buffer_t *metadata);
282     virtual int32_t registerBuffer(buffer_handle_t *buffer);
283 
284 private:
285     int32_t queueJpegSetting(int32_t out_buf_index, metadata_buffer_t *metadata);
286 
287 public:
288     static int kMaxBuffers;
289     QCamera3PostProcessor m_postprocessor; // post processor
290 private:
291     camera3_stream_t *mCamera3Stream;
292     uint32_t mNumBufs;
293     int32_t mCurrentBufIndex;
294     bool m_bWNROn;
295     uint32_t mYuvWidth, mYuvHeight;
296 
297     QCamera3GrallocMemory mMemory;
298     QCamera3HeapMemory *mYuvMemory;
299     QCamera3Channel *m_pMetaChannel;
300     mm_camera_super_buf_t *mMetaFrame;
301 
302 };
303 
304 // reprocess channel class
305 class QCamera3ReprocessChannel : public QCamera3Channel
306 {
307 public:
308     QCamera3ReprocessChannel(uint32_t cam_handle,
309                             mm_camera_ops_t *cam_ops,
310                             channel_cb_routine cb_routine,
311                             cam_padding_info_t *paddingInfo,
312                             void *userData, void *ch_hdl);
313     QCamera3ReprocessChannel();
314     virtual ~QCamera3ReprocessChannel();
315     // online reprocess
316     int32_t doReprocess(mm_camera_super_buf_t *frame,
317                         mm_camera_super_buf_t *meta_frame);
318     int32_t doReprocessOffline(mm_camera_super_buf_t *frame,
319                         metadata_buffer_t *metadata);
320     // offline reprocess
321     int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val,
322                         mm_camera_super_buf_t *meta_buf);
323     virtual QCamera3Memory *getStreamBufs(uint32_t len);
324     virtual void putStreamBufs();
325     virtual int32_t initialize();
326     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
327                             QCamera3Stream *stream);
328     virtual int32_t stop();
329     static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
330                                        void* userdata);
331     int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config,
332                                        QCamera3Channel *pSrcChannel,
333                                        QCamera3Channel *pMetaChannel);
334     QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle);
335     QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle);
336     int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame);
registerBuffer(buffer_handle_t *)337     virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
338             { return NO_ERROR; };
339 
340 public:
341     void *picChHandle;
342 private:
343     typedef struct {
344         QCamera3Stream *stream;
345         cam_mapping_buf_type type;
346         int index;
347     } OfflineBuffer;
348 
349     android::List<OfflineBuffer> mOfflineBuffers;
350     uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE];
351     QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess
352     QCamera3Channel *m_pMetaChannel;
353     QCamera3HeapMemory *mMemory;
354 };
355 
356 /* QCamera3SupportChannel is for HAL internal consumption only */
357 class QCamera3SupportChannel : public QCamera3Channel
358 {
359 public:
360     QCamera3SupportChannel(uint32_t cam_handle,
361                     mm_camera_ops_t *cam_ops,
362                     cam_padding_info_t *paddingInfo,
363                     void *userData);
364     virtual ~QCamera3SupportChannel();
365 
366     virtual int32_t initialize();
367 
368     virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber);
369     virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame,
370                             QCamera3Stream *stream);
371 
372     virtual QCamera3Memory *getStreamBufs(uint32_t le);
373     virtual void putStreamBufs();
registerBuffer(buffer_handle_t *)374     virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/)
375             { return NO_ERROR; };
376 
377     static cam_dimension_t kDim;
378 private:
379     QCamera3HeapMemory *mMemory;
380 };
381 
382 }; // namespace qcamera
383 
384 #endif /* __QCAMERA_CHANNEL_H__ */
385