Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_CAMERA_CAMERA_COMMON_H_
     18 #define ANDROID_CAMERA_CAMERA_COMMON_H_
     19 
     20 /*
     21  * Contains declarations of platform-independent the stuff that is used in
     22  * camera emulation.
     23  */
     24 
     25 #include "qemu-common.h"
     26 #include "android/utils/debug.h"
     27 #include "android/utils/misc.h"
     28 #include "android/utils/system.h"
     29 #ifdef _WIN32
     30 /* Include declarations that are missing in non-Linux headers. */
     31 #include "android/camera/camera-win.h"
     32 #elif _DARWIN_C_SOURCE
     33 /* Include declarations that are missing in non-Linux headers. */
     34 #include "android/camera/camera-win.h"
     35 #else
     36 #include <linux/videodev2.h>
     37 #endif  /* _WIN32 */
     38 
     39 /*
     40  * These are missing in the current linux/videodev2.h
     41  */
     42 
     43 #ifndef V4L2_PIX_FMT_YVYU
     44 #define V4L2_PIX_FMT_YVYU    v4l2_fourcc('Y', 'V', 'Y', 'U')
     45 #endif /* V4L2_PIX_FMT_YVYU */
     46 #ifndef V4L2_PIX_FMT_VYUY
     47 #define V4L2_PIX_FMT_VYUY    v4l2_fourcc('V', 'Y', 'U', 'Y')
     48 #endif /* V4L2_PIX_FMT_VYUY */
     49 #ifndef V4L2_PIX_FMT_YUY2
     50 #define V4L2_PIX_FMT_YUY2    v4l2_fourcc('Y', 'U', 'Y', '2')
     51 #endif /* V4L2_PIX_FMT_YUY2 */
     52 #ifndef V4L2_PIX_FMT_YUNV
     53 #define V4L2_PIX_FMT_YUNV    v4l2_fourcc('Y', 'U', 'N', 'V')
     54 #endif /* V4L2_PIX_FMT_YUNV */
     55 #ifndef V4L2_PIX_FMT_V422
     56 #define V4L2_PIX_FMT_V422    v4l2_fourcc('V', '4', '2', '2')
     57 #endif /* V4L2_PIX_FMT_V422 */
     58 #ifndef V4L2_PIX_FMT_YYVU
     59 #define V4L2_PIX_FMT_YYVU    v4l2_fourcc('Y', 'Y', 'V', 'U')
     60 #endif /* V4L2_PIX_FMT_YYVU */
     61 #ifndef V4L2_PIX_FMT_SGBRG8
     62 #define V4L2_PIX_FMT_SGBRG8  v4l2_fourcc('G', 'B', 'R', 'G')
     63 #endif  /* V4L2_PIX_FMT_SGBRG8 */
     64 #ifndef V4L2_PIX_FMT_SGRBG8
     65 #define V4L2_PIX_FMT_SGRBG8  v4l2_fourcc('G', 'R', 'B', 'G')
     66 #endif  /* V4L2_PIX_FMT_SGRBG8 */
     67 #ifndef V4L2_PIX_FMT_SRGGB8
     68 #define V4L2_PIX_FMT_SRGGB8  v4l2_fourcc('R', 'G', 'G', 'B')
     69 #endif  /* V4L2_PIX_FMT_SRGGB8 */
     70 #ifndef V4L2_PIX_FMT_SBGGR10
     71 #define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B', 'G', '1', '\0')
     72 #endif  /* V4L2_PIX_FMT_SBGGR10 */
     73 #ifndef V4L2_PIX_FMT_SGBRG10
     74 #define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G', 'B', '1', '\0')
     75 #endif  /* V4L2_PIX_FMT_SGBRG10 */
     76 #ifndef V4L2_PIX_FMT_SGRBG10
     77 #define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '\0')
     78 #endif  /* V4L2_PIX_FMT_SGRBG10 */
     79 #ifndef V4L2_PIX_FMT_SRGGB10
     80 #define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R', 'G', '1', '\0')
     81 #endif  /* V4L2_PIX_FMT_SRGGB10 */
     82 #ifndef V4L2_PIX_FMT_SBGGR12
     83 #define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B', 'G', '1', '2')
     84 #endif  /* V4L2_PIX_FMT_SBGGR12 */
     85 #ifndef V4L2_PIX_FMT_SGBRG12
     86 #define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2')
     87 #endif  /* V4L2_PIX_FMT_SGBRG12 */
     88 #ifndef V4L2_PIX_FMT_SGRBG12
     89 #define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2')
     90 #endif  /* V4L2_PIX_FMT_SGRBG12 */
     91 #ifndef V4L2_PIX_FMT_SRGGB12
     92 #define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2')
     93 #endif  /* V4L2_PIX_FMT_SRGGB12 */
     94 
     95 /* Describes framebuffer, used by the client of camera capturing API.
     96  * This descritptor is used in camera_device_read_frame call.
     97  */
     98 typedef struct ClientFrameBuffer {
     99     /* Pixel format used in the client framebuffer. */
    100     uint32_t    pixel_format;
    101     /* Address of the client framebuffer. */
    102     void*       framebuffer;
    103 } ClientFrameBuffer;
    104 
    105 /* Describes frame dimensions.
    106  */
    107 typedef struct CameraFrameDim {
    108     /* Frame width. */
    109     int     width;
    110     /* Frame height. */
    111     int     height;
    112 } CameraFrameDim;
    113 
    114 /* Camera information descriptor, containing properties of a camera connected
    115  * to the host.
    116  *
    117  * Instances of this structure are created during camera device enumerations,
    118  * and are considered to be constant everywhere else. The only exception to this
    119  * rule is changing the 'in_use' flag during creation / destruction of a service
    120  * representing that camera.
    121  */
    122 typedef struct CameraInfo {
    123     /* User-friendly camera display name. */
    124     char*               display_name;
    125     /* Device name for the camera. */
    126     char*               device_name;
    127     /* Input channel for the camera. */
    128     int                 inp_channel;
    129     /* Pixel format chosen for the camera. */
    130     uint32_t            pixel_format;
    131     /* Direction the camera is facing: 'front', or 'back' */
    132     char*               direction;
    133     /* Array of frame sizes supported for the pixel format chosen for the camera.
    134      * The size of the array is defined by the frame_sizes_num field of this
    135      * structure. */
    136     CameraFrameDim*     frame_sizes;
    137     /* Number of frame sizes supported for the pixel format chosen
    138      * for the camera. */
    139     int                 frame_sizes_num;
    140     /* In use status. When there is a camera service created for this camera,
    141      * "in use" is set to one. Otherwise this flag is zet to 0. */
    142     int                 in_use;
    143 } CameraInfo;
    144 
    145 /* Allocates CameraInfo instance. */
    146 static __inline__ CameraInfo* _camera_info_alloc(void)
    147 {
    148     CameraInfo* ci;
    149     ANEW0(ci);
    150     return ci;
    151 }
    152 
    153 /* Frees all resources allocated for CameraInfo instance (including the
    154  * instance itself).
    155  */
    156 static __inline__ void _camera_info_free(CameraInfo* ci)
    157 {
    158     if (ci != NULL) {
    159         if (ci->display_name != NULL)
    160             free(ci->display_name);
    161         if (ci->device_name != NULL)
    162             free(ci->device_name);
    163         if (ci->direction != NULL)
    164             free(ci->direction);
    165         if (ci->frame_sizes != NULL)
    166             free(ci->frame_sizes);
    167         AFREE(ci);
    168     }
    169 }
    170 
    171 /* Describes a connected camera device.
    172  * This is a pratform-independent camera device descriptor that is used in
    173  * the camera API.
    174  */
    175 typedef struct CameraDevice {
    176     /* Opaque pointer used by the camera capturing API. */
    177     void*       opaque;
    178 } CameraDevice;
    179 
    180 /* Returns current time in microseconds. */
    181 static __inline__ uint64_t
    182 _get_timestamp(void)
    183 {
    184     struct timeval t;
    185     t.tv_sec = t.tv_usec = 0;
    186     gettimeofday(&t, NULL);
    187     return (uint64_t)t.tv_sec * 1000000LL + t.tv_usec;
    188 }
    189 
    190 /* Sleeps for the given amount of milliseconds */
    191 static __inline__ void
    192 _camera_sleep(int millisec)
    193 {
    194     struct timeval t;
    195     const uint64_t wake_at = _get_timestamp() + (uint64_t)millisec * 1000;
    196     do {
    197         const uint64_t stamp = _get_timestamp();
    198         if ((stamp / 1000) >= (wake_at / 1000)) {
    199             break;
    200         }
    201         t.tv_sec = (wake_at - stamp) / 1000000;
    202         t.tv_usec = (wake_at - stamp) - (uint64_t)t.tv_sec * 1000000;
    203     } while (select(0, NULL, NULL, NULL, &t) < 0 && errno == EINTR);
    204 }
    205 
    206 #endif  /* ANDROID_CAMERA_CAMERA_COMMON_H_ */
    207