• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. */
_camera_info_alloc(void)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  */
_camera_info_free(CameraInfo * ci)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
_get_timestamp(void)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
_camera_sleep(int millisec)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