From fd86c6d28d44b33cacdaca439d4fe4e6e33335d8 Mon Sep 17 00:00:00 2001 From: SuRuoyan Date: Sun, 24 Nov 2024 11:15:14 +0800 Subject: [PATCH] create codec object during adapter creating Signed-off-by: SuRuoyan --- .../codec/audio/audio_codec_adapter.cpp | 61 +++++++++---------- .../codec/include/audio/audio_codec_adapter.h | 2 + .../codec/include/audio/audio_common_info.h | 1 + .../audio_decoder_codecbase_unit_test.cpp | 16 +++-- .../codeclist_test/codeclist_unit_test.cpp | 2 +- 5 files changed, 44 insertions(+), 38 deletions(-) diff --git a/services/engine/codec/audio/audio_codec_adapter.cpp b/services/engine/codec/audio/audio_codec_adapter.cpp index a1000254c..91a6198ae 100644 --- a/services/engine/codec/audio/audio_codec_adapter.cpp +++ b/services/engine/codec/audio/audio_codec_adapter.cpp @@ -61,21 +61,8 @@ int32_t AudioCodecAdapter::SetCallback(const std::shared_ptr &c return AVCodecServiceErrCode::AVCS_ERR_OK; } -int32_t AudioCodecAdapter::Configure(const Format &format) +int32_t AudioCodecAdapter::Init(Media::Meta &callerInfo) { - AVCODEC_SYNC_TRACE; - AVCODEC_LOGI("state %{public}s to INITIALIZING then INITIALIZED, name:%{public}s", - stateToString(state_).data(), name_.data()); - if (!format.ContainKey(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT)) { - AVCODEC_LOGE("Configure failed, missing channel count key in format."); - return AVCodecServiceErrCode::AVCS_ERR_CONFIGURE_MISMATCH_CHANNEL_COUNT; - } - - if (!format.ContainKey(MediaDescriptionKey::MD_KEY_SAMPLE_RATE)) { - AVCODEC_LOGE("Configure failed,missing sample rate key in format."); - return AVCodecServiceErrCode::AVCS_ERR_MISMATCH_SAMPLE_RATE; - } - if (state_ != CodecState::RELEASED) { AVCODEC_LOGE("Configure failed, state = %{public}s .", stateToString(state_).data()); return AVCodecServiceErrCode::AVCS_ERR_INVALID_STATE; @@ -89,8 +76,23 @@ int32_t AudioCodecAdapter::Configure(const Format &format) AVCODEC_LOGE("Configure failed, state =%{public}s", stateToString(state_).data()); return AVCodecServiceErrCode::AVCS_ERR_INVALID_STATE; } + return AVCodecServiceErrCode::AVCS_ERR_OK; +} + +int32_t AudioCodecAdapter::Configure(const Format &format) +{ + AVCODEC_SYNC_TRACE; + if (!format.ContainKey(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT)) { + AVCODEC_LOGE("Configure failed, missing channel count key in format."); + return AVCodecServiceErrCode::AVCS_ERR_CONFIGURE_MISMATCH_CHANNEL_COUNT; + } + + if (!format.ContainKey(MediaDescriptionKey::MD_KEY_SAMPLE_RATE)) { + AVCODEC_LOGE("Configure failed,missing sample rate key in format."); + return AVCodecServiceErrCode::AVCS_ERR_MISMATCH_SAMPLE_RATE; + } - ret = doConfigure(format); + int32_t ret = doConfigure(format); AVCODEC_LOGD("Configure exit"); return ret; } @@ -111,7 +113,7 @@ int32_t AudioCodecAdapter::Start() return doResume(); } - if (state_ != CodecState::INITIALIZED) { + if (state_ != CodecState::CONFIGURED) { AVCODEC_LOGE("Start is incorrect, state = %{public}s .", stateToString(state_).data()); return AVCodecServiceErrCode::AVCS_ERR_INVALID_STATE; } @@ -129,14 +131,14 @@ int32_t AudioCodecAdapter::Stop() "Stop failed, call back not initialized."); if (state_ == CodecState::INITIALIZED || state_ == CodecState::RELEASED || state_ == CodecState::STOPPING || - state_ == CodecState::RELEASING) { + state_ == CodecState::RELEASING || state_ == CodecState::CONFIGURED) { AVCODEC_LOGD("Stop, state_=%{public}s", stateToString(state_).data()); return AVCodecServiceErrCode::AVCS_ERR_OK; } state_ = CodecState::STOPPING; auto ret = doStop(); AVCODEC_LOGI("state %{public}s to INITIALIZED", stateToString(state_).data()); - state_ = CodecState::INITIALIZED; + state_ = CodecState::CONFIGURED; return ret; } @@ -166,15 +168,6 @@ int32_t AudioCodecAdapter::Reset() { AVCODEC_SYNC_TRACE; AVCODEC_LOGD("adapter Reset enter"); - if (state_ == CodecState::RELEASED || state_ == CodecState::RELEASING) { - AVCODEC_LOGW("adapter reset, state is already released, state =%{public}s .", stateToString(state_).data()); - return AVCodecServiceErrCode::AVCS_ERR_OK; - } - if (state_ == CodecState::INITIALIZING) { - AVCODEC_LOGW("adapter reset, state is initialized, state =%{public}s .", stateToString(state_).data()); - state_ = CodecState::RELEASED; - return AVCodecServiceErrCode::AVCS_ERR_OK; - } int32_t status = AVCodecServiceErrCode::AVCS_ERR_OK; if (worker_) { worker_->Release(); @@ -183,11 +176,12 @@ int32_t AudioCodecAdapter::Reset() } if (audioCodec) { status = audioCodec->Reset(); - audioCodec.reset(); - audioCodec = nullptr; + AVCODEC_LOGI("state %{public}s to INITIALIZED", stateToString(state_).data()); + state_ = CodecState::INITIALIZED; + } else { + auto ret = doInit(); + CHECK_AND_RETURN_RET_LOG(ret == AVCodecServiceErrCode::AVCS_ERR_OK, ret, "unknown error."); } - state_ = CodecState::RELEASED; - AVCODEC_LOGI("state %{public}s to INITIALIZED", stateToString(state_).data()); return status; } @@ -344,7 +338,7 @@ int32_t AudioCodecAdapter::doInit() AVCODEC_LOGE("Initlize failed, because create codec failed. name: %{public}s.", name_.data()); return AVCodecServiceErrCode::AVCS_ERR_UNKNOWN; } - AVCODEC_LOGD("adapter doInit, state from %{public}s to INITIALIZED", + AVCODEC_LOGI("adapter doInit, state from %{public}s to INITIALIZED", stateToString(state_).data()); state_ = CodecState::INITIALIZED; return AVCodecServiceErrCode::AVCS_ERR_OK; @@ -365,9 +359,9 @@ int32_t AudioCodecAdapter::doConfigure(const Format &format) int32_t ret = audioCodec->Init(format); if (ret != AVCodecServiceErrCode::AVCS_ERR_OK) { AVCODEC_LOGE("configure failed, because codec init failed,error:%{public}d.", static_cast(ret)); - state_ = CodecState::RELEASED; return ret; } + state_ = CodecState::CONFIGURED; return ret; } @@ -466,6 +460,7 @@ std::string_view AudioCodecAdapter::stateToString(CodecState state) {CodecState::INITIALIZING, " INITIALIZING"}, {CodecState::STARTING, " STARTING"}, {CodecState::STOPPING, " STOPPING"}, {CodecState::FLUSHING, " FLUSHING"}, {CodecState::RESUMING, " RESUMING"}, {CodecState::RELEASING, " RELEASING"}, + {CodecState::CONFIGURED, " CONFIGURED"}, }; return stateStrMap[state]; } diff --git a/services/engine/codec/include/audio/audio_codec_adapter.h b/services/engine/codec/include/audio/audio_codec_adapter.h index 20ef66f4f..ddabb0374 100644 --- a/services/engine/codec/include/audio/audio_codec_adapter.h +++ b/services/engine/codec/include/audio/audio_codec_adapter.h @@ -38,6 +38,8 @@ public: int32_t Stop() override; + int32_t Init(Media::Meta &callerInfo) override; + int32_t Flush() override; int32_t Reset() override; diff --git a/services/engine/codec/include/audio/audio_common_info.h b/services/engine/codec/include/audio/audio_common_info.h index b5f6f1aec..b6319557d 100644 --- a/services/engine/codec/include/audio/audio_common_info.h +++ b/services/engine/codec/include/audio/audio_common_info.h @@ -35,6 +35,7 @@ enum class CodecState { FLUSHING, // RUNNING -> FLUSHED RESUMING, // FLUSHED -> RUNNING RELEASING, // {ANY EXCEPT RELEASED} -> RELEASED + CONFIGURED, }; } // namespace MediaAVCodec } // namespace OHOS diff --git a/test/unittest/audio_test/audio_decoder_codecbase_unit_test.cpp b/test/unittest/audio_test/audio_decoder_codecbase_unit_test.cpp index bbd6cb1fa..d0c518075 100644 --- a/test/unittest/audio_test/audio_decoder_codecbase_unit_test.cpp +++ b/test/unittest/audio_test/audio_decoder_codecbase_unit_test.cpp @@ -185,8 +185,10 @@ int32_t AudioCodeDecoderUnitTest::CreateMp3CodecFunc(void) signal_ = new ADecSignal(); adec_->SetCallback(std::shared_ptr(std::make_shared(signal_))); + Media::Meta callerInfo; + int32_t ret = adec_->Init(callerInfo); sleep(1); - return AVCodecServiceErrCode::AVCS_ERR_OK; + return ret; } int32_t AudioCodeDecoderUnitTest::CreateFlacCodecFunc(void) @@ -195,8 +197,10 @@ int32_t AudioCodeDecoderUnitTest::CreateFlacCodecFunc(void) signal_ = new ADecSignal(); adec_->SetCallback(std::shared_ptr(std::make_shared(signal_))); + Media::Meta callerInfo; + int32_t ret = adec_->Init(callerInfo); sleep(1); - return AVCodecServiceErrCode::AVCS_ERR_OK; + return ret; } int32_t AudioCodeDecoderUnitTest::CreateAacCodecFunc(void) @@ -205,8 +209,10 @@ int32_t AudioCodeDecoderUnitTest::CreateAacCodecFunc(void) signal_ = new ADecSignal(); adec_->SetCallback(std::shared_ptr(std::make_shared(signal_))); + Media::Meta callerInfo; + int32_t ret = adec_->Init(callerInfo); sleep(1); - return AVCodecServiceErrCode::AVCS_ERR_OK; + return ret; } int32_t AudioCodeDecoderUnitTest::CreateOpusCodecFunc(void) @@ -215,8 +221,10 @@ int32_t AudioCodeDecoderUnitTest::CreateOpusCodecFunc(void) signal_ = new ADecSignal(); adec_->SetCallback(std::shared_ptr(std::make_shared(signal_))); + Media::Meta callerInfo; + int32_t ret = adec_->Init(callerInfo); sleep(1); - return AVCodecServiceErrCode::AVCS_ERR_OK; + return ret; } int32_t AudioCodeDecoderUnitTest::CheckSoFunc() diff --git a/test/unittest/codeclist_test/codeclist_unit_test.cpp b/test/unittest/codeclist_test/codeclist_unit_test.cpp index 31e49c1f8..7e4b786cf 100644 --- a/test/unittest/codeclist_test/codeclist_unit_test.cpp +++ b/test/unittest/codeclist_test/codeclist_unit_test.cpp @@ -167,7 +167,7 @@ HWTEST_F(CodecListUnitTest, CodecList_GetName_001, TestSize.Level1) std::string codecName = capability_->GetName(); if (mime == std::string(CodecMimeType::AUDIO_AAC)) { bool check = (codecName == nameOfMime || - codecName == std::string(AVCodecCodecName::AUDIO_ENCODER_AAC_NAME)); + codecName == std::string(AVCodecCodecName::AUDIO_ENCODER_VENDOR_AAC_NAME)); EXPECT_EQ(true, check) << mime << " get error name: " << codecName << std::endl; } else { EXPECT_EQ(nameOfMime, codecName) << mime << " get error name: " << codecName << std::endl; -- Gitee