1 /* 2 * Copyright (c) 2021-2021 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 18 #define private public 19 #define protected public 20 #define UNIT_TEST 1 21 #include "foundation/utils/constants.h" 22 #include "pipeline/core/compatible_check.h" 23 #include "plugin/common/any.h" 24 #include "plugin/common/plugin_audio_tags.h" 25 #include "plugin/common/plugin_meta.h" 26 27 using namespace testing::ext; 28 29 using namespace std; 30 using namespace OHOS::Media::Plugin; 31 32 namespace OHOS::Media::Test { 33 HWTEST(TestApplyCapability, mime_Test, TestSize.Level1) 34 { 35 Capability wildcard {"*"}; 36 Capability audioWildcard {"audio/*"}; 37 Capability testWildcard {"test/*"}; 38 Capability wrongWildcard {"/audio*"}; 39 Capability wrongCapability {"wrong"}; 40 Capability rawMimeCapability {"audio/raw"}; 41 Capability mpegMimeCapability {"audio/mpeg"}; 42 43 Capability out; 44 ASSERT_TRUE(Pipeline::MergeCapability(audioWildcard, wildcard, out)); 45 ASSERT_TRUE(out.mime == audioWildcard.mime); 46 ASSERT_TRUE(out.keys.empty()); 47 48 ASSERT_FALSE(Pipeline::MergeCapability(wrongWildcard, wildcard, out)); 49 ASSERT_TRUE(out.mime.empty()); 50 ASSERT_TRUE(out.keys.empty()); 51 52 ASSERT_FALSE(Pipeline::MergeCapability(wrongCapability, wildcard, out)); 53 ASSERT_TRUE(out.mime.empty()); 54 ASSERT_TRUE(out.keys.empty()); 55 56 ASSERT_FALSE(Pipeline::MergeCapability(wrongCapability, audioWildcard, out)); 57 ASSERT_TRUE(out.mime.empty()); 58 ASSERT_TRUE(out.keys.empty()); 59 60 61 ASSERT_TRUE(Pipeline::MergeCapability(rawMimeCapability, wildcard, out)); 62 ASSERT_TRUE(out.mime == rawMimeCapability.mime); 63 ASSERT_TRUE(out.keys.empty()); 64 65 ASSERT_TRUE(Pipeline::MergeCapability(rawMimeCapability, audioWildcard, out)); 66 ASSERT_TRUE(out.mime == rawMimeCapability.mime); 67 ASSERT_TRUE(out.keys.empty()); 68 69 ASSERT_FALSE(Pipeline::MergeCapability(rawMimeCapability, testWildcard, out)); 70 ASSERT_TRUE(out.mime.empty()); 71 ASSERT_TRUE(out.keys.empty()); 72 73 ASSERT_FALSE(Pipeline::MergeCapability(rawMimeCapability, mpegMimeCapability, out)); 74 ASSERT_TRUE(out.mime.empty()); 75 ASSERT_TRUE(out.keys.empty()); 76 77 ASSERT_FALSE(Pipeline::MergeCapability(rawMimeCapability, wrongWildcard, out)); 78 ASSERT_TRUE(out.mime.empty()); 79 ASSERT_TRUE(out.keys.empty()); 80 } 81 82 HWTEST(TestMergeCapabilityKeys, SingleType_Test, TestSize.Level1) 83 { 84 Capability wildMimeCapability("*"); 85 Capability out; 86 87 Capability rawFixedMimeCapability (MEDIA_MIME_AUDIO_RAW); 88 rawFixedMimeCapability.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 89 90 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability, wildMimeCapability, out)); 91 ASSERT_TRUE(out.mime.empty()); 92 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 93 94 Capability rawFixedMimeCapability2 (MEDIA_MIME_AUDIO_MPEG); 95 rawFixedMimeCapability2.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 96 97 // fix apply with fix 98 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability, rawFixedMimeCapability2, out)); 99 ASSERT_TRUE(out.mime.empty()); 100 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 101 102 // apply failed 103 Capability rawFixedMimeCapability3 (MEDIA_MIME_AUDIO_RAW); 104 rawFixedMimeCapability3.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 105 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability, rawFixedMimeCapability3, out)); 106 ASSERT_TRUE(out.mime.empty()); 107 ASSERT_TRUE(out.keys.empty()); 108 109 Capability rawListMimeCapability {MEDIA_MIME_AUDIO_RAW}; 110 rawListMimeCapability.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {8000, 32000, 48000, 44100}); 111 112 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawListMimeCapability, wildMimeCapability, out)); 113 ASSERT_TRUE(out.mime.empty()); 114 auto disCaps = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 115 ASSERT_TRUE(disCaps[0] == 8000); 116 ASSERT_TRUE(disCaps[1] == 32000); 117 ASSERT_TRUE(disCaps[2] == 48000); 118 ASSERT_TRUE(disCaps[3] == 44100); 119 120 // fix apply with discrete 121 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability, rawListMimeCapability, out)); 122 ASSERT_TRUE(out.mime.empty()); 123 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 124 125 // apply failed 126 Capability rawFixedMimeCapability4 (MEDIA_MIME_AUDIO_RAW); 127 rawFixedMimeCapability4.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 128 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability4, rawListMimeCapability, out)); 129 ASSERT_TRUE(out.mime.empty()); 130 ASSERT_TRUE(out.keys.empty()); 131 132 // discrete apply with discrete 133 Capability rawListMimeCapability2 {MEDIA_MIME_AUDIO_RAW}; 134 rawListMimeCapability2.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 48000, 44100}); 135 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawListMimeCapability2, rawListMimeCapability, out)); 136 ASSERT_TRUE(out.mime.empty()); 137 auto tmp1 = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 138 ASSERT_TRUE(tmp1.size() == 2); 139 ASSERT_TRUE(tmp1[0] == 48000); 140 ASSERT_TRUE(tmp1[1] == 44100); 141 142 // discrete apply with discrete 143 Capability rawListMimeCapability3 {MEDIA_MIME_AUDIO_RAW}; 144 rawListMimeCapability3.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 44100}); 145 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawListMimeCapability3, rawListMimeCapability, out)); 146 ASSERT_TRUE(out.mime.empty()); 147 auto tmp2 = Plugin::AnyCast<Plugin::FixedCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 148 ASSERT_TRUE(tmp2 == 44100); 149 150 // discrete apply with discrete failed 151 Capability rawListMimeCapability4 {MEDIA_MIME_AUDIO_RAW}; 152 rawListMimeCapability4.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 4100}); 153 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawListMimeCapability4, rawListMimeCapability, out)); 154 ASSERT_TRUE(out.mime.empty()); 155 ASSERT_TRUE(out.keys.empty()); 156 157 Capability rawIntervalMimeCapability {MEDIA_MIME_AUDIO_RAW}; 158 rawIntervalMimeCapability.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 48000); 159 160 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, wildMimeCapability, out)); 161 ASSERT_TRUE(out.mime.empty()); 162 auto intCaps = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 163 ASSERT_TRUE(intCaps.first == 8000); 164 ASSERT_TRUE(intCaps.second == 48000); 165 166 // inter apply with fix 167 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability, rawIntervalMimeCapability, out)); 168 ASSERT_TRUE(out.mime.empty()); 169 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 170 171 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, rawFixedMimeCapability, out)); 172 ASSERT_TRUE(out.mime.empty()); 173 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 174 175 Capability rawFixedMimeCapability5 (MEDIA_MIME_AUDIO_RAW); 176 rawFixedMimeCapability5.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 177 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawFixedMimeCapability5, rawIntervalMimeCapability, out)); 178 ASSERT_TRUE(out.mime.empty()); 179 ASSERT_TRUE(out.keys.empty()); 180 181 // inter apply with inter 182 Capability rawIntervalMimeCapability2 {MEDIA_MIME_AUDIO_RAW}; 183 rawIntervalMimeCapability2.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 3000, 9000); 184 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability2, rawIntervalMimeCapability, out)); 185 ASSERT_TRUE(out.mime.empty()); 186 auto intCaps2 = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 187 ASSERT_TRUE(intCaps2.first == 8000); 188 ASSERT_TRUE(intCaps2.second == 9000); 189 190 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, rawIntervalMimeCapability2, out)); 191 ASSERT_TRUE(out.mime.empty()); 192 auto intCaps3 = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 193 ASSERT_TRUE(intCaps3.first == 8000); 194 ASSERT_TRUE(intCaps3.second == 9000); 195 196 Capability rawIntervalMimeCapability3 {MEDIA_MIME_AUDIO_RAW}; 197 rawIntervalMimeCapability3.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 3000, 4000); 198 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability3, rawIntervalMimeCapability, out)); 199 ASSERT_TRUE(out.mime.empty()); 200 ASSERT_TRUE(out.keys.empty()); 201 202 // inter apply with discrete 203 Capability rawListMimeCapability5 {MEDIA_MIME_AUDIO_RAW}; 204 rawListMimeCapability5.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 4100}); 205 ASSERT_FALSE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, rawListMimeCapability5, out)); 206 ASSERT_TRUE(out.mime.empty()); 207 ASSERT_TRUE(out.keys.empty()); 208 209 Capability rawListMimeCapability6 {MEDIA_MIME_AUDIO_RAW}; 210 rawListMimeCapability6.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 44100}); 211 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, rawListMimeCapability6, out)); 212 ASSERT_TRUE(out.mime.empty()); 213 auto intCaps4 = Plugin::AnyCast<Plugin::FixedCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 214 ASSERT_TRUE(intCaps4 == 44100); 215 216 Capability rawListMimeCapability7 {MEDIA_MIME_AUDIO_RAW}; 217 rawListMimeCapability7.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 40000, 44100}); 218 ASSERT_TRUE(Pipeline::MergeCapabilityKeys(rawIntervalMimeCapability, rawListMimeCapability7, out)); 219 ASSERT_TRUE(out.mime.empty()); 220 auto intCaps5 = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 221 ASSERT_TRUE(intCaps5.size() == 2); 222 ASSERT_TRUE(intCaps5[0] == 40000); 223 ASSERT_TRUE(intCaps5[1] == 44100); 224 } 225 226 HWTEST(TestMergeCapability, SingleType_Test, TestSize.Level1) 227 { 228 Capability wildMimeCapability("*"); 229 Capability out; 230 231 Capability rawFixedMimeCapability (MEDIA_MIME_AUDIO_RAW); 232 rawFixedMimeCapability.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 233 234 ASSERT_TRUE(Pipeline::MergeCapability(rawFixedMimeCapability, wildMimeCapability, out)); 235 ASSERT_TRUE(out.mime == rawFixedMimeCapability.mime); 236 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 237 238 Capability rawFixedMimeCapability2 (MEDIA_MIME_AUDIO_RAW); 239 rawFixedMimeCapability2.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 240 241 // fix apply with fix 242 ASSERT_TRUE(Pipeline::MergeCapability(rawFixedMimeCapability, rawFixedMimeCapability2, out)); 243 ASSERT_TRUE(out.mime == rawFixedMimeCapability.mime); 244 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 245 246 // apply failed 247 Capability rawFixedMimeCapability3 (MEDIA_MIME_AUDIO_RAW); 248 rawFixedMimeCapability3.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 249 ASSERT_FALSE(Pipeline::MergeCapability(rawFixedMimeCapability, rawFixedMimeCapability3, out)); 250 ASSERT_TRUE(out.mime.empty()); 251 ASSERT_TRUE(out.keys.empty()); 252 253 Capability rawListMimeCapability {MEDIA_MIME_AUDIO_RAW}; 254 rawListMimeCapability.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {8000, 32000, 48000, 44100}); 255 256 ASSERT_TRUE(Pipeline::MergeCapability(rawListMimeCapability, wildMimeCapability, out)); 257 ASSERT_TRUE(out.mime == rawListMimeCapability.mime); 258 auto disCaps = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 259 ASSERT_TRUE(disCaps[0] == 8000); 260 ASSERT_TRUE(disCaps[1] == 32000); 261 ASSERT_TRUE(disCaps[2] == 48000); 262 ASSERT_TRUE(disCaps[3] == 44100); 263 264 // fix apply with discrete 265 ASSERT_TRUE(Pipeline::MergeCapability(rawFixedMimeCapability, rawListMimeCapability, out)); 266 ASSERT_TRUE(out.mime == rawFixedMimeCapability.mime); 267 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 268 269 // apply failed 270 Capability rawFixedMimeCapability4 (MEDIA_MIME_AUDIO_RAW); 271 rawFixedMimeCapability4.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 272 ASSERT_FALSE(Pipeline::MergeCapability(rawFixedMimeCapability4, rawListMimeCapability, out)); 273 ASSERT_TRUE(out.mime.empty()); 274 ASSERT_TRUE(out.keys.empty()); 275 276 // discrete apply with discrete 277 Capability rawListMimeCapability2 {MEDIA_MIME_AUDIO_RAW}; 278 rawListMimeCapability2.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 48000, 44100}); 279 ASSERT_TRUE(Pipeline::MergeCapability(rawListMimeCapability2, rawListMimeCapability, out)); 280 ASSERT_TRUE(out.mime == rawListMimeCapability2.mime); 281 auto tmp1 = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 282 ASSERT_TRUE(tmp1.size() == 2); 283 ASSERT_TRUE(tmp1[0] == 48000); 284 ASSERT_TRUE(tmp1[1] == 44100); 285 286 // discrete apply with discrete 287 Capability rawListMimeCapability3 {MEDIA_MIME_AUDIO_RAW}; 288 rawListMimeCapability3.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 44100}); 289 ASSERT_TRUE(Pipeline::MergeCapability(rawListMimeCapability3, rawListMimeCapability, out)); 290 ASSERT_TRUE(out.mime == rawListMimeCapability3.mime); 291 auto tmp2 = Plugin::AnyCast<Plugin::FixedCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 292 ASSERT_TRUE(tmp2 == 44100); 293 294 // discrete apply with discrete failed 295 Capability rawListMimeCapability4 {MEDIA_MIME_AUDIO_RAW}; 296 rawListMimeCapability4.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 4100}); 297 ASSERT_FALSE(Pipeline::MergeCapability(rawListMimeCapability4, rawListMimeCapability, out)); 298 ASSERT_TRUE(out.mime.empty()); 299 ASSERT_TRUE(out.keys.empty()); 300 301 Capability rawIntervalMimeCapability {MEDIA_MIME_AUDIO_RAW}; 302 rawIntervalMimeCapability.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 48000); 303 304 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability, wildMimeCapability, out)); 305 ASSERT_TRUE(out.mime == rawIntervalMimeCapability.mime); 306 auto intCaps = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 307 ASSERT_TRUE(intCaps.first == 8000); 308 ASSERT_TRUE(intCaps.second == 48000); 309 310 // inter apply with fix 311 ASSERT_TRUE(Pipeline::MergeCapability(rawFixedMimeCapability, rawIntervalMimeCapability, out)); 312 ASSERT_TRUE(out.mime == rawFixedMimeCapability.mime); 313 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 314 315 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability, rawFixedMimeCapability, out)); 316 ASSERT_TRUE(out.mime == rawIntervalMimeCapability.mime); 317 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 318 319 Capability rawFixedMimeCapability5 (MEDIA_MIME_AUDIO_RAW); 320 rawFixedMimeCapability5.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 4000); 321 ASSERT_FALSE(Pipeline::MergeCapability(rawFixedMimeCapability5, rawIntervalMimeCapability, out)); 322 ASSERT_TRUE(out.mime.empty()); 323 ASSERT_TRUE(out.keys.empty()); 324 325 // inter apply with inter 326 Capability rawIntervalMimeCapability2 {MEDIA_MIME_AUDIO_RAW}; 327 rawIntervalMimeCapability2.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 3000, 9000); 328 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability2, rawIntervalMimeCapability, out)); 329 ASSERT_TRUE(out.mime == rawIntervalMimeCapability2.mime); 330 auto intCaps2 = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 331 ASSERT_TRUE(intCaps2.first == 8000); 332 ASSERT_TRUE(intCaps2.second == 9000); 333 334 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability, rawIntervalMimeCapability2, out)); 335 ASSERT_TRUE(out.mime == rawIntervalMimeCapability.mime); 336 auto intCaps3 = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 337 ASSERT_TRUE(intCaps3.first == 8000); 338 ASSERT_TRUE(intCaps3.second == 9000); 339 340 Capability rawIntervalMimeCapability3 {MEDIA_MIME_AUDIO_RAW}; 341 rawIntervalMimeCapability3.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 3000, 4000); 342 ASSERT_FALSE(Pipeline::MergeCapability(rawIntervalMimeCapability3, rawIntervalMimeCapability, out)); 343 ASSERT_TRUE(out.mime.empty()); 344 ASSERT_TRUE(out.keys.empty()); 345 346 // inter apply with discrete 347 Capability rawListMimeCapability5 {MEDIA_MIME_AUDIO_RAW}; 348 rawListMimeCapability5.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 4100}); 349 ASSERT_FALSE(Pipeline::MergeCapability(rawIntervalMimeCapability, rawListMimeCapability5, out)); 350 ASSERT_TRUE(out.mime.empty()); 351 ASSERT_TRUE(out.keys.empty()); 352 353 Capability rawListMimeCapability6 {MEDIA_MIME_AUDIO_RAW}; 354 rawListMimeCapability6.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 4000, 44100}); 355 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability, rawListMimeCapability6, out)); 356 ASSERT_TRUE(out.mime == rawIntervalMimeCapability.mime); 357 auto intCaps4 = Plugin::AnyCast<Plugin::FixedCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 358 ASSERT_TRUE(intCaps4 == 44100); 359 360 Capability rawListMimeCapability7 {MEDIA_MIME_AUDIO_RAW}; 361 rawListMimeCapability7.AppendDiscreteKeys<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, {1000, 2000, 40000, 44100}); 362 ASSERT_TRUE(Pipeline::MergeCapability(rawIntervalMimeCapability, rawListMimeCapability7, out)); 363 ASSERT_TRUE(out.mime == rawIntervalMimeCapability.mime); 364 auto intCaps5 = Plugin::AnyCast<Plugin::DiscreteCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]); 365 ASSERT_TRUE(intCaps5.size() == 2); 366 ASSERT_TRUE(intCaps5[0] == 40000); 367 ASSERT_TRUE(intCaps5[1] == 44100); 368 } 369 370 HWTEST(TestMergeCapability, ComplexType_Test, TestSize.Level1) 371 { 372 Capability wildMimeCapability("*"); 373 Capability out; 374 375 Capability cap1 (MEDIA_MIME_AUDIO_RAW); 376 cap1.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 377 cap1.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 2, 8); 378 cap1.AppendDiscreteKeys<Plugin::AudioSampleFormat>(CapabilityID::AUDIO_SAMPLE_FORMAT, { 379 Plugin::AudioSampleFormat::S64, Plugin::AudioSampleFormat::S64P, Plugin::AudioSampleFormat::U64, 380 Plugin::AudioSampleFormat::U64P, Plugin::AudioSampleFormat::F64, 381 }); 382 383 Capability cap2(MEDIA_MIME_AUDIO_APE); 384 385 ASSERT_FALSE(Pipeline::MergeCapability(cap1, cap2, out)); 386 ASSERT_TRUE(out.mime.empty()); 387 ASSERT_TRUE(out.keys.empty()); 388 389 Capability cap3(MEDIA_MIME_AUDIO_RAW); 390 ASSERT_TRUE(Pipeline::MergeCapability(cap1, cap3, out)); 391 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 392 auto intCaps = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_CHANNELS]); 393 ASSERT_TRUE(intCaps.first == 2); 394 ASSERT_TRUE(intCaps.second == 8); 395 auto disCaps = Plugin::AnyCast<Plugin::DiscreteCapability<Plugin::AudioSampleFormat>>( 396 out.keys[CapabilityID::AUDIO_SAMPLE_FORMAT]); 397 ASSERT_TRUE(disCaps.size() == 5); 398 ASSERT_TRUE(disCaps[0] == Plugin::AudioSampleFormat::S64); 399 ASSERT_TRUE(disCaps[1] == Plugin::AudioSampleFormat::S64P); 400 ASSERT_TRUE(disCaps[2] == Plugin::AudioSampleFormat::U64); 401 ASSERT_TRUE(disCaps[3] == Plugin::AudioSampleFormat::U64P); 402 ASSERT_TRUE(disCaps[4] == Plugin::AudioSampleFormat::F64); 403 404 Capability cap4(MEDIA_MIME_AUDIO_RAW); 405 cap4.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 96000); 406 cap4.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 4); 407 cap4.AppendDiscreteKeys<Plugin::AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, { 408 Plugin::AudioChannelLayout::STEREO, Plugin::AudioChannelLayout::SURROUND, 409 Plugin::AudioChannelLayout::CH_5POINT1, Plugin::AudioChannelLayout::CH_7POINT1, 410 }); 411 ASSERT_TRUE(Pipeline::MergeCapability(cap1, cap4, out)); 412 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 413 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_CHANNELS]) == 4); 414 auto disCaps1 = Plugin::AnyCast<Plugin::DiscreteCapability<Plugin::AudioSampleFormat>>( 415 out.keys[CapabilityID::AUDIO_SAMPLE_FORMAT]); 416 ASSERT_TRUE(disCaps.size() == 5); 417 ASSERT_TRUE(disCaps[0] == Plugin::AudioSampleFormat::S64); 418 ASSERT_TRUE(disCaps[1] == Plugin::AudioSampleFormat::S64P); 419 ASSERT_TRUE(disCaps[2] == Plugin::AudioSampleFormat::U64); 420 ASSERT_TRUE(disCaps[3] == Plugin::AudioSampleFormat::U64P); 421 ASSERT_TRUE(disCaps[4] == Plugin::AudioSampleFormat::F64); 422 auto intCaps1 = Plugin::AnyCast<Plugin::DiscreteCapability<Plugin::AudioChannelLayout>>( 423 out.keys[CapabilityID::AUDIO_CHANNEL_LAYOUT]); 424 ASSERT_TRUE(intCaps1.size() == 4); 425 ASSERT_TRUE(intCaps1[0] == Plugin::AudioChannelLayout::STEREO); 426 ASSERT_TRUE(intCaps1[1] == Plugin::AudioChannelLayout::SURROUND); 427 ASSERT_TRUE(intCaps1[2] == Plugin::AudioChannelLayout::CH_5POINT1); 428 ASSERT_TRUE(intCaps1[3] == Plugin::AudioChannelLayout::CH_7POINT1); 429 430 Capability cap5(MEDIA_MIME_AUDIO_RAW); 431 cap5.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 96000); 432 cap5.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 10); 433 cap5.AppendDiscreteKeys<Plugin::AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, { 434 Plugin::AudioChannelLayout::STEREO, Plugin::AudioChannelLayout::SURROUND, 435 Plugin::AudioChannelLayout::CH_5POINT1, Plugin::AudioChannelLayout::CH_7POINT1, 436 }); 437 ASSERT_FALSE(Pipeline::MergeCapability(cap1, cap5, out)); 438 ASSERT_TRUE(out.mime.empty()); 439 ASSERT_TRUE(out.keys.empty()); 440 } 441 442 HWTEST(TestApplyCapabilitySet, ComplexType_Test, TestSize.Level1) 443 { 444 Capability out; 445 446 Capability cap1 (MEDIA_MIME_AUDIO_RAW); 447 cap1.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000); 448 cap1.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 2, 8); 449 cap1.AppendDiscreteKeys<Plugin::AudioSampleFormat>(CapabilityID::AUDIO_SAMPLE_FORMAT, { 450 Plugin::AudioSampleFormat::S64, Plugin::AudioSampleFormat::S64P, Plugin::AudioSampleFormat::U64, 451 Plugin::AudioSampleFormat::U64P, Plugin::AudioSampleFormat::F64, 452 }); 453 454 Capability cap2(MEDIA_MIME_AUDIO_APE); 455 Capability cap3(MEDIA_MIME_AUDIO_RAW); 456 457 Capability cap4(MEDIA_MIME_AUDIO_RAW); 458 cap4.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 96000); 459 cap4.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 4); 460 cap4.AppendDiscreteKeys<Plugin::AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, { 461 Plugin::AudioChannelLayout::STEREO, Plugin::AudioChannelLayout::SURROUND, 462 Plugin::AudioChannelLayout::CH_5POINT1, Plugin::AudioChannelLayout::CH_7POINT1, 463 }); 464 465 Capability cap5(MEDIA_MIME_AUDIO_RAW); 466 cap5.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 8000, 96000); 467 cap5.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 10); 468 cap5.AppendDiscreteKeys<Plugin::AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, { 469 Plugin::AudioChannelLayout::STEREO, Plugin::AudioChannelLayout::SURROUND, 470 Plugin::AudioChannelLayout::CH_5POINT1, Plugin::AudioChannelLayout::CH_7POINT1, 471 }); 472 473 CapabilitySet capSet1 = {cap2, cap3}; 474 ASSERT_TRUE(Pipeline::ApplyCapabilitySet(cap1, capSet1, out)); 475 ASSERT_TRUE(Plugin::AnyCast<uint32_t>(out.keys[CapabilityID::AUDIO_SAMPLE_RATE]) == 8000); 476 auto intCaps = Plugin::AnyCast<Plugin::IntervalCapability<uint32_t>>(out.keys[CapabilityID::AUDIO_CHANNELS]); 477 ASSERT_TRUE(intCaps.first == 2); 478 ASSERT_TRUE(intCaps.second == 8); 479 auto disCaps = Plugin::AnyCast<Plugin::DiscreteCapability<Plugin::AudioSampleFormat>>( 480 out.keys[CapabilityID::AUDIO_SAMPLE_FORMAT]); 481 ASSERT_TRUE(disCaps.size() == 5); 482 ASSERT_TRUE(disCaps[0] == Plugin::AudioSampleFormat::S64); 483 ASSERT_TRUE(disCaps[1] == Plugin::AudioSampleFormat::S64P); 484 ASSERT_TRUE(disCaps[2] == Plugin::AudioSampleFormat::U64); 485 ASSERT_TRUE(disCaps[3] == Plugin::AudioSampleFormat::U64P); 486 ASSERT_TRUE(disCaps[4] == Plugin::AudioSampleFormat::F64); 487 488 CapabilitySet capSet2 = {cap2, cap5}; 489 ASSERT_FALSE(Pipeline::ApplyCapabilitySet(cap1, capSet2, out)); 490 ASSERT_TRUE(out.mime.empty()); 491 ASSERT_TRUE(out.keys.empty()); 492 } 493 494 HWTEST(TestMetaToCap, MetaToCap_Test, TestSize.Level1) 495 { 496 Meta meta; 497 meta.Set<Plugin::Tag::MIME>(MEDIA_MIME_AUDIO_RAW); 498 meta.Set<Plugin::Tag::AUDIO_MPEG_VERSION>(1); 499 meta.Set<Tag::AUDIO_CHANNEL_LAYOUT>(AudioChannelLayout::STEREO); 500 meta.Set<Plugin::Tag::AUDIO_CHANNELS>(2); 501 meta.Set<Plugin::Tag::AUDIO_SAMPLE_RATE>(48000); 502 auto cap = Pipeline::MetaToCapability(meta); 503 ASSERT_STREQ(MEDIA_MIME_AUDIO_RAW, cap->mime.c_str()); 504 auto mpegVersion = Plugin::AnyCast<uint32_t>(cap->keys[CapabilityID::AUDIO_MPEG_VERSION]); 505 ASSERT_TRUE(mpegVersion == 1); 506 507 auto channelLayout = Plugin::AnyCast<AudioChannelLayout>(cap->keys[CapabilityID::AUDIO_CHANNEL_LAYOUT]); 508 ASSERT_TRUE(channelLayout == AudioChannelLayout::STEREO); 509 510 auto channels = Plugin::AnyCast<uint32_t>(cap->keys[CapabilityID::AUDIO_CHANNELS]); 511 ASSERT_TRUE(channels == 2); 512 513 auto sampleRate = Plugin::AnyCast<uint32_t>(cap->keys[CapabilityID::AUDIO_SAMPLE_RATE]); 514 ASSERT_TRUE(sampleRate == 48000); 515 } 516 517 HWTEST(TestMergeMetaWithCapability, MergeMetaWithEmptyKeyCapability_Test, TestSize.Level1) 518 { 519 Meta meta; 520 meta.Set<Plugin::Tag::MIME>(MEDIA_MIME_AUDIO_MPEG); 521 meta.Set<Plugin::Tag::AUDIO_MPEG_VERSION>(1); 522 meta.Set<Plugin::Tag::AUDIO_CHANNEL_LAYOUT>(AudioChannelLayout::STEREO); 523 meta.Set<Plugin::Tag::AUDIO_CHANNELS>(2); 524 meta.Set<Plugin::Tag::AUDIO_SAMPLE_RATE>(48000); 525 meta.Set<Plugin::Tag::AUDIO_SAMPLE_FORMAT>(AudioSampleFormat::U16P); 526 527 Capability cap0(MEDIA_MIME_AUDIO_RAW); 528 Meta out1; 529 std::string outMime1; 530 uint32_t outMpegVersion1 = 0; 531 AudioChannelLayout outAudioChannelLayout1; 532 uint32_t outChannels1 = 0; 533 uint32_t outSampleRate1 = 0; 534 AudioSampleFormat outSampleFormat1 = AudioSampleFormat::U8; 535 ASSERT_TRUE(Pipeline::MergeMetaWithCapability(meta, cap0, out1)); 536 ASSERT_TRUE(out1.Get<Tag::MIME>(outMime1)); 537 ASSERT_STREQ(outMime1.c_str(), MEDIA_MIME_AUDIO_RAW); 538 ASSERT_TRUE(out1.Get<Tag::AUDIO_MPEG_VERSION>(outMpegVersion1)); 539 ASSERT_TRUE(outMpegVersion1 == 1); 540 ASSERT_TRUE(out1.Get<Tag::AUDIO_CHANNEL_LAYOUT>(outAudioChannelLayout1)); 541 ASSERT_TRUE(outAudioChannelLayout1 == AudioChannelLayout::STEREO); 542 ASSERT_TRUE(out1.Get<Tag::AUDIO_CHANNELS>(outChannels1)); 543 ASSERT_TRUE(outChannels1 == 2); 544 ASSERT_TRUE(out1.Get<Tag::AUDIO_SAMPLE_RATE>(outSampleRate1)); 545 ASSERT_TRUE(outSampleRate1 == 48000); 546 ASSERT_TRUE(out1.Get<Tag::AUDIO_SAMPLE_FORMAT>(outSampleFormat1)); 547 ASSERT_TRUE(outSampleFormat1 == AudioSampleFormat::U16P); 548 } 549 550 HWTEST(TestMergeMetaWithCapability, Merge_meta_contains_meta_ony_key_capability_Test, TestSize.Level1) 551 { 552 Meta meta; 553 meta.Set<Plugin::Tag::MIME>(MEDIA_MIME_AUDIO_MPEG); 554 meta.Set<Plugin::Tag::AUDIO_MPEG_VERSION>(1); 555 meta.Set<Tag::AUDIO_CHANNEL_LAYOUT>(AudioChannelLayout::STEREO); 556 meta.Set<Plugin::Tag::AUDIO_CHANNELS>(2); 557 meta.Set<Plugin::Tag::AUDIO_SAMPLE_RATE>(48000); 558 meta.Set<Plugin::Tag::MEDIA_BITRATE>(128000); 559 560 Capability cap0(MEDIA_MIME_AUDIO_RAW); 561 cap0.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_MPEG_VERSION, 1); 562 cap0.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_SAMPLE_RATE, 48000); 563 cap0.AppendDiscreteKeys<AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, 564 {AudioChannelLayout::STEREO,AudioChannelLayout::SURROUND}); 565 cap0.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 1, 8); 566 cap0.AppendDiscreteKeys<AudioSampleFormat>(CapabilityID::AUDIO_SAMPLE_FORMAT, 567 {AudioSampleFormat::U16P, AudioSampleFormat::U8}); 568 cap0.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_MPEG_LAYER, 3, 7); 569 570 Meta out1; 571 std::string outMime1; 572 uint32_t outMpegVersion1 = 0; 573 AudioChannelLayout outAudioChannelLayout1; 574 uint32_t outChannels1 = 0; 575 uint32_t outSampleRate1 = 0; 576 AudioSampleFormat outSampleFormat1 = AudioSampleFormat::U8; 577 uint32_t outMpegLayer = 0; 578 int64_t outBitRate = 0; 579 580 ASSERT_TRUE(Pipeline::MergeMetaWithCapability(meta, cap0, out1)); 581 ASSERT_TRUE(out1.Get<Tag::MIME>(outMime1)); 582 ASSERT_STREQ(outMime1.c_str(), MEDIA_MIME_AUDIO_RAW); 583 ASSERT_TRUE(out1.Get<Tag::AUDIO_MPEG_VERSION>(outMpegVersion1)); 584 ASSERT_TRUE(outMpegVersion1 == 1); 585 ASSERT_TRUE(out1.Get<Tag::AUDIO_CHANNEL_LAYOUT>(outAudioChannelLayout1)); 586 ASSERT_TRUE(outAudioChannelLayout1 == AudioChannelLayout::STEREO); 587 ASSERT_TRUE(out1.Get<Tag::AUDIO_CHANNELS>(outChannels1)); 588 ASSERT_TRUE(outChannels1 == 2); 589 ASSERT_TRUE(out1.Get<Tag::AUDIO_SAMPLE_RATE>(outSampleRate1)); 590 ASSERT_TRUE(outSampleRate1 == 48000); 591 ASSERT_TRUE(out1.Get<Tag::AUDIO_SAMPLE_FORMAT>(outSampleFormat1)); 592 ASSERT_TRUE(outSampleFormat1 == AudioSampleFormat::U16P); 593 ASSERT_TRUE(out1.Get<Tag::AUDIO_MPEG_LAYER>(outMpegLayer)); 594 ASSERT_TRUE(outMpegLayer == 3); 595 ASSERT_TRUE(out1.Get<Tag::MEDIA_BITRATE>(outBitRate)); 596 ASSERT_TRUE(outBitRate == 128000); 597 } 598 599 HWTEST(TestMergeMetaWithCapability, Merge_meta_with_capability_failed_Test, TestSize.Level1) 600 { 601 Meta meta; 602 meta.Set<Plugin::Tag::MIME>(MEDIA_MIME_AUDIO_MPEG); 603 meta.Set<Plugin::Tag::AUDIO_MPEG_VERSION>(1); 604 meta.Set<Tag::AUDIO_CHANNEL_LAYOUT>(AudioChannelLayout::STEREO); 605 meta.Set<Plugin::Tag::AUDIO_CHANNELS>(2); 606 meta.Set<Plugin::Tag::AUDIO_SAMPLE_RATE>(48000); 607 meta.Set<Plugin::Tag::MEDIA_BITRATE>(128000); 608 609 Capability cap0(MEDIA_MIME_AUDIO_RAW); 610 cap0.AppendFixedKey<uint32_t>(CapabilityID::AUDIO_MPEG_VERSION, 2); 611 Meta out1; 612 ASSERT_FALSE(Pipeline::MergeMetaWithCapability(meta, cap0, out1)); 613 614 Capability cap1(MEDIA_MIME_AUDIO_RAW); 615 cap1.AppendDiscreteKeys<AudioChannelLayout>(CapabilityID::AUDIO_CHANNEL_LAYOUT, 616 {AudioChannelLayout::CH_5POINT1,AudioChannelLayout::SURROUND}); 617 Meta out2; 618 ASSERT_FALSE(Pipeline::MergeMetaWithCapability(meta, cap1, out2)); 619 620 621 Capability cap2(MEDIA_MIME_AUDIO_RAW); 622 cap2.AppendIntervalKey<uint32_t>(CapabilityID::AUDIO_CHANNELS, 3, 8); 623 Meta out3; 624 ASSERT_FALSE(Pipeline::MergeMetaWithCapability(meta, cap2, out3)); 625 } 626 }