1 /* Copyright (c) 2012, The Linux Foundation. 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 #ifndef ANDROID_HARDWARE_QCAMERA_USB_PRIV_H
30 #define ANDROID_HARDWARE_QCAMERA_USB_PRIV_H
31 
32 namespace android {
33 
34 /* File name length in number of characters */
35 #define FILENAME_LENGTH     (256)
36 
37 /* Number of display buffers (in addition to minimum number of undequed buffers */
38 #define PRVW_DISP_BUF_CNT   2
39 
40 /* Number of V4L2 capture  buffers. */
41 #define PRVW_CAP_BUF_CNT    4
42 
43 /* Maximum buffer size for JPEG output in number of bytes */
44 #define MAX_JPEG_BUFFER_SIZE    (1024 * 1024)
45 
46 /* Preview loop commands */
47 #define USB_CAM_PREVIEW_EXIT    (0x100)
48 #define USB_CAM_PREVIEW_PAUSE   (0x101)
49 #define USB_CAM_PREVIEW_TAKEPIC (0x200)
50 
51 /******************************************************************************
52  * Macro function to input validate device handle
53  *****************************************************************************/
54 #define VALIDATE_DEVICE_HDL(camHal, device, ret_err_code)     {\
55     if(device && device->priv){\
56         camHal = (camera_hardware_t *)device->priv;\
57     }else{\
58         ALOGE("%s: Null device or device->priv", __func__);\
59         return ret_err_code;\
60     }\
61 }\
62 
63 /******************************************************************************
64  * Macro function to check return status of a function, log and exit the thread
65  *****************************************************************************/
66 #define ERROR_CHECK_EXIT_THREAD(rc, string)    {\
67     if(rc < 0) {\
68         ALOGE("%s: Error %s", __func__, string);\
69         return (void *)-1;\
70     }\
71 }
72 
73 /******************************************************************************
74  * Macro function to check return status of a function, log and exit
75  *****************************************************************************/
76 #define ERROR_CHECK_EXIT(rc, string)    {\
77     if(rc < 0) {\
78         ALOGE("%s: Error %s", __func__, string);\
79         return -1;\
80     }\
81 }
82 
83 /******************************************************************************
84 * Macro function to Print the parameter string 1000 characters at a time
85 ******************************************************************************/
86 #define PRINT_PARAM_STR(parms)    {\
87         char temp[1001] = {0};\
88         int n=0;\
89         while(1) {\
90             strlcpy(temp,parms+n,1000);\
91             ALOGD("parms = %s", temp);\
92             if (strlen(temp) < 1000) break;\
93             n += 1000;\
94         }\
95     }\
96 
97 /******************************************************************************
98  * Macro function to open camera
99  *****************************************************************************/
100 #define USB_CAM_OPEN(camHal)    {\
101         camHal->fd = open(camHal->dev_name, O_RDWR | O_NONBLOCK, 0);\
102         if(!camHal->fd)\
103             ALOGE("%s: Error in open", __func__);\
104         else\
105             ALOGD("%s: Successfully opened", __func__);\
106         }\
107 
108 /******************************************************************************
109  * Macro function to close camera
110  *****************************************************************************/
111 #define USB_CAM_CLOSE(camHal) {\
112         int rc;\
113         if(camHal->fd){\
114             rc = close(camHal->fd);\
115             if(0 > rc){\
116                 ALOGE("%s: close failed ", __func__);\
117             }\
118             else{\
119                 camHal->fd = 0;\
120                 ALOGD("%s: close successful", __func__);\
121             }\
122         }\
123     }\
124 
125 struct bufObj {
126     void    *data;
127     int     len;
128 };
129 
130 typedef struct {
131     camera_device                       hw_dev;
132     Mutex                               lock;
133     int                                 previewEnabledFlag;
134     int                                 prvwStoppedForPicture;
135     int                                 msgEnabledFlag;
136     volatile int                        prvwCmdPending;
137     volatile int                        prvwCmd;
138     pthread_t                           previewThread;
139     pthread_t                           takePictureThread;
140 
141     camera_notify_callback              notify_cb;
142     camera_data_callback                data_cb;
143     camera_data_timestamp_callback      data_cb_timestamp;
144     camera_request_memory               get_memory;
145     void*                               cb_ctxt;
146 
147     /* capture related members */
148     /* prevFormat is pixel format of preview buffers that are exported */
149     int                                 prevFormat;
150     int                                 prevFps;
151     int                                 prevWidth;
152     int                                 prevHeight;
153     /* captureFormat is internal setting for USB camera buffers */
154     int                                 captureFormat;
155     char                                dev_name[FILENAME_LENGTH];
156     int                                 fd;
157     unsigned int                        n_buffers;
158     struct v4l2_buffer                  curCaptureBuf;
159     struct bufObj                       *buffers;
160 
161     /* Display related members */
162     preview_stream_ops*                 window;
163     QCameraHalMemory_t                  previewMem;
164     /* dispFormat is preview display format.Same as preview buffer format*/
165     int                                 dispFormat;
166     int                                 dispWidth;
167     int                                 dispHeight;
168 
169     /* MJPEG decoder related members */
170     /* MJPEG decoder object */
171     void*                               mjpegd;
172 
173     /* JPEG picture and thumbnail related members */
174     int                                 pictFormat;
175     int                                 pictWidth;
176     int                                 pictHeight;
177     int                                 pictJpegQlty;
178     int                                 thumbnailWidth;
179     int                                 thumbnailHeight;
180     int                                 thumbnailJpegQlty;
181     QCameraHalMemory_t                  pictMem;
182     int                                 takePictInProgress;
183     int                                 jpegEncInProgress;
184     pthread_mutex_t                     jpegEncMutex;
185     pthread_cond_t                      jpegEncCond;
186 
187     /* */
188     QCameraParameters                   qCamParams;
189     String8                             prevSizeValues;
190     String8                             pictSizeValues;
191     String8                             thumbnailSizeValues;
192     String8                             vidSizeValues;
193     String8                             pictFormatValues;
194     String8                             prevFormatValues;
195     String8                             prevFpsRangesValues;
196 
197 } camera_hardware_t;
198 
199 
200 }; // namespace android
201 
202 #endif /* ANDROID_HARDWARE_QCAMERA_USB_PRIV_H */
203