• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <gtest/gtest.h>
16 #include <fstream>
17 #include "plugin/plugin_manager_v2.h"
18 #include "plugin/codec_plugin.h"
19 #include "avcodec_codec_name.h"
20 
21 using namespace std;
22 using namespace testing::ext;
23 using namespace OHOS::Media;
24 using namespace OHOS::Media::Plugins;
25 
26 namespace OHOS {
27 namespace Media {
28 namespace Plugins {
29 
30 const string CODEC_LBVC_DEC_NAME = std::string(MediaAVCodec::AVCodecCodecName::AUDIO_DECODER_LBVC_NAME);
31 const string CODEC_LBVC_ENC_NAME = std::string(MediaAVCodec::AVCodecCodecName::AUDIO_ENCODER_LBVC_NAME);
32 constexpr int32_t LBVC_SAMPLE_RATE = 16000;
33 constexpr int64_t LBVC_BIT_RATE = 6000;
34 constexpr int32_t LBVC_SIZE = 640;
35 
36 class LbvcUnitTest : public testing::Test, public DataCallback {
37 public:
38     static void SetUpTestCase(void);
39     static void TearDownTestCase(void);
40     void SetUp() override;
41     void TearDown() override;
42     int32_t CheckFunc(bool isEncoder);
43     int32_t ProceFunc(bool isEncoder);
OnInputBufferDone(const shared_ptr<Media::AVBuffer> & inputBuffer)44     void OnInputBufferDone(const shared_ptr<Media::AVBuffer> &inputBuffer) override
45     {
46         (void)inputBuffer;
47     }
OnOutputBufferDone(const shared_ptr<Media::AVBuffer> & outputBuffer)48     void OnOutputBufferDone(const shared_ptr<Media::AVBuffer> &outputBuffer) override
49     {
50         (void)outputBuffer;
51     }
OnEvent(const shared_ptr<Plugins::PluginEvent> event)52     void OnEvent(const shared_ptr<Plugins::PluginEvent> event) override
53     {
54         (void)event;
55     }
56 protected:
57     std::unique_ptr<std::ifstream> soFile_;
58     shared_ptr<Media::Meta> meta_ = nullptr;
59     shared_ptr<CodecPlugin> plugin_ = nullptr;
60     shared_ptr<AVBuffer> avBuffer_ = nullptr;
61 };
62 
SetUpTestCase(void)63 void LbvcUnitTest::SetUpTestCase(void)
64 {
65 }
66 
TearDownTestCase(void)67 void LbvcUnitTest::TearDownTestCase(void)
68 {
69 }
70 
SetUp(void)71 void LbvcUnitTest::SetUp(void)
72 {
73     meta_ = make_shared<Media::Meta>();
74     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
75     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(LBVC_SAMPLE_RATE);
76     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S16LE);
77     meta_->Set<Tag::MEDIA_BITRATE>(LBVC_BIT_RATE);
78     auto avAllocator = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
79     avBuffer_ = AVBuffer::CreateAVBuffer(avAllocator, (LBVC_SIZE << 1));
80     avBuffer_->memory_->SetSize(LBVC_SIZE);
81 }
82 
TearDown(void)83 void LbvcUnitTest::TearDown(void)
84 {
85     if (plugin_) {
86         plugin_->Release();
87         plugin_ = nullptr;
88         meta_ = nullptr;
89     }
90 }
91 
CheckFunc(bool isEncoder)92 int32_t LbvcUnitTest::CheckFunc(bool isEncoder)
93 {
94     shared_ptr<CodecPlugin> tmpPlugin = nullptr;
95     if (isEncoder) {
96         auto tmp = PluginManagerV2::Instance().CreatePluginByName(CODEC_LBVC_ENC_NAME);
97         tmpPlugin = reinterpret_pointer_cast<CodecPlugin>(tmp);
98     } else {
99         auto tmp = PluginManagerV2::Instance().CreatePluginByName(CODEC_LBVC_DEC_NAME);
100         tmpPlugin = reinterpret_pointer_cast<CodecPlugin>(tmp);
101     }
102     bool ret = (tmpPlugin->Init() == Status::OK);
103     tmpPlugin->Release();
104     tmpPlugin = nullptr;
105     return ret;
106 }
107 
ProceFunc(bool isEncoder)108 int32_t LbvcUnitTest::ProceFunc(bool isEncoder)
109 {
110     if (isEncoder) {
111         auto tmp = PluginManagerV2::Instance().CreatePluginByName(CODEC_LBVC_ENC_NAME);
112         plugin_ = reinterpret_pointer_cast<CodecPlugin>(tmp);
113     } else {
114         auto tmp = PluginManagerV2::Instance().CreatePluginByName(CODEC_LBVC_DEC_NAME);
115         plugin_ = reinterpret_pointer_cast<CodecPlugin>(tmp);
116     }
117     EXPECT_EQ(true, plugin_ != nullptr);
118     return 0;
119 }
120 
121 HWTEST_F(LbvcUnitTest, decode_invalid, TestSize.Level1)
122 {
123     if (!CheckFunc(false)) {
124         return;
125     }
126     ProceFunc(false);
127     plugin_->Init();
128     plugin_->SetDataCallback(this);
129     meta_->Remove(Tag::AUDIO_CHANNEL_COUNT);
130     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
131     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
132     meta_->Remove(Tag::AUDIO_SAMPLE_RATE);
133     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
134     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(LBVC_SAMPLE_RATE);
135     meta_->Remove(Tag::AUDIO_SAMPLE_FORMAT);
136     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
137     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S32LE);
138     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
139     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S16LE);
140     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(1);
141     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
142     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(LBVC_SAMPLE_RATE);
143     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(2);
144     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
145     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
146     EXPECT_EQ(plugin_->SetParameter(meta_), Status::OK);
147     plugin_->Start();
148     EXPECT_NE(plugin_->QueueInputBuffer(avBuffer_), Status::OK);
149     EXPECT_NE(plugin_->QueueOutputBuffer(avBuffer_), Status::OK);
150     plugin_->Flush();
151     plugin_->Stop();
152     EXPECT_EQ(plugin_->Reset(), Status::OK);
153 }
154 
155 HWTEST_F(LbvcUnitTest, encode_invalid, TestSize.Level1)
156 {
157     if (!CheckFunc(true)) {
158         return;
159     }
160     ProceFunc(true);
161     plugin_->Init();
162     plugin_->SetDataCallback(this);
163     meta_->Remove(Tag::AUDIO_CHANNEL_COUNT);
164     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
165     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
166     meta_->Remove(Tag::AUDIO_SAMPLE_RATE);
167     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
168     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(LBVC_SAMPLE_RATE);
169     meta_->Remove(Tag::AUDIO_SAMPLE_FORMAT);
170     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
171     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S16LE);
172     meta_->Remove(Tag::MEDIA_BITRATE);
173     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
174     meta_->Set<Tag::MEDIA_BITRATE>(LBVC_BIT_RATE);
175     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S32LE);
176     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
177     meta_->Set<Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::SAMPLE_S16LE);
178     meta_->Set<Tag::MEDIA_BITRATE>(1);
179     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
180     meta_->Set<Tag::MEDIA_BITRATE>(LBVC_BIT_RATE);
181     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(1);
182     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
183     meta_->Set<Tag::AUDIO_SAMPLE_RATE>(LBVC_SAMPLE_RATE);
184     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(2);
185     EXPECT_NE(plugin_->SetParameter(meta_), Status::OK);
186     meta_->Set<Tag::AUDIO_CHANNEL_COUNT>(1);
187     EXPECT_EQ(plugin_->SetParameter(meta_), Status::OK);
188     plugin_->Start();
189     avBuffer_->memory_->SetSize(1);
190     EXPECT_NE(plugin_->QueueInputBuffer(avBuffer_), Status::OK);
191     EXPECT_NE(plugin_->QueueOutputBuffer(avBuffer_), Status::OK);
192     plugin_->Flush();
193     plugin_->Stop();
194     EXPECT_EQ(plugin_->Reset(), Status::OK);
195 }
196 
197 } // namespace Plugins
198 } // namespace Media
199 } // namespace OHOS