1 /* 2 * Copyright 2016 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 #include "hal_camera.h" 18 19 #include <pthread.h> 20 #include <stdlib.h> 21 22 #include <iostream> 23 24 #include <hardware/camera.h> 25 #include <hardware/camera_common.h> 26 #include <hardware/hardware.h> 27 28 #include "test/vts/proto/ComponentSpecificationMessage.pb.h" 29 30 #include "vts_datatype.h" 31 32 using namespace std; 33 34 namespace android { 35 namespace vts { 36 37 // Callbacks { 38 static void vts_camera_device_status_change( 39 const struct camera_module_callbacks*, int /*camera_id*/, 40 int /*new_status*/) {} 41 42 static void vts_torch_mode_status_change( 43 const struct camera_module_callbacks*, const char* /*camera_id*/, 44 int /*new_status*/) {} 45 46 static void vts_camera_notify_callback( 47 int32_t /*msg_type*/, int32_t /*ext1*/, int32_t /*ext2*/, 48 void* /*user*/) {} 49 50 static void vts_camera_data_callback( 51 int32_t /*msg_type*/, const camera_memory_t* /*data*/, 52 unsigned int /*index*/, camera_frame_metadata_t* /*metadata*/, 53 void* /*user*/) {} 54 55 static void vts_camera_data_timestamp_callback( 56 int64_t /*timestamp*/, int32_t /*msg_type*/, 57 const camera_memory_t* /*data*/, unsigned int /*index*/, void* /*user*/) { 58 } 59 60 static camera_memory_t* vts_camera_request_memory( 61 int /*fd*/, size_t /*buf_size*/, unsigned int /*num_bufs*/, 62 void* /*user*/) { 63 cout << __func__ << endl; 64 return NULL; 65 } 66 // } Callbacks 67 68 camera_module_callbacks_t* GenerateCameraModuleCallbacks() { 69 cout << __func__ << endl; 70 if (RandomBool()) { 71 return NULL; 72 } else { 73 camera_module_callbacks_t* callbacks = 74 (camera_module_callbacks_t*)malloc(sizeof(camera_module_callbacks_t)); 75 callbacks->camera_device_status_change = vts_camera_device_status_change; 76 callbacks->torch_mode_status_change = vts_torch_mode_status_change; 77 return callbacks; 78 } 79 } 80 81 camera_notify_callback GenerateCameraNotifyCallback() { 82 return vts_camera_notify_callback; 83 } 84 85 camera_data_callback GenerateCameraDataCallback() { 86 return vts_camera_data_callback; 87 } 88 89 camera_data_timestamp_callback GenerateCameraDataTimestampCallback() { 90 return vts_camera_data_timestamp_callback; 91 } 92 93 camera_request_memory GenerateCameraRequestMemory() { 94 return vts_camera_request_memory; 95 } 96 97 camera_info_t* GenerateCameraInfo() { 98 cout << __func__ << endl; 99 if (RandomBool()) { 100 return NULL; 101 } else { 102 camera_info_t* caminfo = (camera_info_t*)malloc(sizeof(camera_info_t)); 103 caminfo->facing = RandomBool() ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT; 104 // support CAMERA_FACING_EXTERNAL if CAMERA_MODULE_API_VERSION_2_4 or above 105 caminfo->orientation = 106 RandomBool() ? (RandomBool() ? 0 : 90) : (RandomBool() ? 180 : 270); 107 caminfo->device_version = CAMERA_MODULE_API_VERSION_2_1; 108 caminfo->static_camera_characteristics = NULL; 109 caminfo->resource_cost = 50; // between 50 and 100. 110 caminfo->conflicting_devices = NULL; 111 caminfo->conflicting_devices_length = 0; 112 113 return caminfo; 114 } 115 /** 116 * The camera's fixed characteristics, which include all static camera 117 metadata 118 * specified in system/media/camera/docs/docs.html. This should be a sorted 119 metadata 120 * buffer, and may not be modified or freed by the caller. The pointer should 121 remain 122 * valid for the lifetime of the camera module, and values in it may not 123 * change after it is returned by get_camera_info(). 124 * 125 * Version information (based on camera_module_t.common.module_api_version): 126 * 127 * CAMERA_MODULE_API_VERSION_1_0: 128 * 129 * Not valid. Extra characteristics are not available. Do not read this 130 * field. 131 * 132 * CAMERA_MODULE_API_VERSION_2_0 or higher: 133 * 134 * Valid if device_version >= CAMERA_DEVICE_API_VERSION_2_0. Do not read 135 * otherwise. 136 * 137 const camera_metadata_t *static_camera_characteristics; 138 */ 139 140 /** 141 * An array of camera device IDs represented as NULL-terminated strings 142 * indicating other devices that cannot be simultaneously opened while this 143 * camera device is in use. 144 * 145 * This field is intended to be used to indicate that this camera device 146 * is a composite of several other camera devices, or otherwise has 147 * hardware dependencies that prohibit simultaneous usage. If there are no 148 * dependencies, a NULL may be returned in this field to indicate this. 149 * 150 * The camera service will never simultaneously open any of the devices 151 * in this list while this camera device is open. 152 * 153 * The strings pointed to in this field will not be cleaned up by the camera 154 * service, and must remain while this device is plugged in. 155 * 156 * Version information (based on camera_module_t.common.module_api_version): 157 * 158 * CAMERA_MODULE_API_VERSION_2_3 or lower: 159 * 160 * Not valid. Can be assumed to be NULL. Do not read this field. 161 * 162 * CAMERA_MODULE_API_VERSION_2_4 or higher: 163 * 164 * Always valid. 165 char** conflicting_devices; 166 */ 167 168 /** 169 * The length of the array given in the conflicting_devices field. 170 * 171 * Version information (based on camera_module_t.common.module_api_version): 172 * 173 * CAMERA_MODULE_API_VERSION_2_3 or lower: 174 * 175 * Not valid. Can be assumed to be 0. Do not read this field. 176 * 177 * CAMERA_MODULE_API_VERSION_2_4 or higher: 178 * 179 * Always valid. 180 size_t conflicting_devices_length; 181 */ 182 } 183 184 camera_info_t* GenerateCameraInfoUsingMessage( 185 const VariableSpecificationMessage& /*msg*/) { 186 cout << __func__ << endl; 187 // TODO: acutally use msg. 188 camera_info_t* caminfo = (camera_info_t*)malloc(sizeof(camera_info_t)); 189 caminfo->facing = RandomBool() ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT; 190 // support CAMERA_FACING_EXTERNAL if CAMERA_MODULE_API_VERSION_2_4 or above 191 caminfo->orientation = 192 RandomBool() ? (RandomBool() ? 0 : 90) : (RandomBool() ? 180 : 270); 193 caminfo->device_version = CAMERA_MODULE_API_VERSION_2_1; 194 caminfo->static_camera_characteristics = NULL; 195 caminfo->resource_cost = 50; // between 50 and 100. 196 caminfo->conflicting_devices = NULL; 197 caminfo->conflicting_devices_length = 0; 198 199 return caminfo; 200 } 201 202 bool ConvertCameraInfoToProtobuf(camera_info_t* raw, 203 VariableSpecificationMessage* msg) { 204 cout << __func__ << ":" << __LINE__ << endl; 205 206 if (msg->struct_value_size() > 0) msg->clear_struct_value(); 207 208 if (!raw) return false; 209 210 cout << __func__ << ":" << __LINE__ << endl; 211 // TODO: use primitive_name and put in the expected order. 212 msg->set_type(TYPE_STRUCT); 213 214 VariableSpecificationMessage* sub_msg; 215 216 sub_msg = msg->add_struct_value(); 217 sub_msg->set_type(TYPE_SCALAR); 218 sub_msg->set_scalar_type("int32_t"); 219 sub_msg->mutable_scalar_value()->set_int32_t(raw->facing); 220 221 sub_msg = msg->add_struct_value(); 222 sub_msg->set_type(TYPE_SCALAR); 223 sub_msg->set_scalar_type("int32_t"); 224 sub_msg->mutable_scalar_value()->set_int32_t(raw->orientation); 225 226 sub_msg = msg->add_struct_value(); 227 sub_msg->set_type(TYPE_SCALAR); 228 sub_msg->set_scalar_type("uint32_t"); 229 sub_msg->mutable_scalar_value()->set_uint32_t(raw->device_version); 230 231 // TODO: update for static_camera_characteristics and others 232 // msg.add_primitive_value()->set_int32_t(raw->static_camera_characteristics); 233 sub_msg = msg->add_struct_value(); 234 sub_msg->set_type(TYPE_SCALAR); 235 sub_msg->set_scalar_type("int32_t"); 236 sub_msg->mutable_scalar_value()->set_int32_t(raw->resource_cost); 237 238 // TODO: support pointer. conflicting_devices is pointer pointer. 239 // msg.add_primitive_value()->set_pointer(raw->conflicting_devices); 240 // msg.add_primitive_value()->set_int32_t(raw->conflicting_devices_length); 241 sub_msg = msg->add_struct_value(); 242 sub_msg->set_type(TYPE_SCALAR); 243 sub_msg->set_scalar_type("int32_t"); 244 sub_msg->mutable_scalar_value()->set_int32_t(0); 245 return true; 246 } 247 248 } // namespace vts 249 } // namespace android 250