blob: b3bbc95a75db48ee719a133240bdff30a3d574b9 [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"
18#define LOG_NDEBUG 0
19
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"
31
32namespace android {
Igor Murashkine302ee32012-11-05 11:14:49 -080033namespace camera2 {
34namespace tests {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070035
36class Camera2Test: public testing::Test {
37 public:
38 static void SetUpTestCase() {
39 int res;
40
41 hw_module_t *module = NULL;
42 res = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
43 (const hw_module_t **)&module);
44
45 ASSERT_EQ(0, res)
46 << "Failure opening camera hardware module: " << res;
47 ASSERT_TRUE(NULL != module)
48 << "No camera module was set by hw_get_module";
49
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070050 IF_ALOGV() {
51 std::cout << " Camera module name: "
52 << module->name << std::endl;
53 std::cout << " Camera module author: "
54 << module->author << std::endl;
55 std::cout << " Camera module API version: 0x" << std::hex
56 << module->module_api_version << std::endl;
57 std::cout << " Camera module HAL API version: 0x" << std::hex
58 << module->hal_api_version << std::endl;
59 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070060
61 int16_t version2_0 = CAMERA_MODULE_API_VERSION_2_0;
62 ASSERT_EQ(version2_0, module->module_api_version)
63 << "Camera module version is 0x"
64 << std::hex << module->module_api_version
65 << ", not 2.0. (0x"
66 << std::hex << CAMERA_MODULE_API_VERSION_2_0 << ")";
67
68 sCameraModule = reinterpret_cast<camera_module_t*>(module);
69
70 sNumCameras = sCameraModule->get_number_of_cameras();
71 ASSERT_LT(0, sNumCameras) << "No camera devices available!";
72
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070073 IF_ALOGV() {
74 std::cout << " Camera device count: " << sNumCameras << std::endl;
75 }
76
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070077 sCameraSupportsHal2 = new bool[sNumCameras];
78
79 for (int i = 0; i < sNumCameras; i++) {
80 camera_info info;
81 res = sCameraModule->get_camera_info(i, &info);
82 ASSERT_EQ(0, res)
83 << "Failure getting camera info for camera " << i;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070084 IF_ALOGV() {
85 std::cout << " Camera device: " << std::dec
86 << i << std::endl;;
87 std::cout << " Facing: " << std::dec
88 << info.facing << std::endl;
89 std::cout << " Orientation: " << std::dec
90 << info.orientation << std::endl;
91 std::cout << " Version: 0x" << std::hex <<
92 info.device_version << std::endl;
93 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -070094 if (info.device_version >= CAMERA_DEVICE_API_VERSION_2_0) {
95 sCameraSupportsHal2[i] = true;
96 ASSERT_TRUE(NULL != info.static_camera_characteristics);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -070097 IF_ALOGV() {
98 std::cout << " Static camera metadata:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -070099 dump_indented_camera_metadata(info.static_camera_characteristics,
100 0, 1, 6);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700101 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700102 } else {
103 sCameraSupportsHal2[i] = false;
104 }
105 }
106 }
107
Igor Murashkine302ee32012-11-05 11:14:49 -0800108 static void TearDownTestCase() {
109 hw_module_t *module = reinterpret_cast<hw_module_t*>(sCameraModule);
110 ASSERT_EQ(0, HWModuleHelpers::closeModule(module));
111 }
112
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700113 static const camera_module_t *getCameraModule() {
114 return sCameraModule;
115 }
116
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700117 static int getNumCameras() {
118 return sNumCameras;
119 }
120
121 static bool isHal2Supported(int id) {
122 return sCameraSupportsHal2[id];
123 }
124
125 static camera2_device_t *openCameraDevice(int id) {
126 ALOGV("Opening camera %d", id);
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700127 if (NULL == sCameraSupportsHal2) return NULL;
128 if (id >= sNumCameras) return NULL;
129 if (!sCameraSupportsHal2[id]) return NULL;
130
131 hw_device_t *device = NULL;
132 const camera_module_t *cam_module = getCameraModule();
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700133 if (cam_module == NULL) {
134 return NULL;
135 }
136
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700137 char camId[10];
138 int res;
139
140 snprintf(camId, 10, "%d", id);
141 res = cam_module->common.methods->open(
142 (const hw_module_t*)cam_module,
143 camId,
144 &device);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700145 if (res != NO_ERROR || device == NULL) {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700146 return NULL;
147 }
148 camera2_device_t *cam_device =
149 reinterpret_cast<camera2_device_t*>(device);
150 return cam_device;
151 }
152
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700153 static status_t configureCameraDevice(camera2_device_t *dev,
154 MetadataQueue &requestQueue,
155 MetadataQueue &frameQueue,
156 NotifierListener &listener) {
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700157
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700158 status_t err;
159
160 err = dev->ops->set_request_queue_src_ops(dev,
161 requestQueue.getToConsumerInterface());
162 if (err != OK) return err;
163
164 requestQueue.setFromConsumerInterface(dev);
165
166 err = dev->ops->set_frame_queue_dst_ops(dev,
167 frameQueue.getToProducerInterface());
168 if (err != OK) return err;
169
170 err = listener.getNotificationsFrom(dev);
171 if (err != OK) return err;
172
173 vendor_tag_query_ops_t *vendor_metadata_tag_ops;
174 err = dev->ops->get_metadata_vendor_tag_ops(dev, &vendor_metadata_tag_ops);
175 if (err != OK) return err;
176
177 err = set_camera_metadata_vendor_tag_ops(vendor_metadata_tag_ops);
178 if (err != OK) return err;
179
180 return OK;
181 }
182
183 static status_t closeCameraDevice(camera2_device_t *cam_dev) {
184 int res;
185 ALOGV("Closing camera %p", cam_dev);
186
187 hw_device_t *dev = reinterpret_cast<hw_device_t *>(cam_dev);
188 res = dev->close(dev);
189 return res;
190 }
191
192 void setUpCamera(int id) {
193 ASSERT_GT(sNumCameras, id);
194 status_t res;
195
196 if (mDevice != NULL) {
197 closeCameraDevice(mDevice);
198 }
199 mDevice = openCameraDevice(id);
200 ASSERT_TRUE(NULL != mDevice) << "Failed to open camera device";
201
202 camera_info info;
203 res = sCameraModule->get_camera_info(id, &info);
204 ASSERT_EQ(OK, res);
205
206 mStaticInfo = info.static_camera_characteristics;
207
208 res = configureCameraDevice(mDevice,
209 mRequests,
210 mFrames,
211 mNotifications);
212 ASSERT_EQ(OK, res) << "Failure to configure camera device";
213
214 }
215
216 void setUpStream(sp<ISurfaceTexture> consumer,
217 int width, int height, int format, int *id) {
218 status_t res;
219
220 StreamAdapter* stream = new StreamAdapter(consumer);
221
222 ALOGV("Creating stream, format 0x%x, %d x %d", format, width, height);
223 res = stream->connectToDevice(mDevice, width, height, format);
224 ASSERT_EQ(NO_ERROR, res) << "Failed to connect to stream: "
225 << strerror(-res);
226 mStreams.push_back(stream);
227
228 *id = stream->getId();
229 }
230
231 void disconnectStream(int id) {
232 status_t res;
233 unsigned int i=0;
234 for (; i < mStreams.size(); i++) {
235 if (mStreams[i]->getId() == id) {
236 res = mStreams[i]->disconnect();
237 ASSERT_EQ(NO_ERROR, res) <<
238 "Failed to disconnect stream " << id;
239 break;
240 }
241 }
242 ASSERT_GT(mStreams.size(), i) << "Stream id not found:" << id;
243 }
244
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700245 void getResolutionList(int32_t format,
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700246 const int32_t **list,
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700247 size_t *count) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700248 ALOGV("Getting resolutions for format %x", format);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700249 status_t res;
Eino-Ville Talvala2388a2d2012-08-28 14:01:26 -0700250 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700251 camera_metadata_ro_entry_t availableFormats;
252 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700253 ANDROID_SCALER_AVAILABLE_FORMATS,
254 &availableFormats);
255 ASSERT_EQ(OK, res);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700256
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700257 uint32_t formatIdx;
258 for (formatIdx=0; formatIdx < availableFormats.count; formatIdx++) {
259 if (availableFormats.data.i32[formatIdx] == format) break;
260 }
261 ASSERT_NE(availableFormats.count, formatIdx)
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700262 << "No support found for format 0x" << std::hex << format;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700263 }
264
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700265 camera_metadata_ro_entry_t availableSizes;
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700266 if (format == HAL_PIXEL_FORMAT_RAW_SENSOR) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700267 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700268 ANDROID_SCALER_AVAILABLE_RAW_SIZES,
269 &availableSizes);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700270 } else if (format == HAL_PIXEL_FORMAT_BLOB) {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700271 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700272 ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
273 &availableSizes);
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700274 } else {
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700275 res = find_camera_metadata_ro_entry(mStaticInfo,
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700276 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
277 &availableSizes);
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700278 }
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700279 ASSERT_EQ(OK, res);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700280
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700281 *list = availableSizes.data.i32;
282 *count = availableSizes.count;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700283 }
284
285 virtual void SetUp() {
286 const ::testing::TestInfo* const testInfo =
287 ::testing::UnitTest::GetInstance()->current_test_info();
288
289 ALOGV("*** Starting test %s in test case %s", testInfo->name(), testInfo->test_case_name());
290 mDevice = NULL;
291 }
292
293 virtual void TearDown() {
294 for (unsigned int i = 0; i < mStreams.size(); i++) {
295 delete mStreams[i];
296 }
297 if (mDevice != NULL) {
298 closeCameraDevice(mDevice);
299 }
300 }
301
302 camera2_device *mDevice;
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700303 const camera_metadata_t *mStaticInfo;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700304
305 MetadataQueue mRequests;
306 MetadataQueue mFrames;
307 NotifierListener mNotifications;
308
309 Vector<StreamAdapter*> mStreams;
310
311 private:
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700312 static camera_module_t *sCameraModule;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700313 static int sNumCameras;
314 static bool *sCameraSupportsHal2;
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700315};
316
317camera_module_t *Camera2Test::sCameraModule = NULL;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700318bool *Camera2Test::sCameraSupportsHal2 = NULL;
319int Camera2Test::sNumCameras = 0;
320
321static const nsecs_t USEC = 1000;
322static const nsecs_t MSEC = 1000*USEC;
323static const nsecs_t SEC = 1000*MSEC;
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700324
325
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700326TEST_F(Camera2Test, OpenClose) {
327 status_t res;
328
329 for (int id = 0; id < getNumCameras(); id++) {
330 if (!isHal2Supported(id)) continue;
331
332 camera2_device_t *d = openCameraDevice(id);
333 ASSERT_TRUE(NULL != d) << "Failed to open camera device";
334
335 res = closeCameraDevice(d);
336 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
337 }
Eino-Ville Talvalafed0c022012-03-22 13:11:05 -0700338}
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700339
340TEST_F(Camera2Test, Capture1Raw) {
341 status_t res;
342
343 for (int id = 0; id < getNumCameras(); id++) {
344 if (!isHal2Supported(id)) continue;
345
346 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
347
348 sp<CpuConsumer> rawConsumer = new CpuConsumer(1);
349 sp<FrameWaiter> rawWaiter = new FrameWaiter();
350 rawConsumer->setFrameAvailableListener(rawWaiter);
351
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700352 const int32_t *rawResolutions;
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700353 size_t rawResolutionsCount;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700354
355 int format = HAL_PIXEL_FORMAT_RAW_SENSOR;
356
357 getResolutionList(format,
358 &rawResolutions, &rawResolutionsCount);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700359 ASSERT_LT((size_t)0, rawResolutionsCount);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700360
361 // Pick first available raw resolution
362 int width = rawResolutions[0];
363 int height = rawResolutions[1];
364
365 int streamId;
366 ASSERT_NO_FATAL_FAILURE(
367 setUpStream(rawConsumer->getProducerInterface(),
368 width, height, format, &streamId) );
369
370 camera_metadata_t *request;
371 request = allocate_camera_metadata(20, 2000);
372
373 uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL;
374 add_camera_metadata_entry(request,
375 ANDROID_REQUEST_METADATA_MODE,
376 (void**)&metadataMode, 1);
377 uint32_t outputStreams = streamId;
378 add_camera_metadata_entry(request,
379 ANDROID_REQUEST_OUTPUT_STREAMS,
380 (void**)&outputStreams, 1);
381
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700382 uint64_t exposureTime = 10*MSEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700383 add_camera_metadata_entry(request,
384 ANDROID_SENSOR_EXPOSURE_TIME,
385 (void**)&exposureTime, 1);
386 uint64_t frameDuration = 30*MSEC;
387 add_camera_metadata_entry(request,
388 ANDROID_SENSOR_FRAME_DURATION,
389 (void**)&frameDuration, 1);
390 uint32_t sensitivity = 100;
391 add_camera_metadata_entry(request,
392 ANDROID_SENSOR_SENSITIVITY,
393 (void**)&sensitivity, 1);
394
Eino-Ville Talvala895ed342012-05-20 17:25:53 -0700395 uint32_t hourOfDay = 12;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700396 add_camera_metadata_entry(request,
397 0x80000000, // EMULATOR_HOUROFDAY
398 &hourOfDay, 1);
399
400 IF_ALOGV() {
401 std::cout << "Input request: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700402 dump_indented_camera_metadata(request, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700403 }
404
405 res = mRequests.enqueue(request);
406 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res);
407
408 res = mFrames.waitForBuffer(exposureTime + SEC);
409 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
410
411 camera_metadata_t *frame;
412 res = mFrames.dequeue(&frame);
413 ASSERT_EQ(NO_ERROR, res);
414 ASSERT_TRUE(frame != NULL);
415
416 IF_ALOGV() {
417 std::cout << "Output frame:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700418 dump_indented_camera_metadata(frame, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700419 }
420
421 res = rawWaiter->waitForFrame(exposureTime + SEC);
422 ASSERT_EQ(NO_ERROR, res);
423
424 CpuConsumer::LockedBuffer buffer;
425 res = rawConsumer->lockNextBuffer(&buffer);
426 ASSERT_EQ(NO_ERROR, res);
427
428 IF_ALOGV() {
429 const char *dumpname =
430 "/data/local/tmp/camera2_test-capture1raw-dump.raw";
431 ALOGV("Dumping raw buffer to %s", dumpname);
432 // Write to file
433 std::ofstream rawFile(dumpname);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700434 size_t bpp = 2;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700435 for (unsigned int y = 0; y < buffer.height; y++) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700436 rawFile.write(
437 (const char *)(buffer.data + y * buffer.stride * bpp),
438 buffer.width * bpp);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700439 }
440 rawFile.close();
441 }
442
443 res = rawConsumer->unlockBuffer(buffer);
444 ASSERT_EQ(NO_ERROR, res);
445
446 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId));
447
448 res = closeCameraDevice(mDevice);
449 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
450
451 }
452}
453
454TEST_F(Camera2Test, CaptureBurstRaw) {
455 status_t res;
456
457 for (int id = 0; id < getNumCameras(); id++) {
458 if (!isHal2Supported(id)) continue;
459
460 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
461
462 sp<CpuConsumer> rawConsumer = new CpuConsumer(1);
463 sp<FrameWaiter> rawWaiter = new FrameWaiter();
464 rawConsumer->setFrameAvailableListener(rawWaiter);
465
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700466 const int32_t *rawResolutions;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700467 size_t rawResolutionsCount;
468
469 int format = HAL_PIXEL_FORMAT_RAW_SENSOR;
470
471 getResolutionList(format,
472 &rawResolutions, &rawResolutionsCount);
473 ASSERT_LT((uint32_t)0, rawResolutionsCount);
474
475 // Pick first available raw resolution
476 int width = rawResolutions[0];
477 int height = rawResolutions[1];
478
479 int streamId;
480 ASSERT_NO_FATAL_FAILURE(
481 setUpStream(rawConsumer->getProducerInterface(),
482 width, height, format, &streamId) );
483
484 camera_metadata_t *request;
485 request = allocate_camera_metadata(20, 2000);
486
487 uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL;
488 add_camera_metadata_entry(request,
489 ANDROID_REQUEST_METADATA_MODE,
490 (void**)&metadataMode, 1);
491 uint32_t outputStreams = streamId;
492 add_camera_metadata_entry(request,
493 ANDROID_REQUEST_OUTPUT_STREAMS,
494 (void**)&outputStreams, 1);
495
496 uint64_t frameDuration = 30*MSEC;
497 add_camera_metadata_entry(request,
498 ANDROID_SENSOR_FRAME_DURATION,
499 (void**)&frameDuration, 1);
500 uint32_t sensitivity = 100;
501 add_camera_metadata_entry(request,
502 ANDROID_SENSOR_SENSITIVITY,
503 (void**)&sensitivity, 1);
504
505 uint32_t hourOfDay = 12;
506 add_camera_metadata_entry(request,
507 0x80000000, // EMULATOR_HOUROFDAY
508 &hourOfDay, 1);
509
510 IF_ALOGV() {
511 std::cout << "Input request template: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700512 dump_indented_camera_metadata(request, 0, 1, 2);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700513 }
514
515 int numCaptures = 10;
516
517 // Enqueue numCaptures requests with increasing exposure time
518
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700519 uint64_t exposureTime = 100 * USEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700520 for (int reqCount = 0; reqCount < numCaptures; reqCount++ ) {
521 camera_metadata_t *req;
522 req = allocate_camera_metadata(20, 2000);
523 append_camera_metadata(req, request);
524
525 add_camera_metadata_entry(req,
526 ANDROID_SENSOR_EXPOSURE_TIME,
527 (void**)&exposureTime, 1);
528 exposureTime *= 2;
529
530 res = mRequests.enqueue(req);
531 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: "
532 << strerror(-res);
533 }
534
535 // Get frames and image buffers one by one
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700536 uint64_t expectedExposureTime = 100 * USEC;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700537 for (int frameCount = 0; frameCount < 10; frameCount++) {
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700538 res = mFrames.waitForBuffer(SEC + expectedExposureTime);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700539 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
540
541 camera_metadata_t *frame;
542 res = mFrames.dequeue(&frame);
543 ASSERT_EQ(NO_ERROR, res);
544 ASSERT_TRUE(frame != NULL);
545
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700546 camera_metadata_entry_t frameNumber;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700547 res = find_camera_metadata_entry(frame,
548 ANDROID_REQUEST_FRAME_COUNT,
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700549 &frameNumber);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700550 ASSERT_EQ(NO_ERROR, res);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700551 ASSERT_EQ(frameCount, *frameNumber.data.i32);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700552
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700553 res = rawWaiter->waitForFrame(SEC + expectedExposureTime);
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700554 ASSERT_EQ(NO_ERROR, res) <<
555 "Never got raw data for capture " << frameCount;
556
557 CpuConsumer::LockedBuffer buffer;
558 res = rawConsumer->lockNextBuffer(&buffer);
559 ASSERT_EQ(NO_ERROR, res);
560
561 IF_ALOGV() {
562 char dumpname[60];
563 snprintf(dumpname, 60,
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700564 "/data/local/tmp/camera2_test-"
565 "captureBurstRaw-dump_%d.raw",
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700566 frameCount);
567 ALOGV("Dumping raw buffer to %s", dumpname);
568 // Write to file
569 std::ofstream rawFile(dumpname);
570 for (unsigned int y = 0; y < buffer.height; y++) {
571 rawFile.write(
572 (const char *)(buffer.data + y * buffer.stride * 2),
573 buffer.width * 2);
574 }
575 rawFile.close();
576 }
577
578 res = rawConsumer->unlockBuffer(buffer);
579 ASSERT_EQ(NO_ERROR, res);
Eino-Ville Talvalae6a3c3c2012-05-11 16:18:42 -0700580
581 expectedExposureTime *= 2;
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700582 }
583 }
584}
585
Eino-Ville Talvala6adfd6b2012-05-14 15:25:27 -0700586TEST_F(Camera2Test, ConstructDefaultRequests) {
587 status_t res;
588
589 for (int id = 0; id < getNumCameras(); id++) {
590 if (!isHal2Supported(id)) continue;
591
592 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
593
594 for (int i = CAMERA2_TEMPLATE_PREVIEW; i < CAMERA2_TEMPLATE_COUNT;
595 i++) {
596 camera_metadata_t *request = NULL;
597 res = mDevice->ops->construct_default_request(mDevice,
598 i,
599 &request);
600 EXPECT_EQ(NO_ERROR, res) <<
601 "Unable to construct request from template type %d", i;
602 EXPECT_TRUE(request != NULL);
603 EXPECT_LT((size_t)0, get_camera_metadata_entry_count(request));
604 EXPECT_LT((size_t)0, get_camera_metadata_data_count(request));
605
606 IF_ALOGV() {
607 std::cout << " ** Template type " << i << ":"<<std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700608 dump_indented_camera_metadata(request, 0, 2, 4);
Eino-Ville Talvala6adfd6b2012-05-14 15:25:27 -0700609 }
610
611 free_camera_metadata(request);
612 }
613 }
614}
615
Igor Murashkine302ee32012-11-05 11:14:49 -0800616TEST_F(Camera2Test, DISABLED_Capture1Jpeg) {
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700617 status_t res;
618
619 for (int id = 0; id < getNumCameras(); id++) {
620 if (!isHal2Supported(id)) continue;
621
622 ASSERT_NO_FATAL_FAILURE(setUpCamera(id));
623
624 sp<CpuConsumer> jpegConsumer = new CpuConsumer(1);
625 sp<FrameWaiter> jpegWaiter = new FrameWaiter();
626 jpegConsumer->setFrameAvailableListener(jpegWaiter);
627
Eino-Ville Talvalab8b64392012-08-24 12:32:17 -0700628 const int32_t *jpegResolutions;
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700629 size_t jpegResolutionsCount;
630
631 int format = HAL_PIXEL_FORMAT_BLOB;
632
633 getResolutionList(format,
634 &jpegResolutions, &jpegResolutionsCount);
635 ASSERT_LT((size_t)0, jpegResolutionsCount);
636
637 // Pick first available JPEG resolution
638 int width = jpegResolutions[0];
639 int height = jpegResolutions[1];
640
641 int streamId;
642 ASSERT_NO_FATAL_FAILURE(
643 setUpStream(jpegConsumer->getProducerInterface(),
644 width, height, format, &streamId) );
645
646 camera_metadata_t *request;
647 request = allocate_camera_metadata(20, 2000);
648
649 uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL;
650 add_camera_metadata_entry(request,
651 ANDROID_REQUEST_METADATA_MODE,
652 (void**)&metadataMode, 1);
653 uint32_t outputStreams = streamId;
654 add_camera_metadata_entry(request,
655 ANDROID_REQUEST_OUTPUT_STREAMS,
656 (void**)&outputStreams, 1);
657
658 uint64_t exposureTime = 10*MSEC;
659 add_camera_metadata_entry(request,
660 ANDROID_SENSOR_EXPOSURE_TIME,
661 (void**)&exposureTime, 1);
662 uint64_t frameDuration = 30*MSEC;
663 add_camera_metadata_entry(request,
664 ANDROID_SENSOR_FRAME_DURATION,
665 (void**)&frameDuration, 1);
666 uint32_t sensitivity = 100;
667 add_camera_metadata_entry(request,
668 ANDROID_SENSOR_SENSITIVITY,
669 (void**)&sensitivity, 1);
670
671 uint32_t hourOfDay = 12;
672 add_camera_metadata_entry(request,
673 0x80000000, // EMULATOR_HOUROFDAY
674 &hourOfDay, 1);
675
676 IF_ALOGV() {
677 std::cout << "Input request: " << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700678 dump_indented_camera_metadata(request, 0, 1, 4);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700679 }
680
681 res = mRequests.enqueue(request);
682 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res);
683
684 res = mFrames.waitForBuffer(exposureTime + SEC);
685 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res);
686
687 camera_metadata_t *frame;
688 res = mFrames.dequeue(&frame);
689 ASSERT_EQ(NO_ERROR, res);
690 ASSERT_TRUE(frame != NULL);
691
692 IF_ALOGV() {
693 std::cout << "Output frame:" << std::endl;
Eino-Ville Talvala5d64b232012-07-30 10:12:40 -0700694 dump_indented_camera_metadata(frame, 0, 1, 4);
Eino-Ville Talvalafa7a91d2012-05-22 10:41:20 -0700695 }
696
697 res = jpegWaiter->waitForFrame(exposureTime + SEC);
698 ASSERT_EQ(NO_ERROR, res);
699
700 CpuConsumer::LockedBuffer buffer;
701 res = jpegConsumer->lockNextBuffer(&buffer);
702 ASSERT_EQ(NO_ERROR, res);
703
704 IF_ALOGV() {
705 const char *dumpname =
706 "/data/local/tmp/camera2_test-capture1jpeg-dump.jpeg";
707 ALOGV("Dumping raw buffer to %s", dumpname);
708 // Write to file
709 std::ofstream jpegFile(dumpname);
710 size_t bpp = 1;
711 for (unsigned int y = 0; y < buffer.height; y++) {
712 jpegFile.write(
713 (const char *)(buffer.data + y * buffer.stride * bpp),
714 buffer.width * bpp);
715 }
716 jpegFile.close();
717 }
718
719 res = jpegConsumer->unlockBuffer(buffer);
720 ASSERT_EQ(NO_ERROR, res);
721
722 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId));
723
724 res = closeCameraDevice(mDevice);
725 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device";
726
727 }
728}
729
Igor Murashkine302ee32012-11-05 11:14:49 -0800730} // namespace tests
731} // namespace camera2
Eino-Ville Talvala567b4a22012-04-23 09:29:38 -0700732} // namespace android