1/* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15#include <string> 16#include <securec.h> 17#include "gtest/gtest.h" 18#include "native_avcodec_videoencoder.h" 19#include "native_averrors.h" 20#include "native_avcodec_base.h" 21#include "avcodec_codec_name.h" 22#include "native_avcapability.h" 23 24namespace { 25OH_AVCodec *venc_ = NULL; 26OH_AVCapability *cap = nullptr; 27OH_AVCapability *cap_hevc = nullptr; 28constexpr uint32_t CODEC_NAME_SIZE = 128; 29char g_codecName[CODEC_NAME_SIZE] = {}; 30char g_codecNameHEVC[CODEC_NAME_SIZE] = {}; 31OH_AVFormat *format; 32} // namespace 33namespace OHOS { 34namespace Media { 35class HwCapabilityNdkTest : public testing::Test { 36public: 37 static void SetUpTestCase(); 38 static void TearDownTestCase(); 39 void SetUp() override; 40 void TearDown() override; 41 void InputFunc(); 42 void OutputFunc(); 43 void Release(); 44 int32_t Stop(); 45}; 46} // namespace Media 47} // namespace OHOS 48 49using namespace std; 50using namespace OHOS; 51using namespace OHOS::Media; 52using namespace testing::ext; 53 54void HwCapabilityNdkTest::SetUpTestCase() 55{ 56 cap = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 57 const char *tmpCodecName = OH_AVCapability_GetName(cap); 58 if (memcpy_s(g_codecName, sizeof(g_codecName), tmpCodecName, strlen(tmpCodecName)) != 0) 59 cout << "memcpy failed" << endl; 60 cout << "codecname: " << g_codecName << endl; 61 cap_hevc = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true, HARDWARE); 62 const char *tmpCodecNameHevc = OH_AVCapability_GetName(cap_hevc); 63 if (memcpy_s(g_codecNameHEVC, sizeof(g_codecNameHEVC), tmpCodecNameHevc, strlen(tmpCodecNameHevc)) != 0) 64 cout << "memcpy failed" << endl; 65 cout << "codecname_hevc: " << g_codecNameHEVC << endl; 66} 67void HwCapabilityNdkTest::TearDownTestCase() {} 68void HwCapabilityNdkTest::SetUp() {} 69void HwCapabilityNdkTest::TearDown() 70{ 71 if (venc_ != NULL) { 72 OH_VideoEncoder_Destroy(venc_); 73 venc_ = nullptr; 74 } 75 if (format != nullptr) { 76 OH_AVFormat_Destroy(format); 77 format = nullptr; 78 } 79} 80namespace { 81/** 82 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0010 83 * @tc.name : OH_AVCapability_IsFeatureSupported para error 84 * @tc.desc : api test 85 */ 86HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0010, TestSize.Level2) 87{ 88 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 89 ASSERT_NE(nullptr, capability); 90 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, static_cast<OH_AVCapabilityFeature>(4))); 91} 92 93/** 94 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0011 95 * @tc.name : 解码,是否支持分层编码 96 * @tc.desc : api test 97 */ 98HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0011, TestSize.Level2) 99{ 100 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 101 ASSERT_NE(nullptr, capability); 102 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 103} 104 105/** 106 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0012 107 * @tc.name : 编码,是否支持分层编码 108 * @tc.desc : api test 109 */ 110HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0012, TestSize.Level1) 111{ 112 if (!access("/system/lib64/media/", 0)) { 113 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 114 ASSERT_NE(nullptr, capability); 115 ASSERT_EQ(true, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 116 } else { 117 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 118 ASSERT_NE(nullptr, capability); 119 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 120 } 121} 122 123/** 124 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0013 125 * @tc.name : 解码,是否支持LTR 126 * @tc.desc : api test 127 */ 128HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0013, TestSize.Level2) 129{ 130 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 131 ASSERT_NE(nullptr, capability); 132 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE)); 133} 134 135/** 136 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0014 137 * @tc.name : 编码,是否支持LTR 138 * @tc.desc : api test 139 */ 140HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0014, TestSize.Level1) 141{ 142 if (!access("/system/lib64/media/", 0)) { 143 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 144 ASSERT_NE(nullptr, capability); 145 ASSERT_EQ(true, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE)); 146 } else { 147 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 148 ASSERT_NE(nullptr, capability); 149 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE)); 150 } 151} 152 153/** 154 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0015 155 * @tc.name : 软解,是否支持低时延 156 * @tc.desc : api test 157 */ 158HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0015, TestSize.Level2) 159{ 160 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, SOFTWARE); 161 ASSERT_NE(nullptr, capability); 162 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_LOW_LATENCY)); 163} 164 165/** 166 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0016 167 * @tc.name : 硬解,是否支持低时延 168 * @tc.desc : api test 169 */ 170HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0016, TestSize.Level2) 171{ 172 if (!access("/system/lib64/media/", 0)) { 173 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory( 174 OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 175 ASSERT_NE(nullptr, capability); 176 ASSERT_EQ(true, OH_AVCapability_IsFeatureSupported(capability, VIDEO_LOW_LATENCY)); 177 } else { 178 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory( 179 OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 180 ASSERT_NE(nullptr, capability); 181 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_LOW_LATENCY)); 182 } 183} 184 185/** 186 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0017 187 * @tc.name : 编码,是否支持低时延 188 * @tc.desc : api test 189 */ 190HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0017, TestSize.Level1) 191{ 192 if (!access("/system/lib64/media/", 0)) { 193 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 194 ASSERT_NE(nullptr, capability); 195 ASSERT_EQ(true, OH_AVCapability_IsFeatureSupported(capability, VIDEO_LOW_LATENCY)); 196 } else { 197 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 198 ASSERT_NE(nullptr, capability); 199 ASSERT_EQ(false, OH_AVCapability_IsFeatureSupported(capability, VIDEO_LOW_LATENCY)); 200 } 201} 202 203/** 204 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0018 205 * @tc.name : OH_AVCapability_GetFeatureProperties para error 206 * @tc.desc : api test 207 */ 208HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0018, TestSize.Level2) 209{ 210 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 211 ASSERT_NE(nullptr, capability); 212 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, static_cast<OH_AVCapabilityFeature>(4))); 213 214 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, static_cast<OH_AVCapabilityFeature>(-1))); 215 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, static_cast<OH_AVCapabilityFeature>(100))); 216 217 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 218} 219 220/** 221 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0019 222 * @tc.name : 解码,查询分层编码的能力值 223 * @tc.desc : api test 224 */ 225HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0019, TestSize.Level2) 226{ 227 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 228 ASSERT_NE(nullptr, capability); 229 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 230} 231 232/** 233 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0020 234 * @tc.name : 编码,查询分层编码的能力值 235 * @tc.desc : api test 236 */ 237HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0020, TestSize.Level1) 238{ 239 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 240 ASSERT_NE(nullptr, capability); 241 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY)); 242} 243 244/** 245 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0021 246 * @tc.name : 解码,查询LTR能力值 247 * @tc.desc : api test 248 */ 249HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0021, TestSize.Level2) 250{ 251 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 252 ASSERT_NE(nullptr, capability); 253 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE)); 254} 255 256/** 257 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0022 258 * @tc.name : 编码,查询LTR的能力值 259 * @tc.desc : api test 260 */ 261HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0022, TestSize.Level1) 262{ 263 if (!access("/system/lib64/media/", 0)) { 264 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 265 ASSERT_NE(nullptr, capability); 266 format = OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE); 267 ASSERT_NE(nullptr, format); 268 int ltrnum = 0; 269 EXPECT_EQ(OH_AVFormat_GetIntValue( 270 format, OH_FEATURE_PROPERTY_KEY_VIDEO_ENCODER_MAX_LTR_FRAME_COUNT, <rnum), true); 271 EXPECT_EQ(ltrnum, 10); 272 } else { 273 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 274 ASSERT_NE(nullptr, capability); 275 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_ENCODER_LONG_TERM_REFERENCE)); 276 } 277} 278 279/** 280 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0023 281 * @tc.name : 软解,查询低时延的能力值 282 * @tc.desc : api test 283 */ 284HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0023, TestSize.Level2) 285{ 286 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, SOFTWARE); 287 ASSERT_NE(nullptr, capability); 288 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_LOW_LATENCY)); 289} 290 291/** 292 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0024 293 * @tc.name : 硬解,查询低时延的能力值 294 * @tc.desc : api test 295 */ 296HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0024, TestSize.Level2) 297{ 298 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); 299 ASSERT_NE(nullptr, capability); 300 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_LOW_LATENCY)); 301} 302 303/** 304 * @tc.number : VIDEO_TEMPORAL_ENCODE_API_0025 305 * @tc.name : 编码,查询低时延的能力值 306 * @tc.desc : api test 307 */ 308HWTEST_F(HwCapabilityNdkTest, VIDEO_TEMPORAL_ENCODE_API_0025, TestSize.Level1) 309{ 310 OH_AVCapability *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); 311 ASSERT_NE(nullptr, capability); 312 ASSERT_EQ(nullptr, OH_AVCapability_GetFeatureProperties(capability, VIDEO_LOW_LATENCY)); 313} 314} // namespace