166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Redistribution and use in source and binary forms, with or without
466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * modification, are permitted provided that the following conditions are
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * met:
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions of source code must retain the above copyright
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       notice, this list of conditions and the following disclaimer.
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions in binary form must reproduce the above
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       copyright notice, this list of conditions and the following
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       disclaimer in the documentation and/or other materials provided
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       with the distribution.
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       contributors may be used to endorse or promote products derived
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       from this software without specific prior written permission.
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef ANDROID_HARDWARE_QCAMERA_USB_PRIV_H
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define ANDROID_HARDWARE_QCAMERA_USB_PRIV_H
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace android {
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* File name length in number of characters */
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define FILENAME_LENGTH     (256)
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Number of display buffers (in addition to minimum number of undequed buffers */
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define PRVW_DISP_BUF_CNT   2
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Number of V4L2 capture  buffers. */
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define PRVW_CAP_BUF_CNT    4
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Maximum buffer size for JPEG output in number of bytes */
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MAX_JPEG_BUFFER_SIZE    (1024 * 1024)
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Preview loop commands */
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define USB_CAM_PREVIEW_EXIT    (0x100)
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define USB_CAM_PREVIEW_PAUSE   (0x101)
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define USB_CAM_PREVIEW_TAKEPIC (0x200)
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Macro function to input validate device handle
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *****************************************************************************/
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define VALIDATE_DEVICE_HDL(camHal, device, ret_err_code)     {\
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(device && device->priv){\
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camHal = (camera_hardware_t *)device->priv;\
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }else{\
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ALOGE("%s: Null device or device->priv", __func__);\
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return ret_err_code;\
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }\
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}\
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Macro function to check return status of a function, log and exit the thread
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *****************************************************************************/
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define ERROR_CHECK_EXIT_THREAD(rc, string)    {\
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(rc < 0) {\
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ALOGE("%s: Error %s", __func__, string);\
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return (void *)-1;\
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }\
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Macro function to check return status of a function, log and exit
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *****************************************************************************/
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define ERROR_CHECK_EXIT(rc, string)    {\
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(rc < 0) {\
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ALOGE("%s: Error %s", __func__, string);\
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;\
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }\
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Macro function to Print the parameter string 1000 characters at a time
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin******************************************************************************/
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define PRINT_PARAM_STR(parms)    {\
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        char temp[1001] = {0};\
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int n=0;\
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        while(1) {\
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            strlcpy(temp,parms+n,1000);\
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ALOGD("parms = %s", temp);\
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (strlen(temp) < 1000) break;\
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            n += 1000;\
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }\
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }\
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Macro function to open camera
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *****************************************************************************/
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define USB_CAM_OPEN(camHal)    {\
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camHal->fd = open(camHal->dev_name, O_RDWR | O_NONBLOCK, 0);\
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(!camHal->fd)\
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ALOGE("%s: Error in open", __func__);\
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        else\
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ALOGD("%s: Successfully opened", __func__);\
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }\
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/******************************************************************************
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Macro function to close camera
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *****************************************************************************/
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define USB_CAM_CLOSE(camHal) {\
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int rc;\
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(camHal->fd){\
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = close(camHal->fd);\
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if(0 > rc){\
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ALOGE("%s: close failed ", __func__);\
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }\
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            else{\
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                camHal->fd = 0;\
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ALOGD("%s: close successful", __func__);\
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }\
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }\
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }\
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstruct bufObj {
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void    *data;
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int     len;
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_device                       hw_dev;
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex                               lock;
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 previewEnabledFlag;
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 prvwStoppedForPicture;
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 msgEnabledFlag;
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    volatile int                        prvwCmdPending;
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    volatile int                        prvwCmd;
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_t                           previewThread;
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_t                           takePictureThread;
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_notify_callback              notify_cb;
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_callback                data_cb;
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_timestamp_callback      data_cb_timestamp;
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_request_memory               get_memory;
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void*                               cb_ctxt;
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* capture related members */
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* prevFormat is pixel format of preview buffers that are exported */
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 prevFormat;
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 prevFps;
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 prevWidth;
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 prevHeight;
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* captureFormat is internal setting for USB camera buffers */
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 captureFormat;
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char                                dev_name[FILENAME_LENGTH];
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 fd;
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    unsigned int                        n_buffers;
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    struct v4l2_buffer                  curCaptureBuf;
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    struct bufObj                       *buffers;
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Display related members */
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    preview_stream_ops*                 window;
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraHalMemory_t                  previewMem;
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* dispFormat is preview display format.Same as preview buffer format*/
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 dispFormat;
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 dispWidth;
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 dispHeight;
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* MJPEG decoder related members */
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* MJPEG decoder object */
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void*                               mjpegd;
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* JPEG picture and thumbnail related members */
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 pictFormat;
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 pictWidth;
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 pictHeight;
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 pictJpegQlty;
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 thumbnailWidth;
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 thumbnailHeight;
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 thumbnailJpegQlty;
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraHalMemory_t                  pictMem;
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 takePictInProgress;
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                                 jpegEncInProgress;
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t                     jpegEncMutex;
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t                      jpegEncCond;
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* */
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraParameters                   qCamParams;
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             prevSizeValues;
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             pictSizeValues;
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             thumbnailSizeValues;
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             vidSizeValues;
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             pictFormatValues;
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             prevFormatValues;
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    String8                             prevFpsRangesValues;
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} camera_hardware_t;
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace android
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif /* ANDROID_HARDWARE_QCAMERA_USB_PRIV_H */
203