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 <limits>
17 #include "gtest/gtest.h"
18 #include "native_avcodec_videoencoder.h"
19 #include "native_averrors.h"
20 #include "videoenc_api11_sample.h"
21 #include "native_avcodec_base.h"
22 #include "avcodec_codec_name.h"
23 #include "native_avcapability.h"
24 namespace {
25 OH_AVCodec *venc_ = NULL;
26 OH_AVCapability *cap = nullptr;
27 OH_AVCapability *cap_hevc = nullptr;
28 constexpr uint32_t CODEC_NAME_SIZE = 128;
29 constexpr uint32_t DEFAULT_BITRATE = 1000000;
30 char g_codecName[CODEC_NAME_SIZE] = {};
31 char g_codecNameHEVC[CODEC_NAME_SIZE] = {};
32 const char *INP_DIR_720 = "/data/test/media/1280_720_nv.yuv";
33 constexpr uint32_t DEFAULT_WIDTH = 1280;
34 constexpr uint32_t DEFAULT_HEIGHT = 720;
35 } // namespace
36 namespace OHOS {
37 namespace Media {
38 class HwEncGetParamNdkTest : public testing::Test {
39 public:
40 static void SetUpTestCase();
41 static void TearDownTestCase();
42 void SetUp() override;
43 void TearDown() override;
44 void InputFunc();
45 void OutputFunc();
46 void Release();
47 int32_t Stop();
48 };
49 } // namespace Media
50 } // namespace OHOS
51
52 using namespace std;
53 using namespace OHOS;
54 using namespace OHOS::Media;
55 using namespace testing::ext;
56
SetUpTestCase()57 void HwEncGetParamNdkTest::SetUpTestCase()
58 {
59 cap = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE);
60 const char *tmpCodecName = OH_AVCapability_GetName(cap);
61 if (memcpy_s(g_codecName, sizeof(g_codecName), tmpCodecName, strlen(tmpCodecName)) != 0)
62 cout << "memcpy failed" << endl;
63 cout << "codecname: " << g_codecName << endl;
64 cap_hevc = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true, HARDWARE);
65 const char *tmpCodecNameHevc = OH_AVCapability_GetName(cap_hevc);
66 if (memcpy_s(g_codecNameHEVC, sizeof(g_codecNameHEVC), tmpCodecNameHevc, strlen(tmpCodecNameHevc)) != 0)
67 cout << "memcpy failed" << endl;
68 cout << "codecname_hevc: " << g_codecNameHEVC << endl;
69 }
TearDownTestCase()70 void HwEncGetParamNdkTest::TearDownTestCase() {}
SetUp()71 void HwEncGetParamNdkTest::SetUp() {}
TearDown()72 void HwEncGetParamNdkTest::TearDown()
73 {
74 if (venc_ != NULL) {
75 OH_VideoEncoder_Destroy(venc_);
76 venc_ = nullptr;
77 }
78 }
79 namespace {
80 /**
81 * @tc.number : VIDEO_ENCODE_MSE_QP_0100
82 * @tc.name : encode Avbuffer h265 buffer,get QP and MSE
83 * @tc.desc : function test
84 */
85 HWTEST_F(HwEncGetParamNdkTest, VIDEO_ENCODE_MSE_QP_0100, TestSize.Level0)
86 {
87 auto vEncSample = make_unique<VEncAPI11Sample>();
88 vEncSample->INP_DIR = INP_DIR_720;
89 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
90 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
91 vEncSample->DEFAULT_FRAME_RATE = 30;
92 vEncSample->DEFAULT_BITRATE = DEFAULT_BITRATE;
93 vEncSample->getQpMse = true;
94 vEncSample->SURF_INPUT = false;
95 vEncSample->OUT_DIR = "/data/test/media/qp_mse_0100.h265";
96 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecNameHEVC));
97 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
98 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
99 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
100 vEncSample->WaitForEOS();
101 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
102 }
103
104 /**
105 * @tc.number : VIDEO_ENCODE_MSE_QP_0200
106 * @tc.name : encode Avbuffer h265 surf,get QP and MSE
107 * @tc.desc : function test
108 */
109 HWTEST_F(HwEncGetParamNdkTest, VIDEO_ENCODE_MSE_QP_0200, TestSize.Level0)
110 {
111 auto vEncSample = make_unique<VEncAPI11Sample>();
112 vEncSample->INP_DIR = INP_DIR_720;
113 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
114 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
115 vEncSample->DEFAULT_FRAME_RATE = 30;
116 vEncSample->DEFAULT_BITRATE = DEFAULT_BITRATE;
117 vEncSample->getQpMse = true;
118 vEncSample->SURF_INPUT = true;
119 vEncSample->OUT_DIR = "/data/test/media/qp_mse_0200.h265";
120 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecNameHEVC));
121 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
122 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
123 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
124 vEncSample->WaitForEOS();
125 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
126 }
127
128 /**
129 * @tc.number : VIDEO_ENCODE_MSE_QP_0300
130 * @tc.name : encode Avbuffer h264 buffer,get QP and MSE
131 * @tc.desc : function test
132 */
133 HWTEST_F(HwEncGetParamNdkTest, VIDEO_ENCODE_MSE_QP_0300, TestSize.Level0)
134 {
135 auto vEncSample = make_unique<VEncAPI11Sample>();
136 vEncSample->INP_DIR = INP_DIR_720;
137 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
138 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
139 vEncSample->DEFAULT_FRAME_RATE = 30;
140 vEncSample->DEFAULT_BITRATE = DEFAULT_BITRATE;
141 vEncSample->getQpMse = true;
142 vEncSample->SURF_INPUT = false;
143 vEncSample->OUT_DIR = "/data/test/media/qp_mse_0300.h265";
144 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
145 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
146 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
147 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
148 vEncSample->WaitForEOS();
149 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
150 }
151
152 /**
153 * @tc.number : VIDEO_ENCODE_MSE_QP_0400
154 * @tc.name : encode Avbuffer h264 surf,get QP and MSE
155 * @tc.desc : function test
156 */
157 HWTEST_F(HwEncGetParamNdkTest, VIDEO_ENCODE_MSE_QP_0400, TestSize.Level0)
158 {
159 auto vEncSample = make_unique<VEncAPI11Sample>();
160 vEncSample->INP_DIR = INP_DIR_720;
161 vEncSample->DEFAULT_WIDTH = DEFAULT_WIDTH;
162 vEncSample->DEFAULT_HEIGHT = DEFAULT_HEIGHT;
163 vEncSample->DEFAULT_FRAME_RATE = 30;
164 vEncSample->DEFAULT_BITRATE = DEFAULT_BITRATE;
165 vEncSample->getQpMse = true;
166 vEncSample->SURF_INPUT = true;
167 vEncSample->OUT_DIR = "/data/test/media/qp_mse_0400.h265";
168 ASSERT_EQ(AV_ERR_OK, vEncSample->CreateVideoEncoder(g_codecName));
169 ASSERT_EQ(AV_ERR_OK, vEncSample->SetVideoEncoderCallback());
170 ASSERT_EQ(AV_ERR_OK, vEncSample->ConfigureVideoEncoder());
171 ASSERT_EQ(AV_ERR_OK, vEncSample->StartVideoEncoder());
172 vEncSample->WaitForEOS();
173 ASSERT_EQ(AV_ERR_OK, vEncSample->errCount);
174 }
175 }