diff options
Diffstat (limited to 'camera/provider/aidl/vts')
-rw-r--r-- | camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp | 18 | ||||
-rw-r--r-- | camera/provider/aidl/vts/camera_aidl_test.cpp | 39 | ||||
-rw-r--r-- | camera/provider/aidl/vts/camera_aidl_test.h | 3 | ||||
-rw-r--r-- | camera/provider/aidl/vts/device_cb.cpp | 19 |
4 files changed, 48 insertions, 31 deletions
diff --git a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp index 70ab7a02b3..b764ad6299 100644 --- a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp +++ b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp @@ -1846,7 +1846,6 @@ TEST_P(CameraAidlTest, processUltraHighResolutionRequest) { // Generate and verify 10-bit dynamic range request TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { std::vector<std::string> cameraDeviceNames = getCameraDeviceNames(mProvider); - int64_t bufferId = 1; CameraMetadata settings; for (const auto& name : cameraDeviceNames) { @@ -1927,12 +1926,12 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { // Stream as long as needed to fill the Hal inflight queue std::vector<CaptureRequest> requests(halStreams[0].maxBuffers); - for (int32_t frameNumber = 0; frameNumber < requests.size(); frameNumber++) { + for (int32_t requestId = 0; requestId < requests.size(); requestId++) { std::shared_ptr<InFlightRequest> inflightReq = std::make_shared<InFlightRequest>( static_cast<ssize_t>(halStreams.size()), false, supportsPartialResults, partialResultCount, std::unordered_set<std::string>(), resultQueue); - CaptureRequest& request = requests[frameNumber]; + CaptureRequest& request = requests[requestId]; std::vector<StreamBuffer>& outputBuffers = request.outputBuffers; outputBuffers.resize(halStreams.size()); @@ -1941,6 +1940,7 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { std::vector<buffer_handle_t> graphicBuffers; graphicBuffers.reserve(halStreams.size()); + auto bufferId = requestId + 1; // Buffer id value 0 is not valid for (const auto& halStream : halStreams) { buffer_handle_t buffer_handle; if (useHalBufManager) { @@ -1959,14 +1959,13 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { outputBuffers[k] = {halStream.id, bufferId, android::makeToAidl(buffer_handle), BufferStatus::OK, NativeHandle(), NativeHandle()}; - bufferId++; } k++; } request.inputBuffer = { -1, 0, NativeHandle(), BufferStatus::ERROR, NativeHandle(), NativeHandle()}; - request.frameNumber = frameNumber; + request.frameNumber = bufferId; request.fmqSettingsSize = 0; request.settings = settings; request.inputWidth = 0; @@ -1974,7 +1973,7 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { { std::unique_lock<std::mutex> l(mLock); - mInflightMap[frameNumber] = inflightReq; + mInflightMap[bufferId] = inflightReq; } } @@ -1990,7 +1989,10 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { std::vector<int32_t> {halStreams[0].id}); ASSERT_TRUE(returnStatus.isOk()); - for (int32_t frameNumber = 0; frameNumber < requests.size(); frameNumber++) { + // We are keeping frame numbers and buffer ids consistent. Buffer id value of 0 + // is used to indicate a buffer that is not present/available so buffer ids as well + // as frame numbers begin with 1. + for (int32_t frameNumber = 1; frameNumber <= requests.size(); frameNumber++) { const auto& inflightReq = mInflightMap[frameNumber]; std::unique_lock<std::mutex> l(mLock); while (!inflightReq->errorCodeValid && @@ -2000,6 +2002,8 @@ TEST_P(CameraAidlTest, process10BitDynamicRangeRequest) { ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); } + waitForReleaseFence(inflightReq->resultOutputBuffers); + ASSERT_FALSE(inflightReq->errorCodeValid); ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u); verify10BitMetadata(mHandleImporter, *inflightReq, profile); diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp index 20f32bfe21..137c521c2b 100644 --- a/camera/provider/aidl/vts/camera_aidl_test.cpp +++ b/camera/provider/aidl/vts/camera_aidl_test.cpp @@ -34,6 +34,7 @@ #include <grallocusage/GrallocUsageConversion.h> #include <hardware/gralloc1.h> #include <simple_device_cb.h> +#include <ui/Fence.h> #include <ui/GraphicBufferAllocator.h> #include <regex> #include <typeinfo> @@ -139,6 +140,25 @@ void CameraAidlTest::TearDown() { } } +void CameraAidlTest::waitForReleaseFence( + std::vector<InFlightRequest::StreamBufferAndTimestamp>& resultOutputBuffers) { + for (auto& bufferAndTimestamp : resultOutputBuffers) { + // wait for the fence timestamp and store it along with the buffer + android::sp<android::Fence> releaseFence = nullptr; + const native_handle_t* releaseFenceHandle = bufferAndTimestamp.buffer.releaseFence; + if (releaseFenceHandle != nullptr && releaseFenceHandle->numFds == 1 && + releaseFenceHandle->data[0] >= 0) { + releaseFence = new android::Fence(releaseFenceHandle->data[0]); + } + if (releaseFence && releaseFence->isValid()) { + releaseFence->wait(/*ms*/ 300); + nsecs_t releaseTime = releaseFence->getSignalTime(); + if (bufferAndTimestamp.timeStamp < releaseTime) + bufferAndTimestamp.timeStamp = releaseTime; + } + } +} + std::vector<std::string> CameraAidlTest::getCameraDeviceNames( std::shared_ptr<ICameraProvider>& provider, bool addSecureOnly) { std::vector<std::string> cameraDeviceNames; @@ -167,7 +187,7 @@ std::vector<std::string> CameraAidlTest::getCameraDeviceNames( ScopedAStatus physicalCameraDeviceStatusChange( const std::string&, const std::string&, ::aidl::android::hardware::camera::common::CameraDeviceStatus) override { - return ndk::ScopedAStatus(); + return ScopedAStatus::ok(); } std::vector<std::string> externalCameraDeviceNames; @@ -751,8 +771,6 @@ Status CameraAidlTest::getAvailableOutputStreams(const camera_metadata_t* static std::vector<AvailableStream>& outputStreams, const AvailableStream* threshold, bool maxResolution) { - AvailableStream depthPreviewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast<int32_t>(PixelFormat::Y16)}; if (nullptr == staticMeta) { return Status::ILLEGAL_ARGUMENT; } @@ -778,7 +796,11 @@ Status CameraAidlTest::getAvailableOutputStreams(const camera_metadata_t* static } if (foundDepth == 0 && (0 == (depthEntry.count % 4))) { - fillOutputStreams(&depthEntry, outputStreams, &depthPreviewThreshold, + AvailableStream depthPreviewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast<int32_t>(PixelFormat::Y16)}; + const AvailableStream* depthThreshold = + isDepthOnly(staticMeta) ? &depthPreviewThreshold : threshold; + fillOutputStreams(&depthEntry, outputStreams, depthThreshold, ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT); } @@ -1181,6 +1203,7 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( camera_metadata_ro_entry physicalMultiResStreamConfigs; camera_metadata_ro_entry physicalStreamConfigs; camera_metadata_ro_entry physicalMaxResolutionStreamConfigs; + CameraMetadata physChars; bool isUltraHighRes = false; std::unordered_set<int32_t> subCameraPrivacyTestPatterns; if (isPublicId) { @@ -1189,12 +1212,11 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( ASSERT_TRUE(ret.isOk()); ASSERT_NE(subDevice, nullptr); - CameraMetadata subDeviceChars; - ret = subDevice->getCameraCharacteristics(&subDeviceChars); + ret = subDevice->getCameraCharacteristics(&physChars); ASSERT_TRUE(ret.isOk()); const camera_metadata_t* staticMetadata = - reinterpret_cast<const camera_metadata_t*>(subDeviceChars.metadata.data()); + reinterpret_cast<const camera_metadata_t*>(physChars.metadata.data()); retStatus = getSystemCameraKind(staticMetadata, &physSystemCameraKind); ASSERT_EQ(retStatus, Status::OK); @@ -1215,7 +1237,6 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( getPrivacyTestPatternModes(staticMetadata, &subCameraPrivacyTestPatterns); } else { // Check camera characteristics for hidden camera id - CameraMetadata physChars; ndk::ScopedAStatus ret = device->getPhysicalCameraCharacteristics(physicalId, &physChars); ASSERT_TRUE(ret.isOk()); @@ -2333,6 +2354,7 @@ void CameraAidlTest::processPreviewStabilizationCaptureRequestInternal( request.fmqSettingsSize = 0; request.settings.metadata = std::vector(rawMetadata, rawMetadata + get_camera_metadata_size(releasedMetadata)); + overrideRotateAndCrop(&request.settings); request.outputBuffers = std::vector<StreamBuffer>(1); StreamBuffer& outputBuffer = request.outputBuffers[0]; if (useHalBufManager) { @@ -2374,6 +2396,7 @@ void CameraAidlTest::processPreviewStabilizationCaptureRequestInternal( std::chrono::seconds(kStreamBufferTimeoutSec); ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); } + waitForReleaseFence(inflightReq->resultOutputBuffers); ASSERT_FALSE(inflightReq->errorCodeValid); ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u); diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h index d828cee4a8..9fa84d36d1 100644 --- a/camera/provider/aidl/vts/camera_aidl_test.h +++ b/camera/provider/aidl/vts/camera_aidl_test.h @@ -488,6 +488,9 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> { aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap profile); + static void waitForReleaseFence( + std::vector<InFlightRequest::StreamBufferAndTimestamp>& resultOutputBuffers); + // Map from frame number to the in-flight request state typedef std::unordered_map<uint32_t, std::shared_ptr<InFlightRequest>> InFlightMap; diff --git a/camera/provider/aidl/vts/device_cb.cpp b/camera/provider/aidl/vts/device_cb.cpp index 4698b4ae89..ca2f904c0a 100644 --- a/camera/provider/aidl/vts/device_cb.cpp +++ b/camera/provider/aidl/vts/device_cb.cpp @@ -19,7 +19,6 @@ #include <aidl/android/hardware/graphics/common/PixelFormat.h> #include <aidlcommonsupport/NativeHandle.h> #include <grallocusage/GrallocUsageConversion.h> -#include <ui/Fence.h> #include <cinttypes> using ::aidl::android::hardware::camera::device::BufferStatus; @@ -419,31 +418,19 @@ bool DeviceCb::processCaptureResultLocked( } for (const auto& buffer : results.outputBuffers) { - // wait for the fence timestamp and store it along with the buffer - // TODO: Check if we really need the dup here - android::sp<android::Fence> releaseFence = nullptr; - if (buffer.releaseFence.fds.size() == 1 && buffer.releaseFence.fds[0].get() >= 0) { - releaseFence = new android::Fence(dup(buffer.releaseFence.fds[0].get())); - } - CameraAidlTest::InFlightRequest::StreamBufferAndTimestamp streamBufferAndTimestamp; auto outstandingBuffers = mUseHalBufManager ? mOutstandingBufferIds : request->mOutstandingBufferIds; + auto bufferId = mUseHalBufManager ? buffer.bufferId : results.frameNumber; auto outputBuffer = outstandingBuffers.empty() ? ::android::makeFromAidl(buffer.buffer) : - outstandingBuffers[buffer.streamId][buffer.bufferId]; + outstandingBuffers[buffer.streamId][bufferId]; streamBufferAndTimestamp.buffer = {buffer.streamId, - buffer.bufferId, + bufferId, outputBuffer, buffer.status, ::android::makeFromAidl(buffer.acquireFence), ::android::makeFromAidl(buffer.releaseFence)}; streamBufferAndTimestamp.timeStamp = systemTime(); - if (releaseFence && releaseFence->isValid()) { - releaseFence->wait(/*ms*/ 300); - nsecs_t releaseTime = releaseFence->getSignalTime(); - if (streamBufferAndTimestamp.timeStamp < releaseTime) - streamBufferAndTimestamp.timeStamp = releaseTime; - } request->resultOutputBuffers.push_back(streamBufferAndTimestamp); } // If shutter event is received notify the pending threads. |