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