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