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