diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/camera2/Android.mk | 1 | ||||
-rw-r--r-- | tests/camera2/CameraModuleTests.cpp | 2 | ||||
-rw-r--r-- | tests/camera2/camera2.cpp | 872 |
3 files changed, 1 insertions, 874 deletions
diff --git a/tests/camera2/Android.mk b/tests/camera2/Android.mk index 1128522..e45f467 100644 --- a/tests/camera2/Android.mk +++ b/tests/camera2/Android.mk @@ -2,7 +2,6 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ - camera2.cpp \ camera2_utils.cpp \ main.cpp \ CameraMetadataTests.cpp \ diff --git a/tests/camera2/CameraModuleTests.cpp b/tests/camera2/CameraModuleTests.cpp index 2e85d81..2b6c757 100644 --- a/tests/camera2/CameraModuleTests.cpp +++ b/tests/camera2/CameraModuleTests.cpp @@ -120,7 +120,7 @@ TEST_F(CameraModuleTest, GetCameraInfoBadIndices) { for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { struct camera_info info; EXPECT_NE(OK, mModule->getCameraInfo(idx[i], &info)); - EXPECT_EQ(-ENODEV, mModule->getCameraInfo(idx[i], &info)) + EXPECT_EQ(-EINVAL, mModule->getCameraInfo(idx[i], &info)) << "Incorrect error code for get_camera_info idx= " << idx[i]; } diff --git a/tests/camera2/camera2.cpp b/tests/camera2/camera2.cpp deleted file mode 100644 index 8d637d4..0000000 --- a/tests/camera2/camera2.cpp +++ /dev/null @@ -1,872 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -#define LOG_TAG "Camera2_test" -//#define LOG_NDEBUG 0 - -#include <utils/Log.h> -#include <gtest/gtest.h> -#include <iostream> -#include <fstream> - -#include <utils/Vector.h> -#include <utils/KeyedVector.h> -#include <gui/CpuConsumer.h> -#include <ui/PixelFormat.h> -#include <system/camera_metadata.h> - -#include "camera2_utils.h" -#include "TestExtensions.h" - -namespace android { -namespace camera2 { -namespace tests { - -class Camera2Test: public testing::Test { - public: - void SetUpModule() { - int res; - - hw_module_t *module = NULL; - res = hw_get_module(CAMERA_HARDWARE_MODULE_ID, - (const hw_module_t **)&module); - - ASSERT_EQ(0, res) - << "Failure opening camera hardware module: " << res; - ASSERT_TRUE(NULL != module) - << "No camera module was set by hw_get_module"; - - IF_ALOGV() { - std::cout << " Camera module name: " - << module->name << std::endl; - std::cout << " Camera module author: " - << module->author << std::endl; - std::cout << " Camera module API version: 0x" << std::hex - << module->module_api_version << std::endl; - std::cout << " Camera module HAL API version: 0x" << std::hex - << module->hal_api_version << std::endl; - } - - int16_t version2_0 = CAMERA_MODULE_API_VERSION_2_0; - ASSERT_LE(version2_0, module->module_api_version) - << "Camera module version is 0x" - << std::hex << module->module_api_version - << ", should be at least 2.0. (0x" - << std::hex << CAMERA_MODULE_API_VERSION_2_0 << ")"; - - sCameraModule = reinterpret_cast<camera_module_t*>(module); - - sNumCameras = sCameraModule->get_number_of_cameras(); - ASSERT_LT(0, sNumCameras) << "No camera devices available!"; - - IF_ALOGV() { - std::cout << " Camera device count: " << sNumCameras << std::endl; - } - - sCameraSupportsHal2 = new bool[sNumCameras]; - - for (int i = 0; i < sNumCameras; i++) { - camera_info info; - res = sCameraModule->get_camera_info(i, &info); - ASSERT_EQ(0, res) - << "Failure getting camera info for camera " << i; - IF_ALOGV() { - std::cout << " Camera device: " << std::dec - << i << std::endl;; - std::cout << " Facing: " << std::dec - << info.facing << std::endl; - std::cout << " Orientation: " << std::dec - << info.orientation << std::endl; - std::cout << " Version: 0x" << std::hex << - info.device_version << std::endl; - } - if (info.device_version >= CAMERA_DEVICE_API_VERSION_2_0 && - info.device_version < CAMERA_DEVICE_API_VERSION_3_0) { - sCameraSupportsHal2[i] = true; - ASSERT_TRUE(NULL != info.static_camera_characteristics); - IF_ALOGV() { - std::cout << " Static camera metadata:" << std::endl; - dump_indented_camera_metadata(info.static_camera_characteristics, - 0, 1, 6); - } - } else { - sCameraSupportsHal2[i] = false; - } - } - } - - void TearDownModule() { - hw_module_t *module = reinterpret_cast<hw_module_t*>(sCameraModule); - ASSERT_EQ(0, HWModuleHelpers::closeModule(module)); - } - - static const camera_module_t *getCameraModule() { - return sCameraModule; - } - - static int getNumCameras() { - return sNumCameras; - } - - static bool isHal2Supported(int id) { - return sCameraSupportsHal2[id]; - } - - static camera2_device_t *openCameraDevice(int id) { - ALOGV("Opening camera %d", id); - if (NULL == sCameraSupportsHal2) return NULL; - if (id >= sNumCameras) return NULL; - if (!sCameraSupportsHal2[id]) return NULL; - - hw_device_t *device = NULL; - const camera_module_t *cam_module = getCameraModule(); - if (cam_module == NULL) { - return NULL; - } - - char camId[10]; - int res; - - snprintf(camId, 10, "%d", id); - res = cam_module->common.methods->open( - (const hw_module_t*)cam_module, - camId, - &device); - if (res != NO_ERROR || device == NULL) { - return NULL; - } - camera2_device_t *cam_device = - reinterpret_cast<camera2_device_t*>(device); - return cam_device; - } - - static status_t configureCameraDevice(camera2_device_t *dev, - MetadataQueue &requestQueue, - MetadataQueue &frameQueue, - NotifierListener &listener) { - - status_t err; - - err = dev->ops->set_request_queue_src_ops(dev, - requestQueue.getToConsumerInterface()); - if (err != OK) return err; - - requestQueue.setFromConsumerInterface(dev); - - err = dev->ops->set_frame_queue_dst_ops(dev, - frameQueue.getToProducerInterface()); - if (err != OK) return err; - - err = listener.getNotificationsFrom(dev); - if (err != OK) return err; - - return OK; - } - - static status_t closeCameraDevice(camera2_device_t **cam_dev) { - int res; - if (*cam_dev == NULL ) return OK; - - ALOGV("Closing camera %p", cam_dev); - - hw_device_t *dev = reinterpret_cast<hw_device_t *>(*cam_dev); - res = dev->close(dev); - *cam_dev = NULL; - return res; - } - - void setUpCamera(int id) { - ASSERT_GT(sNumCameras, id); - status_t res; - - if (mDevice != NULL) { - closeCameraDevice(&mDevice); - } - mId = id; - mDevice = openCameraDevice(mId); - ASSERT_TRUE(NULL != mDevice) << "Failed to open camera device"; - - camera_info info; - res = sCameraModule->get_camera_info(id, &info); - ASSERT_EQ(OK, res); - - mDeviceVersion = info.device_version; - mStaticInfo = info.static_camera_characteristics; - buildOutputResolutions(); - - res = configureCameraDevice(mDevice, - mRequests, - mFrames, - mNotifications); - ASSERT_EQ(OK, res) << "Failure to configure camera device"; - - } - - void setUpStream(sp<IGraphicBufferProducer> consumer, - int width, int height, int format, int *id) { - status_t res; - - StreamAdapter* stream = new StreamAdapter(consumer); - - ALOGV("Creating stream, format 0x%x, %d x %d", format, width, height); - res = stream->connectToDevice(mDevice, width, height, format); - ASSERT_EQ(NO_ERROR, res) << "Failed to connect to stream: " - << strerror(-res); - mStreams.push_back(stream); - - *id = stream->getId(); - } - - void disconnectStream(int id) { - status_t res; - unsigned int i=0; - for (; i < mStreams.size(); i++) { - if (mStreams[i]->getId() == id) { - res = mStreams[i]->disconnect(); - ASSERT_EQ(NO_ERROR, res) << - "Failed to disconnect stream " << id; - break; - } - } - ASSERT_GT(mStreams.size(), i) << "Stream id not found:" << id; - } - - void buildOutputResolutions() { - status_t res; - if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { - return; - } - if (mOutputResolutions.isEmpty()) { - camera_metadata_ro_entry_t availableStrmConfigs; - res = find_camera_metadata_ro_entry(mStaticInfo, - ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, - &availableStrmConfigs); - ASSERT_EQ(OK, res); - ASSERT_EQ(0u, availableStrmConfigs.count % 4); - for (uint32_t i = 0; i < availableStrmConfigs.count; i += 4) { - int32_t format = availableStrmConfigs.data.i32[i]; - int32_t width = availableStrmConfigs.data.i32[i + 1]; - int32_t height = availableStrmConfigs.data.i32[i + 2]; - int32_t inOrOut = availableStrmConfigs.data.i32[i + 3]; - if (inOrOut == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) { - int index = mOutputResolutions.indexOfKey(format); - if (index < 0) { - index = mOutputResolutions.add(format, new Vector<int32_t>()); - ASSERT_TRUE(index >= 0); - } - Vector<int32_t> *resolutions = mOutputResolutions.editValueAt(index); - resolutions->add(width); - resolutions->add(height); - } - } - } - } - - void deleteOutputResolutions() { - for (uint32_t i = 0; i < mOutputResolutions.size(); i++) { - Vector<int32_t>* resolutions = mOutputResolutions.editValueAt(i); - delete resolutions; - } - mOutputResolutions.clear(); - } - - void getResolutionList(int32_t format, - const int32_t **list, - size_t *count) { - status_t res; - ALOGV("Getting resolutions for format %x", format); - if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { - if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { - camera_metadata_ro_entry_t availableFormats; - res = find_camera_metadata_ro_entry(mStaticInfo, - ANDROID_SCALER_AVAILABLE_FORMATS, - &availableFormats); - ASSERT_EQ(OK, res); - - uint32_t formatIdx; - for (formatIdx=0; formatIdx < availableFormats.count; formatIdx++) { - if (availableFormats.data.i32[formatIdx] == format) break; - } - ASSERT_NE(availableFormats.count, formatIdx) - << "No support found for format 0x" << std::hex << format; - } - - camera_metadata_ro_entry_t availableSizes; - if (format == HAL_PIXEL_FORMAT_RAW16) { - res = find_camera_metadata_ro_entry(mStaticInfo, - ANDROID_SCALER_AVAILABLE_RAW_SIZES, - &availableSizes); - } else if (format == HAL_PIXEL_FORMAT_BLOB) { - res = find_camera_metadata_ro_entry(mStaticInfo, - ANDROID_SCALER_AVAILABLE_JPEG_SIZES, - &availableSizes); - } else { - res = find_camera_metadata_ro_entry(mStaticInfo, - ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, - &availableSizes); - } - ASSERT_EQ(OK, res); - - *list = availableSizes.data.i32; - *count = availableSizes.count; - } else { - int index = mOutputResolutions.indexOfKey(format); - ASSERT_TRUE(index >= 0); - Vector<int32_t>* resolutions = mOutputResolutions.valueAt(index); - *list = resolutions->array(); - *count = resolutions->size(); - } - } - - status_t waitUntilDrained() { - static const uint32_t kSleepTime = 50000; // 50 ms - static const uint32_t kMaxSleepTime = 10000000; // 10 s - ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId); - - // TODO: Set up notifications from HAL, instead of sleeping here - uint32_t totalTime = 0; - while (mDevice->ops->get_in_progress_count(mDevice) > 0) { - usleep(kSleepTime); - totalTime += kSleepTime; - if (totalTime > kMaxSleepTime) { - ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__, - mDevice->ops->get_in_progress_count(mDevice), totalTime); - return TIMED_OUT; - } - } - ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId); - return OK; - } - - virtual void SetUp() { - TEST_EXTENSION_FORKING_SET_UP; - - SetUpModule(); - - const ::testing::TestInfo* const testInfo = - ::testing::UnitTest::GetInstance()->current_test_info(); - (void)testInfo; - - ALOGV("*** Starting test %s in test case %s", testInfo->name(), - testInfo->test_case_name()); - mDevice = NULL; - } - - virtual void TearDown() { - TEST_EXTENSION_FORKING_TEAR_DOWN; - - for (unsigned int i = 0; i < mStreams.size(); i++) { - delete mStreams[i]; - } - if (mDevice != NULL) { - closeCameraDevice(&mDevice); - } - - deleteOutputResolutions(); - TearDownModule(); - } - - int mId; - camera2_device *mDevice; - uint32_t mDeviceVersion; - const camera_metadata_t *mStaticInfo; - - MetadataQueue mRequests; - MetadataQueue mFrames; - NotifierListener mNotifications; - - Vector<StreamAdapter*> mStreams; - KeyedVector<int32_t, Vector<int32_t>* > mOutputResolutions; - - private: - static camera_module_t *sCameraModule; - static int sNumCameras; - static bool *sCameraSupportsHal2; - -}; - -camera_module_t *Camera2Test::sCameraModule = NULL; -bool *Camera2Test::sCameraSupportsHal2 = NULL; -int Camera2Test::sNumCameras = 0; - -static const nsecs_t USEC = 1000; -static const nsecs_t MSEC = 1000*USEC; -static const nsecs_t SEC = 1000*MSEC; - - -TEST_F(Camera2Test, OpenClose) { - - TEST_EXTENSION_FORKING_INIT; - - status_t res; - - for (int id = 0; id < getNumCameras(); id++) { - if (!isHal2Supported(id)) continue; - - camera2_device_t *d = openCameraDevice(id); - ASSERT_TRUE(NULL != d) << "Failed to open camera device"; - - res = closeCameraDevice(&d); - ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; - } -} - -TEST_F(Camera2Test, Capture1Raw) { - - TEST_EXTENSION_FORKING_INIT; - - status_t res; - - for (int id = 0; id < getNumCameras(); id++) { - if (!isHal2Supported(id)) continue; - - ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); - - sp<IGraphicBufferProducer> bqProducer; - sp<IGraphicBufferConsumer> bqConsumer; - BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); - sp<CpuConsumer> rawConsumer = new CpuConsumer(bqConsumer, 1); - sp<FrameWaiter> rawWaiter = new FrameWaiter(); - rawConsumer->setFrameAvailableListener(rawWaiter); - - const int32_t *rawResolutions; - size_t rawResolutionsCount; - - int format = HAL_PIXEL_FORMAT_RAW16; - - getResolutionList(format, - &rawResolutions, &rawResolutionsCount); - - if (rawResolutionsCount <= 0) { - const ::testing::TestInfo* const test_info = - ::testing::UnitTest::GetInstance()->current_test_info(); - std::cerr << "Skipping test " - << test_info->test_case_name() << "." - << test_info->name() - << " because the optional format was not available: " - << "RAW16" << std::endl; - return; - } - - ASSERT_LT((size_t)0, rawResolutionsCount); - - // Pick first available raw resolution - int width = rawResolutions[0]; - int height = rawResolutions[1]; - - int streamId; - ASSERT_NO_FATAL_FAILURE( - setUpStream(bqProducer, width, height, format, &streamId) ); - - camera_metadata_t *request; - request = allocate_camera_metadata(20, 2000); - - uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; - add_camera_metadata_entry(request, - ANDROID_REQUEST_METADATA_MODE, - (void**)&metadataMode, 1); - uint32_t outputStreams = streamId; - add_camera_metadata_entry(request, - ANDROID_REQUEST_OUTPUT_STREAMS, - (void**)&outputStreams, 1); - - uint64_t exposureTime = 10*MSEC; - add_camera_metadata_entry(request, - ANDROID_SENSOR_EXPOSURE_TIME, - (void**)&exposureTime, 1); - uint64_t frameDuration = 30*MSEC; - add_camera_metadata_entry(request, - ANDROID_SENSOR_FRAME_DURATION, - (void**)&frameDuration, 1); - uint32_t sensitivity = 100; - add_camera_metadata_entry(request, - ANDROID_SENSOR_SENSITIVITY, - (void**)&sensitivity, 1); - uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; - add_camera_metadata_entry(request, - ANDROID_REQUEST_TYPE, - (void**)&requestType, 1); - - uint32_t hourOfDay = 12; - add_camera_metadata_entry(request, - 0x80000000, // EMULATOR_HOUROFDAY - &hourOfDay, 1); - - IF_ALOGV() { - std::cout << "Input request: " << std::endl; - dump_indented_camera_metadata(request, 0, 1, 2); - } - - res = mRequests.enqueue(request); - ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res); - - res = mFrames.waitForBuffer(exposureTime + SEC); - ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); - - camera_metadata_t *frame; - res = mFrames.dequeue(&frame); - ASSERT_EQ(NO_ERROR, res); - ASSERT_TRUE(frame != NULL); - - IF_ALOGV() { - std::cout << "Output frame:" << std::endl; - dump_indented_camera_metadata(frame, 0, 1, 2); - } - - res = rawWaiter->waitForFrame(exposureTime + SEC); - ASSERT_EQ(NO_ERROR, res); - - CpuConsumer::LockedBuffer buffer; - res = rawConsumer->lockNextBuffer(&buffer); - ASSERT_EQ(NO_ERROR, res); - - IF_ALOGV() { - const char *dumpname = - "/data/local/tmp/camera2_test-capture1raw-dump.raw"; - ALOGV("Dumping raw buffer to %s", dumpname); - // Write to file - std::ofstream rawFile(dumpname); - size_t bpp = 2; - for (unsigned int y = 0; y < buffer.height; y++) { - rawFile.write( - (const char *)(buffer.data + y * buffer.stride * bpp), - buffer.width * bpp); - } - rawFile.close(); - } - - res = rawConsumer->unlockBuffer(buffer); - ASSERT_EQ(NO_ERROR, res); - - ASSERT_EQ(OK, waitUntilDrained()); - ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); - - res = closeCameraDevice(&mDevice); - ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; - - } -} - -TEST_F(Camera2Test, CaptureBurstRaw) { - - TEST_EXTENSION_FORKING_INIT; - - status_t res; - - for (int id = 0; id < getNumCameras(); id++) { - if (!isHal2Supported(id)) continue; - - ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); - - sp<IGraphicBufferProducer> bqProducer; - sp<IGraphicBufferConsumer> bqConsumer; - BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); - sp<CpuConsumer> rawConsumer = new CpuConsumer(bqConsumer, 1); - sp<FrameWaiter> rawWaiter = new FrameWaiter(); - rawConsumer->setFrameAvailableListener(rawWaiter); - - const int32_t *rawResolutions; - size_t rawResolutionsCount; - - int format = HAL_PIXEL_FORMAT_RAW16; - - getResolutionList(format, - &rawResolutions, &rawResolutionsCount); - - if (rawResolutionsCount <= 0) { - const ::testing::TestInfo* const test_info = - ::testing::UnitTest::GetInstance()->current_test_info(); - std::cerr << "Skipping test " - << test_info->test_case_name() << "." - << test_info->name() - << " because the optional format was not available: " - << "RAW16" << std::endl; - return; - } - - ASSERT_LT((uint32_t)0, rawResolutionsCount); - - // Pick first available raw resolution - int width = rawResolutions[0]; - int height = rawResolutions[1]; - - int streamId; - ASSERT_NO_FATAL_FAILURE( - setUpStream(bqProducer, width, height, format, &streamId) ); - - camera_metadata_t *request; - request = allocate_camera_metadata(20, 2000); - - uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; - add_camera_metadata_entry(request, - ANDROID_REQUEST_METADATA_MODE, - (void**)&metadataMode, 1); - uint32_t outputStreams = streamId; - add_camera_metadata_entry(request, - ANDROID_REQUEST_OUTPUT_STREAMS, - (void**)&outputStreams, 1); - - uint64_t frameDuration = 30*MSEC; - add_camera_metadata_entry(request, - ANDROID_SENSOR_FRAME_DURATION, - (void**)&frameDuration, 1); - uint32_t sensitivity = 100; - add_camera_metadata_entry(request, - ANDROID_SENSOR_SENSITIVITY, - (void**)&sensitivity, 1); - uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; - add_camera_metadata_entry(request, - ANDROID_REQUEST_TYPE, - (void**)&requestType, 1); - - uint32_t hourOfDay = 12; - add_camera_metadata_entry(request, - 0x80000000, // EMULATOR_HOUROFDAY - &hourOfDay, 1); - - IF_ALOGV() { - std::cout << "Input request template: " << std::endl; - dump_indented_camera_metadata(request, 0, 1, 2); - } - - int numCaptures = 10; - - // Enqueue numCaptures requests with increasing exposure time - - uint64_t exposureTime = 100 * USEC; - for (int reqCount = 0; reqCount < numCaptures; reqCount++ ) { - camera_metadata_t *req; - req = allocate_camera_metadata(20, 2000); - append_camera_metadata(req, request); - - add_camera_metadata_entry(req, - ANDROID_SENSOR_EXPOSURE_TIME, - (void**)&exposureTime, 1); - exposureTime *= 2; - - res = mRequests.enqueue(req); - ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " - << strerror(-res); - } - - // Get frames and image buffers one by one - uint64_t expectedExposureTime = 100 * USEC; - for (int frameCount = 0; frameCount < 10; frameCount++) { - res = mFrames.waitForBuffer(SEC + expectedExposureTime); - ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); - - camera_metadata_t *frame; - res = mFrames.dequeue(&frame); - ASSERT_EQ(NO_ERROR, res); - ASSERT_TRUE(frame != NULL); - - camera_metadata_entry_t frameNumber; - res = find_camera_metadata_entry(frame, - ANDROID_REQUEST_FRAME_COUNT, - &frameNumber); - ASSERT_EQ(NO_ERROR, res); - ASSERT_EQ(frameCount, *frameNumber.data.i32); - - res = rawWaiter->waitForFrame(SEC + expectedExposureTime); - ASSERT_EQ(NO_ERROR, res) << - "Never got raw data for capture " << frameCount; - - CpuConsumer::LockedBuffer buffer; - res = rawConsumer->lockNextBuffer(&buffer); - ASSERT_EQ(NO_ERROR, res); - - IF_ALOGV() { - char dumpname[60]; - snprintf(dumpname, 60, - "/data/local/tmp/camera2_test-" - "captureBurstRaw-dump_%d.raw", - frameCount); - ALOGV("Dumping raw buffer to %s", dumpname); - // Write to file - std::ofstream rawFile(dumpname); - for (unsigned int y = 0; y < buffer.height; y++) { - rawFile.write( - (const char *)(buffer.data + y * buffer.stride * 2), - buffer.width * 2); - } - rawFile.close(); - } - - res = rawConsumer->unlockBuffer(buffer); - ASSERT_EQ(NO_ERROR, res); - - expectedExposureTime *= 2; - } - } -} - -TEST_F(Camera2Test, ConstructDefaultRequests) { - - TEST_EXTENSION_FORKING_INIT; - - status_t res; - - for (int id = 0; id < getNumCameras(); id++) { - if (!isHal2Supported(id)) continue; - - ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); - - for (int i = CAMERA2_TEMPLATE_PREVIEW; i < CAMERA2_TEMPLATE_COUNT; - i++) { - camera_metadata_t *request = NULL; - res = mDevice->ops->construct_default_request(mDevice, - i, - &request); - EXPECT_EQ(NO_ERROR, res) << - "Unable to construct request from template type " << i; - EXPECT_TRUE(request != NULL); - EXPECT_LT((size_t)0, get_camera_metadata_entry_count(request)); - EXPECT_LT((size_t)0, get_camera_metadata_data_count(request)); - - IF_ALOGV() { - std::cout << " ** Template type " << i << ":"<<std::endl; - dump_indented_camera_metadata(request, 0, 2, 4); - } - - free_camera_metadata(request); - } - } -} - -TEST_F(Camera2Test, Capture1Jpeg) { - status_t res; - - for (int id = 0; id < getNumCameras(); id++) { - if (!isHal2Supported(id)) continue; - - ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); - - sp<IGraphicBufferProducer> bqProducer; - sp<IGraphicBufferConsumer> bqConsumer; - BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); - sp<CpuConsumer> jpegConsumer = new CpuConsumer(bqConsumer, 1); - sp<FrameWaiter> jpegWaiter = new FrameWaiter(); - jpegConsumer->setFrameAvailableListener(jpegWaiter); - - const int32_t *jpegResolutions; - size_t jpegResolutionsCount; - - int format = HAL_PIXEL_FORMAT_BLOB; - - getResolutionList(format, - &jpegResolutions, &jpegResolutionsCount); - ASSERT_LT((size_t)0, jpegResolutionsCount); - - // Pick first available JPEG resolution - int width = jpegResolutions[0]; - int height = jpegResolutions[1]; - - int streamId; - ASSERT_NO_FATAL_FAILURE( - setUpStream(bqProducer, width, height, format, &streamId) ); - - camera_metadata_t *request; - request = allocate_camera_metadata(20, 2000); - - uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; - add_camera_metadata_entry(request, - ANDROID_REQUEST_METADATA_MODE, - (void**)&metadataMode, 1); - uint32_t outputStreams = streamId; - add_camera_metadata_entry(request, - ANDROID_REQUEST_OUTPUT_STREAMS, - (void**)&outputStreams, 1); - - uint64_t exposureTime = 10*MSEC; - add_camera_metadata_entry(request, - ANDROID_SENSOR_EXPOSURE_TIME, - (void**)&exposureTime, 1); - uint64_t frameDuration = 30*MSEC; - add_camera_metadata_entry(request, - ANDROID_SENSOR_FRAME_DURATION, - (void**)&frameDuration, 1); - uint32_t sensitivity = 100; - add_camera_metadata_entry(request, - ANDROID_SENSOR_SENSITIVITY, - (void**)&sensitivity, 1); - uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; - add_camera_metadata_entry(request, - ANDROID_REQUEST_TYPE, - (void**)&requestType, 1); - - uint32_t hourOfDay = 12; - add_camera_metadata_entry(request, - 0x80000000, // EMULATOR_HOUROFDAY - &hourOfDay, 1); - - IF_ALOGV() { - std::cout << "Input request: " << std::endl; - dump_indented_camera_metadata(request, 0, 1, 4); - } - - res = mRequests.enqueue(request); - ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res); - - res = mFrames.waitForBuffer(exposureTime + SEC); - ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); - - camera_metadata_t *frame; - res = mFrames.dequeue(&frame); - ASSERT_EQ(NO_ERROR, res); - ASSERT_TRUE(frame != NULL); - - IF_ALOGV() { - std::cout << "Output frame:" << std::endl; - dump_indented_camera_metadata(frame, 0, 1, 4); - } - - res = jpegWaiter->waitForFrame(exposureTime + SEC); - ASSERT_EQ(NO_ERROR, res); - - CpuConsumer::LockedBuffer buffer; - res = jpegConsumer->lockNextBuffer(&buffer); - ASSERT_EQ(NO_ERROR, res); - - IF_ALOGV() { - const char *dumpname = - "/data/local/tmp/camera2_test-capture1jpeg-dump.jpeg"; - ALOGV("Dumping raw buffer to %s", dumpname); - // Write to file - std::ofstream jpegFile(dumpname); - size_t bpp = 1; - for (unsigned int y = 0; y < buffer.height; y++) { - jpegFile.write( - (const char *)(buffer.data + y * buffer.stride * bpp), - buffer.width * bpp); - } - jpegFile.close(); - } - - res = jpegConsumer->unlockBuffer(buffer); - ASSERT_EQ(NO_ERROR, res); - - ASSERT_EQ(OK, waitUntilDrained()); - ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); - - res = closeCameraDevice(&mDevice); - ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; - - } -} - -} // namespace tests -} // namespace camera2 -} // namespace android |