| /* | |
| * 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_ */ |