Loading services/camera/virtualcamera/VirtualCameraRenderThread.cc +9 −8 Original line number Diff line number Diff line Loading @@ -100,7 +100,11 @@ NotifyMsg createBufferErrorNotifyMsg(int frameNumber, int streamId) { NotifyMsg createRequestErrorNotifyMsg(int frameNumber) { NotifyMsg msg; msg.set<NotifyMsg::Tag::error>(ErrorMsg{ .frameNumber = frameNumber, .errorCode = ErrorCode::ERROR_REQUEST}); .frameNumber = frameNumber, // errorStreamId needs to be set to -1 for ERROR_REQUEST // (not tied to specific stream). .errorStreamId = -1, .errorCode = ErrorCode::ERROR_REQUEST}); return msg; } Loading Loading @@ -164,8 +168,9 @@ void VirtualCameraRenderThread::enqueueTask( void VirtualCameraRenderThread::flush() { std::lock_guard<std::mutex> lock(mLock); for (auto task = std::move(mQueue.front()); !mQueue.empty(); mQueue.pop_front()) { while (!mQueue.empty()) { std::unique_ptr<ProcessCaptureRequestTask> task = std::move(mQueue.front()); mQueue.pop_front(); flushCaptureRequest(*task); } } Loading Loading @@ -233,6 +238,7 @@ void VirtualCameraRenderThread::processCaptureRequest( CaptureResult captureResult; captureResult.fmqResultSize = 0; captureResult.frameNumber = request.getFrameNumber(); // Partial result needs to be set to 1 when metadata are present. captureResult.partialResult = 1; captureResult.inputBuffer.streamId = -1; captureResult.physicalCameraMetadata.resize(0); Loading Loading @@ -308,15 +314,10 @@ void VirtualCameraRenderThread::processCaptureRequest( void VirtualCameraRenderThread::flushCaptureRequest( const ProcessCaptureRequestTask& request) { const std::chrono::nanoseconds timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::steady_clock::now().time_since_epoch()); CaptureResult captureResult; captureResult.fmqResultSize = 0; captureResult.frameNumber = request.getFrameNumber(); captureResult.inputBuffer.streamId = -1; captureResult.result = createCaptureResultMetadata(timestamp); const std::vector<CaptureRequestBuffer>& buffers = request.getBuffers(); captureResult.outputBuffers.resize(buffers.size()); Loading services/camera/virtualcamera/VirtualCameraSession.cc +11 −1 Original line number Diff line number Diff line Loading @@ -179,6 +179,14 @@ ndk::ScopedAStatus VirtualCameraSession::close() { mVirtualCameraClientCallback->onStreamClosed(/*streamId=*/0); } { std::lock_guard<std::mutex> lock(mLock); if (mRenderThread != nullptr) { mRenderThread->stop(); mRenderThread = nullptr; } } mSessionContext.closeAllStreams(); return ndk::ScopedAStatus::ok(); } Loading Loading @@ -275,7 +283,9 @@ ndk::ScopedAStatus VirtualCameraSession::constructDefaultRequestSettings( ndk::ScopedAStatus VirtualCameraSession::flush() { ALOGV("%s", __func__); std::lock_guard<std::mutex> lock(mLock); if (mRenderThread != nullptr) { mRenderThread->flush(); } return ndk::ScopedAStatus::ok(); } Loading services/camera/virtualcamera/VirtualCameraSession.h +1 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class VirtualCameraSession virtual ~VirtualCameraSession() override = default; ndk::ScopedAStatus close() override; ndk::ScopedAStatus close() override EXCLUDES(mLock); ndk::ScopedAStatus configureStreams( const ::aidl::android::hardware::camera::device::StreamConfiguration& Loading services/camera/virtualcamera/tests/VirtualCameraRenderThreadTest.cc +7 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ using ::aidl::android::hardware::camera::device::BufferRequest; using ::aidl::android::hardware::camera::device::BufferRequestStatus; using ::aidl::android::hardware::camera::device::BufferStatus; using ::aidl::android::hardware::camera::device::CaptureResult; using ::aidl::android::hardware::camera::device::ErrorCode; using ::aidl::android::hardware::camera::device::ErrorMsg; using ::aidl::android::hardware::camera::device::NotifyMsg; using ::aidl::android::hardware::camera::device::StreamBuffer; Loading Loading @@ -73,7 +74,11 @@ Matcher<StreamBuffer> IsStreamBufferWithStatus(const int streamId, Matcher<NotifyMsg> IsRequestErrorNotifyMsg(const int frameId) { return AllOf(Property(&NotifyMsg::getTag, Eq(NotifyMsg::error)), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::frameNumber, Eq(frameId)))); Field(&ErrorMsg::frameNumber, Eq(frameId))), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::errorStreamId, Eq(-1))), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::errorCode, Eq(ErrorCode::ERROR_REQUEST)))); } class MockCameraDeviceCallback : public BnCameraDeviceCallback { Loading services/camera/virtualcamera/tests/VirtualCameraSessionTest.cc +8 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,14 @@ TEST_F(VirtualCameraSessionTest, CloseTriggersClientTerminateCallback) { ASSERT_TRUE(mVirtualCameraSession->close().isOk()); } TEST_F(VirtualCameraSessionTest, FlushBeforeConfigure) { // Flush request coming before the configure request finished // (so potentially the thread is not yet running) should be // gracefully handled. EXPECT_TRUE(mVirtualCameraSession->flush().isOk()); } TEST_F(VirtualCameraSessionTest, onProcessCaptureRequestTriggersClientCallback) { StreamConfiguration streamConfiguration; streamConfiguration.streams = { Loading Loading
services/camera/virtualcamera/VirtualCameraRenderThread.cc +9 −8 Original line number Diff line number Diff line Loading @@ -100,7 +100,11 @@ NotifyMsg createBufferErrorNotifyMsg(int frameNumber, int streamId) { NotifyMsg createRequestErrorNotifyMsg(int frameNumber) { NotifyMsg msg; msg.set<NotifyMsg::Tag::error>(ErrorMsg{ .frameNumber = frameNumber, .errorCode = ErrorCode::ERROR_REQUEST}); .frameNumber = frameNumber, // errorStreamId needs to be set to -1 for ERROR_REQUEST // (not tied to specific stream). .errorStreamId = -1, .errorCode = ErrorCode::ERROR_REQUEST}); return msg; } Loading Loading @@ -164,8 +168,9 @@ void VirtualCameraRenderThread::enqueueTask( void VirtualCameraRenderThread::flush() { std::lock_guard<std::mutex> lock(mLock); for (auto task = std::move(mQueue.front()); !mQueue.empty(); mQueue.pop_front()) { while (!mQueue.empty()) { std::unique_ptr<ProcessCaptureRequestTask> task = std::move(mQueue.front()); mQueue.pop_front(); flushCaptureRequest(*task); } } Loading Loading @@ -233,6 +238,7 @@ void VirtualCameraRenderThread::processCaptureRequest( CaptureResult captureResult; captureResult.fmqResultSize = 0; captureResult.frameNumber = request.getFrameNumber(); // Partial result needs to be set to 1 when metadata are present. captureResult.partialResult = 1; captureResult.inputBuffer.streamId = -1; captureResult.physicalCameraMetadata.resize(0); Loading Loading @@ -308,15 +314,10 @@ void VirtualCameraRenderThread::processCaptureRequest( void VirtualCameraRenderThread::flushCaptureRequest( const ProcessCaptureRequestTask& request) { const std::chrono::nanoseconds timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::steady_clock::now().time_since_epoch()); CaptureResult captureResult; captureResult.fmqResultSize = 0; captureResult.frameNumber = request.getFrameNumber(); captureResult.inputBuffer.streamId = -1; captureResult.result = createCaptureResultMetadata(timestamp); const std::vector<CaptureRequestBuffer>& buffers = request.getBuffers(); captureResult.outputBuffers.resize(buffers.size()); Loading
services/camera/virtualcamera/VirtualCameraSession.cc +11 −1 Original line number Diff line number Diff line Loading @@ -179,6 +179,14 @@ ndk::ScopedAStatus VirtualCameraSession::close() { mVirtualCameraClientCallback->onStreamClosed(/*streamId=*/0); } { std::lock_guard<std::mutex> lock(mLock); if (mRenderThread != nullptr) { mRenderThread->stop(); mRenderThread = nullptr; } } mSessionContext.closeAllStreams(); return ndk::ScopedAStatus::ok(); } Loading Loading @@ -275,7 +283,9 @@ ndk::ScopedAStatus VirtualCameraSession::constructDefaultRequestSettings( ndk::ScopedAStatus VirtualCameraSession::flush() { ALOGV("%s", __func__); std::lock_guard<std::mutex> lock(mLock); if (mRenderThread != nullptr) { mRenderThread->flush(); } return ndk::ScopedAStatus::ok(); } Loading
services/camera/virtualcamera/VirtualCameraSession.h +1 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class VirtualCameraSession virtual ~VirtualCameraSession() override = default; ndk::ScopedAStatus close() override; ndk::ScopedAStatus close() override EXCLUDES(mLock); ndk::ScopedAStatus configureStreams( const ::aidl::android::hardware::camera::device::StreamConfiguration& Loading
services/camera/virtualcamera/tests/VirtualCameraRenderThreadTest.cc +7 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ using ::aidl::android::hardware::camera::device::BufferRequest; using ::aidl::android::hardware::camera::device::BufferRequestStatus; using ::aidl::android::hardware::camera::device::BufferStatus; using ::aidl::android::hardware::camera::device::CaptureResult; using ::aidl::android::hardware::camera::device::ErrorCode; using ::aidl::android::hardware::camera::device::ErrorMsg; using ::aidl::android::hardware::camera::device::NotifyMsg; using ::aidl::android::hardware::camera::device::StreamBuffer; Loading Loading @@ -73,7 +74,11 @@ Matcher<StreamBuffer> IsStreamBufferWithStatus(const int streamId, Matcher<NotifyMsg> IsRequestErrorNotifyMsg(const int frameId) { return AllOf(Property(&NotifyMsg::getTag, Eq(NotifyMsg::error)), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::frameNumber, Eq(frameId)))); Field(&ErrorMsg::frameNumber, Eq(frameId))), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::errorStreamId, Eq(-1))), Property(&NotifyMsg::get<NotifyMsg::error>, Field(&ErrorMsg::errorCode, Eq(ErrorCode::ERROR_REQUEST)))); } class MockCameraDeviceCallback : public BnCameraDeviceCallback { Loading
services/camera/virtualcamera/tests/VirtualCameraSessionTest.cc +8 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,14 @@ TEST_F(VirtualCameraSessionTest, CloseTriggersClientTerminateCallback) { ASSERT_TRUE(mVirtualCameraSession->close().isOk()); } TEST_F(VirtualCameraSessionTest, FlushBeforeConfigure) { // Flush request coming before the configure request finished // (so potentially the thread is not yet running) should be // gracefully handled. EXPECT_TRUE(mVirtualCameraSession->flush().isOk()); } TEST_F(VirtualCameraSessionTest, onProcessCaptureRequestTriggersClientCallback) { StreamConfiguration streamConfiguration; streamConfiguration.streams = { Loading