diff options
Diffstat (limited to 'camera')
-rw-r--r-- | camera/device/3.2/default/convert.cpp | 8 | ||||
-rw-r--r-- | camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp | 104 | ||||
-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 |
6 files changed, 79 insertions, 112 deletions
diff --git a/camera/device/3.2/default/convert.cpp b/camera/device/3.2/default/convert.cpp index 628b7af912..cb64f396f2 100644 --- a/camera/device/3.2/default/convert.cpp +++ b/camera/device/3.2/default/convert.cpp @@ -16,6 +16,7 @@ #define LOG_TAG "android.hardware.camera.device@3.2-convert-impl" #include <log/log.h> +#include <system/camera_metadata.h> #include "include/convert.h" @@ -43,6 +44,13 @@ bool convertFromHidl(const CameraMetadata &src, const camera_metadata_t** dst) { ALOGE("%s: input CameraMetadata is corrupt!", __FUNCTION__); return false; } + + if (validate_camera_metadata_structure((camera_metadata_t*)data, /*expected_size=*/NULL) != + OK) { + ALOGE("%s: Failed to validate the metadata structure", __FUNCTION__); + return false; + } + *dst = (camera_metadata_t*) data; return true; } diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 6866776ba5..339a142251 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -929,7 +929,7 @@ public: static Status getMandatoryConcurrentStreams(const camera_metadata_t* staticMeta, std::vector<AvailableStream>* outputStreams); - static bool supportsPreviewStabilization(const std::string& name, sp<ICameraProvider> provider); + static Status getJpegBufferSize(camera_metadata_t *staticMeta, uint32_t* outBufSize); static Status isConstrainedModeAvailable(camera_metadata_t *staticMeta); @@ -976,9 +976,6 @@ public: void processCaptureRequestInternal(uint64_t bufferusage, RequestTemplate reqTemplate, bool useSecureOnlyCameras); - void processPreviewStabilizationCaptureRequestInternal( - bool previewStabilizationOn, - /*inout*/ std::unordered_map<std::string, nsecs_t>& cameraDeviceToTimeLag); // Used by switchToOffline where a new result queue is created for offline reqs void updateInflightResultQueue(std::shared_ptr<ResultMetadataQueue> resultQueue); @@ -1032,11 +1029,7 @@ protected: // Buffers are added by process_capture_result when output buffers // return from HAL but framework. - struct StreamBufferAndTimestamp { - StreamBuffer buffer; - nsecs_t timeStamp; - }; - ::android::Vector<StreamBufferAndTimestamp> resultOutputBuffers; + ::android::Vector<StreamBuffer> resultOutputBuffers; std::unordered_set<std::string> expectedPhysicalResults; @@ -1453,25 +1446,8 @@ bool CameraHidlTest::DeviceCb::processCaptureResultLocked(const CaptureResult& r return notify; } - 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 - sp<android::Fence> releaseFence = nullptr; - if (buffer.releaseFence && (buffer.releaseFence->numFds == 1) && - buffer.releaseFence->data[0] >= 0) { - releaseFence = new android::Fence(dup(buffer.releaseFence->data[0])); - } - InFlightRequest::StreamBufferAndTimestamp streamBufferAndTimestamp; - streamBufferAndTimestamp.buffer = buffer; - 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); - } + request->resultOutputBuffers.appendArray(results.outputBuffers.data(), + results.outputBuffers.size()); // If shutter event is received notify the pending threads. if (request->shutterTimestamp != 0) { notify = true; @@ -4841,7 +4817,7 @@ void CameraHidlTest::processCaptureRequestInternal(uint64_t bufferUsage, ASSERT_FALSE(inflightReq.errorCodeValid); ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].buffer.streamId); + ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].streamId); request.frameNumber++; // Empty settings should be supported after the first call @@ -4879,7 +4855,7 @@ void CameraHidlTest::processCaptureRequestInternal(uint64_t bufferUsage, ASSERT_FALSE(inflightReq.errorCodeValid); ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].buffer.streamId); + ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].streamId); } if (useHalBufManager) { @@ -5460,7 +5436,7 @@ TEST_P(CameraHidlTest, processCaptureRequestBurstISO) { ASSERT_FALSE(inflightReqs[i].errorCodeValid); ASSERT_NE(inflightReqs[i].resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReqs[i].resultOutputBuffers[0].buffer.streamId); + ASSERT_EQ(previewStream.id, inflightReqs[i].resultOutputBuffers[0].streamId); ASSERT_FALSE(inflightReqs[i].collectedResult.isEmpty()); ASSERT_TRUE(inflightReqs[i].collectedResult.exists(ANDROID_SENSOR_SENSITIVITY)); camera_metadata_entry_t isoResult = inflightReqs[i].collectedResult.find( @@ -5744,7 +5720,7 @@ TEST_P(CameraHidlTest, switchToOffline) { ASSERT_FALSE(inflightReqs[i].errorCodeValid); ASSERT_NE(inflightReqs[i].resultOutputBuffers.size(), 0u); - ASSERT_EQ(stream.id, inflightReqs[i].resultOutputBuffers[0].buffer.streamId); + ASSERT_EQ(stream.id, inflightReqs[i].resultOutputBuffers[0].streamId); ASSERT_FALSE(inflightReqs[i].collectedResult.isEmpty()); } @@ -5940,7 +5916,7 @@ TEST_P(CameraHidlTest, flushPreviewRequest) { if (!inflightReq.errorCodeValid) { ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].buffer.streamId); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); } else { switch (inflightReq.errorCode) { case ErrorCode::ERROR_REQUEST: @@ -6318,8 +6294,6 @@ Status CameraHidlTest::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; } @@ -6345,8 +6319,12 @@ Status CameraHidlTest::getAvailableOutputStreams(const camera_metadata_t* static } if(foundDepth == 0 && (0 == (depthEntry.count % 4))) { - fillOutputStreams(&depthEntry, outputStreams, &depthPreviewThreshold, - ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT); + 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); } return Status::OK; @@ -7425,47 +7403,6 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t dev previewStream, halStreamConfig, supportsPartialResults, partialResultCount, useHalBufManager, outCb, streamConfigCounter); } - -bool CameraHidlTest::supportsPreviewStabilization(const std::string& name, - sp<ICameraProvider> provider) { - Return<void> ret; - sp<ICameraDevice> device3_x = nullptr; - ret = provider->getCameraDeviceInterface_V3_x(name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_x = device; - }); - if (!(ret.isOk())) { - ADD_FAILURE() << "Failed to get camera device interface for " << name; - } - - camera_metadata_t* staticMeta = nullptr; - ret = device3_x->getCameraCharacteristics([&](Status s, CameraMetadata metadata) { - ASSERT_EQ(Status::OK, s); - staticMeta = - clone_camera_metadata(reinterpret_cast<const camera_metadata_t*>(metadata.data())); - }); - if (!(ret.isOk())) { - ADD_FAILURE() << "Failed to get camera characteristics for " << name; - } - // Go through the characteristics and see if video stabilization modes have - // preview stabilization - camera_metadata_ro_entry entry; - - int retcode = find_camera_metadata_ro_entry( - staticMeta, ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, &entry); - if ((0 == retcode) && (entry.count > 0)) { - for (auto i = 0; i < entry.count; i++) { - if (entry.data.u8[i] == - ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION) { - return true; - } - } - } - return false; -} - // Open a device session and configure a preview stream. void CameraHidlTest::configureSingleStream( const std::string& name, int32_t deviceVersion, sp<ICameraProvider> provider, @@ -7883,6 +7820,7 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( } } + camera_metadata_t* staticMetadata; camera_metadata_ro_entry physicalMultiResStreamConfigs; camera_metadata_ro_entry physicalStreamConfigs; camera_metadata_ro_entry physicalMaxResolutionStreamConfigs; @@ -7901,8 +7839,9 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( ret = subDevice->getCameraCharacteristics([&](auto status, const auto& chars) { ASSERT_EQ(Status::OK, status); - const camera_metadata_t* staticMetadata = - reinterpret_cast<const camera_metadata_t*>(chars.data()); + staticMetadata = clone_camera_metadata( + reinterpret_cast<const camera_metadata_t*>(chars.data())); + ASSERT_NE(nullptr, staticMetadata); rc = getSystemCameraKind(staticMetadata, &physSystemCameraKind); ASSERT_EQ(rc, Status::OK); // Make sure that the system camera kind of a non-hidden @@ -7936,7 +7875,9 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( verifyCameraCharacteristics(status, chars); verifyMonochromeCharacteristics(chars, deviceVersion); - auto staticMetadata = (const camera_metadata_t*)chars.data(); + staticMetadata = clone_camera_metadata( + reinterpret_cast<const camera_metadata_t*>(chars.data())); + ASSERT_NE(nullptr, staticMetadata); retcode = find_camera_metadata_ro_entry( staticMetadata, ANDROID_CONTROL_ZOOM_RATIO_RANGE, &entry); bool subCameraHasZoomRatioRange = (0 == retcode && entry.count == 2); @@ -8064,6 +8005,7 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( } } } + free_camera_metadata(staticMetadata); } // If a multi-resolution stream is supported, there must be at least one 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. |