| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_CAMERA_CAMERA_COMMON_H_
|
| #define ANDROID_CAMERA_CAMERA_COMMON_H_
|
| |
| /* |
| * Contains declarations of platform-independent the stuff that is used in |
| * camera emulation. |
| */ |
| |
| #include "qemu-common.h" |
| #include "android/utils/debug.h" |
| #include "android/utils/misc.h" |
| #include "android/utils/system.h" |
| #ifdef _WIN32 |
| /* Include declarations that are missing in non-Linux headers. */ |
| #include "android/camera/camera-win.h" |
| #elif _DARWIN_C_SOURCE |
| /* Include declarations that are missing in non-Linux headers. */ |
| #include "android/camera/camera-win.h" |
| #else |
| #include <linux/videodev2.h> |
| #endif /* _WIN32 */ |
| |
| /* |
| * These are missing in the current linux/videodev2.h |
| */ |
| |
| #ifndef V4L2_PIX_FMT_YVYU |
| #define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U') |
| #endif /* V4L2_PIX_FMT_YVYU */ |
| #ifndef V4L2_PIX_FMT_VYUY |
| #define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y') |
| #endif /* V4L2_PIX_FMT_VYUY */ |
| #ifndef V4L2_PIX_FMT_YUY2 |
| #define V4L2_PIX_FMT_YUY2 v4l2_fourcc('Y', 'U', 'Y', '2') |
| #endif /* V4L2_PIX_FMT_YUY2 */ |
| #ifndef V4L2_PIX_FMT_YUNV |
| #define V4L2_PIX_FMT_YUNV v4l2_fourcc('Y', 'U', 'N', 'V') |
| #endif /* V4L2_PIX_FMT_YUNV */ |
| #ifndef V4L2_PIX_FMT_V422 |
| #define V4L2_PIX_FMT_V422 v4l2_fourcc('V', '4', '2', '2') |
| #endif /* V4L2_PIX_FMT_V422 */ |
| #ifndef V4L2_PIX_FMT_YYVU |
| #define V4L2_PIX_FMT_YYVU v4l2_fourcc('Y', 'Y', 'V', 'U') |
| #endif /* V4L2_PIX_FMT_YYVU */ |
| #ifndef V4L2_PIX_FMT_SGBRG8 |
| #define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G', 'B', 'R', 'G') |
| #endif /* V4L2_PIX_FMT_SGBRG8 */ |
| #ifndef V4L2_PIX_FMT_SGRBG8 |
| #define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G', 'R', 'B', 'G') |
| #endif /* V4L2_PIX_FMT_SGRBG8 */ |
| #ifndef V4L2_PIX_FMT_SRGGB8 |
| #define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R', 'G', 'G', 'B') |
| #endif /* V4L2_PIX_FMT_SRGGB8 */ |
| #ifndef V4L2_PIX_FMT_SBGGR10 |
| #define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B', 'G', '1', '\0') |
| #endif /* V4L2_PIX_FMT_SBGGR10 */ |
| #ifndef V4L2_PIX_FMT_SGBRG10 |
| #define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G', 'B', '1', '\0') |
| #endif /* V4L2_PIX_FMT_SGBRG10 */ |
| #ifndef V4L2_PIX_FMT_SGRBG10 |
| #define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '\0') |
| #endif /* V4L2_PIX_FMT_SGRBG10 */ |
| #ifndef V4L2_PIX_FMT_SRGGB10 |
| #define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R', 'G', '1', '\0') |
| #endif /* V4L2_PIX_FMT_SRGGB10 */ |
| #ifndef V4L2_PIX_FMT_SBGGR12 |
| #define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B', 'G', '1', '2') |
| #endif /* V4L2_PIX_FMT_SBGGR12 */ |
| #ifndef V4L2_PIX_FMT_SGBRG12 |
| #define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2') |
| #endif /* V4L2_PIX_FMT_SGBRG12 */ |
| #ifndef V4L2_PIX_FMT_SGRBG12 |
| #define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2') |
| #endif /* V4L2_PIX_FMT_SGRBG12 */ |
| #ifndef V4L2_PIX_FMT_SRGGB12 |
| #define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2') |
| #endif /* V4L2_PIX_FMT_SRGGB12 */ |
| |
| /* Describes framebuffer, used by the client of camera capturing API. |
| * This descritptor is used in camera_device_read_frame call. |
| */ |
| typedef struct ClientFrameBuffer { |
| /* Pixel format used in the client framebuffer. */ |
| uint32_t pixel_format; |
| /* Address of the client framebuffer. */ |
| void* framebuffer; |
| } ClientFrameBuffer; |
| |
| /* Describes frame dimensions. |
| */ |
| typedef struct CameraFrameDim { |
| /* Frame width. */ |
| int width; |
| /* Frame height. */ |
| int height; |
| } CameraFrameDim; |
| |
| /* Camera information descriptor, containing properties of a camera connected |
| * to the host. |
| * |
| * Instances of this structure are created during camera device enumerations, |
| * and are considered to be constant everywhere else. The only exception to this |
| * rule is changing the 'in_use' flag during creation / destruction of a service |
| * representing that camera. |
| */ |
| typedef struct CameraInfo { |
| /* User-friendly camera display name. */ |
| char* display_name; |
| /* Device name for the camera. */ |
| char* device_name; |
| /* Input channel for the camera. */ |
| int inp_channel; |
| /* Pixel format chosen for the camera. */ |
| uint32_t pixel_format; |
| /* Direction the camera is facing: 'front', or 'back' */ |
| char* direction; |
| /* Array of frame sizes supported for the pixel format chosen for the camera. |
| * The size of the array is defined by the frame_sizes_num field of this |
| * structure. */ |
| CameraFrameDim* frame_sizes; |
| /* Number of frame sizes supported for the pixel format chosen |
| * for the camera. */ |
| int frame_sizes_num; |
| /* In use status. When there is a camera service created for this camera, |
| * "in use" is set to one. Otherwise this flag is zet to 0. */ |
| int in_use; |
| } CameraInfo; |
| |
| /* Allocates CameraInfo instance. */ |
| static __inline__ CameraInfo* _camera_info_alloc(void) |
| { |
| CameraInfo* ci; |
| ANEW0(ci); |
| return ci; |
| } |
| |
| /* Frees all resources allocated for CameraInfo instance (including the |
| * instance itself). |
| */ |
| static __inline__ void _camera_info_free(CameraInfo* ci) |
| { |
| if (ci != NULL) { |
| if (ci->display_name != NULL) |
| free(ci->display_name); |
| if (ci->device_name != NULL) |
| free(ci->device_name); |
| if (ci->direction != NULL) |
| free(ci->direction); |
| if (ci->frame_sizes != NULL) |
| free(ci->frame_sizes); |
| AFREE(ci); |
| } |
| } |
|
|
| /* Describes a connected camera device.
|
| * This is a pratform-independent camera device descriptor that is used in
|
| * the camera API.
|
| */
|
| typedef struct CameraDevice { |
| /* Opaque pointer used by the camera capturing API. */ |
| void* opaque; |
| } CameraDevice; |
| |
| /* Returns current time in microseconds. */ |
| static __inline__ uint64_t |
| _get_timestamp(void) |
| { |
| struct timeval t; |
| t.tv_sec = t.tv_usec = 0; |
| gettimeofday(&t, NULL); |
| return (uint64_t)t.tv_sec * 1000000LL + t.tv_usec; |
| } |
| |
| /* Sleeps for the given amount of milliseconds */ |
| static __inline__ void |
| _camera_sleep(int millisec) |
| { |
| struct timeval t; |
| const uint64_t wake_at = _get_timestamp() + (uint64_t)millisec * 1000; |
| do { |
| const uint64_t stamp = _get_timestamp(); |
| if ((stamp / 1000) >= (wake_at / 1000)) { |
| break; |
| } |
| t.tv_sec = (wake_at - stamp) / 1000000; |
| t.tv_usec = (wake_at - stamp) - (uint64_t)t.tv_sec * 1000000; |
| } while (select(0, NULL, NULL, NULL, &t) < 0 && errno == EINTR); |
| } |
|
|
| #endif /* ANDROID_CAMERA_CAMERA_COMMON_H_ */ |