diff options
-rw-r--r-- | modules/camera/Camera.cpp | 40 | ||||
-rw-r--r-- | modules/camera/Camera.h | 2 | ||||
-rw-r--r-- | modules/camera/Metadata.cpp | 80 | ||||
-rw-r--r-- | modules/camera/Metadata.h | 4 | ||||
-rw-r--r-- | modules/camera/Stream.cpp | 8 | ||||
-rw-r--r-- | modules/camera/Stream.h | 2 | ||||
-rw-r--r-- | tests/camera2/CameraBurstTests.cpp | 10 | ||||
-rw-r--r-- | tests/camera2/CameraFrameTests.cpp | 5 | ||||
-rw-r--r-- | tests/camera2/CameraMetadataTests.cpp | 28 | ||||
-rw-r--r-- | tests/camera2/CameraModuleFixture.h | 51 | ||||
-rw-r--r-- | tests/camera2/CameraModuleTests.cpp | 15 | ||||
-rw-r--r-- | tests/camera2/CameraStreamFixture.h | 39 | ||||
-rw-r--r-- | tests/camera2/CameraStreamTests.cpp | 5 | ||||
-rw-r--r-- | tests/camera2/camera2.cpp | 20 |
14 files changed, 242 insertions, 67 deletions
diff --git a/modules/camera/Camera.cpp b/modules/camera/Camera.cpp index 3bafdf4..137c5f6 100644 --- a/modules/camera/Camera.cpp +++ b/modules/camera/Camera.cpp @@ -135,6 +135,29 @@ int Camera::initialize(const camera3_callback_ops_t *callback_ops) { ALOGV("%s:%d: callback_ops=%p", __func__, mId, callback_ops); mCallbackOps = callback_ops; + // Create standard settings templates + // 0 is invalid as template + mTemplates[0] = NULL; + // CAMERA3_TEMPLATE_PREVIEW = 1 + mTemplates[1] = new Metadata(ANDROID_CONTROL_MODE_OFF, + ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW); + // CAMERA3_TEMPLATE_STILL_CAPTURE = 2 + mTemplates[2] = new Metadata(ANDROID_CONTROL_MODE_OFF, + ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE); + // CAMERA3_TEMPLATE_VIDEO_RECORD = 3 + mTemplates[3] = new Metadata(ANDROID_CONTROL_MODE_OFF, + ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD); + // CAMERA3_TEMPLATE_VIDEO_SNAPSHOT = 4 + mTemplates[4] = new Metadata(ANDROID_CONTROL_MODE_OFF, + ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); + // CAMERA3_TEMPLATE_STILL_ZERO_SHUTTER_LAG = 5 + mTemplates[5] = new Metadata(ANDROID_CONTROL_MODE_OFF, + ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG); + // Pre-generate metadata structures + for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; i++) { + mTemplates[i]->generate(); + } + // TODO: create vendor templates return 0; } @@ -303,10 +326,13 @@ int Camera::configureStreams(camera3_stream_configuration_t *stream_config) // Fill new stream array with reused streams and new streams for (unsigned int i = 0; i < stream_config->num_streams; i++) { astream = stream_config->streams[i]; - if (astream->max_buffers > 0) + if (astream->max_buffers > 0) { + ALOGV("%s:%d: Reusing stream %d", __func__, mId, i); newStreams[i] = reuseStream(astream); - else + } else { + ALOGV("%s:%d: Creating new stream %d", __func__, mId, i); newStreams[i] = new Stream(mId, astream); + } if (newStreams[i] == NULL) { ALOGE("%s:%d: Error processing stream %d", __func__, mId, i); @@ -388,6 +414,8 @@ bool Camera::isValidStreamSet(Stream **streams, int count) if (streams[i]->isOutputType()) outputs++; } + ALOGV("%s:%d: Configuring %d output streams and %d input streams", + __func__, mId, outputs, inputs); if (outputs < 1) { ALOGE("%s:%d: Stream config must have >= 1 output", __func__, mId); return false; @@ -445,8 +473,12 @@ int Camera::registerStreamBuffers(const camera3_stream_buffer_set_t *buf_set) const camera_metadata_t* Camera::constructDefaultRequestSettings(int type) { ALOGV("%s:%d: type=%d", __func__, mId, type); - // TODO: return statically built default request - return NULL; + + if (type < 1 || type >= CAMERA3_TEMPLATE_COUNT) { + ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type); + return NULL; + } + return mTemplates[type]->generate(); } int Camera::processCaptureRequest(camera3_capture_request_t *request) diff --git a/modules/camera/Camera.h b/modules/camera/Camera.h index e97dfd0..c7ee52d 100644 --- a/modules/camera/Camera.h +++ b/modules/camera/Camera.h @@ -91,6 +91,8 @@ class Camera { Stream **mStreams; // Number of streams in mStreams int mNumStreams; + // Static array of standard camera settings templates + Metadata *mTemplates[CAMERA3_TEMPLATE_COUNT]; // Most recent request settings seen, memoized to be reused camera_metadata_t *mSettings; }; diff --git a/modules/camera/Metadata.cpp b/modules/camera/Metadata.cpp index 77f5405..362a087 100644 --- a/modules/camera/Metadata.cpp +++ b/modules/camera/Metadata.cpp @@ -33,7 +33,9 @@ Metadata::Metadata() : mHead(NULL), mTail(NULL), mEntryCount(0), - mDataCount(0) + mDataCount(0), + mGenerated(NULL), + mDirty(true) { // NULL (default) pthread mutex attributes pthread_mutex_init(&mMutex, NULL); @@ -41,6 +43,37 @@ Metadata::Metadata() Metadata::~Metadata() { + if (mGenerated != NULL) + free_camera_metadata(mGenerated); +} + +Metadata::Metadata(uint8_t mode, uint8_t intent) + : mHead(NULL), + mTail(NULL), + mEntryCount(0), + mDataCount(0), + mGenerated(NULL), + mDirty(true) +{ + pthread_mutex_init(&mMutex, NULL); + + if (validate(ANDROID_CONTROL_MODE, TYPE_BYTE, 1)) { + int res = add(ANDROID_CONTROL_MODE, 1, &mode); + if (res != 0) { + ALOGE("%s: Unable to add mode to template!", __func__); + } + } else { + ALOGE("%s: Invalid mode constructing template!", __func__); + } + + if (validate(ANDROID_CONTROL_CAPTURE_INTENT, TYPE_BYTE, 1)) { + int res = add(ANDROID_CONTROL_CAPTURE_INTENT, 1, &intent); + if (res != 0) { + ALOGE("%s: Unable to add capture intent to template!", __func__); + } + } else { + ALOGE("%s: Invalid capture intent constructing template!", __func__); + } } int Metadata::addUInt8(uint32_t tag, int count, uint8_t *data) @@ -113,33 +146,54 @@ int Metadata::add(uint32_t tag, int count, void *tag_data) return -ENOMEM; memcpy(data, tag_data, count * type_sz); + pthread_mutex_lock(&mMutex); mEntryCount++; mDataCount += calculate_camera_metadata_entry_data_size(tag_type, count); push(new Entry(tag, data, count)); + mDirty = true; + pthread_mutex_unlock(&mMutex); return 0; } camera_metadata_t* Metadata::generate() { - Entry *current = mHead; + Entry *current; pthread_mutex_lock(&mMutex); + // Reuse if old generated metadata still valid + if (!mDirty && mGenerated != NULL) { + ALOGV("%s: Reusing generated metadata at %p", __func__, mGenerated); + goto out; + } + // Destroy old metadata + if (mGenerated != NULL) { + ALOGV("%s: Freeing generated metadata at %p", __func__, mGenerated); + free_camera_metadata(mGenerated); + mGenerated = NULL; + } + // Generate new metadata structure + ALOGV("%s: Generating new camera metadata structure, Entries:%d Data:%d", + __func__, mEntryCount, mDataCount); + mGenerated = allocate_camera_metadata(mEntryCount, mDataCount); if (mGenerated == NULL) { - ALOGV("Generating new camera metadata structure"); - mGenerated = allocate_camera_metadata(mEntryCount, mDataCount); - if (mGenerated == NULL) { - ALOGE("%s: Failed to allocate metadata (%d entries %d data)", - __func__, mEntryCount, mDataCount); - } + ALOGE("%s: Failed to allocate metadata (%d entries %d data)", + __func__, mEntryCount, mDataCount); + goto out; } // Walk list of entries adding each one to newly allocated metadata - while (current != NULL) { - add_camera_metadata_entry(mGenerated, current->mTag, current->mData, - current->mCount); - current = current->mNext; + for (current = mHead; current != NULL; current = current->mNext) { + int res = add_camera_metadata_entry(mGenerated, current->mTag, + current->mData, current->mCount); + if (res != 0) { + ALOGE("%s: Failed to add camera metadata: %d", __func__, res); + free_camera_metadata(mGenerated); + mGenerated = NULL; + goto out; + } } - pthread_mutex_unlock(&mMutex); +out: + pthread_mutex_unlock(&mMutex); return mGenerated; } diff --git a/modules/camera/Metadata.h b/modules/camera/Metadata.h index d5aac36..22d2f22 100644 --- a/modules/camera/Metadata.h +++ b/modules/camera/Metadata.h @@ -28,6 +28,8 @@ class Metadata { public: Metadata(); ~Metadata(); + // Constructor used for request metadata templates + Metadata(uint8_t mode, uint8_t intent); // Parse and add an entry int addUInt8(uint32_t tag, int count, uint8_t *data); @@ -67,6 +69,8 @@ class Metadata { int mDataCount; // Save generated metadata, invalidated on update camera_metadata_t *mGenerated; + // Flag to force metadata regeneration + bool mDirty; // Lock protecting the Metadata object for modifications pthread_mutex_t mMutex; }; diff --git a/modules/camera/Stream.cpp b/modules/camera/Stream.cpp index 0834aee..aae7adb 100644 --- a/modules/camera/Stream.cpp +++ b/modules/camera/Stream.cpp @@ -61,6 +61,7 @@ void Stream::setUsage(uint32_t usage) pthread_mutex_lock(&mMutex); if (usage != mUsage) { mUsage = usage; + mStream->usage = usage; unregisterBuffers_L(); } pthread_mutex_unlock(&mMutex); @@ -71,6 +72,7 @@ void Stream::setMaxBuffers(uint32_t max_buffers) pthread_mutex_lock(&mMutex); if (max_buffers != mMaxBuffers) { mMaxBuffers = max_buffers; + mStream->max_buffers = max_buffers; unregisterBuffers_L(); } pthread_mutex_unlock(&mMutex); @@ -83,12 +85,14 @@ int Stream::getType() bool Stream::isInputType() { - return mType & (CAMERA3_STREAM_INPUT | CAMERA3_STREAM_BIDIRECTIONAL); + return mType == CAMERA3_STREAM_INPUT || + mType == CAMERA3_STREAM_BIDIRECTIONAL; } bool Stream::isOutputType() { - return mType & (CAMERA3_STREAM_OUTPUT | CAMERA3_STREAM_BIDIRECTIONAL); + return mType == CAMERA3_STREAM_OUTPUT || + mType == CAMERA3_STREAM_BIDIRECTIONAL; } bool Stream::isRegistered() diff --git a/modules/camera/Stream.h b/modules/camera/Stream.h index 521362e..34abd95 100644 --- a/modules/camera/Stream.h +++ b/modules/camera/Stream.h @@ -52,7 +52,7 @@ class Stream { // The camera device id this stream belongs to const int mId; // Handle to framework's stream, used as a cookie for buffers - const camera3_stream_t *mStream; + camera3_stream_t *mStream; // Stream type: CAMERA3_STREAM_* (see <hardware/camera3.h>) const int mType; // Width in pixels of the buffers in this stream diff --git a/tests/camera2/CameraBurstTests.cpp b/tests/camera2/CameraBurstTests.cpp index e39970c..5c4b6e7 100644 --- a/tests/camera2/CameraBurstTests.cpp +++ b/tests/camera2/CameraBurstTests.cpp @@ -34,7 +34,7 @@ #define CAMERA_EXPOSURE_DOUBLE 2 #define CAMERA_EXPOSURE_DOUBLING_THRESHOLD 1.0f #define CAMERA_EXPOSURE_DOUBLING_COUNT 4 -#define CAMERA_EXPOSURE_FORMAT HAL_PIXEL_FORMAT_YCrCb_420_SP +#define CAMERA_EXPOSURE_FORMAT CAMERA_STREAM_AUTO_CPU_FORMAT #define CAMERA_EXPOSURE_STARTING 100000 // 1/10ms, up to 51.2ms with 10 steps #if CAMERA_BURST_DEBUGGING @@ -86,7 +86,7 @@ public: TEST_EXTENSION_FORKING_TEAR_DOWN; } - /* this assumes the format is YUV420sp */ + /* this assumes the format is YUV420sp or flexible YUV */ long long TotalBrightness(const CpuConsumer::LockedBuffer& imgBuffer, int *underexposed, int *overexposed) const { @@ -170,6 +170,11 @@ TEST_F(CameraBurstTest, ManualExposureControl) { uint8_t cmOff = static_cast<uint8_t>(ANDROID_CONTROL_MODE_OFF); ASSERT_EQ(OK, previewRequest.update(ANDROID_CONTROL_MODE, &cmOff, 1)); + + int requestId = 1; + ASSERT_EQ(OK, previewRequest.update(ANDROID_REQUEST_ID, + &requestId, 1)); + if (CAMERA_BURST_DEBUGGING) { int frameCount = 0; ASSERT_EQ(OK, previewRequest.update(ANDROID_REQUEST_FRAME_COUNT, @@ -255,4 +260,3 @@ TEST_F(CameraBurstTest, ManualExposureControl) { } } } - diff --git a/tests/camera2/CameraFrameTests.cpp b/tests/camera2/CameraFrameTests.cpp index 2b5b546..8445098 100644 --- a/tests/camera2/CameraFrameTests.cpp +++ b/tests/camera2/CameraFrameTests.cpp @@ -23,7 +23,7 @@ #include "hardware/hardware.h" #include "hardware/camera2.h" -#include "Camera2Device.h" +#include "CameraDeviceBase.h" #include "utils/StrongPointer.h" #include <gui/CpuConsumer.h> @@ -46,7 +46,7 @@ namespace camera2 { namespace tests { static CameraStreamParams STREAM_PARAMETERS = { - /*mFormat*/ HAL_PIXEL_FORMAT_YCrCb_420_SP, + /*mFormat*/ CAMERA_STREAM_AUTO_CPU_FORMAT, /*mHeapCount*/ CAMERA_HEAP_COUNT }; @@ -139,4 +139,3 @@ INSTANTIATE_TEST_CASE_P(FrameParameterCombinations, CameraFrameTest, } } } - diff --git a/tests/camera2/CameraMetadataTests.cpp b/tests/camera2/CameraMetadataTests.cpp index 8cae619..66c4847 100644 --- a/tests/camera2/CameraMetadataTests.cpp +++ b/tests/camera2/CameraMetadataTests.cpp @@ -25,7 +25,7 @@ #include "hardware/hardware.h" #include "hardware/camera2.h" -#include "Camera2Device.h" +#include "CameraDeviceBase.h" #include "utils/StrongPointer.h" #include <gui/CpuConsumer.h> @@ -142,13 +142,25 @@ TEST_F(CameraMetadataTest, RequiredFormats) { HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, HAL_PIXEL_FORMAT_BLOB)); // JPEG - EXPECT_TRUE( - HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, - HAL_PIXEL_FORMAT_YCrCb_420_SP)); // NV21 + if (getDeviceVersion() < CAMERA_DEVICE_API_VERSION_3_0) { + // HAL2 can support either flexible YUV or YV12 + NV21 + if (!HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, + HAL_PIXEL_FORMAT_YCbCr_420_888)) { + + EXPECT_TRUE( + HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, + HAL_PIXEL_FORMAT_YCrCb_420_SP)); // NV21 + + EXPECT_TRUE( + HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, + HAL_PIXEL_FORMAT_YV12)); + } + } else { + // HAL3 must support flexible YUV + EXPECT_TRUE(HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, + HAL_PIXEL_FORMAT_YCbCr_420_888)); + } - EXPECT_TRUE( - HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, - HAL_PIXEL_FORMAT_YV12)); } TEST_F(CameraMetadataTest, SaneResolutions) { @@ -156,7 +168,7 @@ TEST_F(CameraMetadataTest, SaneResolutions) { // Iff there are listed raw resolutions, the format should be available int rawResolutionsCount = - GetEntryCountFromStaticTag(HAL_PIXEL_FORMAT_RAW_SENSOR); + GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_RAW_SIZES); EXPECT_EQ(rawResolutionsCount > 0, HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS, HAL_PIXEL_FORMAT_RAW_SENSOR)); diff --git a/tests/camera2/CameraModuleFixture.h b/tests/camera2/CameraModuleFixture.h index 01e1ad0..ef4a9a5 100644 --- a/tests/camera2/CameraModuleFixture.h +++ b/tests/camera2/CameraModuleFixture.h @@ -23,6 +23,7 @@ #include "hardware/camera2.h" #include "Camera2Device.h" +#include "Camera3Device.h" #include "camera2_utils.h" #include "TestExtensions.h" @@ -82,6 +83,42 @@ struct CameraModuleFixture { } } + void CreateCamera(int cameraID, /*out*/ sp<CameraDeviceBase> *device) { + struct camera_info info; + ASSERT_EQ(OK, mModule->get_camera_info(cameraID, &info)); + + ASSERT_GE((int)info.device_version, CAMERA_DEVICE_API_VERSION_2_0) << + "Device version too old for camera " << cameraID << ". Version: " << + info.device_version; + switch(info.device_version) { + case CAMERA_DEVICE_API_VERSION_2_0: + case CAMERA_DEVICE_API_VERSION_2_1: + *device = new Camera2Device(cameraID); + break; + case CAMERA_DEVICE_API_VERSION_3_0: + *device = new Camera3Device(cameraID); + break; + default: + device->clear(); + FAIL() << "Device version unknown for camera " << cameraID << ". Version: " << + info.device_version; + } + + } + + int getDeviceVersion() { + return getDeviceVersion(mCameraID); + } + + int getDeviceVersion(int cameraId, status_t* status = NULL) { + camera_info info; + status_t res; + res = mModule->get_camera_info(cameraId, &info); + if (status != NULL) *status = res; + + return info.device_version; + } + private: void SetUpMixin() { @@ -90,14 +127,12 @@ private: EXPECT_LE(0, mCameraID); EXPECT_LT(mCameraID, mNumberOfCameras); - /* HALBUG (Exynos5); crashes if trying to initialize - before calling get_camera_info */ - if (InfoQuirk) { - struct camera_info info; - ASSERT_EQ(OK, mModule->get_camera_info(mCameraID, &info)); - } + /* HALBUG (Exynos5); crashes if we skip calling get_camera_info + before initializing. Need info anyway now. */ + + CreateCamera(mCameraID, &mDevice); - mDevice = new Camera2Device(mCameraID); + ASSERT_TRUE(mDevice != NULL) << "Failed to open device " << mCameraID; ASSERT_EQ(OK, mDevice->initialize(mModule)) << "Failed to initialize device " << mCameraID; } @@ -110,7 +145,7 @@ private: protected: int mNumberOfCameras; camera_module_t *mModule; - sp<Camera2Device> mDevice; + sp<CameraDeviceBase> mDevice; private: int mCameraID; diff --git a/tests/camera2/CameraModuleTests.cpp b/tests/camera2/CameraModuleTests.cpp index fc6fd36..44d3e3b 100644 --- a/tests/camera2/CameraModuleTests.cpp +++ b/tests/camera2/CameraModuleTests.cpp @@ -23,7 +23,7 @@ #include "hardware/hardware.h" #include "hardware/camera2.h" -#include "Camera2Device.h" +#include "CameraDeviceBase.h" #include "utils/StrongPointer.h" #include "CameraModuleFixture.h" @@ -54,13 +54,6 @@ public: return stat; } - int getDeviceVersion(int cameraId, status_t* status) { - camera_info info; - *status = mModule->get_camera_info(cameraId, &info); - - return info.device_version; - } - bool isDeviceVersionHal2(int cameraId, status_t* status) { return getDeviceVersion(cameraId, status) >= CAMERA_DEVICE_API_VERSION_2_0; @@ -72,8 +65,7 @@ TEST_F(CameraModuleTest, LoadModule) { TEST_EXTENSION_FORKING_INIT; for (int i = 0; i < mNumberOfCameras; ++i) { - mDevice = new Camera2Device(i); - + CreateCamera(i, &mDevice); ASSERT_EQ(OK, initializeDevice(i)) << "Failed to initialize device " << i; mDevice.clear(); @@ -88,6 +80,8 @@ TEST_F(CameraModuleTest, LoadModuleBadIndices) { int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 }; for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { + // Since the initialization should fail at device open(), it doesn't + // matter which version of CameraNDevice is used here mDevice = new Camera2Device(idx[i]); status_t deviceInitializeCode = initializeDevice(idx[i]); EXPECT_NE(OK, deviceInitializeCode); @@ -136,4 +130,3 @@ TEST_F(CameraModuleTest, GetCameraInfoBadIndices) { } } } - diff --git a/tests/camera2/CameraStreamFixture.h b/tests/camera2/CameraStreamFixture.h index c5db7ef..a4dc4a8 100644 --- a/tests/camera2/CameraStreamFixture.h +++ b/tests/camera2/CameraStreamFixture.h @@ -24,6 +24,7 @@ #include <gui/Surface.h> #include <utils/Condition.h> #include <utils/Mutex.h> +#include <system/camera_metadata.h> #include "CameraModuleFixture.h" #include "TestExtensions.h" @@ -32,14 +33,33 @@ namespace android { namespace camera2 { namespace tests { +// Format specifier for picking the best format for CPU reading the given device +// version +#define CAMERA_STREAM_AUTO_CPU_FORMAT (-1) + +struct CameraStreamParams; + +void PrintTo(const CameraStreamParams& p, ::std::ostream* os); + struct CameraStreamParams { int mFormat; int mHeapCount; + }; +inline ::std::ostream& operator<<(::std::ostream& os, const CameraStreamParams &p) { + PrintTo(p, &os); + return os; +} + inline void PrintTo(const CameraStreamParams& p, ::std::ostream* os) { + char fmt[100]; + camera_metadata_enum_snprint( + ANDROID_SCALER_AVAILABLE_FORMATS, p.mFormat, fmt, sizeof(fmt)); + *os << "{ "; *os << "Format: 0x" << std::hex << p.mFormat << ", "; + *os << "Format name: " << fmt << ", "; *os << "HeapCount: " << p.mHeapCount; *os << " }"; } @@ -71,7 +91,7 @@ private: CameraModuleFixture::SetUp(); CameraStreamParams p = mParam; - sp<Camera2Device> device = mDevice; + sp<CameraDeviceBase> device = mDevice; /* use an arbitrary w,h */ { @@ -136,7 +156,7 @@ protected: }; void CreateStream() { - sp<Camera2Device> device = mDevice; + sp<CameraDeviceBase> device = mDevice; CameraStreamParams p = mParam; mCpuConsumer = new CpuConsumer(p.mHeapCount); @@ -145,9 +165,11 @@ protected: mNativeWindow = new Surface( mCpuConsumer->getProducerInterface()); + int format = MapAutoFormat(p.mFormat); + ASSERT_EQ(OK, device->createStream(mNativeWindow, - mWidth, mHeight, p.mFormat, /*size (for jpegs)*/0, + mWidth, mHeight, format, /*size (for jpegs)*/0, &mStreamId)); ASSERT_NE(-1, mStreamId); @@ -161,6 +183,17 @@ protected: ASSERT_EQ(OK, mDevice->deleteStream(mStreamId)); } + int MapAutoFormat(int format) { + if (format == CAMERA_STREAM_AUTO_CPU_FORMAT) { + if (getDeviceVersion() >= CAMERA_DEVICE_API_VERSION_3_0) { + format = HAL_PIXEL_FORMAT_YCbCr_420_888; + } else { + format = HAL_PIXEL_FORMAT_YCrCb_420_SP; + } + } + return format; + } + int mWidth; int mHeight; diff --git a/tests/camera2/CameraStreamTests.cpp b/tests/camera2/CameraStreamTests.cpp index 5423a30..164e0e5 100644 --- a/tests/camera2/CameraStreamTests.cpp +++ b/tests/camera2/CameraStreamTests.cpp @@ -93,8 +93,8 @@ TEST_P(CameraStreamTest, CreateStream) { std::cerr << "Skipping test " << test_info->test_case_name() << "." << test_info->name() - << " because the format was not available: 0x" - << std::hex << GetParam().mFormat << std::endl; + << " because the format was not available: " + << GetParam() << std::endl; return; } } @@ -186,4 +186,3 @@ INSTANTIATE_TEST_CASE_P(StreamParameterCombinations, CameraStreamTest, } } } - diff --git a/tests/camera2/camera2.cpp b/tests/camera2/camera2.cpp index 0f75070..92ef221 100644 --- a/tests/camera2/camera2.cpp +++ b/tests/camera2/camera2.cpp @@ -92,7 +92,8 @@ class Camera2Test: public testing::Test { std::cout << " Version: 0x" << std::hex << info.device_version << std::endl; } - if (info.device_version >= CAMERA_DEVICE_API_VERSION_2_0) { + 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() { @@ -181,12 +182,15 @@ class Camera2Test: public testing::Test { return OK; } - static status_t closeCameraDevice(camera2_device_t *cam_dev) { + 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); + hw_device_t *dev = reinterpret_cast<hw_device_t *>(*cam_dev); res = dev->close(dev); + *cam_dev = NULL; return res; } @@ -195,7 +199,7 @@ class Camera2Test: public testing::Test { status_t res; if (mDevice != NULL) { - closeCameraDevice(mDevice); + closeCameraDevice(&mDevice); } mDevice = openCameraDevice(id); ASSERT_TRUE(NULL != mDevice) << "Failed to open camera device"; @@ -324,7 +328,7 @@ class Camera2Test: public testing::Test { delete mStreams[i]; } if (mDevice != NULL) { - closeCameraDevice(mDevice); + closeCameraDevice(&mDevice); } TearDownModule(); @@ -366,7 +370,7 @@ TEST_F(Camera2Test, OpenClose) { camera2_device_t *d = openCameraDevice(id); ASSERT_TRUE(NULL != d) << "Failed to open camera device"; - res = closeCameraDevice(d); + res = closeCameraDevice(&d); ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; } } @@ -499,7 +503,7 @@ TEST_F(Camera2Test, Capture1Raw) { ASSERT_EQ(OK, waitUntilDrained()); ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); - res = closeCameraDevice(mDevice); + res = closeCameraDevice(&mDevice); ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; } @@ -802,7 +806,7 @@ TEST_F(Camera2Test, Capture1Jpeg) { ASSERT_EQ(OK, waitUntilDrained()); ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); - res = closeCameraDevice(mDevice); + res = closeCameraDevice(&mDevice); ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; } |