From 1c9b97cd230245917c92eba816abc6cf9954cf08 Mon Sep 17 00:00:00 2001 From: zhuzhihui7 Date: Mon, 3 Mar 2025 19:45:33 +0800 Subject: [PATCH] fix camera errors Signed-off-by: zhuzhihui7 --- .../client/include/dcamera_client.h | 1 - .../client/include/icamera_operator.h | 1 - .../client/src/dcamera_client.cpp | 14 --- .../dcamera_sink_controller.h | 3 - .../dcamera_sink_controller.cpp | 90 +++++++------------ .../dcamera_sink_output_test.cpp | 12 --- .../mock_camera_operator.h | 5 -- .../dcameradata/dcamera_source_input.h | 5 -- .../dcamera_source_controller.cpp | 14 +-- .../dcameradata/dcamera_source_input.cpp | 27 ++---- .../encoder/encode_data_process.h | 3 - .../encoder/encode_data_process.cpp | 8 +- .../encode_data_process_test.cpp | 2 +- 13 files changed, 51 insertions(+), 134 deletions(-) diff --git a/services/cameraservice/cameraoperator/client/include/dcamera_client.h b/services/cameraservice/cameraoperator/client/include/dcamera_client.h index 1df19c7b..9fe39811 100644 --- a/services/cameraservice/cameraoperator/client/include/dcamera_client.h +++ b/services/cameraservice/cameraoperator/client/include/dcamera_client.h @@ -49,7 +49,6 @@ public: int32_t SetResultCallback(std::shared_ptr& callback) override; int32_t PauseCapture() override; int32_t ResumeCapture() override; - int32_t PrelaunchCamera() override; private: int32_t ConfigCaptureSession(std::vector>& captureInfos, int32_t sceneMode); diff --git a/services/cameraservice/cameraoperator/client/include/icamera_operator.h b/services/cameraservice/cameraoperator/client/include/icamera_operator.h index 90daa089..97309ff7 100644 --- a/services/cameraservice/cameraoperator/client/include/icamera_operator.h +++ b/services/cameraservice/cameraoperator/client/include/icamera_operator.h @@ -64,7 +64,6 @@ public: virtual int32_t SetResultCallback(std::shared_ptr& callback) = 0; virtual int32_t PauseCapture() = 0; virtual int32_t ResumeCapture() = 0; - virtual int32_t PrelaunchCamera() = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/cameraoperator/client/src/dcamera_client.cpp b/services/cameraservice/cameraoperator/client/src/dcamera_client.cpp index 099cf53a..78851383 100644 --- a/services/cameraservice/cameraoperator/client/src/dcamera_client.cpp +++ b/services/cameraservice/cameraoperator/client/src/dcamera_client.cpp @@ -665,19 +665,5 @@ int32_t DCameraClient::ResumeCapture() } return ret; } - -int32_t DCameraClient::PrelaunchCamera() -{ - if (cameraManager_ == nullptr) { - DHLOGE("DCameraClient cameraManager_ is nullptr."); - return DCAMERA_BAD_VALUE; - } - int32_t ret = cameraManager_->PrelaunchCamera(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraClient PrelaunchCamera Start failed, cameraId: %{public}s, ret: %{public}d", - GetAnonyString(cameraId_).c_str(), ret); - } - return ret; -} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h index 0a81725d..3660d51e 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h @@ -85,9 +85,6 @@ private: void ProcessPostAuthorization(const AppExecFwk::InnerEvent::Pointer &event); int32_t CreateCtrlSession(); int32_t CheckSensitive(); - void HandleConnecting(); - void HandleConnected(std::string networkId); - void HandleDisconnected(); bool isInit_; int32_t sessionState_; diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp index 9e2d39b2..6ac21696 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp @@ -544,21 +544,45 @@ void DCameraSinkController::OnMetadataResult(std::vector events = std::make_shared(); - events->eventType_ = DCAMERA_SINK_STOP; - events->eventResult_ = DCAMERA_EVENT_SINK_STOP; - DCameraNotify(events); - HandleDisconnected(); + DHLOGI("channel is disconnected"); + ffrt::submit([this]() { + DHLOGI("DCameraSinkController::OnSessionState %{public}s new thread session state: %{public}d", + GetAnonyString(dhId_).c_str(), sessionState_); + prctl(PR_SET_NAME, CHANNEL_DISCONNECTED.c_str()); + std::lock_guard autoLock(autoLock_); + int32_t ret = CloseChannel(); + if (ret != DCAMERA_OK) { + DHLOGE("session state: %{public}d, %{public}s close channel failed, ret: %{public}d", + sessionState_, GetAnonyString(dhId_).c_str(), ret); + } + ret = StopCapture(); + if (ret != DCAMERA_OK) { + DHLOGE("session state: %{public}d, %{public}s stop capture failed, ret: %{public}d", + sessionState_, GetAnonyString(dhId_).c_str(), ret); + } + }); break; } default: @@ -567,54 +591,6 @@ void DCameraSinkController::OnSessionState(int32_t state, std::string networkId) } } -void DCameraSinkController::HandleConnecting() -{ - DHLOGI("channel is connecting"); -} - -void DCameraSinkController::HandleConnected(std::string networkId) -{ - if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { - return; - } - srcDevId_ = networkId; - int32_t ret = CheckSensitive(); - if (ret != DCAMERA_OK) { - DHLOGE("Check sensitive error. ret %{public}d.", ret); - return; - } - ret = PullUpPage(); - CHECK_AND_RETURN_LOG(ret != DCAMERA_OK, "PullUpPage failed"); - if (operator_ == nullptr) { - DHLOGE("operator_ is nullptr"); - return; - } - ret = operator_->PrelaunchCamera(); - if (ret != DCAMERA_OK) { - DHLOGE("operator_ PrelaunchCamera error. ret %{public}d.", ret); - } -} - -void DCameraSinkController::HandleDisconnected() -{ - ffrt::submit([this]() { - DHLOGI("DCameraSinkController::OnSessionState %{public}s new thread session state: %{public}d", - GetAnonyString(dhId_).c_str(), sessionState_); - prctl(PR_SET_NAME, CHANNEL_DISCONNECTED.c_str()); - std::lock_guard autoLock(autoLock_); - int32_t ret = CloseChannel(); - if (ret != DCAMERA_OK) { - DHLOGE("session state: %{public}d, %{public}s close channel failed, ret: %{public}d", - sessionState_, GetAnonyString(dhId_).c_str(), ret); - } - ret = StopCapture(); - if (ret != DCAMERA_OK) { - DHLOGE("session state: %{public}d, %{public}s stop capture failed, ret: %{public}d", - sessionState_, GetAnonyString(dhId_).c_str(), ret); - } - }); -} - void DCameraSinkController::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) { DHLOGI("DCameraSinkController::OnSessionError dhId: %{public}s, eventType: %{public}d, eventReason: %{public}d," diff --git a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_output_test.cpp b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_output_test.cpp index 1adafec1..82a001b0 100644 --- a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_output_test.cpp +++ b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_output_test.cpp @@ -289,17 +289,5 @@ HWTEST_F(DCameraSinkOutputTest, dcamera_sink_output_test_008, TestSize.Level1) ret = output_->GetProperty(name, propertyCarrier); EXPECT_NE(DCAMERA_OK, ret); } - -/** - * @tc.name: dcamera_sink_output_test_009 - * @tc.desc: Verify the PrelaunchCamera function. - * @tc.type: FUNC - * @tc.require: I5N1JI - */ -HWTEST_F(DCameraSinkOutputTest, dcamera_sink_output_test_009, TestSize.Level1) -{ - int32_t ret = operator_->PrelaunchCamera(); - EXPECT_EQ(DCAMERA_OK, ret); -} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/mock_camera_operator.h b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/mock_camera_operator.h index 2a712d6a..67fc84e9 100644 --- a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/mock_camera_operator.h +++ b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/mock_camera_operator.h @@ -110,11 +110,6 @@ public: } return DCAMERA_OK; } - - int32_t PrelaunchCamera() - { - return DCAMERA_OK; - } }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input.h index f3d3edf4..6fa3b270 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input.h @@ -68,11 +68,6 @@ private: std::atomic isChannelConnected_ = false; std::mutex channelMtx_; std::condition_variable channelCond_; - - static constexpr std::chrono::seconds TIMEOUT_1_SEC = std::chrono::seconds(1); - std::atomic isOpenChannel_ = false; - std::mutex isOpenChannelMtx_; - std::condition_variable isOpenChannelCond_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp index 8362419a..f6b615c5 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp @@ -64,7 +64,7 @@ DCameraSourceController::~DCameraSourceController() int32_t DCameraSourceController::StartCapture(std::vector>& captureInfos, int32_t sceneMode) { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("StartCapture not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -110,7 +110,7 @@ int32_t DCameraSourceController::StartCapture(std::vector DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("StopCapture not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -162,7 +162,7 @@ int32_t DCameraSourceController::StopCapture() int32_t DCameraSourceController::ChannelNeg(std::shared_ptr& info) { if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("ChannelNeg not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -236,7 +236,7 @@ int32_t DCameraSourceController::DCameraNotify(std::shared_ptr& ev int32_t DCameraSourceController::UpdateSettings(std::vector>& settings) { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("UpdateSettings not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -280,7 +280,7 @@ int32_t DCameraSourceController::UpdateSettings(std::vector& camInfo) { if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("GetCameraInfo not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -314,7 +314,7 @@ int32_t DCameraSourceController::GetCameraInfo(std::shared_ptr& cam int32_t DCameraSourceController::OpenChannel(std::shared_ptr& openInfo) { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("OpenChannel not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } @@ -362,7 +362,7 @@ int32_t DCameraSourceController::OpenChannel(std::shared_ptr& o int32_t DCameraSourceController::CloseChannel() { - if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) { + if (indexs_.size() > DCAMERA_MAX_NUM) { DHLOGE("CloseChannel not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input.cpp index aa24885b..85a23569 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input.cpp @@ -180,21 +180,13 @@ int32_t DCameraSourceInput::OpenChannel(std::vector& indexs) DHLOGI("DCameraSourceInput OpenChannel devId %{public}s dhId %{public}s continue state: %{public}d, snapshot " "state: %{public}d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), channelState_[CONTINUOUS_FRAME], channelState_[SNAPSHOT_FRAME]); - std::shared_ptr runner = AppExecFwk::EventRunner::Create(true); - auto handler = std::make_shared(runner); - std::vector &localIndexs = indexs; if (channelState_[CONTINUOUS_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED) { - auto task = [&]() { - int32_t ret = EstablishContinuousFrameSession(localIndexs); - if (ret != DCAMERA_OK) { - DHLOGE("esdablish continuous frame failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); - } - std::unique_lock lock(isOpenChannelMtx_); - isOpenChannel_.store(true); - isOpenChannelCond_.notify_one(); - }; - handler->PostTask(task, "DCameraSourceInput:OpenChannel", 0, AppExecFwk::EventQueue::Priority::HIGH); + int32_t ret = EstablishContinuousFrameSession(indexs); + if (ret != DCAMERA_OK) { + DHLOGE("esdablish continuous frame failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + return ret; + } } if (channelState_[SNAPSHOT_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED) { int32_t ret = EstablishSnapshotFrameSession(indexs); @@ -202,12 +194,7 @@ int32_t DCameraSourceInput::OpenChannel(std::vector& indexs) DHLOGE("esdablish snapshot frame failed ret: %{public}d," "devId: %{public}s, dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); - } - { - std::unique_lock lock(isOpenChannelMtx_); - while (!isOpenChannel_.load()) { - isOpenChannelCond_.wait_for(lock, TIMEOUT_1_SEC, [this] { return isOpenChannel_.load(); }); - } + return ret; } } return DCAMERA_OK; diff --git a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h index 7adb87dc..bf90e19e 100644 --- a/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h +++ b/services/data_process/include/pipeline_node/multimedia_codec/encoder/encode_data_process.h @@ -120,7 +120,6 @@ private: const static std::map ENCODER_BITRATE_TABLE; constexpr static uint64_t S2NS = 1000000000; constexpr static uint32_t US2NS = 1000; - constexpr static std::chrono::seconds TIMEOUT_1_SEC = std::chrono::seconds(1); std::weak_ptr callbackPipelineSink_; std::mutex mtxEncoderState_; @@ -133,8 +132,6 @@ private: sptr encodeProducerSurface_ = nullptr; std::atomic isEncoderProcess_ = false; - std::mutex isEncoderProcessMtx_; - std::condition_variable isEncoderProcessCond_; int32_t waitEncoderOutputCount_ = 0; int64_t lastFeedEncoderInputBufferTimeUs_ = 0; diff --git a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp index 17fa55ad..d309f082 100644 --- a/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp +++ b/services/data_process/src/pipeline_node/multimedia_codec/encoder/encode_data_process.cpp @@ -75,7 +75,6 @@ int32_t EncodeDataProcess::InitNode(const VideoConfigParams& sourceConfig, const processedConfig_ = sourceConfig; processedConfig = processedConfig_; isEncoderProcess_.store(true); - isEncoderProcessCond_.notify_one(); return DCAMERA_OK; } @@ -89,7 +88,6 @@ int32_t EncodeDataProcess::InitNode(const VideoConfigParams& sourceConfig, const } processedConfig = processedConfig_; isEncoderProcess_.store(true); - isEncoderProcessCond_.notify_one(); return DCAMERA_OK; } @@ -546,9 +544,9 @@ void EncodeDataProcess::OnOutputFormatChanged(const Media::Format &format) void EncodeDataProcess::OnOutputBufferAvailable(uint32_t index, MediaAVCodec::AVCodecBufferInfo info, MediaAVCodec::AVCodecBufferFlag flag, std::shared_ptr buffer) { - std::unique_lock lock(isEncoderProcessMtx_); - while (!isEncoderProcess_.load()) { - isEncoderProcessCond_.wait_for(lock, TIMEOUT_1_SEC, [this] { return isEncoderProcess_.load(); }); + if (!isEncoderProcess_.load()) { + DHLOGE("EncodeNode occurred error or start release."); + return; } DHLOGD("Video encode buffer info: presentation TimeUs %{public}" PRId64", size %{public}d, offset %{public}d, " "flag %{public}d", info.presentationTimeUs, info.size, info.offset, flag); diff --git a/services/data_process/test/unittest/common/pipeline_node/encode_data_process_test.cpp b/services/data_process/test/unittest/common/pipeline_node/encode_data_process_test.cpp index 694c2159..161a4534 100644 --- a/services/data_process/test/unittest/common/pipeline_node/encode_data_process_test.cpp +++ b/services/data_process/test/unittest/common/pipeline_node/encode_data_process_test.cpp @@ -465,11 +465,11 @@ HWTEST_F(EncodeDataProcessTest, encode_data_process_test_014, TestSize.Level1) MediaAVCodec::AVCodecBufferFlag flag = MediaAVCodec::AVCODEC_BUFFER_FLAG_CODEC_DATA; std::shared_ptr buffer = nullptr; testEncodeDataProcess_->OnOutputBufferAvailable(index, info, flag, buffer); + testEncodeDataProcess_->OnError(); testEncodeDataProcess_->OnInputBufferAvailable(index, buffer); Media::Format format; testEncodeDataProcess_->OnOutputFormatChanged(format); testEncodeDataProcess_->OnOutputBufferAvailable(index, info, flag, buffer); - testEncodeDataProcess_->OnError(); EXPECT_EQ(rc, DCAMERA_OK); } -- Gitee