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
32namespace 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
125struct bufObj {
126    void    *data;
127    int     len;
128};
129
130typedef 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