blob: 75ec73f562dbfecf79a06dbacd28d780c7c1d48c [file] [log] [blame]
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -07001/*
2 * Copyright (C) 2012 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
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070017#define LOG_TAG "Camera2_test"
Igor Murashkineab33fc2012-11-06 17:02:54 -080018//#define LOG_NDEBUG 0
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070019
20#include <utils/Log.h>
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070021#include <gtest/gtest.h>
22#include <iostream>
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070023#include <fstream>
24
25#include <utils/Vector.h>
26#include <gui/CpuConsumer.h>
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -070027#include <ui/PixelFormat.h>
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070028#include <system/camera_metadata.h>
29
30#include "camera2_utils.h"
Igor Murashkineab33fc2012-11-06 17:02:54 -080031#include "TestExtensions.h"
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070032
33namespace android {
Igor Murashkine302ee32012-11-05 11:14:49 -080034namespace camera2 {
35namespace tests {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070036
37class Camera2Test: public testing::Test {
38 public:
Igor Murashkineab33fc2012-11-06 17:02:54 -080039 void SetUpModule() {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070040 int res;
41
42 hw_module_t *module = NULL;
43 res = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
44 (const hw_module_t **)&module);
45
46 ASSERT_EQ(0, res)
47 << "Failure opening camera hardware module: " << res;
48 ASSERT_TRUE(NULL != module)
49 << "No camera module was set by hw_get_module";
50
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070051 IF_ALOGV() {
52 std::cout << " Camera module name: "
53 << module->name << std::endl;
54 std::cout << " Camera module author: "
55 << module->author << std::endl;
56 std::cout << " Camera module API version: 0x" << std::hex
57 << module->module_api_version << std::endl;
58 std::cout << " Camera module HAL API version: 0x" << std::hex
59 << module->hal_api_version << std::endl;
60 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070061
62 int16_t version2_0 = CAMERA_MODULE_API_VERSION_2_0;
63 ASSERT_EQ(version2_0, module->module_api_version)
64 << "Camera module version is 0x"
65 << std::hex << module->module_api_version
66 << ", not 2.0. (0x"
67 << std::hex << CAMERA_MODULE_API_VERSION_2_0 << ")";
68
69 sCameraModule = reinterpret_cast<camera_module_t*>(module);
70
71 sNumCameras = sCameraModule->get_number_of_cameras();
72 ASSERT_LT(0, sNumCameras) << "No camera devices available!";
73
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070074 IF_ALOGV() {
75 std::cout << " Camera device count: " << sNumCameras << std::endl;
76 }
77
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070078 sCameraSupportsHal2 = new bool[sNumCameras];
79
80 for (int i = 0; i < sNumCameras; i++) {
81 camera_info info;
82 res = sCameraModule->get_camera_info(i, &info);
83 ASSERT_EQ(0, res)
84 << "Failure getting camera info for camera " << i;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070085 IF_ALOGV() {
86 std::cout << " Camera device: " << std::dec
87 << i << std::endl;;
88 std::cout << " Facing: " << std::dec
89 << info.facing << std::endl;
90 std::cout << " Orientation: " << std::dec
91 << info.orientation << std::endl;
92 std::cout << " Version: 0x" << std::hex <<
93 info.device_version << std::endl;
94 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070095 if (info.device_version >= CAMERA_DEVICE_API_VERSION_2_0) {
96 sCameraSupportsHal2[i] = true;
97 ASSERT_TRUE(NULL != info.static_camera_characteristics);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070098 IF_ALOGV() {
99 std::cout << " Static camera metadata:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700100 dump_indented_camera_metadata(info.static_camera_characteristics,
101 0, 1, 6);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700102 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700103 } else {
104 sCameraSupportsHal2[i] = false;
105 }
106 }
107 }
108
Igor Murashkineab33fc2012-11-06 17:02:54 -0800109 void TearDownModule() {
Igor Murashkine302ee32012-11-05 11:14:49 -0800110 hw_module_t *module = reinterpret_cast<hw_module_t*>(sCameraModule);
111 ASSERT_EQ(0, HWModuleHelpers::closeModule(module));
112 }
113
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700114 static const camera_module_t *getCameraModule() {
115 return sCameraModule;
116 }
117
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700118 static int getNumCameras() {
119 return sNumCameras;
120 }
121
122 static bool isHal2Supported(int id) {
123 return sCameraSupportsHal2[id];
124 }
125
126 static camera2_device_t *openCameraDevice(int id) {
127 ALOGV("Opening camera %d", id);
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700128 if (NULL == sCameraSupportsHal2) return NULL;
129 if (id >= sNumCameras) return NULL;
130 if (!sCameraSupportsHal2[id]) return NULL;
131
132 hw_device_t *device = NULL;
133 const camera_module_t *cam_module = getCameraModule();
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700134 if (cam_module == NULL) {
135 return NULL;
136 }
137
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700138 char camId[10];
139 int res;
140
141 snprintf(camId, 10, "%d", id);
142 res = cam_module->common.methods->open(
143 (const hw_module_t*)cam_module,
144 camId,
145 &device);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700146 if (res != NO_ERROR || device == NULL) {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700147 return NULL;
148 }
149 camera2_device_t *cam_device =
150 reinterpret_cast<camera2_device_t*>(device);
151 return cam_device;
152 }
153
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700154 static status_t configureCameraDevice(camera2_device_t *dev,
155 MetadataQueue &requestQueue,
156 MetadataQueue &frameQueue,
157 NotifierListener &listener) {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700158
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700159 status_t err;
160
161 err = dev->ops->set_request_queue_src_ops(dev,
162 requestQueue.getToConsumerInterface());
163 if (err != OK) return err;
164
165 requestQueue.setFromConsumerInterface(dev);
166
167 err = dev->ops->set_frame_queue_dst_ops(dev,
168 frameQueue.getToProducerInterface());
169 if (err != OK) return err;
170
171 err = listener.getNotificationsFrom(dev);
172 if (err != OK) return err;
173
174 vendor_tag_query_ops_t *vendor_metadata_tag_ops;
175 err = dev->ops->get_metadata_vendor_tag_ops(dev, &vendor_metadata_tag_ops);
176 if (err != OK) return err;
177
178 err = set_camera_metadata_vendor_tag_ops(vendor_metadata_tag_ops);
179 if (err != OK) return err;
180
181 return OK;
182 }
183
184 static status_t closeCameraDevice(camera2_device_t *cam_dev) {
185 int res;
186 ALOGV("Closing camera %p", cam_dev);
187
188 hw_device_t *dev = reinterpret_cast<hw_device_t *>(cam_dev);
189 res = dev->close(dev);
190 return res;
191 }
192
193 void setUpCamera(int id) {
194 ASSERT_GT(sNumCameras, id);
195 status_t res;
196
197 if (mDevice != NULL) {
198 closeCameraDevice(mDevice);
199 }
200 mDevice = openCameraDevice(id);
201 ASSERT_TRUE(NULL != mDevice) << "Failed to open camera device";
202
203 camera_info info;
204 res = sCameraModule->get_camera_info(id, &info);
205 ASSERT_EQ(OK, res);
206
207 mStaticInfo = info.static_camera_characteristics;
208
209 res = configureCameraDevice(mDevice,
210 mRequests,
211 mFrames,
212 mNotifications);
213 ASSERT_EQ(OK, res) << "Failure to configure camera device";
214
215 }
216
Andy McFaddeneda79df2012-12-18 09:50:24 -0800217 void setUpStream(sp<IGraphicBufferProducer> consumer,
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700218 int width, int height, int format, int *id) {
219 status_t res;
220
221 StreamAdapter* stream = new StreamAdapter(consumer);
222
223 ALOGV("Creating stream, format 0x%x, %d x %d", format, width, height);
224 res = stream->connectToDevice(mDevice, width, height, format);
225 ASSERT_EQ(NO_ERROR, res) << "Failed to connect to stream: "
226 << strerror(-res);
227 mStreams.push_back(stream);
228
229 *id = stream->getId();
230 }
231
232 void disconnectStream(int id) {
233 status_t res;
234 unsigned int i=0;
235 for (; i < mStreams.size(); i++) {
236 if (mStreams[i]->getId() == id) {
237 res = mStreams[i]->disconnect();
238 ASSERT_EQ(NO_ERROR, res) <<
239 "Failed to disconnect stream " << id;
240 break;
241 }
242 }
243 ASSERT_GT(mStreams.size(), i) << "Stream id not found:" << id;
244 }
245
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700246 void getResolutionList(int32_t format,
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700247 const int32_t **list,
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700248 size_t *count) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700249 ALOGV("Getting resolutions for format %x", format);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700250 status_t res;
Eino-Ville Talvala2388a2d2012-08-28 14:01:26 -0700251 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700252 camera_metadata_ro_entry_t availableFormats;
253 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700254 ANDROID_SCALER_AVAILABLE_FORMATS,
255 &availableFormats);
256 ASSERT_EQ(OK, res);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700257
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700258 uint32_t formatIdx;
259 for (formatIdx=0; formatIdx < availableFormats.count; formatIdx++) {
260 if (availableFormats.data.i32[formatIdx] == format) break;
261 }
262 ASSERT_NE(availableFormats.count, formatIdx)
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700263 << "No support found for format 0x" << std::hex << format;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700264 }
265
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700266 camera_metadata_ro_entry_t availableSizes;
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700267 if (format == HAL_PIXEL_FORMAT_RAW_SENSOR) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700268 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700269 ANDROID_SCALER_AVAILABLE_RAW_SIZES,
270 &availableSizes);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700271 } else if (format == HAL_PIXEL_FORMAT_BLOB) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700272 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700273 ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
274 &availableSizes);
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700275 } else {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700276 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700277 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
278 &availableSizes);
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700279 }
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700280 ASSERT_EQ(OK, res);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700281
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700282 *list = availableSizes.data.i32;
283 *count = availableSizes.count;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700284 }
285
286 virtual void SetUp() {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800287 TEST_EXTENSION_FORKING_SET_UP;
288
289 SetUpModule();
290
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700291 const ::testing::TestInfo* const testInfo =
292 ::testing::UnitTest::GetInstance()->current_test_info();
Igor Murashkineab33fc2012-11-06 17:02:54 -0800293 (void)testInfo;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700294
Igor Murashkineab33fc2012-11-06 17:02:54 -0800295 ALOGV("*** Starting test %s in test case %s", testInfo->name(),
296 testInfo->test_case_name());
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700297 mDevice = NULL;
298 }
299
300 virtual void TearDown() {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800301 TEST_EXTENSION_FORKING_TEAR_DOWN;
302
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700303 for (unsigned int i = 0; i < mStreams.size(); i++) {
304 delete mStreams[i];
305 }
306 if (mDevice != NULL) {
307 closeCameraDevice(mDevice);
308 }
Igor Murashkineab33fc2012-11-06 17:02:54 -0800309
310 TearDownModule();
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700311 }
312
313 camera2_device *mDevice;
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700314 const camera_metadata_t *mStaticInfo;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700315
316 MetadataQueue mRequests;
317 MetadataQueue mFrames;
318 NotifierListener mNotifications;
319
320 Vector<StreamAdapter*> mStreams;
321
322 private:
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700323 static camera_module_t *sCameraModule;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700324 static int sNumCameras;
325 static bool *sCameraSupportsHal2;
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700326};
327
328camera_module_t *Camera2Test::sCameraModule = NULL;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700329bool *Camera2Test::sCameraSupportsHal2 = NULL;
330int Camera2Test::sNumCameras = 0;
331
332static const nsecs_t USEC = 1000;
333static const nsecs_t MSEC = 1000*USEC;
334static const nsecs_t SEC = 1000*MSEC;
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700335
336
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700337TEST_F(Camera2Test, OpenClose) {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800338
339 TEST_EXTENSION_FORKING_INIT;
340
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700341 status_t res;
342
343 for (int id = 0; id < getNumCameras(); id++) {
344 if (!isHal2Supported(id)) continue;
345
346 camera2_device_t *d = openCameraDevice(id);
347 ASSERT_TRUE(NULL != d) << "Failed to open camera device";
348
349 res = closeCameraDevice(d);
350 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
351 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700352}
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700353
354TEST_F(Camera2Test, Capture1Raw) {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800355
356 TEST_EXTENSION_FORKING_INIT;
357
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700358 status_t res;
359
360 for (int id = 0; id < getNumCameras(); id++) {
361 if (!isHal2Supported(id)) continue;
362
363 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
364
365 sp<CpuConsumer> rawConsumer = new CpuConsumer(1);
366 sp<FrameWaiter> rawWaiter = new FrameWaiter();
367 rawConsumer->setFrameAvailableListener(rawWaiter);
368
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700369 const int32_t *rawResolutions;
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700370 size_t rawResolutionsCount;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700371
372 int format = HAL_PIXEL_FORMAT_RAW_SENSOR;
373
374 getResolutionList(format,
375 &rawResolutions, &rawResolutionsCount);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700376 ASSERT_LT((size_t)0, rawResolutionsCount);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700377
378 // Pick first available raw resolution
379 int width = rawResolutions[0];
380 int height = rawResolutions[1];
381
382 int streamId;
383 ASSERT_NO_FATAL_FAILURE(
384 setUpStream(rawConsumer->getProducerInterface(),
385 width, height, format, &streamId) );
386
387 camera_metadata_t *request;
388 request = allocate_camera_metadata(20, 2000);
389
Igor Murashkin09ad0a32012-12-03 13:33:08 -0800390 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700391 add_camera_metadata_entry(request,
392 ANDROID_REQUEST_METADATA_MODE,
393 (void**)&metadataMode, 1);
394 uint32_t outputStreams = streamId;
395 add_camera_metadata_entry(request,
396 ANDROID_REQUEST_OUTPUT_STREAMS,
397 (void**)&outputStreams, 1);
398
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700399 uint64_t exposureTime = 10*MSEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700400 add_camera_metadata_entry(request,
401 ANDROID_SENSOR_EXPOSURE_TIME,
402 (void**)&exposureTime, 1);
403 uint64_t frameDuration = 30*MSEC;
404 add_camera_metadata_entry(request,
405 ANDROID_SENSOR_FRAME_DURATION,
406 (void**)&frameDuration, 1);
407 uint32_t sensitivity = 100;
408 add_camera_metadata_entry(request,
409 ANDROID_SENSOR_SENSITIVITY,
410 (void**)&sensitivity, 1);
411
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700412 uint32_t hourOfDay = 12;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700413 add_camera_metadata_entry(request,
414 0x80000000, // EMULATOR_HOUROFDAY
415 &hourOfDay, 1);
416
417 IF_ALOGV() {
418 std::cout << "Input request: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700419 dump_indented_camera_metadata(request, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700420 }
421
422 res = mRequests.enqueue(request);
423 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res);
424
425 res = mFrames.waitForBuffer(exposureTime + SEC);
426 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
427
428 camera_metadata_t *frame;
429 res = mFrames.dequeue(&frame);
430 ASSERT_EQ(NO_ERROR, res);
431 ASSERT_TRUE(frame != NULL);
432
433 IF_ALOGV() {
434 std::cout << "Output frame:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700435 dump_indented_camera_metadata(frame, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700436 }
437
438 res = rawWaiter->waitForFrame(exposureTime + SEC);
439 ASSERT_EQ(NO_ERROR, res);
440
441 CpuConsumer::LockedBuffer buffer;
442 res = rawConsumer->lockNextBuffer(&buffer);
443 ASSERT_EQ(NO_ERROR, res);
444
445 IF_ALOGV() {
446 const char *dumpname =
447 "/data/local/tmp/camera2_test-capture1raw-dump.raw";
448 ALOGV("Dumping raw buffer to %s", dumpname);
449 // Write to file
450 std::ofstream rawFile(dumpname);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700451 size_t bpp = 2;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700452 for (unsigned int y = 0; y < buffer.height; y++) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700453 rawFile.write(
454 (const char *)(buffer.data + y * buffer.stride * bpp),
455 buffer.width * bpp);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700456 }
457 rawFile.close();
458 }
459
460 res = rawConsumer->unlockBuffer(buffer);
461 ASSERT_EQ(NO_ERROR, res);
462
463 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId));
464
465 res = closeCameraDevice(mDevice);
466 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
467
468 }
469}
470
471TEST_F(Camera2Test, CaptureBurstRaw) {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800472
473 TEST_EXTENSION_FORKING_INIT;
474
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700475 status_t res;
476
477 for (int id = 0; id < getNumCameras(); id++) {
478 if (!isHal2Supported(id)) continue;
479
480 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
481
482 sp<CpuConsumer> rawConsumer = new CpuConsumer(1);
483 sp<FrameWaiter> rawWaiter = new FrameWaiter();
484 rawConsumer->setFrameAvailableListener(rawWaiter);
485
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700486 const int32_t *rawResolutions;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700487 size_t rawResolutionsCount;
488
489 int format = HAL_PIXEL_FORMAT_RAW_SENSOR;
490
491 getResolutionList(format,
492 &rawResolutions, &rawResolutionsCount);
493 ASSERT_LT((uint32_t)0, rawResolutionsCount);
494
495 // Pick first available raw resolution
496 int width = rawResolutions[0];
497 int height = rawResolutions[1];
498
499 int streamId;
500 ASSERT_NO_FATAL_FAILURE(
501 setUpStream(rawConsumer->getProducerInterface(),
502 width, height, format, &streamId) );
503
504 camera_metadata_t *request;
505 request = allocate_camera_metadata(20, 2000);
506
Igor Murashkin09ad0a32012-12-03 13:33:08 -0800507 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700508 add_camera_metadata_entry(request,
509 ANDROID_REQUEST_METADATA_MODE,
510 (void**)&metadataMode, 1);
511 uint32_t outputStreams = streamId;
512 add_camera_metadata_entry(request,
513 ANDROID_REQUEST_OUTPUT_STREAMS,
514 (void**)&outputStreams, 1);
515
516 uint64_t frameDuration = 30*MSEC;
517 add_camera_metadata_entry(request,
518 ANDROID_SENSOR_FRAME_DURATION,
519 (void**)&frameDuration, 1);
520 uint32_t sensitivity = 100;
521 add_camera_metadata_entry(request,
522 ANDROID_SENSOR_SENSITIVITY,
523 (void**)&sensitivity, 1);
524
525 uint32_t hourOfDay = 12;
526 add_camera_metadata_entry(request,
527 0x80000000, // EMULATOR_HOUROFDAY
528 &hourOfDay, 1);
529
530 IF_ALOGV() {
531 std::cout << "Input request template: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700532 dump_indented_camera_metadata(request, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700533 }
534
535 int numCaptures = 10;
536
537 // Enqueue numCaptures requests with increasing exposure time
538
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700539 uint64_t exposureTime = 100 * USEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700540 for (int reqCount = 0; reqCount < numCaptures; reqCount++ ) {
541 camera_metadata_t *req;
542 req = allocate_camera_metadata(20, 2000);
543 append_camera_metadata(req, request);
544
545 add_camera_metadata_entry(req,
546 ANDROID_SENSOR_EXPOSURE_TIME,
547 (void**)&exposureTime, 1);
548 exposureTime *= 2;
549
550 res = mRequests.enqueue(req);
551 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: "
552 << strerror(-res);
553 }
554
555 // Get frames and image buffers one by one
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700556 uint64_t expectedExposureTime = 100 * USEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700557 for (int frameCount = 0; frameCount < 10; frameCount++) {
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700558 res = mFrames.waitForBuffer(SEC + expectedExposureTime);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700559 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
560
561 camera_metadata_t *frame;
562 res = mFrames.dequeue(&frame);
563 ASSERT_EQ(NO_ERROR, res);
564 ASSERT_TRUE(frame != NULL);
565
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700566 camera_metadata_entry_t frameNumber;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700567 res = find_camera_metadata_entry(frame,
568 ANDROID_REQUEST_FRAME_COUNT,
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700569 &frameNumber);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700570 ASSERT_EQ(NO_ERROR, res);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700571 ASSERT_EQ(frameCount, *frameNumber.data.i32);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700572
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700573 res = rawWaiter->waitForFrame(SEC + expectedExposureTime);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700574 ASSERT_EQ(NO_ERROR, res) <<
575 "Never got raw data for capture " << frameCount;
576
577 CpuConsumer::LockedBuffer buffer;
578 res = rawConsumer->lockNextBuffer(&buffer);
579 ASSERT_EQ(NO_ERROR, res);
580
581 IF_ALOGV() {
582 char dumpname[60];
583 snprintf(dumpname, 60,
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700584 "/data/local/tmp/camera2_test-"
585 "captureBurstRaw-dump_%d.raw",
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700586 frameCount);
587 ALOGV("Dumping raw buffer to %s", dumpname);
588 // Write to file
589 std::ofstream rawFile(dumpname);
590 for (unsigned int y = 0; y < buffer.height; y++) {
591 rawFile.write(
592 (const char *)(buffer.data + y * buffer.stride * 2),
593 buffer.width * 2);
594 }
595 rawFile.close();
596 }
597
598 res = rawConsumer->unlockBuffer(buffer);
599 ASSERT_EQ(NO_ERROR, res);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700600
601 expectedExposureTime *= 2;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700602 }
603 }
604}
605
Eino-Ville Talvala6adfd6b2012-05-14 15:25:27 -0700606TEST_F(Camera2Test, ConstructDefaultRequests) {
Igor Murashkineab33fc2012-11-06 17:02:54 -0800607
608 TEST_EXTENSION_FORKING_INIT;
609
Eino-Ville Talvala6adfd6b2012-05-14 15:25:27 -0700610 status_t res;
611
612 for (int id = 0; id < getNumCameras(); id++) {
613 if (!isHal2Supported(id)) continue;
614
615 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
616
617 for (int i = CAMERA2_TEMPLATE_PREVIEW; i < CAMERA2_TEMPLATE_COUNT;
618 i++) {
619 camera_metadata_t *request = NULL;
620 res = mDevice->ops->construct_default_request(mDevice,
621 i,
622 &request);
623 EXPECT_EQ(NO_ERROR, res) <<
624 "Unable to construct request from template type %d", i;
625 EXPECT_TRUE(request != NULL);
626 EXPECT_LT((size_t)0, get_camera_metadata_entry_count(request));
627 EXPECT_LT((size_t)0, get_camera_metadata_data_count(request));
628
629 IF_ALOGV() {
630 std::cout << " ** Template type " << i << ":"<<std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700631 dump_indented_camera_metadata(request, 0, 2, 4);
Eino-Ville Talvala6adfd6b2012-05-14 15:25:27 -0700632 }
633
634 free_camera_metadata(request);
635 }
636 }
637}
638
Igor Murashkineab33fc2012-11-06 17:02:54 -0800639TEST_F(Camera2Test, Capture1Jpeg) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700640 status_t res;
641
642 for (int id = 0; id < getNumCameras(); id++) {
643 if (!isHal2Supported(id)) continue;
644
645 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
646
647 sp<CpuConsumer> jpegConsumer = new CpuConsumer(1);
648 sp<FrameWaiter> jpegWaiter = new FrameWaiter();
649 jpegConsumer->setFrameAvailableListener(jpegWaiter);
650
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700651 const int32_t *jpegResolutions;
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700652 size_t jpegResolutionsCount;
653
654 int format = HAL_PIXEL_FORMAT_BLOB;
655
656 getResolutionList(format,
657 &jpegResolutions, &jpegResolutionsCount);
658 ASSERT_LT((size_t)0, jpegResolutionsCount);
659
660 // Pick first available JPEG resolution
661 int width = jpegResolutions[0];
662 int height = jpegResolutions[1];
663
664 int streamId;
665 ASSERT_NO_FATAL_FAILURE(
666 setUpStream(jpegConsumer->getProducerInterface(),
667 width, height, format, &streamId) );
668
669 camera_metadata_t *request;
670 request = allocate_camera_metadata(20, 2000);
671
Igor Murashkin09ad0a32012-12-03 13:33:08 -0800672 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700673 add_camera_metadata_entry(request,
674 ANDROID_REQUEST_METADATA_MODE,
675 (void**)&metadataMode, 1);
676 uint32_t outputStreams = streamId;
677 add_camera_metadata_entry(request,
678 ANDROID_REQUEST_OUTPUT_STREAMS,
679 (void**)&outputStreams, 1);
680
681 uint64_t exposureTime = 10*MSEC;
682 add_camera_metadata_entry(request,
683 ANDROID_SENSOR_EXPOSURE_TIME,
684 (void**)&exposureTime, 1);
685 uint64_t frameDuration = 30*MSEC;
686 add_camera_metadata_entry(request,
687 ANDROID_SENSOR_FRAME_DURATION,
688 (void**)&frameDuration, 1);
689 uint32_t sensitivity = 100;
690 add_camera_metadata_entry(request,
691 ANDROID_SENSOR_SENSITIVITY,
692 (void**)&sensitivity, 1);
693
694 uint32_t hourOfDay = 12;
695 add_camera_metadata_entry(request,
696 0x80000000, // EMULATOR_HOUROFDAY
697 &hourOfDay, 1);
698
699 IF_ALOGV() {
700 std::cout << "Input request: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700701 dump_indented_camera_metadata(request, 0, 1, 4);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700702 }
703
704 res = mRequests.enqueue(request);
705 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res);
706
707 res = mFrames.waitForBuffer(exposureTime + SEC);
708 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
709
710 camera_metadata_t *frame;
711 res = mFrames.dequeue(&frame);
712 ASSERT_EQ(NO_ERROR, res);
713 ASSERT_TRUE(frame != NULL);
714
715 IF_ALOGV() {
716 std::cout << "Output frame:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700717 dump_indented_camera_metadata(frame, 0, 1, 4);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700718 }
719
720 res = jpegWaiter->waitForFrame(exposureTime + SEC);
721 ASSERT_EQ(NO_ERROR, res);
722
723 CpuConsumer::LockedBuffer buffer;
724 res = jpegConsumer->lockNextBuffer(&buffer);
725 ASSERT_EQ(NO_ERROR, res);
726
727 IF_ALOGV() {
728 const char *dumpname =
729 "/data/local/tmp/camera2_test-capture1jpeg-dump.jpeg";
730 ALOGV("Dumping raw buffer to %s", dumpname);
731 // Write to file
732 std::ofstream jpegFile(dumpname);
733 size_t bpp = 1;
734 for (unsigned int y = 0; y < buffer.height; y++) {
735 jpegFile.write(
736 (const char *)(buffer.data + y * buffer.stride * bpp),
737 buffer.width * bpp);
738 }
739 jpegFile.close();
740 }
741
742 res = jpegConsumer->unlockBuffer(buffer);
743 ASSERT_EQ(NO_ERROR, res);
744
745 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId));
746
747 res = closeCameraDevice(mDevice);
748 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
749
750 }
751}
752
Igor Murashkine302ee32012-11-05 11:14:49 -0800753} // namespace tests
754} // namespace camera2
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700755} // namespace android