1 /*
2  * Copyright (c) 2023-2023 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 
16 #include "gtest/gtest.h"
17 #include "plugin/common/plugin_meta.h"
18 #include "pipeline/filters/common/plugin_utils.h"
19 #include "plugin/common/plugin_tags.h"
20 #include "plugin/common/plugin_types.h"
21 #include "plugin/plugins/codec_adapter/codec_utils.h"
22 #include "pipeline/filters/common/plugin_settings.h"
23 #include "pipeline/core/filter_type.h"
24 #include "plugin/convert/ffmpeg_convert.h"
25 #include "hdf_base.h"
26 #include "OMX_Core.h"
27 
28 using namespace testing::ext;
29 using namespace OHOS::Media::Plugin;
30 using namespace OHOS::Media::Plugin::CodecAdapter;
31 using namespace OHOS::Media::Pipeline;
32 
33 namespace OHOS {
34 namespace Media {
35 namespace Test {
36 
37 HWTEST(TestPluginSetting, set_para_to_sink_plugins, TestSize.Level1)
38 {
39     std::shared_ptr<Ffmpeg::ResamplePara> resamplePara = std::make_shared<Ffmpeg::ResamplePara>();
40     resamplePara->channels = 1;
41     resamplePara->sampleRate = 96000;
42     resamplePara->bitsPerSample = 16;
43     resamplePara->channelLayout = 3;
44     resamplePara->srcFfFmt = AVSampleFormat::AV_SAMPLE_FMT_FLTP;
45     resamplePara->destSamplesPerFrame = 2048;
46     resamplePara->destFmt = AVSampleFormat::AV_SAMPLE_FMT_S16;
47     std::shared_ptr<Ffmpeg::Resample> resample = std::make_shared<Ffmpeg::Resample>();
48     auto src = new uint8_t;
49     size_t srcLength = 16384;
50     auto des = new uint8_t;
51     size_t desLength = 16384;
52     ASSERT_TRUE(resample->Init(*resamplePara) == Status::OK);
53     ASSERT_TRUE(resample->Convert(src, srcLength, des, desLength) == Status::OK);
54     resamplePara->destFmt = AVSampleFormat::AV_SAMPLE_FMT_U8P;
55     ASSERT_TRUE(resample->Init(*resamplePara) == Status::OK);
56     ASSERT_TRUE(resample->Convert(src, srcLength, des, desLength) == Status::OK);
57 
58     resamplePara->bitsPerSample = 8;
59     ASSERT_TRUE(resample->Init(*resamplePara) == Status::OK);
60     ASSERT_FALSE(resample->Convert(src, srcLength, des, desLength) == Status::OK);
61 
62     resamplePara->bitsPerSample = 24;
63     ASSERT_TRUE(resample->Init(*resamplePara) == Status::OK);
64     ASSERT_FALSE(resample->Convert(src, srcLength, des, desLength) == Status::OK);
65 }
66 
67 HWTEST(TestPluginSetting, find_unavailable_plugins, TestSize.Level1)
68 {
69     Meta meta;
70     std::string artist("unit test");
71     meta.Set<Tag::MEDIA_TITLE>(artist);
72     auto capability = MetaToCapability(meta);
73     auto plugins = FindAvailablePlugins(*capability, Plugin::PluginType::AUDIO_DECODER);
74     ASSERT_TRUE(plugins.size() == 0);
75 }
76 
77 HWTEST(TestPluginSetting, hdf_status_to_string, TestSize.Level1)
78 {
79     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_PUBLISH_FAIL) != "null");
80     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_ATTACHDEV_FAIL) != "null");
81     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_NODATA) != "null");
82     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_NORANGE) != "null");
83     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_OP) != "null");
84     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_SUCCESS) != "null");
85     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_FAILURE) != "null");
86     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_NOT_SUPPORT) != "null");
87     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_INVALID_PARAM) != "null");
88     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_INVALID_OBJECT) != "null");
89     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_MALLOC_FAIL) != "null");
90     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_TIMEOUT) != "null");
91     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_THREAD_CREATE_FAIL) != "null");
92     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_QUEUE_FULL) != "null");
93     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_DEVICE_BUSY) != "null");
94     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_IO) != "null");
95     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_PAL_ERR_INNER) != "null");
96     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_NO_MEMORY) != "null");
97     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_NO_DEVICE) != "null");
98     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_NO_DEVICE_SERVICE) != "null");
99     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_DEV_ERR_DEV_INIT_FAIL) != "null");
100     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_BAD_FD) != "null");
101     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_NOPERM) != "null");
102     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_BSP_ERR_OP) != "null");
103     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_ERR_BSP_PLT_API_ERR) != "null");
104     ASSERT_TRUE(HdfStatus2String(HDF_STATUS::HDF_PAL_ERR_DEV_CREATE) != "null");
105     ASSERT_TRUE(HdfStatus2String(100) == "null");
106 }
107 
108 HWTEST(TestPluginSetting, omx_error_type_to_string, TestSize.Level1)
109 {
110     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorNone) == "OMX_ErrorNone");
111     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorUndefined) == "OMX_ErrorUndefined");
112     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorInsufficientResources) == "OMX_ErrorInsufficientResources");
113     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorInvalidComponent) == "OMX_ErrorInvalidComponent");
114     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorBadParameter) == "OMX_ErrorBadParameter");
115     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorNotImplemented) == "OMX_ErrorNotImplemented");
116     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorInvalidComponentName) == "OMX_ErrorInvalidComponentName");
117     ASSERT_TRUE(OmxErrorType2String(OMX_ErrorComponentNotFound) == "OMX_ErrorComponentNotFound");
118     ASSERT_TRUE(OmxErrorType2String(100) == "OMX_ErrorNone");
119 }
120 
121 HWTEST(TestPluginSetting, translate_to_omx_flag_set, TestSize.Level1)
122 {
123     ASSERT_TRUE(Translate2omxFlagSet(BUFFER_FLAG_EOS) == OMX_BUFFERFLAG_EOS);
124     ASSERT_TRUE(Translate2PluginFlagSet(OMX_BUFFERFLAG_EOS) == BUFFER_FLAG_EOS);
125     ASSERT_TRUE(Translate2omxFlagSet(100) == 0);
126     ASSERT_TRUE(Translate2PluginFlagSet(100) == 0);
127 }
128 
129 HWTEST(TestPluginSetting, transfor_hdi_ret_value_to_status, TestSize.Level1)
130 {
131     ASSERT_TRUE(TransHdiRetVal2Status(HDF_SUCCESS) == Status::OK);
132     ASSERT_TRUE(TransHdiRetVal2Status(HDF_FAILURE) == Status::ERROR_UNKNOWN);
133     ASSERT_TRUE(TransHdiRetVal2Status(HDF_ERR_NOT_SUPPORT) == Status::ERROR_INVALID_OPERATION);
134     ASSERT_TRUE(TransHdiRetVal2Status(HDF_ERR_INVALID_PARAM) == Status::ERROR_INVALID_PARAMETER);
135     ASSERT_TRUE(TransHdiRetVal2Status(HDF_ERR_MALLOC_FAIL) == Status::ERROR_NO_MEMORY);
136     ASSERT_TRUE(TransHdiRetVal2Status(100) == Status::ERROR_UNKNOWN);
137 }
138 
139 HWTEST(TestPluginSetting, omx_state_to_string, TestSize.Level1)
140 {
141     ASSERT_TRUE(OmxStateToString(OMX_StateLoaded) == "OMX_StateLoaded");
142     ASSERT_TRUE(OmxStateToString(OMX_StateIdle) == "OMX_StateIdle");
143     ASSERT_TRUE(OmxStateToString(OMX_StateExecuting) == "OMX_StateExecuting");
144     ASSERT_TRUE(OmxStateToString(OMX_StatePause) == "OMX_StatePause");
145     ASSERT_TRUE(OmxStateToString(OMX_StateInvalid) == "OMX_StateInvalid");
146     ASSERT_TRUE(OmxStateToString(OMX_StateLoaded) == "OMX_StateLoaded");
147     ASSERT_TRUE(OmxStateToString(OMX_StateKhronosExtensions) == "OMX_StateKhronosExtensions");
148     ASSERT_TRUE(OmxStateToString(OMX_StateVendorStartUnused) == "OMX_StateVendorStartUnused");
149     ASSERT_TRUE(OmxStateToString(OMX_StateWaitForResources) == "OMX_StateWaitForResources");
150     ASSERT_TRUE(OmxStateToString(OMX_StateMax) == "OMX_StateMax");
151 }
152 
153 HWTEST(TestPluginSetting, coding_type_hst_to_hdi, TestSize.Level1)
154 {
155     ASSERT_TRUE(CodingTypeHstToHdi(MEDIA_MIME_VIDEO_H264) == OMX_VIDEO_CodingAVC);
156     ASSERT_TRUE(CodingTypeHstToHdi("NULL") == OMX_VIDEO_CodingUnused);
157     ASSERT_TRUE(CodingTypeHstToHdi(MEDIA_MIME_VIDEO_H265)
158                 == static_cast<OMX_VIDEO_CODINGTYPE>(CODEC_OMX_VIDEO_CodingHEVC));
159 }
160 
161 HWTEST(TestPluginSetting, format_hst_to_omx, TestSize.Level1)
162 {
163     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::NV12) == OMX_COLOR_FormatYUV420SemiPlanar);
164     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::NV21) == OMX_COLOR_FormatYUV420SemiPlanar);
165     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::BGRA) == OMX_COLOR_Format32bitBGRA8888);
166     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::RGBA) == OMX_COLOR_Format32bitARGB8888);
167     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::YUV420P) == OMX_COLOR_FormatYUV420Planar);
168     ASSERT_TRUE(FormatHstToOmx(VideoPixelFormat::RGB24) == OMX_COLOR_FormatUnused);
169 }
170 
171 HWTEST(TestPluginSetting, get_omx_buffer_type, TestSize.Level1)
172 {
173     ASSERT_TRUE(GetOmxBufferType(static_cast<const Plugin::MemoryType>(MemoryType::SHARE_MEMORY), true)
174                 == CODEC_BUFFER_TYPE_AVSHARE_MEM_FD);
175     ASSERT_TRUE(GetOmxBufferType(static_cast<const Plugin::MemoryType>(MemoryType::VIRTUAL_ADDR), true)
176                 == CODEC_BUFFER_TYPE_INVALID);
177 }
178 
179 HWTEST(TestPluginSetting, assign_parameter_if_match, TestSize.Level1)
180 {
181     uint32_t value = 0;
182     uint32_t ret;
183     ASSERT_FALSE(AssignParameterIfMatch(Tag::SECTION_REGULAR_START, ret, value));
184     ASSERT_FALSE(AssignParameterIfMatch(Tag::MIME, value, 0));
185     ASSERT_TRUE(AssignParameterIfMatch(Tag::TRACK_ID, ret, value));
186 }
187 
188 HWTEST(TestPluginSetting, codec_buffer_pool, TestSize.Level1)
189 {
190     PluginParaAllowedMap allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::MEDIA_SOURCE);
191     ASSERT_TRUE(allowedMap.size() == 0);
192     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::AUDIO_DECODER);
193     ASSERT_TRUE(allowedMap.size() > 0);
194     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::VIDEO_DECODER);
195     ASSERT_TRUE(allowedMap.size() > 0);
196     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::AUDIO_ENCODER);
197     ASSERT_TRUE(allowedMap.size() > 0);
198     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::VIDEO_ENCODER);
199     ASSERT_TRUE(allowedMap.size() > 0);
200     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::CAPTURE_SOURCE);
201     ASSERT_TRUE(allowedMap.size() == 0);
202     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::DEMUXER);
203     ASSERT_TRUE(allowedMap.size() == 0);
204     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::MUXER);
205     ASSERT_TRUE(allowedMap.size() > 0);
206     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::AUDIO_SINK);
207     ASSERT_TRUE(allowedMap.size() > 0);
208     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::VIDEO_SINK);
209     ASSERT_TRUE(allowedMap.size() > 0);
210     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::OUTPUT_SINK);
211     ASSERT_TRUE(allowedMap.size() == 0);
212     allowedMap = PluginParameterTable::FindAllowedParameterMap(FilterType::NONE);
213     ASSERT_TRUE(allowedMap.size() == 0);
214 }
215 
216 HWTEST(TestPluginSetting, translate_plugin_status, TestSize.Level1)
217 {
218     auto status = TranslatePluginStatus(Plugin::Status::END_OF_STREAM);
219     ASSERT_TRUE(status == ErrorCode::END_OF_STREAM);
220     status = TranslatePluginStatus(Plugin::Status::OK);
221     ASSERT_TRUE(status == ErrorCode::SUCCESS);
222     status = TranslatePluginStatus(Plugin::Status::NO_ERROR);
223     ASSERT_TRUE(status == ErrorCode::SUCCESS);
224     status = TranslatePluginStatus(Plugin::Status::ERROR_UNKNOWN);
225     ASSERT_TRUE(status == ErrorCode::ERROR_UNKNOWN);
226     status = TranslatePluginStatus(Plugin::Status::ERROR_CLIENT);
227     ASSERT_TRUE(status == ErrorCode::ERROR_UNKNOWN);
228 }
229 
230 HWTEST(TestPluginSetting, find_allowed_parameter_map, TestSize.Level1)
231 {
232     FilterType filterType = FilterType::NONE;
233     PluginParaAllowedMap allowedMap = PluginParameterTable::FindAllowedParameterMap(filterType);
234     ASSERT_TRUE(allowedMap.size() == 0);
235     filterType = FilterType::AUDIO_DECODER;
236     allowedMap = PluginParameterTable::FindAllowedParameterMap(filterType);
237     ASSERT_TRUE(allowedMap.size() != 0);
238 }
239 
240 HWTEST(TestPluginSetting, translate_into_parameter, TestSize.Level1)
241 {
242     Tag tag = Tag::SECTION_REGULAR_START;
243     auto ret = TranslateIntoParameter(-1, tag);
244     ASSERT_FALSE(ret);
245     ASSERT_TRUE(tag == Tag::SECTION_REGULAR_START);
246     ret = TranslateIntoParameter(static_cast<const int>(Tag::SECTION_REGULAR_START), tag);
247     ASSERT_TRUE(ret);
248     ASSERT_TRUE(tag == Tag::SECTION_REGULAR_START);
249 }
250 
251 HWTEST(TestPluginSetting, capability_to_string, TestSize.Level1)
252 {
253     std::shared_ptr<Capability> capability = std::make_shared<Capability>();
254     std::string string = Capability2String(*capability);
255     ASSERT_TRUE(string == "Capability{mime:}");
256     capability->SetMime("video/avc");
257     capability->AppendFixedKey(Capability::Key::MEDIA_BITRATE, nullptr);
258     capability->AppendFixedKey(Capability::Key::VIDEO_BIT_STREAM_FORMAT, nullptr);
259     string = Capability2String(*capability);
260     ASSERT_TRUE(string == "Capability{mime:video/avc, ");
261 }
262 } // namespace Test
263 } // namespace Media
264 } // namespace OHOS
265