diff --git a/services/services/codec/server/codec_server.cpp b/services/services/codec/server/codec_server.cpp index ce962400a..97788e8c2 100644 --- a/services/services/codec/server/codec_server.cpp +++ b/services/services/codec/server/codec_server.cpp @@ -1216,6 +1216,7 @@ int32_t CodecServer::FlushPostProcessing() if (!postProcessing_) { return AVCS_ERR_OK; } + DeactivatePostProcessingQueue(); if (postProcessingTask_) { postProcessingTask_->Pause(); } diff --git a/services/services/codec/server/post_processing/post_processing.h b/services/services/codec/server/post_processing/post_processing.h index 0020f7695..c85eea3b1 100644 --- a/services/services/codec/server/post_processing/post_processing.h +++ b/services/services/codec/server/post_processing/post_processing.h @@ -81,6 +81,8 @@ public: [[fallthrough]]; case State::RUNNING: [[fallthrough]]; + case State::FLUSHED: + [[fallthrough]]; case State::STOPPED: { int32_t ret = controller_->SetOutputSurface(surface); @@ -131,8 +133,9 @@ public: int32_t Start() { CHECK_AND_RETURN_RET_LOG(controller_, AVCS_ERR_UNKNOWN, "Post processing controller is null"); - CHECK_AND_RETURN_RET_LOG(state_.Get() == State::PREPARED || state_.Get() == State::STOPPED, - AVCS_ERR_INVALID_OPERATION, "Post processing is not prepared"); + CHECK_AND_RETURN_RET_LOG(state_.Get() == State::PREPARED || state_.Get() == State::STOPPED || + state_.Get() == State::FLUSHED, + AVCS_ERR_INVALID_OPERATION, "Post processing is not prepared"); AVCODEC_SYNC_TRACE; int32_t ret = controller_->Start(); CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "Start failed"); @@ -143,8 +146,8 @@ public: int32_t Stop() { CHECK_AND_RETURN_RET_LOG(controller_, AVCS_ERR_UNKNOWN, "Post processing controller is null"); - CHECK_AND_RETURN_RET_LOG(state_.Get() == State::RUNNING, AVCS_ERR_INVALID_STATE, - "Invalid post processing state: %{public}s", state_.Name()); + CHECK_AND_RETURN_RET_LOG(state_.Get() == State::RUNNING || state_.Get() == State::FLUSHED, + AVCS_ERR_INVALID_STATE, "Invalid post processing state: %{public}s", state_.Name()); AVCODEC_SYNC_TRACE; int32_t ret = controller_->Stop(); CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "Start failed"); @@ -160,6 +163,7 @@ public: AVCODEC_SYNC_TRACE; int32_t ret = controller_->Flush(); CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "Flush failed"); + state_.Set(State::FLUSHED); return AVCS_ERR_OK; } diff --git a/services/services/codec/server/post_processing/state_machine.h b/services/services/codec/server/post_processing/state_machine.h index c5a5aa18a..e70c083c7 100644 --- a/services/services/codec/server/post_processing/state_machine.h +++ b/services/services/codec/server/post_processing/state_machine.h @@ -27,6 +27,7 @@ enum class State { CONFIGURED, PREPARED, RUNNING, + FLUSHED, STOPPED }; diff --git a/test/unittest/video_test/vcodec_framework_test/videoenc_func_unit_test.cpp b/test/unittest/video_test/vcodec_framework_test/videoenc_func_unit_test.cpp index 6ecf2554e..6e4b0189a 100644 --- a/test/unittest/video_test/vcodec_framework_test/videoenc_func_unit_test.cpp +++ b/test/unittest/video_test/vcodec_framework_test/videoenc_func_unit_test.cpp @@ -310,6 +310,10 @@ bool TEST_SUIT::GetWaterMarkCapability(int32_t param) AVCodecCategory::AVCODEC_SOFTWARE); break; } + if (capabilityData == nullptr) { + std::cout << "capabilityData is nullptr" << std::endl; + return false; + } if (capabilityData->featuresMap.count(static_cast(AVCapabilityFeature::VIDEO_WATERMARK))) { std::cout << "Support watermark" << std::endl; return true; @@ -949,7 +953,6 @@ HWTEST_P(TEST_SUIT, VideoEncoder_SetCustomBuffer_001, TestSize.Level1) ASSERT_EQ(ret, true); std::shared_ptr buffer = AVBufferMockFactory::CreateAVBuffer(avbuffer); std::shared_ptr param = buffer->GetParameter(); - (void)memset_s(buffer->GetAddr(), buffer->GetCapacity(), 0, 10000); param->PutIntValue(Tag::VIDEO_ENCODER_ENABLE_WATERMARK, 1); param->PutIntValue(Tag::VIDEO_COORDINATE_X, 100); param->PutIntValue(Tag::VIDEO_COORDINATE_Y, 100); @@ -1185,7 +1188,6 @@ HWTEST_P(TEST_SUIT, VideoEncoder_SetCustomBuffer_009, TestSize.Level1) ASSERT_EQ(ret, true); std::shared_ptr buffer = AVBufferMockFactory::CreateAVBuffer(avbuffer); std::shared_ptr param = buffer->GetParameter(); - (void)memset_s(buffer->GetAddr(), buffer->GetCapacity(), 0, 10000); param->PutIntValue(Tag::VIDEO_ENCODER_ENABLE_WATERMARK, 1); param->PutIntValue(Tag::VIDEO_COORDINATE_X, 100); param->PutIntValue(Tag::VIDEO_COORDINATE_Y, 100); @@ -1225,7 +1227,6 @@ HWTEST_P(TEST_SUIT, VideoEncoder_SetCustomBuffer_0010, TestSize.Level1) ASSERT_EQ(ret, true); std::shared_ptr buffer = AVBufferMockFactory::CreateAVBuffer(avbuffer); std::shared_ptr param = buffer->GetParameter(); - (void)memset_s(buffer->GetAddr(), buffer->GetCapacity(), 0, 10000); param->PutIntValue(Tag::VIDEO_ENCODER_ENABLE_WATERMARK, 1); param->PutIntValue(Tag::VIDEO_COORDINATE_X, 100); param->PutIntValue(Tag::VIDEO_COORDINATE_Y, 100);